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.
- package/dist/index.js +3 -3
- package/dist/mcp.js +180 -736
- package/package.json +6 -2
- package/server/client/dist/assets/ArrowRight.es-CbA8ey6a.js +1 -0
- package/server/client/dist/assets/{Calendar-Bc2zJueR.js → Calendar-CgWgr1BV.js} +2 -2
- package/server/client/dist/assets/Callout-DKruIT0f.js +1 -0
- package/server/client/dist/assets/Copy.es-DFbgpaNJ.js +1 -0
- package/server/client/dist/assets/Graph-kCltGRlY.js +1 -0
- package/server/client/dist/assets/{Image-DxWhlIDG.js → Image-7W0DZwMo.js} +1 -1
- package/server/client/dist/assets/Image.es-5pXLx9TU.js +1 -0
- package/server/client/dist/assets/Note-BW6Np_5g.js +20 -0
- package/server/client/dist/assets/Plus.es-B0sg64VJ.js +1 -0
- package/server/client/dist/assets/Reminders-C10fHQcl.js +1 -0
- package/server/client/dist/assets/Search-tf2nV4v0.js +1 -0
- package/server/client/dist/assets/{SurfaceCard-CkAVMLPs.js → SurfaceCard-pydtvHfu.js} +1 -1
- package/server/client/dist/assets/Tag-uCoYbISy.js +1 -0
- package/server/client/dist/assets/TagNotes-CqOcQiRw.js +1 -0
- package/server/client/dist/assets/Trash.es-w32Goxfa.js +1 -0
- package/server/client/dist/assets/ViewNotes-slPXXoOY.js +1 -0
- package/server/client/dist/assets/ViewSectionDialog-brTrsF6G.js +102 -0
- package/server/client/dist/assets/Views-B_wsb-XJ.js +1 -0
- package/server/client/dist/assets/{graph-vendor-CUxe67Lr.js → graph-vendor-BAF95C0g.js} +2 -2
- package/server/client/dist/assets/image.api-CYsjXiMr.js +17 -0
- package/server/client/dist/assets/index-BR05aSXr.js +342 -0
- package/server/client/dist/assets/{index-D3BfroIT.js → index-D83QbOcw.js} +1 -1
- package/server/client/dist/assets/{index-C5BGzDgt.css → index-DPI6YoDt.css} +1 -1
- package/server/client/dist/assets/manage-image-BYIhWu56.js +1 -0
- package/server/client/dist/assets/{manage-image-detail-C8Q7K7I3.js → manage-image-detail-6KgmQvbN.js} +1 -1
- package/server/client/dist/assets/mcp-Dd98N9Hq.js +4 -0
- package/server/client/dist/assets/mcp-admin-adapter-DOgBsYpl.js +1 -0
- package/server/client/dist/assets/note-core-CMGUaW1v.js +176 -0
- package/server/client/dist/assets/note-vendor-Hoz9Q4-4.js +54 -0
- package/server/client/dist/assets/{placeholder-Cr_nI8UI.js → placeholder-siHGg9aK.js} +4 -4
- package/server/client/dist/assets/{properties-CvYWJWUM.js → properties-CyVRKgcT.js} +1 -1
- package/server/client/dist/assets/tag.api-CwmC8crB.js +21 -0
- package/server/client/dist/assets/trash-wojQBK9Z.js +1 -0
- package/server/client/dist/assets/{useReminderMutate-CDmIEwsw.js → useReminderMutate-DuVKxpBh.js} +1 -1
- package/server/client/dist/index.html +5 -5
- package/server/dist/app.js +0 -1
- package/server/dist/features/auth/http/api.js +0 -1
- package/server/dist/features/auth/http/login-page.js +272 -5
- package/server/dist/features/auth/http/pages.js +20 -3
- package/server/dist/features/auth/service.js +3 -2
- package/server/dist/features/cache/graphql/cache.field.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.mutation.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.query.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.resolver.js +0 -1
- package/server/dist/features/cache/graphql/cache.type-defs.js +0 -1
- package/server/dist/features/cache/graphql/index.js +0 -1
- package/server/dist/features/image/graphql/image.field.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.mutation.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.query.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.resolver.js +0 -1
- package/server/dist/features/image/graphql/image.type-defs.js +0 -1
- package/server/dist/features/image/graphql/index.js +0 -1
- package/server/dist/features/image/http/upload.js +34 -24
- package/server/dist/features/image/services/delete.js +0 -1
- package/server/dist/features/image/services/upload.js +0 -1
- package/server/dist/features/image/services/validation.js +110 -0
- package/server/dist/features/mcp-admin/http/handlers.js +11 -4
- package/server/dist/features/mcp-admin/service.js +0 -1
- package/server/dist/features/note/graphql/index.js +0 -1
- package/server/dist/features/note/graphql/note.field.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.mutation.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.query.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.resolver.js +0 -1
- package/server/dist/features/note/graphql/note.type-defs.js +0 -1
- package/server/dist/features/note/http/mcp.js +8 -44
- package/server/dist/features/note/services/authoring.js +0 -1
- package/server/dist/features/note/services/cleanup.js +2 -3
- package/server/dist/features/note/services/content-blocks.js +0 -1
- package/server/dist/features/note/services/markdown-intent-write.js +11 -44
- package/server/dist/features/note/services/markdown-patch.js +4 -124
- package/server/dist/features/note/services/properties.js +0 -1
- package/server/dist/features/note/services/search-backfill.js +0 -1
- package/server/dist/features/note/services/search.js +0 -1
- package/server/dist/features/note/services/snapshot.js +0 -1
- package/server/dist/features/note/services/tag-filter.js +0 -1
- package/server/dist/features/note/services/trash.js +0 -1
- package/server/dist/features/note/services/write-conflict.js +0 -1
- package/server/dist/features/note/services/write.js +13 -14
- package/server/dist/features/placeholder/graphql/index.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.resolver.js +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.type-defs.js +0 -1
- package/server/dist/features/reminder/graphql/index.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.field.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.query.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.resolver.js +0 -1
- package/server/dist/features/reminder/graphql/reminder.type-defs.js +0 -1
- package/server/dist/features/tag/graphql/index.js +0 -1
- package/server/dist/features/tag/graphql/tag.field.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.mutation.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.query.resolver.js +16 -2
- package/server/dist/features/tag/graphql/tag.resolver.js +0 -1
- package/server/dist/features/tag/graphql/tag.type-defs.js +2 -1
- package/server/dist/features/tag/http/mcp.js +0 -1
- package/server/dist/features/tag/services/organization.js +0 -1
- package/server/dist/features/view/graphql/index.js +0 -1
- package/server/dist/features/view/graphql/view.mutation.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.query.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.resolver.js +0 -1
- package/server/dist/features/view/graphql/view.type-defs.js +0 -1
- package/server/dist/features/view/services/workspace.js +0 -1
- package/server/dist/main.js +0 -1
- package/server/dist/models.js +0 -1
- package/server/dist/modules/app-version.js +104 -0
- package/server/dist/modules/auth-guard.js +0 -1
- package/server/dist/modules/auth-mode.js +0 -1
- package/server/dist/modules/auth-redirect.js +0 -1
- package/server/dist/modules/blocknote-markdown-editor.js +53 -0
- package/server/dist/modules/blocknote-tree.js +0 -1
- package/server/dist/modules/blocknote.js +10 -4
- package/server/dist/modules/data-maintenance.js +0 -1
- package/server/dist/modules/error-handler.js +0 -1
- package/server/dist/modules/graphql.js +0 -1
- package/server/dist/modules/logger.js +0 -1
- package/server/dist/modules/mcp-auth.js +62 -2
- package/server/dist/modules/mcp-token.js +0 -1
- package/server/dist/modules/prisma-runtime.js +0 -1
- package/server/dist/modules/rate-limit.js +0 -1
- package/server/dist/modules/recovery-retention.js +0 -1
- package/server/dist/modules/server-events-handler.js +0 -1
- package/server/dist/modules/server-events.js +0 -1
- package/server/dist/modules/session-store.js +0 -1
- package/server/dist/modules/use-async.js +0 -1
- package/server/dist/paths.js +1 -1
- package/server/dist/routes/api.js +2 -9
- package/server/dist/routes/auth-pages.js +0 -1
- package/server/dist/routes/client.js +51 -2
- package/server/dist/routes/graphql.js +0 -1
- package/server/dist/routes/index.js +0 -1
- package/server/dist/routes/mcp.js +0 -1
- package/server/dist/schema/index.js +0 -1
- package/server/dist/start.js +0 -1
- package/server/dist/types/index.js +0 -1
- package/server/dist/types/input.js +0 -1
- package/server/client/dist/assets/Callout-B4kA_Cvr.js +0 -1
- package/server/client/dist/assets/Graph-uq5jfJgt.js +0 -1
- package/server/client/dist/assets/Image.es-BpAOJjJT.js +0 -1
- package/server/client/dist/assets/Note-Bo8ZYRP-.js +0 -22
- package/server/client/dist/assets/Plus.es-Dc_js8AC.js +0 -1
- package/server/client/dist/assets/Reminders-lj7Equld.js +0 -1
- package/server/client/dist/assets/Search-1wcRO5--.js +0 -1
- package/server/client/dist/assets/Tag-CeygwFfv.js +0 -1
- package/server/client/dist/assets/TagNotes-B8DqItxw.js +0 -1
- package/server/client/dist/assets/Trash.es-OuQVb_SX.js +0 -1
- package/server/client/dist/assets/ViewNotes-BH7PbdOD.js +0 -1
- package/server/client/dist/assets/ViewSectionTableRenderer-BJwhd5be.js +0 -102
- package/server/client/dist/assets/Views-eYFtsdFj.js +0 -1
- package/server/client/dist/assets/image.api-C0eYGCeH.js +0 -17
- package/server/client/dist/assets/index-jIfkRdY_.js +0 -361
- package/server/client/dist/assets/manage-image-C0YwkLIP.js +0 -1
- package/server/client/dist/assets/mcp-DHHhTLC8.js +0 -1
- package/server/client/dist/assets/note-core-Z6kqulGB.js +0 -180
- package/server/client/dist/assets/note-vendor-i1M2FSI2.js +0 -54
- package/server/client/dist/assets/trash-DA27aW7L.js +0 -1
- package/server/client/dist/fonts/Pretendard-Bold.woff +0 -0
- package/server/client/dist/fonts/Pretendard-Regular.woff +0 -0
- package/server/dist/app.js.map +0 -1
- package/server/dist/features/auth/http/api.js.map +0 -1
- package/server/dist/features/auth/http/login-page.js.map +0 -1
- package/server/dist/features/auth/http/pages.js.map +0 -1
- package/server/dist/features/auth/service.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.field.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.mutation.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.query.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.resolver.js.map +0 -1
- package/server/dist/features/cache/graphql/cache.type-defs.js.map +0 -1
- package/server/dist/features/cache/graphql/index.js.map +0 -1
- package/server/dist/features/image/graphql/image.field.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.mutation.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.query.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.resolver.js.map +0 -1
- package/server/dist/features/image/graphql/image.type-defs.js.map +0 -1
- package/server/dist/features/image/graphql/index.js.map +0 -1
- package/server/dist/features/image/http/upload.js.map +0 -1
- package/server/dist/features/image/services/delete.js.map +0 -1
- package/server/dist/features/image/services/remote-fetch.js +0 -176
- package/server/dist/features/image/services/remote-fetch.js.map +0 -1
- package/server/dist/features/image/services/upload.js.map +0 -1
- package/server/dist/features/mcp-admin/http/handlers.js.map +0 -1
- package/server/dist/features/mcp-admin/service.js.map +0 -1
- package/server/dist/features/note/graphql/index.js.map +0 -1
- package/server/dist/features/note/graphql/note.field.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.mutation.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.query.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.resolver.js.map +0 -1
- package/server/dist/features/note/graphql/note.type-defs.js.map +0 -1
- package/server/dist/features/note/http/mcp.js.map +0 -1
- package/server/dist/features/note/services/authoring.js.map +0 -1
- package/server/dist/features/note/services/cleanup.js.map +0 -1
- package/server/dist/features/note/services/content-blocks.js.map +0 -1
- package/server/dist/features/note/services/markdown-intent-write.js.map +0 -1
- package/server/dist/features/note/services/markdown-patch.js.map +0 -1
- package/server/dist/features/note/services/properties.js.map +0 -1
- package/server/dist/features/note/services/search-backfill.js.map +0 -1
- package/server/dist/features/note/services/search.js.map +0 -1
- package/server/dist/features/note/services/snapshot.js.map +0 -1
- package/server/dist/features/note/services/tag-filter.js.map +0 -1
- package/server/dist/features/note/services/trash.js.map +0 -1
- package/server/dist/features/note/services/write-conflict.js.map +0 -1
- package/server/dist/features/note/services/write.js.map +0 -1
- package/server/dist/features/placeholder/graphql/index.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.resolver.js.map +0 -1
- package/server/dist/features/placeholder/graphql/placeholder.type-defs.js.map +0 -1
- package/server/dist/features/reminder/graphql/index.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.field.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.query.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.resolver.js.map +0 -1
- package/server/dist/features/reminder/graphql/reminder.type-defs.js.map +0 -1
- package/server/dist/features/tag/graphql/index.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.field.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.mutation.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.query.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.resolver.js.map +0 -1
- package/server/dist/features/tag/graphql/tag.type-defs.js.map +0 -1
- package/server/dist/features/tag/http/mcp.js.map +0 -1
- package/server/dist/features/tag/services/organization.js.map +0 -1
- package/server/dist/features/view/graphql/index.js.map +0 -1
- package/server/dist/features/view/graphql/view.mutation.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.query.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.resolver.js.map +0 -1
- package/server/dist/features/view/graphql/view.type-defs.js.map +0 -1
- package/server/dist/features/view/services/workspace.js.map +0 -1
- package/server/dist/main.js.map +0 -1
- package/server/dist/models.js.map +0 -1
- package/server/dist/modules/auth-guard.js.map +0 -1
- package/server/dist/modules/auth-mode.js.map +0 -1
- package/server/dist/modules/auth-redirect.js.map +0 -1
- package/server/dist/modules/blocknote-tree.js.map +0 -1
- package/server/dist/modules/blocknote.js.map +0 -1
- package/server/dist/modules/data-maintenance.js.map +0 -1
- package/server/dist/modules/error-handler.js.map +0 -1
- package/server/dist/modules/graphql.js.map +0 -1
- package/server/dist/modules/logger.js.map +0 -1
- package/server/dist/modules/mcp-auth.js.map +0 -1
- package/server/dist/modules/mcp-token.js.map +0 -1
- package/server/dist/modules/prisma-runtime.js.map +0 -1
- package/server/dist/modules/rate-limit.js.map +0 -1
- package/server/dist/modules/recovery-retention.js.map +0 -1
- package/server/dist/modules/server-events-handler.js.map +0 -1
- package/server/dist/modules/server-events.js.map +0 -1
- package/server/dist/modules/session-store.js.map +0 -1
- package/server/dist/modules/use-async.js.map +0 -1
- package/server/dist/paths.js.map +0 -1
- package/server/dist/routes/api.js.map +0 -1
- package/server/dist/routes/auth-pages.js.map +0 -1
- package/server/dist/routes/client.js.map +0 -1
- package/server/dist/routes/graphql.js.map +0 -1
- package/server/dist/routes/index.js.map +0 -1
- package/server/dist/routes/mcp.js.map +0 -1
- package/server/dist/schema/index.js.map +0 -1
- package/server/dist/start.js.map +0 -1
- package/server/dist/types/index.js.map +0 -1
- package/server/dist/types/input.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/auth-guard.ts"],"sourcesContent":["import { buildUnauthorizedGraphqlPayload, buildUnauthorizedPayload } from '@baejino/auth';\nimport type { ErrorRequestHandler, NextFunction, Request, RequestHandler, Response } from 'express';\nimport session from 'express-session';\nimport type { ValidationRule } from 'graphql';\nimport { GraphQLError } from 'graphql';\nimport lusca from 'lusca';\nimport type { AuthConfig } from './auth-mode.js';\nimport { sanitizeRedirectPath } from './auth-redirect.js';\nimport { AUTH_SESSION_IDLE_TIMEOUT_MS, createSessionStore } from './session-store.js';\n\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\n\nexport const isAuthenticatedRequest = (req: Request) => Boolean(req.session?.authenticated);\n\nexport const createSessionMiddleware = (authConfig: AuthConfig): RequestHandler => {\n if (authConfig.mode !== 'password') {\n return (_req, _res, next) => next();\n }\n\n return session({\n secret: authConfig.sessionSecret,\n name: authConfig.cookieName,\n store: createSessionStore(),\n resave: false,\n saveUninitialized: false,\n rolling: true,\n cookie: {\n maxAge: AUTH_SESSION_IDLE_TIMEOUT_MS,\n httpOnly: true,\n sameSite: 'lax',\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n },\n });\n};\n\nexport const createCsrfProtection = (authConfig: AuthConfig): RequestHandler => {\n if (authConfig.mode !== 'password') {\n return (_req, _res, next) => next();\n }\n\n return lusca.csrf({\n angular: true,\n cookie: {\n options: {\n path: '/',\n sameSite: 'lax',\n secure: process.env.NODE_ENV === 'production',\n },\n },\n });\n};\n\nconst isCsrfTokenError = (error: unknown) => error instanceof Error && error.message.startsWith('CSRF token ');\n\nconst buildLoginRedirectPath = (req: Request) => {\n const nextPath = sanitizeRedirectPath(req.body?.next);\n return `/login?next=${encodeURIComponent(nextPath)}`;\n};\n\nexport const createLoginCsrfFailureHandler = (authConfig: AuthConfig): ErrorRequestHandler => {\n return (error, req, res, next) => {\n if (\n authConfig.mode !== 'password' ||\n !isCsrfTokenError(error) ||\n req.method !== 'POST' ||\n req.path !== '/login' ||\n isAuthenticatedRequest(req)\n ) {\n next(error);\n return;\n }\n\n res.redirect(303, buildLoginRedirectPath(req));\n };\n};\n\nexport const requireSessionForWrite = (authConfig: AuthConfig): RequestHandler => {\n return (req: Request, res: Response, next: NextFunction) => {\n if (authConfig.mode === 'open' || isAuthenticatedRequest(req)) {\n next();\n return;\n }\n\n res.status(401).set(JSON_HEADERS).json(buildUnauthorizedPayload()).end();\n };\n};\n\nexport const requireSessionForGraphql = (authConfig: AuthConfig): RequestHandler => {\n return (req: Request, res: Response, next: NextFunction) => {\n if (authConfig.mode === 'open' || isAuthenticatedRequest(req)) {\n next();\n return;\n }\n\n res.status(401).set(JSON_HEADERS).json(buildUnauthorizedGraphqlPayload()).end();\n };\n};\n\nexport const createMutationAuthValidationRule = (): ValidationRule => {\n return (context) => {\n return {\n OperationDefinition(node) {\n if (node.operation !== 'mutation') {\n return;\n }\n\n const unauthorizedError = buildUnauthorizedGraphqlPayload().errors[0];\n\n context.reportError(\n new GraphQLError(unauthorizedError.message, {\n nodes: [node],\n extensions: {\n code: unauthorizedError.extensions.code,\n },\n }),\n );\n },\n };\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/auth-mode.ts"],"sourcesContent":["import { type AuthConfig, type AuthEnvironment, resolvePasswordAuthConfig } from '@baejino/auth';\n\nexport type { AuthConfig, AuthMode } from '@baejino/auth';\n\nexport const AUTH_SESSION_COOKIE_NAME = 'ocean-brain.sid';\n\nexport interface AuthModeEnvironment extends AuthEnvironment {\n [key: string]: string | undefined;\n OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH?: string;\n OCEAN_BRAIN_PASSWORD?: string;\n OCEAN_BRAIN_SESSION_SECRET?: string;\n}\n\nexport const resolveAuthConfig = (env: AuthModeEnvironment): AuthConfig =>\n resolvePasswordAuthConfig({\n env,\n passwordEnv: 'OCEAN_BRAIN_PASSWORD',\n sessionSecretEnv: 'OCEAN_BRAIN_SESSION_SECRET',\n allowOpenEnv: 'OCEAN_BRAIN_ALLOW_INSECURE_NO_AUTH',\n requireExplicitOpen: true,\n allowPasswordAsSessionSecret: false,\n cookieName: AUTH_SESSION_COOKIE_NAME,\n });\n\nexport const logAuthConfig = (authConfig: AuthConfig) => {\n if (authConfig.mode === 'open') {\n process.stderr.write(\n '[auth] Running in explicit open mode. Authentication is not required for write access.\\n',\n );\n return;\n }\n\n process.stdout.write('[auth] Running in password mode. Write access requires an authenticated session.\\n');\n};\n"],"mappings":"AAAA,SAAgD,iCAAiC;AAI1E,MAAM,2BAA2B;AASjC,MAAM,oBAAoB,CAAC,QAC9B,0BAA0B;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,YAAY;AAChB,CAAC;AAEE,MAAM,gBAAgB,CAAC,eAA2B;AACrD,MAAI,WAAW,SAAS,QAAQ;AAC5B,YAAQ,OAAO;AAAA,MACX;AAAA,IACJ;AACA;AAAA,EACJ;AAEA,UAAQ,OAAO,MAAM,oFAAoF;AAC7G;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/auth-redirect.ts"],"sourcesContent":["import { sanitizeRedirectPath as sanitizeCommonRedirectPath } from '@baejino/auth';\n\nexport const sanitizeRedirectPath = (value: unknown) =>\n sanitizeCommonRedirectPath(value, {\n fallbackPath: '/',\n loginPath: '/login',\n allowedAbsoluteHosts: ['localhost', '127.0.0.1', '::1'],\n });\n"],"mappings":"AAAA,SAAS,wBAAwB,kCAAkC;AAE5D,MAAM,uBAAuB,CAAC,UACjC,2BAA2B,OAAO;AAAA,EAC9B,cAAc;AAAA,EACd,WAAW;AAAA,EACX,sBAAsB,CAAC,aAAa,aAAa,KAAK;AAC1D,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/blocknote-tree.ts"],"sourcesContent":["export type BlockNoteTreeNode = Record<string, unknown>;\n\nexport const isBlockNoteTreeNode = (value: unknown): value is BlockNoteTreeNode => {\n return typeof value === 'object' && value !== null;\n};\n\nexport const parseBlockNoteContent = (content: string): unknown[] | null => {\n try {\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nexport const walkBlockNoteTree = (value: unknown, visit: (node: BlockNoteTreeNode) => void) => {\n if (Array.isArray(value)) {\n for (const item of value) {\n walkBlockNoteTree(item, visit);\n }\n return;\n }\n\n if (!isBlockNoteTreeNode(value)) {\n return;\n }\n\n visit(value);\n\n if ('content' in value) {\n walkBlockNoteTree(value.content, visit);\n }\n\n if ('children' in value) {\n walkBlockNoteTree(value.children, visit);\n }\n\n if ('rows' in value) {\n walkBlockNoteTree(value.rows, visit);\n }\n\n if ('cells' in value) {\n walkBlockNoteTree(value.cells, visit);\n }\n};\n"],"mappings":"AAEO,MAAM,sBAAsB,CAAC,UAA+C;AAC/E,SAAO,OAAO,UAAU,YAAY,UAAU;AAClD;AAEO,MAAM,wBAAwB,CAAC,YAAsC;AACxE,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,MAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,EAC5C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,MAAM,oBAAoB,CAAC,OAAgB,UAA6C;AAC3F,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,eAAW,QAAQ,OAAO;AACtB,wBAAkB,MAAM,KAAK;AAAA,IACjC;AACA;AAAA,EACJ;AAEA,MAAI,CAAC,oBAAoB,KAAK,GAAG;AAC7B;AAAA,EACJ;AAEA,QAAM,KAAK;AAEX,MAAI,aAAa,OAAO;AACpB,sBAAkB,MAAM,SAAS,KAAK;AAAA,EAC1C;AAEA,MAAI,cAAc,OAAO;AACrB,sBAAkB,MAAM,UAAU,KAAK;AAAA,EAC3C;AAEA,MAAI,UAAU,OAAO;AACjB,sBAAkB,MAAM,MAAM,KAAK;AAAA,EACvC;AAEA,MAAI,WAAW,OAAO;AAClB,sBAAkB,MAAM,OAAO,KAAK;AAAA,EACxC;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/blocknote.ts"],"sourcesContent":["import { ServerBlockNoteEditor } from '@blocknote/server-util';\nimport { ensureTagByName } from '~/features/tag/services/organization.js';\nimport models from '~/models.js';\n\ninterface BlockNote {\n id?: string;\n type: string;\n props?: Record<string, unknown>;\n content?: BlockNoteContent;\n children?: BlockNote[];\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteInline {\n type: string;\n props?: Record<string, unknown>;\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteTableCell {\n type: 'tableCell';\n props?: Record<string, unknown>;\n content?: BlockNoteInline[];\n}\n\ninterface BlockNoteTableRow {\n cells?: BlockNoteTableCell[];\n}\n\ninterface BlockNoteTableContent {\n type: 'tableContent';\n columnWidths?: Array<number | null>;\n headerRows?: number;\n rows?: BlockNoteTableRow[];\n}\n\ntype BlockNoteContent = BlockNoteInline[] | BlockNoteTableContent;\n\ninterface MarkdownImportDeps {\n ensureTag: (name: string) => Promise<\n | {\n id: string;\n name: string;\n }\n | {\n tag: {\n id: string;\n name: string;\n };\n }\n >;\n findNotesByTitle: (title: string) => Promise<\n Array<{\n id: string;\n title: string;\n }>\n >;\n findNoteById?: (id: string) => Promise<{\n id: string;\n title: string;\n } | null>;\n}\n\nconst UNSUPPORTED_MARKDOWN_BLOCK_TYPES = new Set(['tableOfContents']);\nconst TAG_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_TAG_';\nconst TAG_PLACEHOLDER_SUFFIX = '_TOKEN';\nconst REFERENCE_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_REFERENCE_';\nconst REFERENCE_PLACEHOLDER_SUFFIX = '_TOKEN';\n\nconst defaultMarkdownImportDeps: MarkdownImportDeps = {\n ensureTag: async (name) => ensureTagByName(name),\n findNotesByTitle: async (title) => {\n const notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n },\n where: { title },\n orderBy: { createdAt: 'asc' },\n take: 2,\n });\n\n return notes.map((note) => ({\n id: String(note.id),\n title: note.title,\n }));\n },\n findNoteById: async (id) => {\n if (!isValidNoteIdString(id)) {\n return null;\n }\n\n const numericId = Number(id);\n\n const note = await models.note.findUnique({\n select: {\n id: true,\n title: true,\n },\n where: { id: numericId },\n });\n\n return note\n ? {\n id: String(note.id),\n title: note.title,\n }\n : null;\n },\n};\n\nfunction stripUnsupportedMarkdownBlocks(blocks: BlockNote[]): BlockNote[] {\n return blocks\n .filter((block) => !UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type))\n .map((block) => ({\n ...block,\n children: block.children?.length ? stripUnsupportedMarkdownBlocks(block.children) : [],\n }));\n}\n\nfunction parseBlockNoteContent(contentJson: string): BlockNote[] {\n const parsed = JSON.parse(contentJson);\n\n if (!Array.isArray(parsed)) {\n throw new Error('INVALID_BLOCKNOTE_CONTENT');\n }\n\n return parsed;\n}\n\nfunction visitBlocks(blocks: BlockNote[], visit: (block: BlockNote) => void) {\n for (const block of blocks) {\n visit(block);\n\n if (block.children?.length) {\n visitBlocks(block.children, visit);\n }\n }\n}\n\nfunction createTagPlaceholder(index: number) {\n return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createReferencePlaceholder(index: number) {\n return `${REFERENCE_PLACEHOLDER_PREFIX}${index}${REFERENCE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction isValidNoteIdString(id: string) {\n if (!/^[1-9]\\d*$/.test(id)) {\n return false;\n }\n\n const numericId = Number(id);\n\n return Number.isSafeInteger(numericId) && numericId <= MAX_SQLITE_INT_ID;\n}\n\nfunction isTableContent(content: BlockNoteContent | undefined): content is BlockNoteTableContent {\n return !Array.isArray(content) && content?.type === 'tableContent';\n}\n\nfunction mapBlockContent(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => BlockNoteInline,\n): BlockNoteContent | undefined {\n if (Array.isArray(content)) {\n return content.map(mapInline);\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: content.rows?.map((row) => ({\n ...row,\n cells: row.cells?.map((cell) => ({\n ...cell,\n content: cell.content?.map(mapInline),\n })),\n })),\n };\n}\n\nasync function mapBlockContentAsync(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => Promise<BlockNoteInline[]>,\n): Promise<BlockNoteContent | undefined> {\n if (Array.isArray(content)) {\n return (await Promise.all(content.map(mapInline))).flat();\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: await Promise.all(\n (content.rows ?? []).map(async (row) => ({\n ...row,\n cells: await Promise.all(\n (row.cells ?? []).map(async (cell) => ({\n ...cell,\n content: cell.content ? (await Promise.all(cell.content.map(mapInline))).flat() : cell.content,\n })),\n ),\n })),\n ),\n };\n}\n\nfunction visitBlockContent(content: BlockNoteContent | undefined, visitInline: (inline: BlockNoteInline) => void) {\n if (Array.isArray(content)) {\n for (const inline of content) {\n visitInline(inline);\n }\n return;\n }\n\n if (!isTableContent(content)) {\n return;\n }\n\n for (const row of content.rows ?? []) {\n for (const cell of row.cells ?? []) {\n for (const inline of cell.content ?? []) {\n visitInline(inline);\n }\n }\n }\n}\n\nfunction mapBlocks(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => BlockNoteContent | undefined,\n): BlockNote[] {\n return blocks.map((block) => ({\n ...block,\n content: mapContent(block.content),\n children: block.children?.length ? mapBlocks(block.children, mapContent) : [],\n }));\n}\n\nfunction preprocessCustomInlineContent(\n blocks: BlockNote[],\n placeholderToTag: Map<string, string>,\n nextPlaceholderIndex: { value: number },\n): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type === 'reference') {\n const id = String(inline.props?.id || '');\n const title = String(inline.props?.title || inline.props?.id || '');\n\n return {\n type: 'text',\n text: isValidNoteIdString(id) ? `[[${title}]](note:${id})` : `[[${title}]]`,\n styles: {},\n };\n }\n if (inline.type === 'tag') {\n const tag = (inline.props?.tag as string) || '';\n const placeholder = createTagPlaceholder(nextPlaceholderIndex.value++);\n placeholderToTag.set(placeholder, tag);\n return {\n type: 'text',\n text: placeholder,\n styles: {},\n };\n }\n return inline;\n }),\n );\n}\n\nfunction restoreTagPlaceholdersInMarkdown(markdown: string, placeholderToTag: Map<string, string>) {\n let restoredMarkdown = markdown;\n\n for (const [placeholder, tag] of placeholderToTag.entries()) {\n restoredMarkdown = restoredMarkdown.split(placeholder).join(`[${tag}]`);\n }\n\n return restoredMarkdown;\n}\n\nfunction preprocessMarkdownExplicitTags(markdown: string) {\n const placeholderToTag = new Map<string, string>();\n let nextPlaceholderIndex = 0;\n const preprocessedMarkdown = markdown.replace(/\\[([@#][^\\s[\\]]+)\\]/g, (_match, tagToken: string) => {\n const placeholder = createTagPlaceholder(nextPlaceholderIndex++);\n placeholderToTag.set(placeholder, tagToken);\n return placeholder;\n });\n\n return {\n markdown: preprocessedMarkdown,\n placeholderToTag,\n };\n}\n\nfunction preprocessMarkdownExplicitReferences(markdown: string) {\n const placeholderToReference = new Map<string, { id: string; title: string; token: string }>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n const preprocessedLines = markdown.split(/(?<=\\n)/).map((line) => {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n return line;\n }\n\n if (fenceMatch?.[1]) {\n activeFence = {\n marker: fenceMatch[1][0] as '`' | '~',\n length: fenceMatch[1].length,\n };\n return line;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n return line;\n }\n\n return `${replaceMarkdownLineExplicitReferences(lineBody, placeholderToReference)}${lineEnding}`;\n });\n\n return {\n markdown: preprocessedLines.join(''),\n placeholderToReference,\n };\n}\n\nfunction replaceMarkdownLineExplicitReferences(\n line: string,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n\n if (!codeSpan) {\n result += replaceExplicitReferenceTokens(line.slice(cursor), placeholderToReference);\n break;\n }\n\n result += replaceExplicitReferenceTokens(line.slice(cursor, codeSpan.start), placeholderToReference);\n result += line.slice(codeSpan.start, codeSpan.end);\n cursor = codeSpan.end;\n }\n\n return result;\n}\n\nfunction replaceExplicitReferenceTokens(\n text: string,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n return text.replace(/\\[\\[([^\\n]+?)\\]\\]\\(note:([^)\\s]+)\\)/g, (token, title: string, id: string) => {\n const placeholder = createReferencePlaceholder(placeholderToReference.size);\n placeholderToReference.set(placeholder, { id, title, token });\n return placeholder;\n });\n}\n\nconst MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\\n]+)>/g;\nconst MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\\d)~(?=\\d)/g;\nconst MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;\nconst ANGLE_BRACKET_PLACEHOLDER_PREFIX = '\\uE000OBANGLE';\nconst ANGLE_BRACKET_PLACEHOLDER_SUFFIX = '\\uE001';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = '\\uE000OBTILDE';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = '\\uE001';\nconst HARD_BREAK_PLACEHOLDER_PREFIX = '\\uE000OBHARDBREAK';\nconst HARD_BREAK_PLACEHOLDER_SUFFIX = '\\uE001';\nconst MAX_SQLITE_INT_ID = 2_147_483_647;\n\nfunction isMarkdownAutolinkAngleBracketText(innerText: string) {\n if (innerText !== innerText.trim()) {\n return false;\n }\n\n return /^[a-z][a-z0-9.+-]{1,31}:[^\\s<>]*$/i.test(innerText) || /^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(innerText);\n}\n\nfunction countLiteralAngleBracketTextTokens(markdown: string) {\n const tokenCounts = new Map<string, number>();\n\n for (const match of markdown.matchAll(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN)) {\n const token = match[0];\n const innerText = match[1] ?? '';\n\n if (!token || isMarkdownAutolinkAngleBracketText(innerText)) {\n continue;\n }\n\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n\n return tokenCounts;\n}\n\nexport function extractLiteralAngleBracketTextTokens(markdown: string) {\n return [...countLiteralAngleBracketTextTokens(markdown).keys()];\n}\n\nexport function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCounts = countLiteralAngleBracketTextTokens(sourceMarkdown);\n\n if (sourceCounts.size === 0) {\n return false;\n }\n\n const renderedCounts = countLiteralAngleBracketTextTokens(renderedMarkdown);\n\n for (const [token, sourceCount] of sourceCounts) {\n if ((renderedCounts.get(token) ?? 0) < sourceCount) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction countNumericTildeRangeMarkers(markdown: string) {\n return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;\n}\n\nexport function hasNumericTildeRangeMarkers(markdown: string) {\n return countNumericTildeRangeMarkers(markdown) > 0;\n}\n\nexport function hasNumericTildeRangeMarkerLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);\n\n return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;\n}\n\nfunction protectMarkdownNumericTildeRanges(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownLineEndHardBreakMarkers(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n const lines = markdown.split(/(?<=\\n)/);\n\n for (const [index, line] of lines.entries()) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n const nextLineBody = splitMarkdownLineEnding(lines[index + 1] ?? '').body;\n protectedLines.push(\n `${protectMarkdownLineEndHardBreakMarker(\n lineBody,\n lineEnding,\n isMarkdownHardBreakContinuationLine(nextLineBody),\n placeholderToToken,\n )}${lineEnding}`,\n );\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownTextAngleBrackets(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction splitMarkdownLineEnding(line: string) {\n if (line.endsWith('\\r\\n')) {\n return {\n body: line.slice(0, -2),\n lineEnding: '\\r\\n',\n };\n }\n\n if (line.endsWith('\\n')) {\n return {\n body: line.slice(0, -1),\n lineEnding: '\\n',\n };\n }\n\n return {\n body: line,\n lineEnding: '',\n };\n}\n\nfunction isClosingFenceLine(line: string, fence: { marker: '`' | '~'; length: number }) {\n const escapedMarker = fence.marker === '`' ? '`' : '~';\n return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);\n}\n\nfunction protectMarkdownLineTextAngleBrackets(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);\n break;\n }\n\n const codeEndExclusive = codeEnd + delimiterLength;\n result += line.slice(codeStart, codeEndExclusive);\n cursor = codeEndExclusive;\n }\n\n return result;\n}\n\nfunction protectMarkdownLineNumericTildeRanges(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);\n\n if (!protectedSpan) {\n result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);\n result += line.slice(protectedSpan.start, protectedSpan.end);\n cursor = protectedSpan.end;\n }\n\n return result;\n}\n\nfunction findNextMarkdownProtectedSpan(line: string, cursor: number) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);\n\n if (!codeSpan) {\n return linkDestinationSpan;\n }\n\n if (!linkDestinationSpan) {\n return codeSpan;\n }\n\n return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;\n}\n\nfunction findNextInlineCodeSpan(line: string, cursor: number) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n return null;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n return null;\n }\n\n return {\n start: codeStart,\n end: codeEnd + delimiterLength,\n };\n}\n\nfunction findNextMarkdownLinkDestinationSpan(line: string, cursor: number) {\n const linkDestinationPrefix = line.indexOf('](', cursor);\n\n if (linkDestinationPrefix === -1) {\n return null;\n }\n\n const destinationStart = linkDestinationPrefix + 2;\n const destinationEnd = line.indexOf(')', destinationStart);\n\n if (destinationEnd === -1) {\n return null;\n }\n\n return {\n start: destinationStart,\n end: destinationEnd,\n };\n}\n\nfunction replaceLiteralAngleBracketTextTokens(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText: string) => {\n if (isMarkdownAutolinkAngleBracketText(innerText)) {\n return match;\n }\n\n const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, match);\n\n return placeholder;\n });\n}\n\nfunction replaceNumericTildeRangeMarkers(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit: string) => {\n const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, '~');\n\n return `${leadingDigit}${placeholder}`;\n });\n}\n\nfunction protectMarkdownLineEndHardBreakMarker(\n line: string,\n lineEnding: string,\n hasContinuationLine: boolean,\n placeholderToToken: Map<string, string>,\n) {\n if (!lineEnding || !line.endsWith('\\\\')) {\n return line;\n }\n\n const placeholder = createHardBreakPlaceholder(placeholderToToken.size);\n const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);\n placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? '' : '\\\\');\n\n return `${line.slice(0, -1)}${placeholder}`;\n}\n\nfunction isMarkdownHardBreakContinuationLine(line: string) {\n if (!line.trim()) {\n return false;\n }\n\n const trimmedLine = line.trimStart();\n\n if (trimmedLine.match(MARKDOWN_FENCED_CODE_PATTERN)) {\n return false;\n }\n\n if (/^(?:#{1,6})(?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^>/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:[-+*])(?:\\s|$)/.test(trimmedLine) || /^\\d{1,9}[.)](?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/.test(trimmedLine)) {\n return false;\n }\n\n return true;\n}\n\nfunction hasUnclosedInlineCodeSpanAtLineEnd(line: string) {\n let cursor = 0;\n let openDelimiter: string | null = null;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n break;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const delimiter = '`'.repeat(delimiterLength);\n openDelimiter = openDelimiter === delimiter ? null : delimiter;\n cursor = codeStart + delimiterLength;\n }\n\n return openDelimiter !== null;\n}\n\nfunction createAngleBracketPlaceholder(index: number) {\n return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createNumericTildeRangePlaceholder(index: number) {\n return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createHardBreakPlaceholder(index: number) {\n return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction countRepeatedCharacter(value: string, start: number, character: string) {\n let cursor = start;\n\n while (value[cursor] === character) {\n cursor += 1;\n }\n\n return cursor - start;\n}\n\nfunction findTagPlaceholderAtCursor(text: string, cursor: number, placeholderToTag: Map<string, string>) {\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n tagToken,\n };\n }\n }\n\n return null;\n}\n\nfunction findReferencePlaceholderAtCursor(\n text: string,\n cursor: number,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n for (const [placeholder, reference] of placeholderToReference.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n reference,\n };\n }\n }\n\n return null;\n}\n\nfunction restoreRemainingTagPlaceholders(blocks: BlockNote[], placeholderToTag: Map<string, string>): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type !== 'text' || typeof inline.text !== 'string') {\n return inline;\n }\n\n let text = inline.text;\n\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n text = text.split(placeholder).join(`[${tagToken}]`);\n }\n\n return {\n ...inline,\n text,\n };\n }),\n );\n}\n\nfunction restoreProtectedTextPlaceholders(blocks: BlockNote[], placeholderToToken: Map<string, string>): BlockNote[] {\n if (placeholderToToken.size === 0) {\n return blocks;\n }\n\n return mapBlocks(blocks, (content) =>\n mapBlockContent(\n content,\n (inline) => restoreProtectedTextInValue(inline, placeholderToToken) as BlockNoteInline,\n ),\n );\n}\n\nfunction restoreProtectedTextInValue(value: unknown, placeholderToToken: Map<string, string>): unknown {\n if (typeof value === 'string') {\n return restoreProtectedText(value, placeholderToToken);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => restoreProtectedTextInValue(item, placeholderToToken));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, restoreProtectedTextInValue(item, placeholderToToken)]),\n );\n }\n\n return value;\n}\n\nfunction restoreProtectedText(text: string, placeholderToToken: Map<string, string>) {\n let restoredText = text;\n\n for (const [placeholder, token] of placeholderToToken.entries()) {\n restoredText = restoredText.split(placeholder).join(token);\n }\n\n return restoredText;\n}\n\nfunction createTextInline(text: string, styles: Record<string, unknown> = {}): BlockNoteInline {\n return {\n type: 'text',\n text,\n styles,\n };\n}\n\nfunction appendInline(target: BlockNoteInline[], inline: BlockNoteInline) {\n const previous = target.at(-1);\n\n if (\n previous?.type === 'text' &&\n inline.type === 'text' &&\n previous.text !== undefined &&\n inline.text !== undefined &&\n JSON.stringify(previous.styles ?? {}) === JSON.stringify(inline.styles ?? {})\n ) {\n previous.text += inline.text;\n return;\n }\n\n target.push(inline);\n}\n\nasync function restoreCustomInlineContent(\n blocks: BlockNote[],\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToReference: Map<string, { id: string; title: string; token: string }> = new Map(),\n): Promise<BlockNote[]> {\n const tagCache = new Map<string, Promise<{ id: string; tag: string }>>();\n const noteCache = new Map<string, Promise<Array<{ id: string; title: string }>>>();\n const noteByIdCache = new Map<string, Promise<{ id: string; title: string } | null>>();\n\n const getTag = (token: string) => {\n const normalizedToken = token.startsWith('#') ? `@${token.slice(1)}` : token;\n let existing = tagCache.get(normalizedToken);\n\n if (!existing) {\n existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({\n id: 'tag' in result ? result.tag.id : result.id,\n tag: 'tag' in result ? result.tag.name : result.name,\n }));\n tagCache.set(normalizedToken, existing);\n }\n\n return existing;\n };\n\n const getNotesByTitle = (title: string) => {\n let existing = noteCache.get(title);\n\n if (!existing) {\n existing = deps.findNotesByTitle(title);\n noteCache.set(title, existing);\n }\n\n return existing;\n };\n\n const getNoteById = (id: string) => {\n let existing = noteByIdCache.get(id);\n\n if (!existing) {\n existing = deps.findNoteById ? deps.findNoteById(id) : Promise.resolve(null);\n noteByIdCache.set(id, existing);\n }\n\n return existing;\n };\n\n const restoreTextInline = async (inline: BlockNoteInline): Promise<BlockNoteInline[]> => {\n if (inline.type !== 'text' || typeof inline.text !== 'string' || !inline.text || inline.styles?.code === true) {\n return [inline];\n }\n\n const restored: BlockNoteInline[] = [];\n const styles = inline.styles ?? {};\n let cursor = 0;\n\n while (cursor < inline.text.length) {\n const referencePlaceholderMatch = findReferencePlaceholderAtCursor(\n inline.text,\n cursor,\n placeholderToReference,\n );\n\n if (referencePlaceholderMatch) {\n if (!isValidNoteIdString(referencePlaceholderMatch.reference.id)) {\n appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));\n cursor += referencePlaceholderMatch.placeholder.length;\n continue;\n }\n\n const note = await getNoteById(referencePlaceholderMatch.reference.id);\n\n if (note) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: note.id,\n title: note.title,\n },\n });\n } else {\n appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));\n }\n\n cursor += referencePlaceholderMatch.placeholder.length;\n continue;\n }\n\n if (inline.text.startsWith('[[', cursor)) {\n const closeIndex = inline.text.indexOf(']]', cursor + 2);\n\n if (closeIndex !== -1) {\n const title = inline.text.slice(cursor + 2, closeIndex);\n const matchingNotes = await getNotesByTitle(title);\n\n if (matchingNotes.length === 1) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: matchingNotes[0].id,\n title: matchingNotes[0].title,\n },\n });\n cursor = closeIndex + 2;\n continue;\n }\n }\n }\n\n const tagPlaceholderMatch = findTagPlaceholderAtCursor(inline.text, cursor, placeholderToTag);\n\n if (tagPlaceholderMatch) {\n const tag = await getTag(tagPlaceholderMatch.tagToken);\n appendInline(restored, {\n type: 'tag',\n props: tag,\n });\n cursor += tagPlaceholderMatch.placeholder.length;\n continue;\n }\n\n let nextCursor = inline.text.length;\n\n const nextReferenceCursor = inline.text.indexOf('[[', cursor + 1);\n\n if (nextReferenceCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextReferenceCursor);\n }\n\n for (const placeholder of placeholderToTag.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n for (const placeholder of placeholderToReference.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));\n cursor = nextCursor;\n }\n\n return restored;\n };\n\n const restoreBlocks = async (items: BlockNote[]): Promise<BlockNote[]> => {\n return Promise.all(\n items.map(async (block) => {\n if (block.type === 'codeBlock') {\n return {\n ...block,\n children: block.children?.length ? await restoreBlocks(block.children) : [],\n };\n }\n\n return {\n ...block,\n content: await mapBlockContentAsync(block.content, restoreTextInline),\n children: block.children?.length ? await restoreBlocks(block.children) : [],\n };\n }),\n );\n };\n\n return restoreBlocks(blocks);\n}\n\nfunction collectTagIds(blocks: BlockNote[]): string[] {\n const tagIds = new Set<string>();\n\n const visit = (items: BlockNote[]) => {\n for (const block of items) {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'tag' && typeof inline.props?.id === 'string') {\n tagIds.add(inline.props.id);\n }\n });\n\n if (block.children?.length) {\n visit(block.children);\n }\n }\n };\n\n visit(blocks);\n return [...tagIds];\n}\n\nlet editorInstance: ServerBlockNoteEditor | null = null;\n\nfunction getEditor(): ServerBlockNoteEditor {\n if (!editorInstance) {\n editorInstance = ServerBlockNoteEditor.create();\n }\n return editorInstance;\n}\n\nexport async function blocksToMarkdown(contentJson: string): Promise<string> {\n try {\n const blocks = parseBlockNoteContent(contentJson);\n const supportedBlocks = stripUnsupportedMarkdownBlocks(blocks);\n const placeholderToTag = new Map<string, string>();\n const processed = preprocessCustomInlineContent(supportedBlocks, placeholderToTag, { value: 0 });\n const editor = getEditor();\n const markdown = await editor.blocksToMarkdownLossy(\n processed as Parameters<typeof editor.blocksToMarkdownLossy>[0],\n );\n return restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag);\n } catch {\n return '';\n }\n}\n\nexport async function markdownToBlocksJson(\n markdown: string,\n deps: MarkdownImportDeps = defaultMarkdownImportDeps,\n): Promise<string> {\n const editor = getEditor();\n const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);\n const preprocessedReferenceMarkdown = preprocessMarkdownExplicitReferences(preprocessedMarkdown.markdown);\n const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedReferenceMarkdown.markdown);\n const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);\n const basePlaceholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...hardBreakProtectedMarkdown.placeholderToToken,\n ]);\n const contentJson = await parseMarkdownToContentJson(\n editor,\n hardBreakProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n preprocessedReferenceMarkdown.placeholderToReference,\n basePlaceholderToToken,\n );\n\n if (extractLiteralAngleBracketTextTokens(preprocessedReferenceMarkdown.markdown).length === 0) {\n return contentJson;\n }\n\n if (\n !hasLiteralAngleBracketTextTokenLoss(\n preprocessedReferenceMarkdown.markdown,\n await blocksToMarkdown(contentJson),\n )\n ) {\n return contentJson;\n }\n\n const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);\n const placeholderToToken = new Map([...basePlaceholderToToken, ...protectedMarkdown.placeholderToToken]);\n\n return parseMarkdownToContentJson(\n editor,\n protectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n preprocessedReferenceMarkdown.placeholderToReference,\n placeholderToToken,\n );\n}\n\nasync function parseMarkdownToContentJson(\n editor: ServerBlockNoteEditor,\n markdown: string,\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToReference: Map<string, { id: string; title: string; token: string }> = new Map(),\n placeholderToProtectedTextToken: Map<string, string> = new Map(),\n) {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n const restoredBlocks = await restoreCustomInlineContent(\n blocks as BlockNote[],\n deps,\n placeholderToTag,\n placeholderToReference,\n );\n const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);\n const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(\n restoredTagBlocks,\n placeholderToProtectedTextToken,\n );\n\n return JSON.stringify(restoredProtectedTextBlocks);\n}\n\nexport function extractTagIdsFromContentJson(contentJson: string): string[] {\n const blocks = parseBlockNoteContent(contentJson);\n return collectTagIds(blocks);\n}\n\nexport function hasUnsupportedMarkdownBlocks(contentJson: string): boolean {\n try {\n let hasUnsupportedBlock = false;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n if (UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type)) {\n hasUnsupportedBlock = true;\n }\n });\n\n return hasUnsupportedBlock;\n } catch {\n return false;\n }\n}\n\nexport function countReferenceInlinesFromContentJson(contentJson: string): number {\n try {\n let count = 0;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'reference') {\n count += 1;\n }\n });\n });\n\n return count;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/data-maintenance.ts"],"sourcesContent":["import { backfillStaleNoteSearchText } from '~/features/note/services/search-backfill.js';\n\nexport interface DataMaintenanceJobResult {\n key: string;\n processedCount: number;\n}\n\ninterface DataMaintenanceSchedulerOptions {\n intervalMs?: number;\n onError?: (error: unknown) => void;\n onResults?: (results: DataMaintenanceJobResult[]) => void;\n runInBackground?: (limit?: number) => Promise<DataMaintenanceJobResult[]>;\n}\n\ninterface DataMaintenanceJob {\n key: string;\n run: (limit?: number) => Promise<number>;\n}\n\ninterface DataMaintenanceService {\n runNow: (limit?: number) => Promise<DataMaintenanceJobResult[]>;\n runInBackground: (limit?: number) => Promise<DataMaintenanceJobResult[]>;\n}\n\nlet activeDataMaintenanceTimer: ReturnType<typeof setInterval> | null = null;\nconst DEFAULT_DATA_MAINTENANCE_INTERVAL_MS = 15 * 60 * 1000;\n\nexport const createDataMaintenanceService = (jobs: DataMaintenanceJob[]): DataMaintenanceService => {\n let activeDataMaintenancePromise: Promise<DataMaintenanceJobResult[]> | null = null;\n\n const runNow = async (limit?: number) => {\n const results: DataMaintenanceJobResult[] = [];\n\n for (const job of jobs) {\n const processedCount = await job.run(limit);\n\n if (processedCount > 0) {\n results.push({\n key: job.key,\n processedCount,\n });\n }\n }\n\n return results;\n };\n\n const runInBackground = (limit?: number) => {\n if (activeDataMaintenancePromise) {\n return activeDataMaintenancePromise;\n }\n\n activeDataMaintenancePromise = runNow(limit).finally(() => {\n activeDataMaintenancePromise = null;\n });\n\n return activeDataMaintenancePromise;\n };\n\n return {\n runNow,\n runInBackground,\n };\n};\n\nconst defaultDataMaintenanceService = createDataMaintenanceService([\n {\n key: 'note-search-projection',\n run: backfillStaleNoteSearchText,\n },\n]);\n\nexport const runDataMaintenance = async (limit?: number) => {\n return defaultDataMaintenanceService.runNow(limit);\n};\n\nexport const runDataMaintenanceInBackground = (limit?: number) => {\n return defaultDataMaintenanceService.runInBackground(limit);\n};\n\nexport const startDataMaintenanceScheduler = (options: DataMaintenanceSchedulerOptions = {}) => {\n if (activeDataMaintenanceTimer) {\n return () => undefined;\n }\n\n const intervalMs = options.intervalMs ?? DEFAULT_DATA_MAINTENANCE_INTERVAL_MS;\n\n const tick = () => {\n const runInBackground = options.runInBackground ?? runDataMaintenanceInBackground;\n\n void runInBackground()\n .then((results) => {\n options.onResults?.(results);\n })\n .catch((error) => {\n options.onError?.(error);\n });\n };\n\n tick();\n\n activeDataMaintenanceTimer = setInterval(tick, intervalMs);\n activeDataMaintenanceTimer.unref?.();\n\n return () => {\n if (!activeDataMaintenanceTimer) {\n return;\n }\n\n clearInterval(activeDataMaintenanceTimer);\n activeDataMaintenanceTimer = null;\n };\n};\n"],"mappings":"AAAA,SAAS,mCAAmC;AAwB5C,IAAI,6BAAoE;AACxE,MAAM,uCAAuC,KAAK,KAAK;AAEhD,MAAM,+BAA+B,CAAC,SAAuD;AAChG,MAAI,+BAA2E;AAE/E,QAAM,SAAS,OAAO,UAAmB;AACrC,UAAM,UAAsC,CAAC;AAE7C,eAAW,OAAO,MAAM;AACpB,YAAM,iBAAiB,MAAM,IAAI,IAAI,KAAK;AAE1C,UAAI,iBAAiB,GAAG;AACpB,gBAAQ,KAAK;AAAA,UACT,KAAK,IAAI;AAAA,UACT;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,UAAmB;AACxC,QAAI,8BAA8B;AAC9B,aAAO;AAAA,IACX;AAEA,mCAA+B,OAAO,KAAK,EAAE,QAAQ,MAAM;AACvD,qCAA+B;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,MAAM,gCAAgC,6BAA6B;AAAA,EAC/D;AAAA,IACI,KAAK;AAAA,IACL,KAAK;AAAA,EACT;AACJ,CAAC;AAEM,MAAM,qBAAqB,OAAO,UAAmB;AACxD,SAAO,8BAA8B,OAAO,KAAK;AACrD;AAEO,MAAM,iCAAiC,CAAC,UAAmB;AAC9D,SAAO,8BAA8B,gBAAgB,KAAK;AAC9D;AAEO,MAAM,gCAAgC,CAAC,UAA2C,CAAC,MAAM;AAC5F,MAAI,4BAA4B;AAC5B,WAAO,MAAM;AAAA,EACjB;AAEA,QAAM,aAAa,QAAQ,cAAc;AAEzC,QAAM,OAAO,MAAM;AACf,UAAM,kBAAkB,QAAQ,mBAAmB;AAEnD,SAAK,gBAAgB,EAChB,KAAK,CAAC,YAAY;AACf,cAAQ,YAAY,OAAO;AAAA,IAC/B,CAAC,EACA,MAAM,CAAC,UAAU;AACd,cAAQ,UAAU,KAAK;AAAA,IAC3B,CAAC;AAAA,EACT;AAEA,OAAK;AAEL,+BAA6B,YAAY,MAAM,UAAU;AACzD,6BAA2B,QAAQ;AAEnC,SAAO,MAAM;AACT,QAAI,CAAC,4BAA4B;AAC7B;AAAA,IACJ;AAEA,kBAAc,0BAA0B;AACxC,iCAA6B;AAAA,EACjC;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/error-handler.ts"],"sourcesContent":["import type { ErrorRequestHandler } from 'express';\n\nexport class AppError extends Error {\n code: string;\n status: number;\n details?: unknown;\n\n constructor(status: number, code: string, message: string, details?: unknown) {\n super(message);\n this.name = 'AppError';\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nexport const createAppError = (status: number, code: string, message: string, details?: unknown) => {\n return new AppError(status, code, message, details);\n};\n\nexport const createErrorHandler = (): ErrorRequestHandler => {\n return (error, _req, res, next) => {\n if (res.headersSent) {\n next(error);\n return;\n }\n\n if (error instanceof AppError) {\n res.status(error.status)\n .json({\n code: error.code,\n message: error.message,\n ...(error.details ? { details: error.details } : {}),\n })\n .end();\n return;\n }\n\n if (error instanceof Error && error.message.startsWith('CSRF token ')) {\n res.status(403)\n .json({\n code: 'CSRF_TOKEN_INVALID',\n message: error.message,\n })\n .end();\n return;\n }\n\n const message = error instanceof Error ? error.stack || error.message : String(error);\n process.stderr.write(`[error] ${message}\\n`);\n\n res.status(500)\n .json({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Internal Server Error',\n })\n .end();\n };\n};\n"],"mappings":"AAEO,MAAM,iBAAiB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgB,MAAc,SAAiB,SAAmB;AAC1E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AACJ;AAEO,MAAM,iBAAiB,CAAC,QAAgB,MAAc,SAAiB,YAAsB;AAChG,SAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,OAAO;AACtD;AAEO,MAAM,qBAAqB,MAA2B;AACzD,SAAO,CAAC,OAAO,MAAM,KAAK,SAAS;AAC/B,QAAI,IAAI,aAAa;AACjB,WAAK,KAAK;AACV;AAAA,IACJ;AAEA,QAAI,iBAAiB,UAAU;AAC3B,UAAI,OAAO,MAAM,MAAM,EAClB,KAAK;AAAA,QACF,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MACtD,CAAC,EACA,IAAI;AACT;AAAA,IACJ;AAEA,QAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,aAAa,GAAG;AACnE,UAAI,OAAO,GAAG,EACT,KAAK;AAAA,QACF,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,MACnB,CAAC,EACA,IAAI;AACT;AAAA,IACJ;AAEA,UAAM,UAAU,iBAAiB,QAAQ,MAAM,SAAS,MAAM,UAAU,OAAO,KAAK;AACpF,YAAQ,OAAO,MAAM,WAAW,OAAO;AAAA,CAAI;AAE3C,QAAI,OAAO,GAAG,EACT,KAAK;AAAA,MACF,MAAM;AAAA,MACN,SAAS;AAAA,IACb,CAAC,EACA,IAAI;AAAA,EACb;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/graphql.ts"],"sourcesContent":["export function gql(texts: TemplateStringsArray, ...values: unknown[]) {\n return texts.map((text, i) => text + (values[i] || '')).join('');\n}\n"],"mappings":"AAAO,SAAS,IAAI,UAAgC,QAAmB;AACnE,SAAO,MAAM,IAAI,CAAC,MAAM,MAAM,QAAQ,OAAO,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE;AACnE;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/logger.ts"],"sourcesContent":["import type { LoggerOptions } from 'express-winston';\nimport expressWinston from 'express-winston';\nimport type { TransformableInfo } from 'logform';\nimport winston from 'winston';\n\nexport const loggerOptions: LoggerOptions = {\n transports: [new winston.transports.Console()],\n meta: true,\n requestWhitelist: ['httpVersion', 'method', 'originalUrl', 'url', 'query', 'params', 'ip', 'headers'],\n responseWhitelist: ['statusCode'],\n headerBlacklist: ['authorization', 'cookie', 'set-cookie', 'x-api-key'],\n requestFilter: (\n req: { headers?: Record<string, string | string[] | undefined> } & Record<string, unknown>,\n propName: string,\n ): unknown => {\n if (propName === 'headers') {\n const h = req.headers || {};\n return {\n 'user-agent': h['user-agent'],\n 'content-type': h['content-type'],\n accept: h['accept'],\n 'x-forwarded-for': h['x-forwarded-for'],\n 'x-real-ip': h['x-real-ip'],\n };\n }\n return (req as Record<string, unknown>)[propName];\n },\n responseFilter: (res: Record<string, unknown>, propName: string): unknown => {\n return res[propName];\n },\n format: winston.format.combine(\n winston.format.colorize({ all: true }),\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n winston.format.printf((info: TransformableInfo) => {\n const meta = (info as unknown as { meta?: Record<string, unknown> }).meta || {};\n const req = (meta.req as Record<string, unknown>) || {};\n const res = (meta.res as Record<string, unknown>) || {};\n const rt = (meta as Record<string, unknown>).responseTime as number | undefined;\n const method = req.method as string | undefined;\n const url = (req.originalUrl as string | undefined) || (req.url as string | undefined);\n const status = res.statusCode as number | undefined;\n const headers = (req.headers as Record<string, string> | undefined) || {};\n const ua = headers['user-agent'];\n const fwd = headers['x-forwarded-for'];\n const fwdFirst = typeof fwd === 'string' ? fwd.split(',')[0].trim() : undefined;\n const realIp = fwdFirst || headers['x-real-ip'];\n const socketIp =\n (req as unknown as { ip?: string; socket?: { remoteAddress?: string } }).ip ||\n (req as unknown as { socket?: { remoteAddress?: string } }).socket?.remoteAddress;\n const clientIp = fwdFirst || realIp || socketIp || '';\n return `${info.timestamp as string} ${info.level as string}: [${status ?? ''}] ${method || ''} ${url || ''} ${rt ?? ''}ms ip=\"${clientIp}\" ua=\"${ua || ''}\"`;\n }),\n ),\n colorize: true,\n expressFormat: false,\n};\n\nexport default expressWinston.logger(loggerOptions);\n"],"mappings":"AACA,OAAO,oBAAoB;AAE3B,OAAO,aAAa;AAEb,MAAM,gBAA+B;AAAA,EACxC,YAAY,CAAC,IAAI,QAAQ,WAAW,QAAQ,CAAC;AAAA,EAC7C,MAAM;AAAA,EACN,kBAAkB,CAAC,eAAe,UAAU,eAAe,OAAO,SAAS,UAAU,MAAM,SAAS;AAAA,EACpG,mBAAmB,CAAC,YAAY;AAAA,EAChC,iBAAiB,CAAC,iBAAiB,UAAU,cAAc,WAAW;AAAA,EACtE,eAAe,CACX,KACA,aACU;AACV,QAAI,aAAa,WAAW;AACxB,YAAM,IAAI,IAAI,WAAW,CAAC;AAC1B,aAAO;AAAA,QACH,cAAc,EAAE,YAAY;AAAA,QAC5B,gBAAgB,EAAE,cAAc;AAAA,QAChC,QAAQ,EAAE,QAAQ;AAAA,QAClB,mBAAmB,EAAE,iBAAiB;AAAA,QACtC,aAAa,EAAE,WAAW;AAAA,MAC9B;AAAA,IACJ;AACA,WAAQ,IAAgC,QAAQ;AAAA,EACpD;AAAA,EACA,gBAAgB,CAAC,KAA8B,aAA8B;AACzE,WAAO,IAAI,QAAQ;AAAA,EACvB;AAAA,EACA,QAAQ,QAAQ,OAAO;AAAA,IACnB,QAAQ,OAAO,SAAS,EAAE,KAAK,KAAK,CAAC;AAAA,IACrC,QAAQ,OAAO,UAAU,EAAE,QAAQ,sBAAsB,CAAC;AAAA,IAC1D,QAAQ,OAAO,OAAO,CAAC,SAA4B;AAC/C,YAAM,OAAQ,KAAuD,QAAQ,CAAC;AAC9E,YAAM,MAAO,KAAK,OAAmC,CAAC;AACtD,YAAM,MAAO,KAAK,OAAmC,CAAC;AACtD,YAAM,KAAM,KAAiC;AAC7C,YAAM,SAAS,IAAI;AACnB,YAAM,MAAO,IAAI,eAAuC,IAAI;AAC5D,YAAM,SAAS,IAAI;AACnB,YAAM,UAAW,IAAI,WAAkD,CAAC;AACxE,YAAM,KAAK,QAAQ,YAAY;AAC/B,YAAM,MAAM,QAAQ,iBAAiB;AACrC,YAAM,WAAW,OAAO,QAAQ,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI;AACtE,YAAM,SAAS,YAAY,QAAQ,WAAW;AAC9C,YAAM,WACD,IAAwE,MACxE,IAA2D,QAAQ;AACxE,YAAM,WAAW,YAAY,UAAU,YAAY;AACnD,aAAO,GAAG,KAAK,SAAmB,IAAI,KAAK,KAAe,MAAM,UAAU,EAAE,KAAK,UAAU,EAAE,IAAI,OAAO,EAAE,IAAI,MAAM,EAAE,UAAU,QAAQ,SAAS,MAAM,EAAE;AAAA,IAC7J,CAAC;AAAA,EACL;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AACnB;AAEA,IAAO,iBAAQ,eAAe,OAAO,aAAa;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/mcp-auth.ts"],"sourcesContent":["import type { NextFunction, Request, RequestHandler, Response } from 'express';\nimport type { ValidationRule } from 'graphql';\nimport { GraphQLError } from 'graphql';\n\nimport type { AuthConfig } from './auth-mode.js';\n\nexport interface McpTokenValidationResult {\n ok: boolean;\n reason?: 'not_configured' | 'forbidden';\n}\n\nexport interface McpAdminAuthPort {\n getStatus: () => Promise<{ enabled: boolean }>;\n validatePresentedToken: (token: string) => Promise<McpTokenValidationResult>;\n}\n\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\n\nconst readBearerToken = (authorizationHeader?: string) => {\n if (!authorizationHeader?.startsWith('Bearer ')) {\n return undefined;\n }\n\n return authorizationHeader.slice('Bearer '.length).trim() || undefined;\n};\n\nexport const createMcpAuthMiddleware = (_authConfig: AuthConfig, mcpAdminAuth: McpAdminAuthPort): RequestHandler => {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const status = await mcpAdminAuth.getStatus();\n if (!status.enabled) {\n res.status(403)\n .set(JSON_HEADERS)\n .json({\n code: 'MCP_DISABLED',\n message: 'MCP access is disabled by admin.',\n })\n .end();\n return;\n }\n\n const bearerToken = readBearerToken(req.headers.authorization);\n\n if (!bearerToken) {\n res.status(401)\n .set(JSON_HEADERS)\n .json({\n code: 'UNAUTHORIZED',\n message: 'A valid MCP bearer token is required.',\n })\n .end();\n return;\n }\n\n const validation = await mcpAdminAuth.validatePresentedToken(bearerToken);\n\n if (!validation.ok && validation.reason === 'not_configured') {\n res.status(503)\n .set(JSON_HEADERS)\n .json({\n code: 'MCP_AUTH_NOT_CONFIGURED',\n message: 'MCP bearer auth is not configured.',\n })\n .end();\n return;\n }\n\n if (!validation.ok) {\n res.status(403)\n .set(JSON_HEADERS)\n .json({\n code: 'FORBIDDEN',\n message: 'Invalid MCP bearer token.',\n })\n .end();\n return;\n }\n\n next();\n } catch (error) {\n next(error);\n }\n };\n};\n\nexport const createReadOnlyMcpValidationRule = (): ValidationRule => {\n return (context) => {\n return {\n OperationDefinition(node) {\n if (node.operation === 'query') {\n return;\n }\n\n context.reportError(\n new GraphQLError('MCP endpoint is read-only', {\n nodes: [node],\n extensions: { code: 'FORBIDDEN' },\n }),\n );\n },\n };\n };\n};\n"],"mappings":"AAEA,SAAS,oBAAoB;AAc7B,MAAM,eAAe,EAAE,gBAAgB,mBAAmB;AAE1D,MAAM,kBAAkB,CAAC,wBAAiC;AACtD,MAAI,CAAC,qBAAqB,WAAW,SAAS,GAAG;AAC7C,WAAO;AAAA,EACX;AAEA,SAAO,oBAAoB,MAAM,UAAU,MAAM,EAAE,KAAK,KAAK;AACjE;AAEO,MAAM,0BAA0B,CAAC,aAAyB,iBAAmD;AAChH,SAAO,OAAO,KAAc,KAAe,SAAuB;AAC9D,QAAI;AACA,YAAM,SAAS,MAAM,aAAa,UAAU;AAC5C,UAAI,CAAC,OAAO,SAAS;AACjB,YAAI,OAAO,GAAG,EACT,IAAI,YAAY,EAChB,KAAK;AAAA,UACF,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC,EACA,IAAI;AACT;AAAA,MACJ;AAEA,YAAM,cAAc,gBAAgB,IAAI,QAAQ,aAAa;AAE7D,UAAI,CAAC,aAAa;AACd,YAAI,OAAO,GAAG,EACT,IAAI,YAAY,EAChB,KAAK;AAAA,UACF,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC,EACA,IAAI;AACT;AAAA,MACJ;AAEA,YAAM,aAAa,MAAM,aAAa,uBAAuB,WAAW;AAExE,UAAI,CAAC,WAAW,MAAM,WAAW,WAAW,kBAAkB;AAC1D,YAAI,OAAO,GAAG,EACT,IAAI,YAAY,EAChB,KAAK;AAAA,UACF,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC,EACA,IAAI;AACT;AAAA,MACJ;AAEA,UAAI,CAAC,WAAW,IAAI;AAChB,YAAI,OAAO,GAAG,EACT,IAAI,YAAY,EAChB,KAAK;AAAA,UACF,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC,EACA,IAAI;AACT;AAAA,MACJ;AAEA,WAAK;AAAA,IACT,SAAS,OAAO;AACZ,WAAK,KAAK;AAAA,IACd;AAAA,EACJ;AACJ;AAEO,MAAM,kCAAkC,MAAsB;AACjE,SAAO,CAAC,YAAY;AAChB,WAAO;AAAA,MACH,oBAAoB,MAAM;AACtB,YAAI,KAAK,cAAc,SAAS;AAC5B;AAAA,QACJ;AAEA,gBAAQ;AAAA,UACJ,IAAI,aAAa,6BAA6B;AAAA,YAC1C,OAAO,CAAC,IAAI;AAAA,YACZ,YAAY,EAAE,MAAM,YAAY;AAAA,UACpC,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/mcp-token.ts"],"sourcesContent":["import crypto from 'crypto';\n\nconst TOKEN_BYTE_LENGTH = 32;\nconst HASH_ALGORITHM = 'sha256';\n\nexport interface IssuedMcpToken {\n plaintext: string;\n hash: string;\n}\n\nconst toTokenHash = (token: string) => {\n return crypto.createHash(HASH_ALGORITHM).update(token, 'utf8').digest('hex');\n};\n\nexport const issueMcpToken = (): IssuedMcpToken => {\n const plaintext = crypto.randomBytes(TOKEN_BYTE_LENGTH).toString('base64url');\n const hash = toTokenHash(plaintext);\n\n return {\n plaintext,\n hash,\n };\n};\n\nexport const verifyMcpToken = (storedHash: string, presentedToken: string) => {\n const presentedHash = toTokenHash(presentedToken);\n const storedBuffer = Buffer.from(storedHash, 'utf8');\n const presentedBuffer = Buffer.from(presentedHash, 'utf8');\n\n if (storedBuffer.length !== presentedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(storedBuffer, presentedBuffer);\n};\n"],"mappings":"AAAA,OAAO,YAAY;AAEnB,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AAOvB,MAAM,cAAc,CAAC,UAAkB;AACnC,SAAO,OAAO,WAAW,cAAc,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK;AAC/E;AAEO,MAAM,gBAAgB,MAAsB;AAC/C,QAAM,YAAY,OAAO,YAAY,iBAAiB,EAAE,SAAS,WAAW;AAC5E,QAAM,OAAO,YAAY,SAAS;AAElC,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAEO,MAAM,iBAAiB,CAAC,YAAoB,mBAA2B;AAC1E,QAAM,gBAAgB,YAAY,cAAc;AAChD,QAAM,eAAe,OAAO,KAAK,YAAY,MAAM;AACnD,QAAM,kBAAkB,OAAO,KAAK,eAAe,MAAM;AAEzD,MAAI,aAAa,WAAW,gBAAgB,QAAQ;AAChD,WAAO;AAAA,EACX;AAEA,SAAO,OAAO,gBAAgB,cAAc,eAAe;AAC/D;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/prisma-runtime.ts"],"sourcesContent":["import { execFileSync } from 'child_process';\nimport { createRequire } from 'module';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface PrismaRuntimeDeps {\n execFileSync: (\n file: string,\n args: string[],\n options: {\n env: NodeJS.ProcessEnv;\n stdio: 'inherit';\n },\n ) => void;\n resolvePrismaCliEntry: () => string;\n}\n\nconst resolveServerRoot = () => {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n return process.env.OCEAN_BRAIN_PACKAGE_ROOT || path.resolve(__dirname, '../..');\n};\n\nexport const resolvePrismaSchemaPath = () => {\n return path.resolve(resolveServerRoot(), 'prisma/schema.prisma');\n};\n\nexport const resolvePrismaCliEntry = () => {\n const require = createRequire(import.meta.url);\n return require.resolve('prisma/build/index.js');\n};\n\nexport const createPrismaRuntime = (deps: PrismaRuntimeDeps) => ({\n runMigrateDeploy: () => {\n deps.execFileSync(\n process.execPath,\n [deps.resolvePrismaCliEntry(), 'migrate', 'deploy', `--schema=${resolvePrismaSchemaPath()}`],\n {\n stdio: 'inherit',\n env: { ...process.env },\n },\n );\n },\n});\n\nconst defaultPrismaRuntime = createPrismaRuntime({\n execFileSync,\n resolvePrismaCliEntry,\n});\n\nexport const runPrismaMigrateDeploy = () => {\n defaultPrismaRuntime.runMigrateDeploy();\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAc9B,MAAM,oBAAoB,MAAM;AAC5B,QAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,SAAO,QAAQ,IAAI,4BAA4B,KAAK,QAAQ,WAAW,OAAO;AAClF;AAEO,MAAM,0BAA0B,MAAM;AACzC,SAAO,KAAK,QAAQ,kBAAkB,GAAG,sBAAsB;AACnE;AAEO,MAAM,wBAAwB,MAAM;AACvC,QAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,SAAOA,SAAQ,QAAQ,uBAAuB;AAClD;AAEO,MAAM,sBAAsB,CAAC,UAA6B;AAAA,EAC7D,kBAAkB,MAAM;AACpB,SAAK;AAAA,MACD,QAAQ;AAAA,MACR,CAAC,KAAK,sBAAsB,GAAG,WAAW,UAAU,YAAY,wBAAwB,CAAC,EAAE;AAAA,MAC3F;AAAA,QACI,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,MAAM,uBAAuB,oBAAoB;AAAA,EAC7C;AAAA,EACA;AACJ,CAAC;AAEM,MAAM,yBAAyB,MAAM;AACxC,uBAAqB,iBAAiB;AAC1C;","names":["require"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/rate-limit.ts"],"sourcesContent":["import { rateLimit } from 'express-rate-limit';\n\nconst AUTH_RATE_LIMIT_MESSAGE = 'Too many authentication attempts. Please try again later.';\nconst SESSION_ACCESS_RATE_LIMIT_MESSAGE = 'Too many authenticated requests. Please try again later.';\n\nexport const createAuthAttemptRateLimit = () =>\n rateLimit({\n windowMs: 15 * 60 * 1000,\n limit: 10,\n standardHeaders: true,\n legacyHeaders: false,\n handler: (_req, res) => {\n res.status(429).json({\n code: 'AUTH_RATE_LIMITED',\n message: AUTH_RATE_LIMIT_MESSAGE,\n });\n },\n });\n\nexport const createSessionAccessRateLimit = () =>\n rateLimit({\n windowMs: 60 * 1000,\n limit: 300,\n standardHeaders: true,\n legacyHeaders: false,\n handler: (_req, res) => {\n res.status(429).json({\n code: 'SESSION_RATE_LIMITED',\n message: SESSION_ACCESS_RATE_LIMIT_MESSAGE,\n });\n },\n });\n"],"mappings":"AAAA,SAAS,iBAAiB;AAE1B,MAAM,0BAA0B;AAChC,MAAM,oCAAoC;AAEnC,MAAM,6BAA6B,MACtC,UAAU;AAAA,EACN,UAAU,KAAK,KAAK;AAAA,EACpB,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,SAAS,CAAC,MAAM,QAAQ;AACpB,QAAI,OAAO,GAAG,EAAE,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AACJ,CAAC;AAEE,MAAM,+BAA+B,MACxC,UAAU;AAAA,EACN,UAAU,KAAK;AAAA,EACf,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,SAAS,CAAC,MAAM,QAAQ;AACpB,QAAI,OAAO,GAAG,EAAE,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AACJ,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/recovery-retention.ts"],"sourcesContent":["export const NOTE_SNAPSHOT_RETENTION_DAYS = 7;\nexport const NOTE_SNAPSHOT_MAX_PER_NOTE = 10;\nexport const NOTE_TRASH_RETENTION_DAYS = 30;\nexport const RECOVERY_RETENTION_BATCH_LIMIT = 100;\n\nexport const SNAPSHOT_RETENTION_DAYS = NOTE_SNAPSHOT_RETENTION_DAYS;\nexport const SNAPSHOT_MAX_PER_NOTE = NOTE_SNAPSHOT_MAX_PER_NOTE;\nexport const TRASH_RETENTION_DAYS = NOTE_TRASH_RETENTION_DAYS;\nexport const RECOVERY_CLEANUP_BATCH_LIMIT = RECOVERY_RETENTION_BATCH_LIMIT;\n\nconst DAY_IN_MS = 24 * 60 * 60 * 1000;\n\nexport const resolveRetentionCutoff = (retentionDays: number, now = new Date()) => {\n return new Date(now.getTime() - retentionDays * DAY_IN_MS);\n};\n\nexport const createRetentionCutoff = resolveRetentionCutoff;\n"],"mappings":"AAAO,MAAM,+BAA+B;AACrC,MAAM,6BAA6B;AACnC,MAAM,4BAA4B;AAClC,MAAM,iCAAiC;AAEvC,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAC7B,MAAM,+BAA+B;AAE5C,MAAM,YAAY,KAAK,KAAK,KAAK;AAE1B,MAAM,yBAAyB,CAAC,eAAuB,MAAM,oBAAI,KAAK,MAAM;AAC/E,SAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,gBAAgB,SAAS;AAC7D;AAEO,MAAM,wBAAwB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/server-events-handler.ts"],"sourcesContent":["import type { Controller } from '~/types/index.js';\nimport { serializeServerEvent, subscribeServerEvents } from './server-events.js';\nimport { AUTH_SESSION_IDLE_TIMEOUT_MS } from './session-store.js';\n\nconst KEEP_ALIVE_INTERVAL_MS = 30_000;\n\nconst getEventStreamLifetimeMs = (expires?: Date | string | null) => {\n if (!expires) {\n return AUTH_SESSION_IDLE_TIMEOUT_MS;\n }\n\n const expiresAt = expires instanceof Date ? expires : new Date(expires);\n\n if (Number.isNaN(expiresAt.getTime())) {\n return AUTH_SESSION_IDLE_TIMEOUT_MS;\n }\n\n return Math.max(0, Math.min(expiresAt.getTime() - Date.now(), AUTH_SESSION_IDLE_TIMEOUT_MS));\n};\n\nexport const createServerEventsHandler = (): Controller => {\n return async (req, res) => {\n res.status(200);\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache, no-transform');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders?.();\n res.write(': connected\\n\\n');\n\n const unsubscribe = subscribeServerEvents((event) => {\n res.write(serializeServerEvent(event));\n });\n\n const keepAliveTimer = setInterval(() => {\n res.write(': keepalive\\n\\n');\n }, KEEP_ALIVE_INTERVAL_MS);\n keepAliveTimer.unref?.();\n\n const sessionExpiryTimer = setTimeout(() => {\n res.end();\n }, getEventStreamLifetimeMs(req.session?.cookie.expires));\n sessionExpiryTimer.unref?.();\n\n let cleanedUp = false;\n\n const cleanup = () => {\n if (cleanedUp) {\n return;\n }\n\n cleanedUp = true;\n clearInterval(keepAliveTimer);\n clearTimeout(sessionExpiryTimer);\n unsubscribe();\n };\n\n req.on('close', cleanup);\n res.on('close', cleanup);\n };\n};\n"],"mappings":"AACA,SAAS,sBAAsB,6BAA6B;AAC5D,SAAS,oCAAoC;AAE7C,MAAM,yBAAyB;AAE/B,MAAM,2BAA2B,CAAC,YAAmC;AACjE,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,mBAAmB,OAAO,UAAU,IAAI,KAAK,OAAO;AAEtE,MAAI,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACnC,WAAO;AAAA,EACX;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,IAAI,KAAK,IAAI,GAAG,4BAA4B,CAAC;AAC/F;AAEO,MAAM,4BAA4B,MAAkB;AACvD,SAAO,OAAO,KAAK,QAAQ;AACvB,QAAI,OAAO,GAAG;AACd,QAAI,UAAU,gBAAgB,kCAAkC;AAChE,QAAI,UAAU,iBAAiB,wBAAwB;AACvD,QAAI,UAAU,cAAc,YAAY;AACxC,QAAI,UAAU,qBAAqB,IAAI;AACvC,QAAI,eAAe;AACnB,QAAI,MAAM,iBAAiB;AAE3B,UAAM,cAAc,sBAAsB,CAAC,UAAU;AACjD,UAAI,MAAM,qBAAqB,KAAK,CAAC;AAAA,IACzC,CAAC;AAED,UAAM,iBAAiB,YAAY,MAAM;AACrC,UAAI,MAAM,iBAAiB;AAAA,IAC/B,GAAG,sBAAsB;AACzB,mBAAe,QAAQ;AAEvB,UAAM,qBAAqB,WAAW,MAAM;AACxC,UAAI,IAAI;AAAA,IACZ,GAAG,yBAAyB,IAAI,SAAS,OAAO,OAAO,CAAC;AACxD,uBAAmB,QAAQ;AAE3B,QAAI,YAAY;AAEhB,UAAM,UAAU,MAAM;AAClB,UAAI,WAAW;AACX;AAAA,MACJ;AAEA,kBAAY;AACZ,oBAAc,cAAc;AAC5B,mBAAa,kBAAkB;AAC/B,kBAAY;AAAA,IAChB;AAEA,QAAI,GAAG,SAAS,OAAO;AACvB,QAAI,GAAG,SAAS,OAAO;AAAA,EAC3B;AACJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/server-events.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\n\nexport type McpNoteServerEventType = 'mcp.note.created' | 'mcp.note.updated' | 'mcp.note.deleted';\n\ninterface BaseMcpNoteServerEvent {\n id: string;\n noteId: string;\n source: 'mcp';\n}\n\nexport interface McpNoteCreatedServerEvent extends BaseMcpNoteServerEvent {\n type: 'mcp.note.created';\n updatedAt: string;\n}\n\nexport interface McpNoteUpdatedServerEvent extends BaseMcpNoteServerEvent {\n type: 'mcp.note.updated';\n updatedAt: string;\n}\n\nexport interface McpNoteDeletedServerEvent extends BaseMcpNoteServerEvent {\n type: 'mcp.note.deleted';\n}\n\nexport type ServerEvent = McpNoteCreatedServerEvent | McpNoteUpdatedServerEvent | McpNoteDeletedServerEvent;\n\nexport type ServerEventInput =\n | Omit<McpNoteCreatedServerEvent, 'id'>\n | Omit<McpNoteUpdatedServerEvent, 'id'>\n | Omit<McpNoteDeletedServerEvent, 'id'>;\n\ntype ServerEventListener = (event: ServerEvent) => void;\n\nconst SERVER_EVENT_CHANNEL = 'server-event';\n\nconst serverEventEmitter = new EventEmitter();\n\nserverEventEmitter.setMaxListeners(0);\n\nlet nextServerEventId = 1;\n\nexport const emitServerEvent = (event: ServerEventInput) => {\n const nextEvent = {\n id: String(nextServerEventId++),\n ...event,\n } as ServerEvent;\n\n serverEventEmitter.emit(SERVER_EVENT_CHANNEL, nextEvent);\n\n return nextEvent;\n};\n\nexport const subscribeServerEvents = (listener: ServerEventListener) => {\n serverEventEmitter.on(SERVER_EVENT_CHANNEL, listener);\n\n return () => {\n serverEventEmitter.off(SERVER_EVENT_CHANNEL, listener);\n };\n};\n\nexport const serializeServerEvent = (event: ServerEvent) => {\n return `id: ${event.id}\\nevent: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`;\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAiC7B,MAAM,uBAAuB;AAE7B,MAAM,qBAAqB,IAAI,aAAa;AAE5C,mBAAmB,gBAAgB,CAAC;AAEpC,IAAI,oBAAoB;AAEjB,MAAM,kBAAkB,CAAC,UAA4B;AACxD,QAAM,YAAY;AAAA,IACd,IAAI,OAAO,mBAAmB;AAAA,IAC9B,GAAG;AAAA,EACP;AAEA,qBAAmB,KAAK,sBAAsB,SAAS;AAEvD,SAAO;AACX;AAEO,MAAM,wBAAwB,CAAC,aAAkC;AACpE,qBAAmB,GAAG,sBAAsB,QAAQ;AAEpD,SAAO,MAAM;AACT,uBAAmB,IAAI,sBAAsB,QAAQ;AAAA,EACzD;AACJ;AAEO,MAAM,uBAAuB,CAAC,UAAuB;AACxD,SAAO,OAAO,MAAM,EAAE;AAAA,SAAY,MAAM,IAAI;AAAA,QAAW,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA;AAChF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/session-store.ts"],"sourcesContent":["import session, { type SessionData } from 'express-session';\n\nexport const AUTH_SESSION_IDLE_TIMEOUT_MS = 7 * 24 * 60 * 60 * 1000;\nexport const ANONYMOUS_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1000;\nconst AUTH_SESSION_PRUNE_INTERVAL_MS = 60 * 60 * 1000;\nconst DEFAULT_MAX_SESSIONS = 1000;\n\ntype StoredSession = {\n data: string;\n expiresAt: number;\n authenticated: boolean;\n updatedAt: number;\n};\n\ntype AuthSessionData = SessionData & {\n authenticated?: boolean;\n};\n\nconst serializeSession = (data: SessionData) => JSON.stringify(data);\n\nconst deserializeSession = (data: string): SessionData => {\n const parsed = JSON.parse(data) as SessionData;\n const expires = parsed.cookie?.expires;\n\n if (typeof expires === 'string') {\n parsed.cookie.expires = new Date(expires);\n }\n\n return parsed;\n};\n\nconst isAuthenticatedSession = (data: SessionData) => Boolean((data as AuthSessionData).authenticated);\n\nconst getSessionExpiry = (data: SessionData, now = Date.now()) => {\n const expires = data.cookie?.expires;\n const ttlMs = isAuthenticatedSession(data) ? AUTH_SESSION_IDLE_TIMEOUT_MS : ANONYMOUS_SESSION_IDLE_TIMEOUT_MS;\n const fallbackExpiresAt = now + ttlMs;\n\n if (expires) {\n const expiresAt = expires instanceof Date ? expires : new Date(expires);\n\n if (!Number.isNaN(expiresAt.getTime())) {\n return Math.min(expiresAt.getTime(), fallbackExpiresAt);\n }\n }\n\n return fallbackExpiresAt;\n};\n\nexport class TtlMemorySessionStore extends session.Store {\n private readonly sessions = new Map<string, StoredSession>();\n private readonly pruneTimer: NodeJS.Timeout;\n\n constructor(private readonly options: { maxSessions?: number; pruneIntervalMs?: number } = {}) {\n super();\n\n this.pruneTimer = setInterval(() => {\n this.pruneExpiredSessions();\n }, options.pruneIntervalMs ?? AUTH_SESSION_PRUNE_INTERVAL_MS);\n this.pruneTimer.unref?.();\n }\n\n get(sid: string, callback: (error: unknown, session?: SessionData | null) => void) {\n try {\n const entry = this.sessions.get(sid);\n\n if (!entry) {\n callback(null, null);\n return;\n }\n\n if (entry.expiresAt <= Date.now()) {\n this.sessions.delete(sid);\n callback(null, null);\n return;\n }\n\n callback(null, deserializeSession(entry.data));\n } catch (error) {\n callback(error);\n }\n }\n\n set(sid: string, data: SessionData, callback?: (error?: unknown) => void) {\n try {\n const now = Date.now();\n\n this.sessions.set(sid, {\n data: serializeSession(data),\n expiresAt: getSessionExpiry(data, now),\n authenticated: isAuthenticatedSession(data),\n updatedAt: now,\n });\n this.pruneExpiredSessions();\n this.evictOldestSessions();\n callback?.();\n } catch (error) {\n callback?.(error);\n }\n }\n\n destroy(sid: string, callback?: (error?: unknown) => void) {\n this.sessions.delete(sid);\n callback?.();\n }\n\n touch(sid: string, data: SessionData, callback?: () => void) {\n const entry = this.sessions.get(sid);\n\n if (entry) {\n const now = Date.now();\n\n this.sessions.set(sid, {\n data: serializeSession(data),\n expiresAt: getSessionExpiry(data, now),\n authenticated: isAuthenticatedSession(data),\n updatedAt: now,\n });\n }\n\n callback?.();\n }\n\n all(callback: (error: unknown, sessions?: SessionData[] | { [sid: string]: SessionData } | null) => void) {\n try {\n this.pruneExpiredSessions();\n\n const sessions: Record<string, SessionData> = {};\n for (const [sid, entry] of this.sessions) {\n sessions[sid] = deserializeSession(entry.data);\n }\n\n callback(null, sessions);\n } catch (error) {\n callback(error);\n }\n }\n\n length(callback: (error: unknown, length?: number) => void) {\n this.pruneExpiredSessions();\n callback(null, this.sessions.size);\n }\n\n clear(callback?: (error?: unknown) => void) {\n this.sessions.clear();\n callback?.();\n }\n\n pruneExpiredSessions(now = Date.now()) {\n for (const [sid, entry] of this.sessions) {\n if (entry.expiresAt <= now) {\n this.sessions.delete(sid);\n }\n }\n }\n\n stopPruning() {\n clearInterval(this.pruneTimer);\n }\n\n private evictOldestSessions() {\n const maxSessions = this.options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n\n while (this.sessions.size > maxSessions) {\n const oldestSid = this.findOldestSessionId((entry) => !entry.authenticated) ?? this.findOldestSessionId();\n\n if (!oldestSid) {\n return;\n }\n\n this.sessions.delete(oldestSid);\n }\n }\n\n private findOldestSessionId(filter: (entry: StoredSession) => boolean = () => true) {\n let oldestSid: string | undefined;\n let oldestUpdatedAt = Number.POSITIVE_INFINITY;\n\n for (const [sid, entry] of this.sessions) {\n if (filter(entry) && entry.updatedAt < oldestUpdatedAt) {\n oldestSid = sid;\n oldestUpdatedAt = entry.updatedAt;\n }\n }\n\n return oldestSid;\n }\n}\n\nexport const createSessionStore = (): session.Store => new TtlMemorySessionStore();\n"],"mappings":"AAAA,OAAO,aAAmC;AAEnC,MAAM,+BAA+B,IAAI,KAAK,KAAK,KAAK;AACxD,MAAM,oCAAoC,KAAK,KAAK;AAC3D,MAAM,iCAAiC,KAAK,KAAK;AACjD,MAAM,uBAAuB;AAa7B,MAAM,mBAAmB,CAAC,SAAsB,KAAK,UAAU,IAAI;AAEnE,MAAM,qBAAqB,CAAC,SAA8B;AACtD,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAM,UAAU,OAAO,QAAQ;AAE/B,MAAI,OAAO,YAAY,UAAU;AAC7B,WAAO,OAAO,UAAU,IAAI,KAAK,OAAO;AAAA,EAC5C;AAEA,SAAO;AACX;AAEA,MAAM,yBAAyB,CAAC,SAAsB,QAAS,KAAyB,aAAa;AAErG,MAAM,mBAAmB,CAAC,MAAmB,MAAM,KAAK,IAAI,MAAM;AAC9D,QAAM,UAAU,KAAK,QAAQ;AAC7B,QAAM,QAAQ,uBAAuB,IAAI,IAAI,+BAA+B;AAC5E,QAAM,oBAAoB,MAAM;AAEhC,MAAI,SAAS;AACT,UAAM,YAAY,mBAAmB,OAAO,UAAU,IAAI,KAAK,OAAO;AAEtE,QAAI,CAAC,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACpC,aAAO,KAAK,IAAI,UAAU,QAAQ,GAAG,iBAAiB;AAAA,IAC1D;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,MAAM,8BAA8B,QAAQ,MAAM;AAAA,EAIrD,YAA6B,UAA8D,CAAC,GAAG;AAC3F,UAAM;AADmB;AAGzB,SAAK,aAAa,YAAY,MAAM;AAChC,WAAK,qBAAqB;AAAA,IAC9B,GAAG,QAAQ,mBAAmB,8BAA8B;AAC5D,SAAK,WAAW,QAAQ;AAAA,EAC5B;AAAA,EAP6B;AAAA,EAHZ,WAAW,oBAAI,IAA2B;AAAA,EAC1C;AAAA,EAWjB,IAAI,KAAa,UAAkE;AAC/E,QAAI;AACA,YAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AAEnC,UAAI,CAAC,OAAO;AACR,iBAAS,MAAM,IAAI;AACnB;AAAA,MACJ;AAEA,UAAI,MAAM,aAAa,KAAK,IAAI,GAAG;AAC/B,aAAK,SAAS,OAAO,GAAG;AACxB,iBAAS,MAAM,IAAI;AACnB;AAAA,MACJ;AAEA,eAAS,MAAM,mBAAmB,MAAM,IAAI,CAAC;AAAA,IACjD,SAAS,OAAO;AACZ,eAAS,KAAK;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,IAAI,KAAa,MAAmB,UAAsC;AACtE,QAAI;AACA,YAAM,MAAM,KAAK,IAAI;AAErB,WAAK,SAAS,IAAI,KAAK;AAAA,QACnB,MAAM,iBAAiB,IAAI;AAAA,QAC3B,WAAW,iBAAiB,MAAM,GAAG;AAAA,QACrC,eAAe,uBAAuB,IAAI;AAAA,QAC1C,WAAW;AAAA,MACf,CAAC;AACD,WAAK,qBAAqB;AAC1B,WAAK,oBAAoB;AACzB,iBAAW;AAAA,IACf,SAAS,OAAO;AACZ,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,QAAQ,KAAa,UAAsC;AACvD,SAAK,SAAS,OAAO,GAAG;AACxB,eAAW;AAAA,EACf;AAAA,EAEA,MAAM,KAAa,MAAmB,UAAuB;AACzD,UAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AAEnC,QAAI,OAAO;AACP,YAAM,MAAM,KAAK,IAAI;AAErB,WAAK,SAAS,IAAI,KAAK;AAAA,QACnB,MAAM,iBAAiB,IAAI;AAAA,QAC3B,WAAW,iBAAiB,MAAM,GAAG;AAAA,QACrC,eAAe,uBAAuB,IAAI;AAAA,QAC1C,WAAW;AAAA,MACf,CAAC;AAAA,IACL;AAEA,eAAW;AAAA,EACf;AAAA,EAEA,IAAI,UAAsG;AACtG,QAAI;AACA,WAAK,qBAAqB;AAE1B,YAAM,WAAwC,CAAC;AAC/C,iBAAW,CAAC,KAAK,KAAK,KAAK,KAAK,UAAU;AACtC,iBAAS,GAAG,IAAI,mBAAmB,MAAM,IAAI;AAAA,MACjD;AAEA,eAAS,MAAM,QAAQ;AAAA,IAC3B,SAAS,OAAO;AACZ,eAAS,KAAK;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,OAAO,UAAqD;AACxD,SAAK,qBAAqB;AAC1B,aAAS,MAAM,KAAK,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,UAAsC;AACxC,SAAK,SAAS,MAAM;AACpB,eAAW;AAAA,EACf;AAAA,EAEA,qBAAqB,MAAM,KAAK,IAAI,GAAG;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,UAAU;AACtC,UAAI,MAAM,aAAa,KAAK;AACxB,aAAK,SAAS,OAAO,GAAG;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,cAAc;AACV,kBAAc,KAAK,UAAU;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC1B,UAAM,cAAc,KAAK,QAAQ,eAAe;AAEhD,WAAO,KAAK,SAAS,OAAO,aAAa;AACrC,YAAM,YAAY,KAAK,oBAAoB,CAAC,UAAU,CAAC,MAAM,aAAa,KAAK,KAAK,oBAAoB;AAExG,UAAI,CAAC,WAAW;AACZ;AAAA,MACJ;AAEA,WAAK,SAAS,OAAO,SAAS;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,SAA4C,MAAM,MAAM;AAChF,QAAI;AACJ,QAAI,kBAAkB,OAAO;AAE7B,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,UAAU;AACtC,UAAI,OAAO,KAAK,KAAK,MAAM,YAAY,iBAAiB;AACpD,oBAAY;AACZ,0BAAkB,MAAM;AAAA,MAC5B;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;AAEO,MAAM,qBAAqB,MAAqB,IAAI,sBAAsB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/use-async.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\nimport type { Controller } from '~/types/index.js';\n\nexport default function useAsync(callback: Controller) {\n return function (req: Request, res: Response, next: NextFunction) {\n void Promise.resolve()\n .then(() => callback(req, res, next))\n .catch((error: unknown) => {\n next(error);\n });\n };\n}\n"],"mappings":"AAGe,SAAR,SAA0B,UAAsB;AACnD,SAAO,SAAU,KAAc,KAAe,MAAoB;AAC9D,SAAK,QAAQ,QAAQ,EAChB,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EACnC,MAAM,CAAC,UAAmB;AACvB,WAAK,KAAK;AAAA,IACd,CAAC;AAAA,EACT;AACJ;","names":[]}
|
package/server/dist/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paths.ts"],"sourcesContent":["import path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// 패키지 루트 (dist/paths.js 기준 상위)\nconst PACKAGE_ROOT = process.env.OCEAN_BRAIN_PACKAGE_ROOT || path.resolve(__dirname, '..');\n\n// 이미지 디렉토리 (별도 지정 가능, Docker에서 분리 볼륨용)\nconst IMAGE_DIR =\n process.env.OCEAN_BRAIN_IMAGE_DIR || path.resolve(process.env.OCEAN_BRAIN_DATA_DIR || '.', 'assets/images');\n\nexport const paths = {\n clientDist: path.resolve(PACKAGE_ROOT, 'client/dist'),\n clientIndex: path.resolve(PACKAGE_ROOT, 'client/dist/index.html'),\n imageDir: path.resolve(IMAGE_DIR),\n};\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,MAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAG7D,MAAM,eAAe,QAAQ,IAAI,4BAA4B,KAAK,QAAQ,WAAW,IAAI;AAGzF,MAAM,YACF,QAAQ,IAAI,yBAAyB,KAAK,QAAQ,QAAQ,IAAI,wBAAwB,KAAK,eAAe;AAEvG,MAAM,QAAQ;AAAA,EACjB,YAAY,KAAK,QAAQ,cAAc,aAAa;AAAA,EACpD,aAAa,KAAK,QAAQ,cAAc,wBAAwB;AAAA,EAChE,UAAU,KAAK,QAAQ,SAAS;AACpC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/api.ts"],"sourcesContent":["import { Router } from 'express';\nimport { createLoginHandler, createLogoutHandler, createSessionStatusHandler } from '../features/auth/http/api.js';\nimport { createUploadImageFromSrcHandler, createUploadImageHandler } from '../features/image/http/upload.js';\nimport {\n createMcpAdminRevokeTokenHandler,\n createMcpAdminRotateTokenHandler,\n createMcpAdminSetEnabledHandler,\n createMcpAdminStatusHandler,\n} from '../features/mcp-admin/http/handlers.js';\nimport type { McpAdminService } from '../features/mcp-admin/service.js';\nimport { createCsrfProtection, requireSessionForWrite } from '../modules/auth-guard.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createAuthAttemptRateLimit, createSessionAccessRateLimit } from '../modules/rate-limit.js';\nimport { createServerEventsHandler } from '../modules/server-events-handler.js';\nimport useAsync from '../modules/use-async.js';\nimport { createMcpRouter } from './mcp.js';\n\ntype McpAdminApiService = Pick<\n McpAdminService,\n 'getStatus' | 'setEnabled' | 'rotateToken' | 'revokeActiveToken' | 'validatePresentedToken'\n>;\n\nexport const createApiRouter = (authConfig: AuthConfig, mcpAdminService: McpAdminApiService) => {\n const csrfProtection = createCsrfProtection(authConfig);\n const requireSession = requireSessionForWrite(authConfig);\n const sessionAccessRateLimit = createSessionAccessRateLimit();\n\n return Router()\n .use('/mcp', createMcpRouter(authConfig, mcpAdminService))\n .get('/auth/session', csrfProtection, useAsync(createSessionStatusHandler(authConfig)))\n .post('/auth/login', csrfProtection, createAuthAttemptRateLimit(), useAsync(createLoginHandler(authConfig)))\n .post(\n '/auth/logout',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createLogoutHandler(authConfig)),\n )\n .get(\n '/mcp-admin/status',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createMcpAdminStatusHandler(mcpAdminService)),\n )\n .post(\n '/mcp-admin/enabled',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createMcpAdminSetEnabledHandler(mcpAdminService)),\n )\n .post(\n '/mcp-admin/token/rotate',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createMcpAdminRotateTokenHandler(mcpAdminService)),\n )\n .post(\n '/mcp-admin/token/revoke',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createMcpAdminRevokeTokenHandler(mcpAdminService)),\n )\n .post('/image', sessionAccessRateLimit, requireSession, csrfProtection, useAsync(createUploadImageHandler()))\n .post(\n '/image-from-src',\n sessionAccessRateLimit,\n requireSession,\n csrfProtection,\n useAsync(createUploadImageFromSrcHandler()),\n )\n .get('/events', sessionAccessRateLimit, requireSession, csrfProtection, createServerEventsHandler());\n};\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB,qBAAqB,kCAAkC;AACpF,SAAS,iCAAiC,gCAAgC;AAC1E;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAEP,SAAS,sBAAsB,8BAA8B;AAE7D,SAAS,4BAA4B,oCAAoC;AACzE,SAAS,iCAAiC;AAC1C,OAAO,cAAc;AACrB,SAAS,uBAAuB;AAOzB,MAAM,kBAAkB,CAAC,YAAwB,oBAAwC;AAC5F,QAAM,iBAAiB,qBAAqB,UAAU;AACtD,QAAM,iBAAiB,uBAAuB,UAAU;AACxD,QAAM,yBAAyB,6BAA6B;AAE5D,SAAO,OAAO,EACT,IAAI,QAAQ,gBAAgB,YAAY,eAAe,CAAC,EACxD,IAAI,iBAAiB,gBAAgB,SAAS,2BAA2B,UAAU,CAAC,CAAC,EACrF,KAAK,eAAe,gBAAgB,2BAA2B,GAAG,SAAS,mBAAmB,UAAU,CAAC,CAAC,EAC1G;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,oBAAoB,UAAU,CAAC;AAAA,EAC5C,EACC;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,4BAA4B,eAAe,CAAC;AAAA,EACzD,EACC;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,gCAAgC,eAAe,CAAC;AAAA,EAC7D,EACC;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,iCAAiC,eAAe,CAAC;AAAA,EAC9D,EACC;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,iCAAiC,eAAe,CAAC;AAAA,EAC9D,EACC,KAAK,UAAU,wBAAwB,gBAAgB,gBAAgB,SAAS,yBAAyB,CAAC,CAAC,EAC3G;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,gCAAgC,CAAC;AAAA,EAC9C,EACC,IAAI,WAAW,wBAAwB,gBAAgB,gBAAgB,0BAA0B,CAAC;AAC3G;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/auth-pages.ts"],"sourcesContent":["import { Router } from 'express';\nimport {\n createLoginPageHandler,\n createLoginPageSubmitHandler,\n createLogoutPageHandler,\n} from '../features/auth/http/pages.js';\nimport { createCsrfProtection, createLoginCsrfFailureHandler, requireSessionForWrite } from '../modules/auth-guard.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createAuthAttemptRateLimit, createSessionAccessRateLimit } from '../modules/rate-limit.js';\n\nexport const createAuthPagesRouter = (authConfig: AuthConfig) => {\n const csrfProtection = createCsrfProtection(authConfig);\n const sessionAccessRateLimit = createSessionAccessRateLimit();\n\n return Router()\n .get('/login', csrfProtection, createLoginPageHandler(authConfig))\n .post('/login', csrfProtection, createAuthAttemptRateLimit(), createLoginPageSubmitHandler(authConfig))\n .post(\n '/logout',\n sessionAccessRateLimit,\n requireSessionForWrite(authConfig),\n csrfProtection,\n createLogoutPageHandler(authConfig),\n )\n .use(createLoginCsrfFailureHandler(authConfig));\n};\n"],"mappings":"AAAA,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,sBAAsB,+BAA+B,8BAA8B;AAE5F,SAAS,4BAA4B,oCAAoC;AAElE,MAAM,wBAAwB,CAAC,eAA2B;AAC7D,QAAM,iBAAiB,qBAAqB,UAAU;AACtD,QAAM,yBAAyB,6BAA6B;AAE5D,SAAO,OAAO,EACT,IAAI,UAAU,gBAAgB,uBAAuB,UAAU,CAAC,EAChE,KAAK,UAAU,gBAAgB,2BAA2B,GAAG,6BAA6B,UAAU,CAAC,EACrG;AAAA,IACG;AAAA,IACA;AAAA,IACA,uBAAuB,UAAU;AAAA,IACjC;AAAA,IACA,wBAAwB,UAAU;AAAA,EACtC,EACC,IAAI,8BAA8B,UAAU,CAAC;AACtD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/client.ts"],"sourcesContent":["import express, { Router } from 'express';\nimport path from 'path';\nimport { createCsrfProtection, isAuthenticatedRequest } from '../modules/auth-guard.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { paths } from '../paths.js';\n\nconst shouldBlockClientRoute = (authConfig: AuthConfig, requestPath: string, authenticated: boolean) => {\n if (authConfig.mode !== 'password' || authenticated) {\n return false;\n }\n\n if (\n requestPath.startsWith('/api') ||\n requestPath.startsWith('/graphql') ||\n requestPath === '/login' ||\n requestPath === '/logout'\n ) {\n return false;\n }\n\n return path.extname(requestPath) === '';\n};\n\nconst createClientRouteCsrfTokenMiddleware = (authConfig: AuthConfig) => {\n const csrfProtection = createCsrfProtection(authConfig);\n\n return (req: express.Request, res: express.Response, next: express.NextFunction) => {\n if (path.extname(req.path) !== '') {\n next();\n return;\n }\n\n csrfProtection(req, res, next);\n };\n};\n\nexport const createClientRouter = (authConfig: AuthConfig) =>\n Router()\n .use('/assets/images', express.static(paths.imageDir))\n .use((req, res, next) => {\n if (shouldBlockClientRoute(authConfig, req.path, isAuthenticatedRequest(req))) {\n const redirectPath = encodeURIComponent(req.originalUrl || '/');\n res.redirect(303, `/login?next=${redirectPath}`);\n return;\n }\n\n next();\n })\n .use(createClientRouteCsrfTokenMiddleware(authConfig))\n .use(express.static(paths.clientDist, { extensions: ['html'] }))\n .get(/.*/, (_req, res) => {\n res.sendFile(paths.clientIndex);\n });\n"],"mappings":"AAAA,OAAO,WAAW,cAAc;AAChC,OAAO,UAAU;AACjB,SAAS,sBAAsB,8BAA8B;AAE7D,SAAS,aAAa;AAEtB,MAAM,yBAAyB,CAAC,YAAwB,aAAqB,kBAA2B;AACpG,MAAI,WAAW,SAAS,cAAc,eAAe;AACjD,WAAO;AAAA,EACX;AAEA,MACI,YAAY,WAAW,MAAM,KAC7B,YAAY,WAAW,UAAU,KACjC,gBAAgB,YAChB,gBAAgB,WAClB;AACE,WAAO;AAAA,EACX;AAEA,SAAO,KAAK,QAAQ,WAAW,MAAM;AACzC;AAEA,MAAM,uCAAuC,CAAC,eAA2B;AACrE,QAAM,iBAAiB,qBAAqB,UAAU;AAEtD,SAAO,CAAC,KAAsB,KAAuB,SAA+B;AAChF,QAAI,KAAK,QAAQ,IAAI,IAAI,MAAM,IAAI;AAC/B,WAAK;AACL;AAAA,IACJ;AAEA,mBAAe,KAAK,KAAK,IAAI;AAAA,EACjC;AACJ;AAEO,MAAM,qBAAqB,CAAC,eAC/B,OAAO,EACF,IAAI,kBAAkB,QAAQ,OAAO,MAAM,QAAQ,CAAC,EACpD,IAAI,CAAC,KAAK,KAAK,SAAS;AACrB,MAAI,uBAAuB,YAAY,IAAI,MAAM,uBAAuB,GAAG,CAAC,GAAG;AAC3E,UAAM,eAAe,mBAAmB,IAAI,eAAe,GAAG;AAC9D,QAAI,SAAS,KAAK,eAAe,YAAY,EAAE;AAC/C;AAAA,EACJ;AAEA,OAAK;AACT,CAAC,EACA,IAAI,qCAAqC,UAAU,CAAC,EACpD,IAAI,QAAQ,OAAO,MAAM,YAAY,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAC9D,IAAI,MAAM,CAAC,MAAM,QAAQ;AACtB,MAAI,SAAS,MAAM,WAAW;AAClC,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/graphql.ts"],"sourcesContent":["import { type Request, type Response, Router } from 'express';\nimport { createHandler } from 'graphql-http/lib/use/express';\nimport type { McpAdminService } from '../features/mcp-admin/service.js';\nimport { createCsrfProtection, isAuthenticatedRequest, requireSessionForGraphql } from '../modules/auth-guard.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createMcpAuthMiddleware, createReadOnlyMcpValidationRule } from '../modules/mcp-auth.js';\nimport schema from '../schema/index.js';\n\ntype McpGraphqlService = Pick<McpAdminService, 'getStatus' | 'validatePresentedToken'>;\ntype GraphqlRequestContext = { raw: Request; context: { res: Response } };\n\nconst createGraphqlContext = (authConfig: AuthConfig) => (req: GraphqlRequestContext) => ({\n authMode: authConfig.mode,\n isAuthenticated: isAuthenticatedRequest(req.raw),\n req: req.raw,\n res: req.context.res,\n});\n\nexport const createGraphqlRouter = (authConfig: AuthConfig, mcpAdminService: McpGraphqlService) => {\n const csrfProtection = createCsrfProtection(authConfig);\n\n return Router()\n .use(\n '/mcp',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n createHandler({\n schema,\n context: createGraphqlContext(authConfig),\n validationRules: (_req, _args, specifiedRules) => {\n return [...specifiedRules, createReadOnlyMcpValidationRule()];\n },\n }),\n )\n .use(\n '/',\n requireSessionForGraphql(authConfig),\n csrfProtection,\n createHandler({\n schema,\n context: createGraphqlContext(authConfig),\n }),\n );\n};\n"],"mappings":"AAAA,SAAsC,cAAc;AACpD,SAAS,qBAAqB;AAE9B,SAAS,sBAAsB,wBAAwB,gCAAgC;AAEvF,SAAS,yBAAyB,uCAAuC;AACzE,OAAO,YAAY;AAKnB,MAAM,uBAAuB,CAAC,eAA2B,CAAC,SAAgC;AAAA,EACtF,UAAU,WAAW;AAAA,EACrB,iBAAiB,uBAAuB,IAAI,GAAG;AAAA,EAC/C,KAAK,IAAI;AAAA,EACT,KAAK,IAAI,QAAQ;AACrB;AAEO,MAAM,sBAAsB,CAAC,YAAwB,oBAAuC;AAC/F,QAAM,iBAAiB,qBAAqB,UAAU;AAEtD,SAAO,OAAO,EACT;AAAA,IACG;AAAA,IACA,wBAAwB,YAAY,eAAe;AAAA,IACnD,cAAc;AAAA,MACV;AAAA,MACA,SAAS,qBAAqB,UAAU;AAAA,MACxC,iBAAiB,CAAC,MAAM,OAAO,mBAAmB;AAC9C,eAAO,CAAC,GAAG,gBAAgB,gCAAgC,CAAC;AAAA,MAChE;AAAA,IACJ,CAAC;AAAA,EACL,EACC;AAAA,IACG;AAAA,IACA,yBAAyB,UAAU;AAAA,IACnC;AAAA,IACA,cAAc;AAAA,MACV;AAAA,MACA,SAAS,qBAAqB,UAAU;AAAA,IAC5C,CAAC;AAAA,EACL;AACR;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/index.ts"],"sourcesContent":["export { createApiRouter } from './api.js';\nexport { createAuthPagesRouter } from './auth-pages.js';\nexport { createClientRouter } from './client.js';\nexport { createGraphqlRouter } from './graphql.js';\n"],"mappings":"AAAA,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/mcp.ts"],"sourcesContent":["import { Router } from 'express';\nimport type { McpAdminService } from '../features/mcp-admin/service.js';\nimport {\n createMcpAppendNoteMarkdownHandler,\n createMcpCreateNoteHandler,\n createMcpDeleteNoteHandler,\n createMcpNoteWriteBaselineHandler,\n createMcpPatchNoteMarkdownHandler,\n createMcpReplaceNoteMarkdownHandler,\n createMcpUpdateNoteHandler,\n createMcpUpdateNoteMetadataHandler,\n} from '../features/note/http/mcp.js';\nimport { createMcpCreateTagHandler } from '../features/tag/http/mcp.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createMcpAuthMiddleware } from '../modules/mcp-auth.js';\nimport useAsync from '../modules/use-async.js';\n\ntype McpRouteService = Pick<McpAdminService, 'getStatus' | 'validatePresentedToken'>;\n\nexport const createMcpRouter = (authConfig: AuthConfig, mcpAdminService: McpRouteService) =>\n Router()\n .post(\n '/notes/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateNoteHandler()),\n )\n .post(\n '/notes/update',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteHandler()),\n )\n .post(\n '/notes/baseline',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpNoteWriteBaselineHandler()),\n )\n .post(\n '/notes/patch-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpPatchNoteMarkdownHandler()),\n )\n .post(\n '/notes/append-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpAppendNoteMarkdownHandler()),\n )\n .post(\n '/notes/metadata',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteMetadataHandler()),\n )\n .post(\n '/notes/replace-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpReplaceNoteMarkdownHandler()),\n )\n .post(\n '/notes/delete',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpDeleteNoteHandler()),\n )\n .post(\n '/tags/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateTagHandler()),\n );\n"],"mappings":"AAAA,SAAS,cAAc;AAEvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,iCAAiC;AAE1C,SAAS,+BAA+B;AACxC,OAAO,cAAc;AAId,MAAM,kBAAkB,CAAC,YAAwB,oBACpD,OAAO,EACF;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,kCAAkC,CAAC;AAChD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,kCAAkC,CAAC;AAChD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,oCAAoC,CAAC;AAClD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,0BAA0B,CAAC;AACxC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import { makeExecutableSchema } from '@graphql-tools/schema';\nimport { cacheResolvers, cacheTypeDefs } from '../features/cache/graphql/index.js';\nimport { imageResolvers, imageTypeDefs } from '../features/image/graphql/index.js';\nimport { noteResolvers, noteTypeDefs } from '../features/note/graphql/index.js';\nimport { placeholderResolvers, placeholderTypeDefs } from '../features/placeholder/graphql/index.js';\nimport { reminderResolvers, reminderTypeDefs } from '../features/reminder/graphql/index.js';\nimport { tagResolvers, tagTypeDefs } from '../features/tag/graphql/index.js';\nimport { viewResolvers, viewTypeDefs } from '../features/view/graphql/index.js';\n\nconst schema = makeExecutableSchema({\n typeDefs: [\n cacheTypeDefs,\n noteTypeDefs,\n imageTypeDefs,\n tagTypeDefs,\n placeholderTypeDefs,\n reminderTypeDefs,\n viewTypeDefs,\n ],\n resolvers: [\n cacheResolvers,\n noteResolvers,\n imageResolvers,\n tagResolvers,\n placeholderResolvers,\n reminderResolvers,\n viewResolvers,\n ],\n});\n\nexport default schema;\n"],"mappings":"AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB,qBAAqB;AAC9C,SAAS,gBAAgB,qBAAqB;AAC9C,SAAS,eAAe,oBAAoB;AAC5C,SAAS,sBAAsB,2BAA2B;AAC1D,SAAS,mBAAmB,wBAAwB;AACpD,SAAS,cAAc,mBAAmB;AAC1C,SAAS,eAAe,oBAAoB;AAE5C,MAAM,SAAS,qBAAqB;AAAA,EAChC,UAAU;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,WAAW;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ,CAAC;AAED,IAAO,iBAAQ;","names":[]}
|
package/server/dist/start.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/start.ts"],"sourcesContent":["import { runPrismaMigrateDeploy } from './modules/prisma-runtime.js';\n\ntry {\n runPrismaMigrateDeploy();\n await import('./main.js');\n} catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown Prisma startup error';\n process.stderr.write(`[prisma] Startup failed: ${message}\\n`);\n process.exit(1);\n}\n"],"mappings":"AAAA,SAAS,8BAA8B;AAEvC,IAAI;AACA,yBAAuB;AACvB,QAAM,OAAO,WAAW;AAC5B,SAAS,OAAO;AACZ,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAQ,OAAO,MAAM,4BAA4B,OAAO;AAAA,CAAI;AAC5D,UAAQ,KAAK,CAAC;AAClB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\n\ndeclare module 'express-session' {\n interface SessionData {\n authenticated?: boolean;\n }\n}\n\nexport type Controller = (req: Request, res: Response, next?: NextFunction) => Promise<void>;\n\nexport * from './input.js';\n"],"mappings":"AAUA,cAAc;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|