@semiont/backend 0.2.39 → 0.2.41
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/README.md +50 -0
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts","../src/types/jwt-types.ts","../src/auth/jwt.ts","../src/utils/config.ts","../src/index.ts","../src/db.ts","../src/routes/health.ts","../../../specs/openapi.json","../src/utils/openapi-validator.ts","../src/middleware/validate-openapi.ts","../src/auth/oauth.ts","../src/middleware/auth.ts","../src/routes/auth.ts","../src/utils/log-sanitizer.ts","../src/routes/status.ts","../src/routes/admin.ts","../src/routes/resources/shared.ts","../src/routes/resources/routes/create.ts","../src/middleware/content-negotiation.ts","../../../packages/api-client/src/sse/index.ts","../../../packages/api-client/src/utils/annotations.ts","../../../packages/api-client/src/utils/locales.ts","../../../packages/api-client/src/utils/resources.ts","../../../packages/ontology/src/tag-schemas.ts","../../../packages/ontology/src/entity-extraction.ts","../src/routes/resources/routes/get-uri.ts","../src/routes/resources/routes/list.ts","../src/routes/resources/routes/update.ts","../../../node_modules/nanoid/url-alphabet/index.js","../../../node_modules/nanoid/index.js","../src/lib/sse-helpers.ts","../src/routes/resources/routes/annotate-references-stream.ts","../src/routes/resources/routes/annotate-highlights-stream.ts","../src/routes/resources/routes/annotate-assessments-stream.ts","../src/routes/resources/routes/annotate-comments-stream.ts","../src/routes/resources/routes/annotate-tags-stream.ts","../src/routes/resources/routes/llm-context.ts","../src/routes/resources/routes/annotation-llm-context.ts","../src/routes/resources/routes/referenced-by.ts","../src/routes/resources/routes/token.ts","../src/routes/resources/routes/get-annotations.ts","../src/routes/resources/routes/events.ts","../src/routes/resources/routes/events-stream.ts","../src/routes/resources/routes/create-annotation.ts","../src/routes/resources/routes/get-annotation.ts","../src/routes/resources/routes/delete-annotation.ts","../src/routes/resources/routes/update-annotation-body.ts","../src/routes/resources/routes/yield-resource-stream.ts","../src/routes/annotations/routes/history.ts","../src/routes/resources/index.ts","../src/routes/annotations/shared.ts","../src/routes/annotations/routes/get-uri.ts","../src/routes/annotations/operations.ts","../src/routes/annotations/index.ts","../src/routes/entity-types.ts","../src/routes/jobs/index.ts","../src/middleware/security-headers.ts","../src/middleware/request-id.ts","../src/middleware/request-logger.ts","../src/middleware/error-logger.ts"],"names":["getLoggerConfig","logLevel","level","process","env","LOG_LEVEL","format","LOG_FORMAT","nodeEnv","NODE_ENV","transports","createFormat","config","winston","combine","timestamp","errors","stack","json","printf","message","meta","metaStr","Object","keys","length","JSON","stringify","toUpperCase","createTransports","includes","push","Console","File","filename","initializeLogger","loggerInstance","createLogger","exitOnError","info","getLogger","Error","createChildLogger","context","child","createComponentLogger","component","JWTPayloadSchema","z","object","userId","string","regex","email","name","optional","domain","provider","isAdmin","boolean","iat","number","exp","JWTService","siteConfig","initialize","site","oauthAllowedDomains","Array","isArray","getSiteConfig","setTestConfig","resetConfig","getSecret","secret","JWT_SECRET","generateToken","payload","expiresIn","tokenPayload","jwt","sign","issuer","verifyToken","token","decoded","verify","result","safeParse","success","error","data","makeUserId","makeEmail","JsonWebTokenError","TokenExpiredError","NotBeforeError","isAllowedDomain","parts","split","allowedDomains","nodeFileReader","readIfExists","filePath","absolutePath","resolve","existsSync","readFileSync","readRequired","loadEnvironmentConfig","createConfigLoader","globalForPrisma","global","DatabaseConnection","instance","isInitializing","getClient","prisma","logLevels","getLogLevel","logConfig","map","emit","PrismaClient","log","$on","e","getDBLogger","debug","query","params","duration","target","warn","setClient","client","reset","$disconnect","undefined","disconnect","require","checkHealth","$queryRaw","String","getRouteLogger","healthRouter","Hono","get","c","startupFailed","fs","startupStatus","trim","startsWith","response","status","version","Date","toISOString","database","environment","dbStatus","getValidatorLogger","ajv","Ajv","allErrors","coerceTypes","removeAdditional","addFormats","schemasLoaded","loadSchemas","schema","entries","openapiSpec","components","schemas","addSchema","schemaName","count","validateSchema","validate","getSchema","availableSchemas","valid","errorMessage","formatValidationErrors","messages","err","path","instancePath","keyword","missingProperty","type","allowedValues","join","getMiddlewareLogger","validateRequestBody","next","body","req","HTTPException","cause","set","OAuthService","verifyGoogleToken","accessToken","fetch","ok","rawUserInfo","verified_email","userInfo","createOrUpdateUser","googleUser","existingUser","user","findFirst","where","OR","providerId","id","isNewUser","update","image","picture","lastLogin","create","passwordHash","jwtPayload","makeAccessToken","getUserFromToken","findUnique","isActive","acceptTerms","termsAcceptedAt","authMiddleware","logger","authHeader","header","reason","method","tokenStr","substring","SENSITIVE_FIELDS","PARTIAL_MASK_FIELDS","sanitizeForLogging","options","maskValue","partialMask","additionalSensitiveFields","allSensitiveFields","f","toLowerCase","sanitize","obj","sanitized","key","value","lowerKey","some","field","partialMaskValue","firstChars","lastChars","maskLength","Math","max","mask","repeat","createSafeLogContext","authRouter","post","password","hasPasswordHash","isValid","access_token","googleCredential","refreshToken","accessTokenPayload","created","createdAt","refresh_token","statusRouter","use","features","semanticContent","collaboration","rbac","authenticatedAs","adminMiddleware","adminRouter","users","findMany","orderBy","select","updatedAt","u","totalUsers","activeUsers","adminUsers","domainStats","recentUsers","Promise","all","groupBy","by","_count","gte","now","stats","regularUsers","domainBreakdown","d","recentSignups","patch","param","updatedUser","delete","currentUser","allowedDomainsEnv","OAUTH_ALLOWED_DOMAINS","filter","providers","GOOGLE_CLIENT_ID","GOOGLE_CLIENT_SECRET","isConfigured","clientId","createResourceRouter","router","registerCreateResource","formData","file","formatRaw","language","entityTypesStr","creationMethod","entityTypes","parse","arrayBuffer","contentBuffer","Buffer","from","eventStore","repStore","ResourceOperations","createResource","content","resource","prefersHtml","acceptHeader","userAgent","acceptsHtml","acceptsJson","htmlIndex","indexOf","jsonIndex","min","Infinity","isBrowser","test","getFrontendUrl","frontendUrl","FRONTEND_URL","registerGetResourceUri","view","normalizedBase","endsWith","slice","redirectUrl","redirect","ResourceContext","getResourceMetadata","resourceId","primaryRep","getPrimaryRepresentation","checksum","mediaType","retrieve","getPrimaryMediaType","newResponse","Uint8Array","text","decodeRepresentation","EventQuery","storage","events","getResourceEvents","stored","views","materializer","materialize","annotations","entityReferences","a","motivation","getEntityTypes","registerListResources","offset","Number","limit","entityType","archived","q","filteredDocs","listResources","search","doc","getResourceEntityTypes","paginatedDocs","formattedDocs","addContentPreviews","resources","total","registerUpdateResource","updateResource","currentArchived","updatedArchived","currentEntityTypes","updatedEntityTypes","AnnotationContext","getAllAnnotations","urlAlphabet","POOL_SIZE_MULTIPLIER","pool","poolOffset","fillPool","bytes","allocUnsafe","crypto","randomFillSync","nanoid","size","i","writeTypedSSE","stream","writeSSE","event","registerAnnotateReferencesStream","jobQueue","includeDescriptiveReferences","eventBus","job","metadata","jobId","retryCount","maxRetries","et","createJob","streamSSE","isStreamClosed","subscriptions","keepAliveInterval","closeStreamCallback","streamPromise","cleanup","clearInterval","forEach","sub","unsubscribe","resourceBus","scope","scopeKey","subscribe","progress","currentEntityType","totalEntityTypes","processedEntityTypes","completedEntityTypes","foundCount","reduce","sum","percentage","jobType","totalFound","setInterval","raw","signal","addEventListener","sseError","registerAnnotateHighlightsStream","instructions","density","_event","stage","highlightsFound","createdCount","highlightsCreated","registerAnnotateAssessmentsStream","tone","expected","actual","assessmentsFound","assessmentsCreated","registerAnnotateCommentsStream","commentsFound","commentsCreated","registerAnnotateTagsStream","schemaId","categories","getTagSchema","category","tags","t","totalCategories","currentCategory","processedCategories","tagsFound","tagsCreated","byCategory","registerGetResourceLLMContext","makeMeaning","depth","maxResources","includeContent","includeSummary","LLMContext","getResourceContext","inferenceClient","registerGetAnnotationLLMContext","resourceIdParam","annotationId","annotationIdParam","includeSourceContext","includeTargetContext","contextWindow","fullAnnotationUri","services","backend","publicURL","route","buildLLMContext","annotationUri","registerGetReferencedBy","graphDb","resourceUri","resourceIdToURI","makeResourceId","references","getResourceReferencedBy","docIds","Set","ref","getTargetSource","docId","getResource","makeResourceUri","notFound","r","docMap","Map","referencedBy","targetSource","targetSelector","getTargetSelector","found","resourceName","source","selector","exact","getExactText","cloneTokens","registerTokenRoutes","makeCloneToken","tokenData","expiresAt","sourceDoc","sourceResource","validFormats","CREATION_METHODS","CLONE","archiveOriginal","random","toString","registerGetResourceAnnotations","eventTypes","isValidEventType","registerGetEvents","queryParams","eventQuery","validatedType","filters","storedEvents","queryEvents","emptyResponse","sequenceNumber","prevEventHash","registerGetEventStream","rUri","eventCount","SSE_STREAM_CONNECTED","subscription","streamId","bus","storedEvent","eventType","eventData","jsonData","startStringify","stringifyTime","time","stringifyError","startWrite","writeTime","registerCreateAnnotation","request","newAnnotationId","backendUrl","generateAnnotationId","posSelector","getTextPositionSelector","svgSelector","getSvgSelector","fragmentSelector","getFragmentSelector","svgError","validateSvgMarkup","annotation","modified","eventPayload","appendEvent","creator","userToAgent","registerGetAnnotation","getAnnotation","resolvedResource","bodySource","getBodySource","resolvedId","pop","registerDeleteAnnotation","projection","getResourceAnnotations","find","registerUpdateAnnotationBody","put","operations","bodyArray","op","exists","item","index","findIndex","splice","oldItem","newItem","registerYieldResourceStream","linkingAnnotations","ids","expectedAnnotationUri","reference","expectedUri","availableIds","referenceId","makeAnnotationId","sourceResourceId","title","prompt","temperature","maxTokens","resultResourceId","registerGetAnnotationHistory","allEvents","annotationEvents","highlightId","sort","b","createResourcesRouter","resourcesRouter","createAnnotationRouter","registerGetAnnotationUri","resourceUriOrId","extractedResourceId","uriToResourceId","bodyDocId","operationsRouter","contextBefore","contextAfter","getAnnotationContext","generateAnnotationSummary","annotationsRouter","uriRouter","entityTypesRouter","readEntityTypesProjection","details","isModerator","tag","createJobsRouter","jobsRouter","getJob","startedAt","completedAt","securityHeaders","res","headers","csp","permissions","requestIdMiddleware","requestId","randomUUID","requestLoggerMiddleware","startTime","http","durationMs","errorLoggerMiddleware","databaseUrlConstructed","DATABASE_URL","DB_HOST","DB_USER","DB_PASSWORD","dbPort","DB_PORT","dbName","DB_NAME","url","URL","username","hostname","port","pathname","searchParams","SEMIONT_ENV","projectRoot","SEMIONT_ROOT","corsOrigin","backendService","host","ssl","EventBus","startMakeMeaning","__filename","fileURLToPath","__dirname","dirname","app","cors","origin","credentials","openApiPath","openApiContent","openApiSpec","apiUrl","servers","description","swaggerHandler","swaggerUI","persistAuthorization","serve"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core Logger Module\n *\n * Winston-based logging with configurable log levels and structured metadata.\n * Supports environment-based configuration for development and production.\n */\n\nimport winston from 'winston';\n\n/**\n * Log levels supported by the logger\n */\nexport type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'debug';\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n level: LogLevel;\n format: 'json' | 'simple';\n transports: ('console' | 'file')[];\n}\n\n/**\n * Get logger configuration from environment config or environment variables\n *\n * Priority:\n * 1. Provided logLevel parameter (from environment config)\n * 2. LOG_LEVEL environment variable\n * 3. Default: 'info'\n *\n * Environment variables:\n * - LOG_LEVEL: error | warn | info | http | debug (fallback if no config provided)\n * - LOG_FORMAT: json | simple (default: json)\n * - NODE_ENV: development | production | test\n */\nexport function getLoggerConfig(logLevel?: LogLevel): LoggerConfig {\n const level = logLevel || (process.env.LOG_LEVEL as LogLevel) || 'info';\n const format = (process.env.LOG_FORMAT || 'json') as 'json' | 'simple';\n const nodeEnv = process.env.NODE_ENV || 'development';\n\n // In test mode, only use console transport with minimal logging\n if (nodeEnv === 'test') {\n return {\n level: 'error', // Only log errors in tests\n format: 'simple',\n transports: ['console']\n };\n }\n\n return {\n level,\n format,\n transports: ['file']\n };\n}\n\n/**\n * Create Winston format based on configuration\n */\nfunction createFormat(config: LoggerConfig): winston.Logform.Format {\n if (config.format === 'json') {\n return winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.json()\n );\n }\n\n // Simple format for development\n return winston.format.combine(\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n winston.format.errors({ stack: true }),\n winston.format.printf(({ level, message, timestamp, ...meta }) => {\n const metaStr = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} [${level.toUpperCase()}] ${message}${metaStr}`;\n })\n );\n}\n\n/**\n * Create Winston transports based on configuration\n */\nfunction createTransports(config: LoggerConfig): winston.transport[] {\n const transports: winston.transport[] = [];\n\n if (config.transports.includes('console')) {\n transports.push(\n new winston.transports.Console({\n level: config.level\n })\n );\n }\n\n if (config.transports.includes('file')) {\n // Separate files for different log levels\n transports.push(\n new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error'\n }),\n new winston.transports.File({\n filename: 'logs/combined.log',\n level: config.level\n })\n );\n }\n\n return transports;\n}\n\n/**\n * Global Winston logger instance\n */\nlet loggerInstance: winston.Logger | null = null;\n\n/**\n * Initialize the global logger\n * Call this once at application startup\n *\n * @param logLevel - Optional log level from environment config\n */\nexport function initializeLogger(logLevel?: LogLevel): winston.Logger {\n const config = getLoggerConfig(logLevel);\n\n loggerInstance = winston.createLogger({\n level: config.level,\n format: createFormat(config),\n transports: createTransports(config),\n // Don't exit on handled exceptions\n exitOnError: false\n });\n\n loggerInstance.info('Logger initialized', {\n level: config.level,\n format: config.format,\n transports: config.transports\n });\n\n return loggerInstance;\n}\n\n/**\n * Get the global logger instance\n * Throws if logger hasn't been initialized\n */\nexport function getLogger(): winston.Logger {\n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call initializeLogger() first.');\n }\n return loggerInstance;\n}\n\n/**\n * Create a child logger with additional context\n *\n * @param context - Additional context fields to include in all log messages\n * @returns Child logger with context\n *\n * @example\n * ```typescript\n * const logger = createChildLogger({ userId: '123', requestId: 'abc' });\n * logger.info('User logged in'); // Will include userId and requestId\n * ```\n */\nexport function createChildLogger(context: Record<string, any>): winston.Logger {\n return getLogger().child(context);\n}\n\n/**\n * Create a logger for a specific component/service\n *\n * @param component - Component name (e.g., 'auth', 'storage', 'api')\n * @returns Child logger with component context\n *\n * @example\n * ```typescript\n * const logger = createComponentLogger('storage');\n * logger.info('File saved successfully', { path: '/tmp/file.txt' });\n * // Output: { component: 'storage', message: 'File saved successfully', path: '/tmp/file.txt' }\n * ```\n */\nexport function createComponentLogger(component: string): winston.Logger {\n return createChildLogger({ component });\n}\n","import { z } from 'zod';\nimport type { GoogleAuthRequest, UserId } from '@semiont/core';\nimport type { Email } from '@semiont/core';\n\n// JWT Payload schema - backend-specific internal type for JWT validation\nexport const JWTPayloadSchema = z.object({\n userId: z.string().regex(/^c[a-z0-9]{24,}$/), // CUID format\n email: z.string().email(),\n name: z.string().optional(),\n domain: z.string(),\n provider: z.string(),\n isAdmin: z.boolean(),\n iat: z.number().optional(),\n exp: z.number().optional(),\n});\n\n// Base Zod-inferred type\ntype JWTPayloadBase = z.infer<typeof JWTPayloadSchema>;\n\n// Branded version for type safety\nexport type JWTPayload = Omit<JWTPayloadBase, 'userId' | 'email'> & {\n userId: UserId;\n email: Email;\n};\n\n// Re-export GoogleAuthRequest type from SDK\nexport type { GoogleAuthRequest };","import jwt from 'jsonwebtoken';\nimport { JWTPayloadSchema } from '../types/jwt-types';\nimport type { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { EnvironmentConfig, UserId, Email } from '@semiont/core';\nimport { userId as makeUserId, email as makeEmail } from '@semiont/core';\n\nexport interface JWTPayload {\n userId: UserId;\n email: Email;\n name?: string;\n domain: string;\n provider: string;\n type?: 'access' | 'refresh';\n iat?: number;\n exp?: number;\n}\n\ninterface SiteConfig {\n domain?: string;\n oauthAllowedDomains?: string[];\n}\n\nexport class JWTService {\n private static siteConfig: SiteConfig | null = null;\n\n /**\n * Initialize JWTService with application configuration\n * Must be called once at application startup before using any other methods\n */\n static initialize(config: EnvironmentConfig): void {\n if (!config.site?.domain) {\n throw new Error('site.domain is required in environment config');\n }\n\n if (!config.site?.oauthAllowedDomains || !Array.isArray(config.site.oauthAllowedDomains)) {\n throw new Error('site.oauthAllowedDomains is required in environment config');\n }\n\n this.siteConfig = {\n domain: config.site.domain,\n oauthAllowedDomains: config.site.oauthAllowedDomains\n };\n }\n\n /**\n * Get site configuration (must call initialize() first)\n */\n private static getSiteConfig(): SiteConfig {\n if (!this.siteConfig) {\n throw new Error('JWTService not initialized. Call JWTService.initialize(config) at application startup.');\n }\n return this.siteConfig;\n }\n\n /**\n * Override configuration for testing purposes\n * @param config The configuration to use\n */\n static setTestConfig(domain: string, oauthAllowedDomains: string[]): void {\n this.siteConfig = { domain, oauthAllowedDomains };\n }\n\n /**\n * Reset configuration cache (useful for testing)\n */\n static resetConfig(): void {\n this.siteConfig = null;\n }\n \n private static getSecret(): string {\n // JWT secret comes from AWS Secrets Manager (injected as env var by ECS) or test setup\n const secret = process.env.JWT_SECRET;\n if (!secret) {\n throw new Error('JWT_SECRET environment variable not found. This should be injected by AWS Secrets Manager in production or set in test setup.');\n }\n if (secret.length < 32) {\n throw new Error('JWT_SECRET must be at least 32 characters long');\n }\n return secret;\n }\n\n static generateToken(\n payload: Omit<ValidatedJWTPayload, 'iat' | 'exp'>, \n expiresIn: string = '7d'\n ): string {\n const config = this.getSiteConfig();\n // Convert payload to plain object for jwt.sign\n const tokenPayload: Record<string, any> = { ...payload };\n return jwt.sign(tokenPayload, this.getSecret(), {\n expiresIn: expiresIn,\n issuer: config.domain || 'localhost',\n } as jwt.SignOptions);\n }\n\n static verifyToken(token: string): ValidatedJWTPayload {\n try {\n // First, verify JWT signature and basic structure\n const decoded = jwt.verify(token, this.getSecret());\n\n // Then validate the payload structure and content\n const result = JWTPayloadSchema.safeParse(decoded);\n\n if (!result.success) {\n throw new Error(`Invalid token payload: ${result.error.message}`);\n }\n\n // Brand the string types for type safety\n return {\n ...result.data,\n userId: makeUserId(result.data.userId),\n email: makeEmail(result.data.email),\n };\n } catch (error) {\n if (error instanceof jwt.JsonWebTokenError) {\n throw new Error('Invalid token signature');\n }\n if (error instanceof jwt.TokenExpiredError) {\n throw new Error('Token has expired');\n }\n if (error instanceof jwt.NotBeforeError) {\n throw new Error('Token not active yet');\n }\n\n // Re-throw validation errors or other errors\n throw error;\n }\n }\n\n static isAllowedDomain(email: Email): boolean {\n const parts = email.split('@');\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n return false;\n }\n const domain = parts[1];\n const config = this.getSiteConfig();\n const allowedDomains = config.oauthAllowedDomains || [];\n return allowedDomains.includes(domain);\n }\n}","/**\n * Backend Configuration Utilities\n *\n * Node.js-specific config loading using @semiont/core's createConfigLoader\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createConfigLoader, type ConfigFileReader } from '@semiont/core';\n\n/**\n * Node.js file reader implementation for config loading\n */\nconst nodeFileReader: ConfigFileReader = {\n readIfExists: (filePath: string) => {\n const absolutePath = path.resolve(filePath);\n return fs.existsSync(absolutePath)\n ? fs.readFileSync(absolutePath, 'utf-8')\n : null;\n },\n\n readRequired: (filePath: string) => {\n const absolutePath = path.resolve(filePath);\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n return fs.readFileSync(absolutePath, 'utf-8');\n },\n};\n\n/**\n * Load environment configuration from filesystem\n * Uses Node.js fs module for file I/O\n *\n * @param projectRoot - Absolute path to project root\n * @param environment - Environment name (e.g., 'local', 'production')\n * @returns Merged and validated environment configuration\n *\n * @example\n * ```typescript\n * const projectRoot = process.env.SEMIONT_ROOT;\n * if (!projectRoot) throw new Error('SEMIONT_ROOT not set');\n * const config = loadEnvironmentConfig(projectRoot, 'production');\n * ```\n */\nexport const loadEnvironmentConfig = createConfigLoader(nodeFileReader);\n","// Environment variables are loaded via Node's --env-file flag (see package.json)\n// Construct DATABASE_URL from components if not already set\n// MUST be done before any Prisma imports!\nlet databaseUrlConstructed = false;\nif (!process.env.DATABASE_URL && process.env.DB_HOST && process.env.DB_USER && process.env.DB_PASSWORD) {\n const dbPort = process.env.DB_PORT;\n const dbName = process.env.DB_NAME;\n\n if (!dbPort) {\n throw new Error('DB_PORT is required when constructing DATABASE_URL from components');\n }\n if (!dbName) {\n throw new Error('DB_NAME is required when constructing DATABASE_URL from components');\n }\n\n const url = new URL('postgresql://localhost');\n url.username = process.env.DB_USER;\n url.password = process.env.DB_PASSWORD; // Automatically URL-encoded by URL class\n url.hostname = process.env.DB_HOST;\n url.port = dbPort;\n url.pathname = `/${dbName}`;\n url.searchParams.set('sslmode', 'require');\n\n process.env.DATABASE_URL = url.toString();\n databaseUrlConstructed = true;\n}\n\nimport { cors } from 'hono/cors';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { swaggerUI } from '@hono/swagger-ui';\nimport { type EnvironmentConfig, EventBus } from '@semiont/core';\nimport { startMakeMeaning } from '@semiont/make-meaning';\nimport { loadEnvironmentConfig } from './utils/config';\n\nimport { User } from '@prisma/client';\n\n// Load configuration from semiont.json + environments/{SEMIONT_ENV}.json\n// SEMIONT_ROOT and SEMIONT_ENV are read from environment\nconst env = process.env.SEMIONT_ENV || 'local';\nconst projectRoot = process.env.SEMIONT_ROOT;\nif (!projectRoot) {\n throw new Error('SEMIONT_ROOT environment variable is not set');\n}\n\nconst config = loadEnvironmentConfig(projectRoot, env);\n\nif (!config.services?.backend) {\n throw new Error('services.backend is required in environment config');\n}\nif (!config.services.backend.corsOrigin) {\n throw new Error('services.backend.corsOrigin is required in environment config');\n}\n\nconst backendService = config.services.backend;\n\n// Import logging utilities\nimport { initializeLogger, getLogger } from './logger';\n\n// Initialize Winston logger with log level from environment config\ninitializeLogger(config.logLevel);\nconst logger = getLogger();\n\n// Log database configuration after logger is initialized\nif (databaseUrlConstructed) {\n logger.info('DATABASE_URL constructed from environment components', {\n host: process.env.DB_HOST,\n port: process.env.DB_PORT,\n database: process.env.DB_NAME,\n ssl: 'required'\n });\n}\n\n// Create global EventBus for real-time events\nconst eventBus = new EventBus();\n\n// Initialize make-meaning service (job queue, workers, graph consumer)\nconst makeMeaning = await startMakeMeaning(config, eventBus, logger);\n\n// Import route definitions\nimport { healthRouter } from './routes/health';\nimport { authRouter } from './routes/auth';\nimport { statusRouter } from './routes/status';\nimport { adminRouter } from './routes/admin';\nimport { createResourcesRouter } from './routes/resources/index';\nimport { annotationsRouter } from './routes/annotations/index';\nimport { entityTypesRouter } from './routes/entity-types';\nimport { createJobsRouter } from './routes/jobs/index';\nimport { authMiddleware } from './middleware/auth';\n\n// Import for static OpenAPI spec\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\n// ESM equivalent of __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Graph database and inference client are accessed via makeMeaning service\n// Import security headers middleware\nimport { securityHeaders } from './middleware/security-headers';\n// Import logging middleware\nimport { requestIdMiddleware } from './middleware/request-id';\nimport { requestLoggerMiddleware } from './middleware/request-logger';\nimport { errorLoggerMiddleware } from './middleware/error-logger';\n\ntype Variables = {\n user: User;\n config: EnvironmentConfig;\n makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>>;\n};\n\n// Create Hono app with proper typing\nconst app = new Hono<{ Variables: Variables }>();\n\n// Add CORS middleware\napp.use('*', cors({\n origin: backendService.corsOrigin,\n credentials: true,\n}));\n\n// Add security headers middleware (after CORS, before other middleware)\napp.use('*', securityHeaders());\n\n// Add logging middleware (order matters!)\napp.use('*', requestIdMiddleware); // Generate request ID first\napp.use('*', errorLoggerMiddleware); // Catch errors second\napp.use('*', requestLoggerMiddleware); // Log requests third\n\n// Inject config and makeMeaning into context for all routes\napp.use('*', async (c, next) => {\n c.set('config', config);\n c.set('makeMeaning', makeMeaning);\n await next();\n});\n\n// Mount route routers\napp.route('/', healthRouter);\napp.route('/', authRouter);\napp.route('/', statusRouter);\napp.route('/', adminRouter);\nconst resourcesRouter = createResourcesRouter(makeMeaning.jobQueue);\napp.route('/', resourcesRouter);\napp.route('/', annotationsRouter);\napp.route('/', entityTypesRouter);\nconst jobsRouter = createJobsRouter(makeMeaning.jobQueue, authMiddleware);\napp.route('/', jobsRouter);\n\n// API Resourceation root - redirect to appropriate format\napp.get('/api', (c) => {\n const acceptHeader = c.req.header('Accept') || '';\n const userAgent = c.req.header('User-Agent') || '';\n const token = c.req.query('token');\n \n // If request is from a browser, redirect to Swagger UI\n if (acceptHeader.includes('text/html') || userAgent.includes('Mozilla')) {\n // Preserve token in redirect if it was provided\n const redirectUrl = token ? `/api/docs?token=${token}` : '/api/docs';\n return c.redirect(redirectUrl);\n }\n\n // For API clients requesting JSON, redirect to OpenAPI spec\n const redirectUrl = token ? `/api/openapi.json?token=${token}` : '/api/openapi.json';\n return c.redirect(redirectUrl);\n});\n\n// Serve OpenAPI JSON specification - now automatically generated\napp.get('/api/openapi.json', (c) => {\n // Serve the static OpenAPI spec from the specs directory\n const openApiPath = path.join(__dirname, '../../../specs/openapi.json');\n const openApiContent = fs.readFileSync(openApiPath, 'utf-8');\n const openApiSpec = JSON.parse(openApiContent);\n\n // Update server URL dynamically\n const port = backendService.port || 4000;\n const apiUrl = backendService.publicURL || `http://localhost:${port}`;\n if (apiUrl) {\n openApiSpec.servers = [\n {\n url: apiUrl,\n description: 'API Server',\n },\n ];\n }\n\n return c.json(openApiSpec);\n});\n\n// Serve Swagger UI resourceation - now public\napp.get('/api/docs', async (c) => {\n // Token is optional for authenticated access\n const token = c.req.query('token');\n \n try {\n const swaggerHandler = swaggerUI({ \n url: token ? `/api/openapi.json?token=${token}` : '/api/openapi.json',\n persistAuthorization: true,\n title: 'Semiont API Resourceation'\n });\n \n // TypeScript workarounds: swaggerUI has type mismatches\n // - It's typed as MiddlewareHandler expecting (c, next) but runtime only uses (c)\n // - Context type incompatibility requires 'as any' cast\n return await swaggerHandler(c as any, async () => {});\n } catch (error) {\n logger.error('Error in /api/docs handler', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to load resourceation', details: String(error) }, 500);\n }\n});\n\n// Redirect /api/swagger to /api/docs for convenience\napp.get('/api/swagger', (c) => {\n const token = c.req.query('token');\n const redirectUrl = token ? `/api/docs?token=${token}` : '/api/docs';\n return c.redirect(redirectUrl);\n});\n\n// 404 handler for non-existent API routes\napp.all('/api/*', (c) => {\n return c.json({ error: 'Not found' }, 404);\n});\n\n// Start server\nconst port = backendService.port || 4000;\nconst nodeEnv = config.env?.NODE_ENV || 'development';\n\n// Only start server if not in test environment\nif (nodeEnv !== 'test') {\n serve({\n fetch: app.fetch,\n port: port,\n hostname: '0.0.0.0'\n }, async (info) => {\n logger.info('Semiont Backend ready', {\n url: `http://localhost:${info.port}/api`,\n environment: nodeEnv\n });\n\n // Initialize JWT Service with configuration\n try {\n const { JWTService } = await import('./auth/jwt');\n JWTService.initialize(config);\n } catch (error) {\n logger.error('Failed to initialize JWT Service', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n\n // Pre-load entity types from graph database for performance\n try {\n const entityTypes = await makeMeaning.graphDb.getEntityTypes();\n logger.info('Loaded entity types from graph database', {\n count: entityTypes.length\n });\n } catch (error) {\n logger.error('Failed to pre-load entity types', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n });\n}\n\nexport type AppType = typeof app;\n\n// Export app for testing\nexport { app };","import { PrismaClient } from '@prisma/client';\nimport type { Logger } from '@semiont/core';\n\nconst globalForPrisma = global as unknown as { prisma: PrismaClient | undefined };\n\n/**\n * Database connection manager with lazy initialization\n * \n * Usage:\n * const prisma = DatabaseConnection.getClient();\n * const user = await prisma.user.findUnique({ where: { id } });\n */\nexport class DatabaseConnection {\n private static instance: PrismaClient | null = null;\n private static isInitializing = false;\n \n /**\n * Get or create the Prisma client instance\n * Lazy loads the connection on first use\n */\n static getClient(): PrismaClient {\n // Check if we already have an instance (either global or local)\n if (globalForPrisma.prisma) {\n return globalForPrisma.prisma;\n }\n\n if (this.instance) {\n return this.instance;\n }\n\n // Prevent multiple simultaneous initializations\n if (this.isInitializing) {\n throw new Error('Database connection is already being initialized');\n }\n\n this.isInitializing = true;\n try {\n // Determine which events to enable based on environment\n const logLevels = this.getLogLevel();\n\n // Create new PrismaClient instance\n // Use 'emit' type to trigger $on() handlers without stdout logging\n const logConfig = logLevels.map(level => ({ emit: 'event' as const, level }));\n\n this.instance = new PrismaClient({\n log: logConfig, // Enable events but not stdout logging\n });\n\n // Setup custom logging to Winston (logs/combined.log)\n // Logger is retrieved lazily inside each handler to avoid initialization order issues\n this.instance.$on('query' as never, (e: any) => {\n this.getDBLogger()?.debug('Query', {\n query: e.query,\n params: e.params,\n duration: `${e.duration}ms`,\n target: e.target\n });\n });\n\n this.instance.$on('error' as never, (e: any) => {\n this.getDBLogger()?.error('Database error', {\n message: e.message,\n target: e.target\n });\n });\n\n this.instance.$on('warn' as never, (e: any) => {\n this.getDBLogger()?.warn('Database warning', {\n message: e.message,\n target: e.target\n });\n });\n\n this.instance.$on('info' as never, (e: any) => {\n this.getDBLogger()?.info('Database info', {\n message: e.message,\n target: e.target\n });\n });\n\n // In non-production, store in global for hot-reload persistence\n if (process.env.NODE_ENV !== 'production') {\n globalForPrisma.prisma = this.instance;\n }\n\n return this.instance;\n } finally {\n this.isInitializing = false;\n }\n }\n \n /**\n * Get appropriate log level based on environment\n * These events are captured by $on() handlers and routed to Winston\n */\n private static getLogLevel(): Array<'query' | 'error' | 'warn' | 'info'> {\n const env = process.env.NODE_ENV;\n\n if (env === 'development') {\n // Enable query logging in development (goes to logs/combined.log via Winston)\n return ['query', 'error', 'warn', 'info'];\n }\n\n // Default to error-only logging for production and test\n return ['error'];\n }\n \n /**\n * Override the Prisma client instance (useful for testing)\n */\n static setClient(client: PrismaClient): void {\n this.instance = client;\n // Also update global if in non-production\n if (process.env.NODE_ENV !== 'production') {\n globalForPrisma.prisma = client;\n }\n }\n \n /**\n * Reset the connection (useful for testing)\n * This will close the existing connection and clear the instance\n */\n static async reset(): Promise<void> {\n if (this.instance) {\n if (typeof this.instance.$disconnect === 'function') {\n await this.instance.$disconnect();\n }\n this.instance = null;\n }\n \n if (globalForPrisma.prisma) {\n if (typeof globalForPrisma.prisma.$disconnect === 'function') {\n await globalForPrisma.prisma.$disconnect();\n }\n globalForPrisma.prisma = undefined;\n }\n }\n \n /**\n * Disconnect from the database\n * Useful for graceful shutdown\n */\n static async disconnect(): Promise<void> {\n const client = this.instance || globalForPrisma.prisma;\n if (client) {\n await client.$disconnect();\n }\n }\n \n /**\n * Get database logger safely (returns null if logger not initialized)\n * This avoids initialization order issues\n */\n private static getDBLogger(): Logger | null {\n try {\n // Dynamic import to avoid circular dependency\n const { getLogger } = require('./logger');\n return getLogger().child({ component: 'database' });\n } catch (error) {\n // Logger not initialized yet - return null and log events will be skipped\n return null;\n }\n }\n\n /**\n * Check database health by attempting a simple query\n * Returns true if connected, false otherwise\n */\n static async checkHealth(): Promise<boolean> {\n try {\n const client = this.getClient();\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n return true;\n } catch (error) {\n this.getDBLogger()?.error('Database health check failed', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return false;\n }\n }\n}\n\n// For convenience, export a getter function\nexport function getDatabase(): PrismaClient {\n return DatabaseConnection.getClient();\n}\n\n// Export prisma for tests\nexport const prisma = DatabaseConnection.getClient();","/**\n * Health Check Route - Spec-First Version\n *\n * This is a proof of concept demonstrating the new spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No Zod schemas (GET endpoint has no request body)\n * - Types come from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { DatabaseConnection } from '../db';\nimport type { components } from '@semiont/core';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'health' });\n\ntype HealthResponse = components['schemas']['HealthResponse'];\n\n// Create health router with plain Hono\nexport const healthRouter = new Hono();\n\n/**\n * GET /api/health\n *\n * Health check endpoint - no validation needed (no request body)\n * Response type comes from OpenAPI spec via generated types\n */\nhealthRouter.get('/api/health', async (c) => {\n const nodeEnv = process.env.NODE_ENV;\n if (!nodeEnv) {\n throw new Error('NODE_ENV environment variable is required');\n }\n\n // Check if startup script had issues (for internal monitoring)\n let startupFailed = false;\n try {\n const fs = await import('fs');\n if (fs.existsSync('/tmp/startup_status')) {\n const startupStatus = fs.readFileSync('/tmp/startup_status', 'utf-8').trim();\n if (startupStatus.startsWith('FAILED')) {\n startupFailed = true;\n // Log internally but don't expose details\n getRouteLogger().error('Startup script failure detected', { startupStatus });\n }\n }\n } catch (e) {\n // Ignore file read errors\n }\n\n if (startupFailed) {\n // Return unhealthy but don't expose internal details\n const response: HealthResponse = {\n status: 'offline',\n message: 'Service is experiencing issues',\n version: '0.1.0',\n timestamp: new Date().toISOString(),\n database: 'unknown',\n environment: nodeEnv,\n };\n return c.json(response, 200); // Always return 200 for health checks (ALB requirement)\n }\n\n const dbStatus = await DatabaseConnection.checkHealth();\n\n const response: HealthResponse = {\n status: 'operational',\n message: 'Semiont API is running',\n version: '0.1.0',\n timestamp: new Date().toISOString(),\n database: dbStatus ? 'connected' : 'disconnected',\n environment: nodeEnv,\n };\n\n return c.json(response, 200);\n});\n","{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Semiont API\",\n \"version\": \"0.1.0\",\n \"description\": \"Semantic Knowledge Platform API\"\n },\n \"servers\": [\n {\n \"url\": \"http://localhost:4000\",\n \"description\": \"API Server\"\n }\n ],\n \"paths\": {\n \"/resources/{id}\": {\n \"get\": {\n \"summary\": \"Get Resource by URI (W3C Content Negotiation)\",\n \"description\": \"W3C-compliant globally resolvable resource URI with content negotiation. Returns JSON-LD metadata (Accept: application/ld+json), raw representation (Accept: text/plain, text/markdown, etc.), or redirects to frontend (?view=semiont). Requires authentication.\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID\"\n },\n {\n \"name\": \"view\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\",\n \"enum\": [\n \"semiont\"\n ]\n },\n \"description\": \"Optional view parameter. If set to 'semiont', redirects to frontend viewer.\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource metadata (JSON-LD) or raw representation\",\n \"content\": {\n \"application/ld+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceResponse\"\n }\n },\n \"text/plain\": {\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"text/markdown\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"302\": {\n \"description\": \"Redirect to frontend viewer (when ?view=semiont)\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n },\n \"patch\": {\n \"summary\": \"Update Resource\",\n \"description\": \"Update resource metadata (append-only operations - name and content are immutable)\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateResourceRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Resource updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/annotations/{id}\": {\n \"get\": {\n \"summary\": \"Get Annotation by URI (W3C Content Negotiation)\",\n \"description\": \"W3C-compliant globally resolvable annotation URI with content negotiation. Returns JSON-LD for API clients (Accept: application/ld+json or application/json). Redirects to frontend for browsers (Accept: text/html or browser User-Agent). Requires authentication and resourceId query parameter.\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"description\": \"Resource ID or URI containing the annotation\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation representation (JSON-LD)\",\n \"content\": {\n \"application/ld+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationResponse\"\n }\n }\n }\n },\n \"302\": {\n \"description\": \"Redirect to frontend (for browsers)\"\n },\n \"400\": {\n \"description\": \"Missing resourceId parameter\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/annotations/{id}/context\": {\n \"get\": {\n \"summary\": \"Get Annotation Context\",\n \"description\": \"Get the text context around an annotation with configurable before/after window\",\n \"tags\": [\n \"Annotations\",\n \"Context\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID containing the annotation\"\n },\n {\n \"name\": \"contextBefore\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 5000,\n \"default\": 100\n },\n \"description\": \"Number of characters before the selection\"\n },\n {\n \"name\": \"contextAfter\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 5000,\n \"default\": 100\n },\n \"description\": \"Number of characters after the selection\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotationContextResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid query parameters\"\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/annotations/{id}/summary\": {\n \"get\": {\n \"summary\": \"Get Annotation Summary\",\n \"description\": \"Get an AI-generated summary of the annotation in context\",\n \"tags\": [\n \"Annotations\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID containing the annotation\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"AI-generated annotation summary\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ContextualSummaryResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Missing resourceId parameter\"\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/health\": {\n \"get\": {\n \"summary\": \"Health Check\",\n \"description\": \"Check if the API is operational and database is connected\",\n \"tags\": [\n \"System\"\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Health status of the API\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/HealthResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/password\": {\n \"post\": {\n \"summary\": \"Password Authentication\",\n \"description\": \"Authenticate with email and password for users with password provider\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PasswordAuthRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Authentication successful\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AuthResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Bad request - invalid input or OAuth user attempting password auth\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized - invalid credentials\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - account not active\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/google\": {\n \"post\": {\n \"summary\": \"Google OAuth Authentication\",\n \"description\": \"Authenticate with Google OAuth access token\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GoogleAuthRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Successful authentication\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AuthResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid request or authentication failed\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/refresh\": {\n \"post\": {\n \"summary\": \"Refresh Access Token\",\n \"description\": \"Exchange a refresh token for a new access token\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/TokenRefreshRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"New access token generated\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GoogleAuthRequest\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Invalid or expired refresh token\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/mcp-generate\": {\n \"post\": {\n \"summary\": \"Generate MCP Token\",\n \"description\": \"Generate a short-lived token for MCP server\",\n \"tags\": [\n \"Authentication\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"MCP token generated\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/MCPGenerateResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/me\": {\n \"get\": {\n \"summary\": \"Get Current User\",\n \"description\": \"Get information about the authenticated user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User information\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UserResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/accept-terms\": {\n \"post\": {\n \"summary\": \"Accept Terms\",\n \"description\": \"Mark terms as accepted for the current user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Terms accepted successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/logout\": {\n \"post\": {\n \"summary\": \"Logout\",\n \"description\": \"Logout the current user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Logged out successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/status\": {\n \"get\": {\n \"summary\": \"Get Service Status\",\n \"description\": \"Get service status and feature availability\",\n \"tags\": [\n \"General\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Service status information\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/StatusResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users\": {\n \"get\": {\n \"summary\": \"List All Users\",\n \"description\": \"Get a list of all users (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"List of users\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUsersListResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users/stats\": {\n \"get\": {\n \"summary\": \"User Statistics\",\n \"description\": \"Get user statistics (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User statistics\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUserStatsResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users/{id}\": {\n \"patch\": {\n \"summary\": \"Update User\",\n \"description\": \"Update user properties (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\",\n \"example\": \"user-123\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateUserRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"User updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUpdateUserResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid request\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"User not found\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n },\n \"delete\": {\n \"summary\": \"Delete User\",\n \"description\": \"Delete a user account (admin only, cannot delete own account)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\",\n \"example\": \"user-123\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User deleted successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Cannot delete own account\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"User not found\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/oauth/config\": {\n \"get\": {\n \"summary\": \"Get OAuth Configuration\",\n \"description\": \"Get OAuth provider configuration (admin only, read-only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"OAuth configuration\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/OAuthConfigResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources\": {\n \"post\": {\n \"summary\": \"Create Resource\",\n \"description\": \"Create a new resource\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"multipart/form-data\": {\n \"schema\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"file\",\n \"format\"\n ],\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Resource name\"\n },\n \"file\": {\n \"type\": \"string\",\n \"format\": \"binary\",\n \"description\": \"Binary content of the resource\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"MIME type (e.g., text/markdown, image/png)\"\n },\n \"entityTypes\": {\n \"type\": \"string\",\n \"description\": \"JSON-encoded array of entity types\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"ISO 639-1 language code\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"description\": \"How the resource was created\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\",\n \"description\": \"Source annotation ID (for generated resources)\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\",\n \"description\": \"Source resource ID (for cloned resources)\"\n }\n }\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Resource created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n },\n \"get\": {\n \"summary\": \"List Resources\",\n \"description\": \"List all resources with optional filters\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"number\",\n \"nullable\": true,\n \"default\": 0\n },\n \"required\": false,\n \"name\": \"offset\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"nullable\": true,\n \"default\": 50\n },\n \"required\": false,\n \"name\": \"limit\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"entityType\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n \"required\": false,\n \"name\": \"archived\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"search\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"q\",\n \"in\": \"query\",\n \"description\": \"Search query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resources listed successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ListResourcesResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/annotate-references-stream\": {\n \"post\": {\n \"summary\": \"Annotate References with Progress (SSE)\",\n \"description\": \"Stream real-time reference annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateReferencesStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-highlights-stream\": {\n \"post\": {\n \"summary\": \"Annotate Highlights with Progress (SSE)\",\n \"description\": \"Stream real-time highlight annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateHighlightsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-assessments-stream\": {\n \"post\": {\n \"summary\": \"Annotate Assessments with Progress (SSE)\",\n \"description\": \"Stream real-time assessment annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateAssessmentsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-comments-stream\": {\n \"post\": {\n \"summary\": \"Annotate Comments with Progress (SSE)\",\n \"description\": \"Stream real-time comment annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateCommentsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-tags-stream\": {\n \"post\": {\n \"summary\": \"Annotate Tags with Progress (SSE)\",\n \"description\": \"Stream real-time tag annotation progress via Server-Sent Events. Identifies passages serving specific structural roles (IRAC, IMRAD, Toulmin frameworks).\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateTagsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/llm-context\": {\n \"get\": {\n \"summary\": \"Get Resource LLM Context\",\n \"description\": \"Get resource with full context for LLM processing\",\n \"tags\": [\n \"Resources\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 3,\n \"default\": 2\n },\n \"required\": false,\n \"name\": \"depth\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 20,\n \"default\": 10\n },\n \"required\": false,\n \"name\": \"maxResources\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeContent\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": false\n },\n \"required\": false,\n \"name\": \"includeSummary\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"LLM context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ResourceLLMContextResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/llm-context\": {\n \"get\": {\n \"summary\": \"Get Annotation LLM Context\",\n \"description\": \"Get annotation with full context for LLM processing\",\n \"tags\": [\n \"Resources\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeSourceContext\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeTargetContext\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 100,\n \"maximum\": 5000,\n \"default\": 1000\n },\n \"required\": false,\n \"name\": \"contextWindow\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation LLM context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotationLLMContextResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/referenced-by\": {\n \"get\": {\n \"summary\": \"Get Referenced By\",\n \"description\": \"Get resources that reference this resource\",\n \"tags\": [\n \"Resources\",\n \"Graph\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"required\": false,\n \"name\": \"motivation\",\n \"in\": \"query\",\n \"description\": \"Filter incoming references by W3C motivation type (e.g., 'linking', 'commenting', 'highlighting')\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resources that reference this resource\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetReferencedByResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/clone-tokens/{token}\": {\n \"get\": {\n \"summary\": \"Get Resource by Clone Token\",\n \"description\": \"Retrieve a resource using a clone token\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"token\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceByTokenResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/clone-tokens/create-resource\": {\n \"post\": {\n \"summary\": \"Create Resource from Clone Token\",\n \"description\": \"Create a new resource using a clone token\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceFromTokenRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Resource created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/clone-with-token\": {\n \"post\": {\n \"summary\": \"Clone Resource with Token\",\n \"description\": \"Generate a temporary token for cloning a resource\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Clone token generated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CloneResourceWithTokenResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/annotations\": {\n \"get\": {\n \"summary\": \"Get Resource Annotations\",\n \"description\": \"Get all annotations (both highlights and references) in a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource annotations\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n },\n \"post\": {\n \"summary\": \"Create Annotation\",\n \"description\": \"Create a new annotation/reference in a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateAnnotationRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Annotation created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateAnnotationResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/events\": {\n \"get\": {\n \"summary\": \"Get Resource Event History\",\n \"description\": \"Get full event history for a resource with optional filtering\",\n \"tags\": [\n \"Resources\",\n \"Events\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\",\n \"enum\": [\n \"resource.created\",\n \"resource.cloned\",\n \"resource.archived\",\n \"resource.unarchived\",\n \"annotation.added\",\n \"annotation.removed\",\n \"annotation.body.updated\",\n \"entitytag.added\",\n \"entitytag.removed\",\n \"entitytype.added\"\n ]\n },\n \"required\": false,\n \"name\": \"type\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"userId\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 1000,\n \"default\": 100\n },\n \"required\": false,\n \"name\": \"limit\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Events retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetEventsResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/events/stream\": {\n \"get\": {\n \"summary\": \"Subscribe to Resource Events (SSE)\",\n \"description\": \"Open a Server-Sent Events stream to receive real-time resource events\",\n \"tags\": [\n \"Resources\",\n \"Events\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}\": {\n \"get\": {\n \"summary\": \"Get Annotation\",\n \"description\": \"Get a specific annotation from a resource using nested path\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n },\n \"delete\": {\n \"summary\": \"Delete Annotation\",\n \"description\": \"Delete an annotation from a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Annotation deleted successfully\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/body\": {\n \"put\": {\n \"summary\": \"Update Annotation Body\",\n \"description\": \"Apply fine-grained operations to modify annotation body items (add, remove, or replace TextualBody and SpecificResource items)\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateAnnotationBodyRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation body updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateAnnotationBodyResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/yield-resource-stream\": {\n \"post\": {\n \"summary\": \"Generate Resource (SSE Stream)\",\n \"description\": \"Stream real-time resource generation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/YieldResourceStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/history\": {\n \"get\": {\n \"summary\": \"Get Annotation History\",\n \"description\": \"Get full event history for a specific annotation (highlight or reference)\",\n \"tags\": [\n \"Selections\",\n \"Events\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation history retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationHistoryResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/entity-types\": {\n \"get\": {\n \"summary\": \"Get Entity Types\",\n \"description\": \"Get list of available entity types for references\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Entity types retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetEntityTypesResponse\"\n }\n }\n }\n }\n }\n },\n \"post\": {\n \"summary\": \"Add Entity Type\",\n \"description\": \"Add a new entity type to the collection (append-only, requires moderator/admin)\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Entity type added successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Moderator or Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/entity-types/bulk\": {\n \"post\": {\n \"summary\": \"Bulk Add Entity Types\",\n \"description\": \"Add multiple entity types to the collection (append-only, requires moderator/admin)\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/BulkAddEntityTypesRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Entity types added successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Moderator or Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/jobs/{id}\": {\n \"get\": {\n \"summary\": \"Get Job Status\",\n \"description\": \"Get the current status and progress of an async job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Job status retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/JobStatusResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Job not found\"\n }\n }\n }\n }\n },\n \"components\": {\n \"schemas\": {\n \"AcceptTermsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"success\",\n \"message\"\n ]\n },\n \"AddEntityTypeRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"tag\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 100\n }\n },\n \"required\": [\n \"tag\"\n ]\n },\n \"AddEntityTypeResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"success\",\n \"entityTypes\"\n ]\n },\n \"AdminUpdateUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"lastLogin\",\n \"created\",\n \"updatedAt\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"user\"\n ]\n },\n \"AdminUsersListResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"users\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"lastLogin\",\n \"created\",\n \"updatedAt\"\n ]\n }\n }\n },\n \"required\": [\n \"success\",\n \"users\"\n ]\n },\n \"AdminUserStatsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"stats\": {\n \"type\": \"object\",\n \"properties\": {\n \"totalUsers\": {\n \"type\": \"number\"\n },\n \"activeUsers\": {\n \"type\": \"number\"\n },\n \"adminUsers\": {\n \"type\": \"number\"\n },\n \"regularUsers\": {\n \"type\": \"number\"\n },\n \"domainBreakdown\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"domain\": {\n \"type\": \"string\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"domain\",\n \"count\"\n ]\n }\n },\n \"recentSignups\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"created\"\n ]\n }\n }\n },\n \"required\": [\n \"totalUsers\",\n \"activeUsers\",\n \"adminUsers\",\n \"regularUsers\",\n \"domainBreakdown\",\n \"recentSignups\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"stats\"\n ]\n },\n \"Agent\": {\n \"type\": \"object\",\n \"description\": \"Minimal Person/Organization for attribution (W3C PROV compatible)\",\n \"additionalProperties\": true,\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Unique identifier for the agent\"\n },\n \"@type\": {\n \"description\": \"Type(s) of agent (Person, Organization, Software)\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"nickname\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"email_sha1\": {\n \"type\": \"string\"\n },\n \"homepage\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ]\n },\n \"Annotation\": {\n \"type\": \"object\",\n \"properties\": {\n \"@context\": {\n \"type\": \"string\",\n \"enum\": [\n \"http://www.w3.org/ns/anno.jsonld\"\n ],\n \"default\": \"http://www.w3.org/ns/anno.jsonld\",\n \"description\": \"W3C Web Annotation JSON-LD context\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"Annotation\"\n ],\n \"default\": \"Annotation\",\n \"description\": \"W3C Annotation type\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"motivation\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"IRI of the entire resource being annotated\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationTarget\"\n }\n ],\n \"description\": \"W3C Web Annotation target - can be a simple IRI string (entire resource) or an object with source and optional selector (fragment)\"\n },\n \"body\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"maxItems\": 0,\n \"description\": \"Empty array for stub references (Phase 1 pattern)\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationBody\",\n \"description\": \"Single body (TextualBody or SpecificResource)\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"description\": \"Array of mixed TextualBody (tagging) and SpecificResource (linking) bodies\"\n }\n ],\n \"description\": \"W3C Web Annotation body - can be empty array, single body, or array of bodies\"\n },\n \"creator\": {\n \"$ref\": \"#/components/schemas/Agent\"\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"modified\": {\n \"type\": \"string\"\n },\n \"generator\": {\n \"$ref\": \"#/components/schemas/Agent\"\n }\n },\n \"required\": [\n \"@context\",\n \"type\",\n \"id\",\n \"motivation\",\n \"target\",\n \"body\"\n ]\n },\n \"AnnotationBody\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ],\n \"description\": \"Phase 2: Body can be TextualBody (for entity tags, descriptions) or SpecificResource (for links)\"\n },\n \"AnnotationContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"context\": {\n \"type\": \"object\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n },\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"required\": [\n \"annotation\",\n \"context\",\n \"resource\"\n ]\n },\n \"AnnotationLLMContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"sourceResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"targetResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/YieldContext\",\n \"description\": \"Generation context for this annotation\"\n },\n \"sourceContext\": {\n \"type\": \"object\",\n \"description\": \"DEPRECATED: Use 'context' instead. Legacy source context format.\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"before\",\n \"selected\",\n \"after\"\n ]\n },\n \"targetContext\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\"\n ]\n },\n \"suggestedResolution\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"resourceName\": {\n \"type\": \"string\"\n },\n \"confidence\": {\n \"type\": \"number\"\n },\n \"reasoning\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"resourceName\",\n \"confidence\",\n \"reasoning\"\n ]\n }\n },\n \"required\": [\n \"annotation\",\n \"sourceResource\"\n ]\n },\n \"AnnotationTarget\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\",\n \"description\": \"IRI of the resource being annotated\"\n },\n \"selector\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/TextQuoteSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/TextQuoteSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n }\n ]\n }\n }\n ],\n \"description\": \"Optional selector to identify a specific segment of the source resource\"\n }\n },\n \"required\": [\n \"source\"\n ],\n \"description\": \"W3C Web Annotation target object - source is required, selector is optional\"\n },\n \"AsyncJobResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\"\n ]\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"type\",\n \"created\"\n ]\n },\n \"AuthResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"isAdmin\"\n ]\n },\n \"token\": {\n \"type\": \"string\"\n },\n \"isNewUser\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"success\",\n \"user\",\n \"token\",\n \"isNewUser\"\n ]\n },\n \"BodyOperationAdd\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"add\"\n ]\n },\n \"item\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"item\"\n ]\n },\n \"BodyOperationRemove\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"remove\"\n ]\n },\n \"item\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"item\"\n ]\n },\n \"BodyOperationReplace\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"replace\"\n ]\n },\n \"oldItem\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n },\n \"newItem\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"oldItem\",\n \"newItem\"\n ]\n },\n \"BodyType\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextualBody\",\n \"SpecificResource\"\n ],\n \"description\": \"Annotation body type - TextualBody for textual content, SpecificResource for resource links\"\n },\n \"BulkAddEntityTypesRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 100\n }\n }\n },\n \"required\": [\n \"tags\"\n ]\n },\n \"CloneResourceWithTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Generated clone token\"\n },\n \"expiresAt\": {\n \"type\": \"string\",\n \"description\": \"ISO 8601 timestamp when token expires\"\n },\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"required\": [\n \"token\",\n \"expiresAt\",\n \"resource\"\n ]\n },\n \"ContentFormat\": {\n \"type\": \"string\",\n \"description\": \"Content format as MIME type, optionally with charset parameter. Values include: text/plain, text/plain; charset=utf-8, text/plain; charset=iso-8859-1, text/markdown, text/markdown; charset=windows-1252, image/png, image/jpeg, application/pdf\",\n \"example\": \"text/plain; charset=utf-8\"\n },\n \"ContextualSummaryResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"summary\": {\n \"type\": \"string\"\n },\n \"relevantFields\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n },\n \"context\": {\n \"type\": \"object\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n }\n },\n \"required\": [\n \"summary\",\n \"relevantFields\",\n \"context\"\n ]\n },\n \"CreateAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"motivation\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"target\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\"\n },\n \"selector\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n }\n ]\n }\n }\n ]\n }\n },\n \"required\": [\n \"source\",\n \"selector\"\n ]\n },\n \"body\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"maxItems\": 0,\n \"description\": \"Empty array (Phase 1 stub pattern - will be migrated to contain entity tag bodies in Phase 2)\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationBody\",\n \"description\": \"Single body (TextualBody or SpecificResource)\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"minItems\": 1,\n \"description\": \"Array of mixed TextualBody (tagging) and SpecificResource (linking) bodies\"\n }\n ]\n }\n },\n \"required\": [\n \"target\",\n \"body\",\n \"motivation\"\n ]\n },\n \"CreateAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"CreateFromAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID of the resource containing the annotation\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"name\",\n \"content\",\n \"format\"\n ]\n },\n \"CreateFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"CreateJobResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\"\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"type\",\n \"status\",\n \"created\"\n ]\n },\n \"CreateResourceFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\"\n ]\n },\n \"CreateResourceFromSelectionRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID of the resource containing the annotation\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n \"prompt\": {\n \"type\": \"string\"\n },\n \"language\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"content\",\n \"name\",\n \"format\"\n ]\n },\n \"CreateResourceFromSelectionResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\"\n ]\n },\n \"CreateResourceFromTokenRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Clone token\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name for the new resource\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Content for the new resource\"\n },\n \"archiveOriginal\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to archive the original resource\"\n }\n },\n \"required\": [\n \"token\",\n \"name\",\n \"content\"\n ]\n },\n \"CreateResourceFromTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"CreateResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 500\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"language\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"content\",\n \"format\",\n \"entityTypes\"\n ]\n },\n \"CreateResourceResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"DeleteAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Resource URI containing the annotation (required for O(1) Layer 3 lookup)\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"DeleteUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"success\",\n \"message\"\n ]\n },\n \"AnnotateReferencesStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types to annotate (e.g., 'Person', 'Organization', 'Location')\"\n },\n \"includeDescriptiveReferences\": {\n \"type\": \"boolean\",\n \"description\": \"Include anaphoric/cataphoric references (e.g., 'the CEO', 'the tech giant') in addition to direct mentions\"\n }\n },\n \"required\": [\n \"entityTypes\"\n ]\n },\n \"AnnotateHighlightsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI highlight annotation\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 15,\n \"description\": \"Optional density: desired number of highlights per 2000 words of text (1-15)\"\n }\n }\n },\n \"AnnotateAssessmentsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI assessment annotation\"\n },\n \"tone\": {\n \"type\": \"string\",\n \"enum\": [\n \"analytical\",\n \"critical\",\n \"balanced\",\n \"constructive\"\n ],\n \"description\": \"Optional tone/style for generated assessments\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 10,\n \"description\": \"Optional density: desired number of assessments per 2000 words of text (1-10)\"\n }\n }\n },\n \"AnnotateCommentsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI comment annotation\"\n },\n \"tone\": {\n \"type\": \"string\",\n \"enum\": [\n \"scholarly\",\n \"explanatory\",\n \"conversational\",\n \"technical\"\n ],\n \"description\": \"Optional tone/style for generated comments\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 2,\n \"maximum\": 12,\n \"description\": \"Optional density: desired number of comments per 2000 words of text (2-12)\"\n }\n }\n },\n \"AnnotateTagsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaId\": {\n \"type\": \"string\",\n \"description\": \"Tag schema ID (e.g., 'legal-irac', 'scientific-imrad', 'argument-toulmin')\"\n },\n \"categories\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Categories to annotate from the selected schema (e.g., ['Issue', 'Rule', 'Application', 'Conclusion'])\"\n }\n },\n \"required\": [\n \"schemaId\",\n \"categories\"\n ]\n },\n \"ErrorResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"error\": {\n \"type\": \"string\"\n },\n \"code\": {\n \"type\": \"string\"\n },\n \"details\": {}\n },\n \"required\": [\n \"error\"\n ]\n },\n \"EventStreamResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"event\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"event\",\n \"data\"\n ]\n },\n \"YieldResourceFromAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Optional name for the generated resource\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types for the generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Optional AI prompt for generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language code (e.g., 'en', 'es')\"\n }\n }\n },\n \"YieldResourceFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"generated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\",\n \"generated\"\n ]\n },\n \"YieldResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Resource ID containing the annotation\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Custom title for generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Custom prompt for content generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language locale (e.g., \\\"es\\\", \\\"fr\\\", \\\"ja\\\")\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"YieldResourceStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Custom title for generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Custom prompt for content generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language locale for generated content (e.g., \\\"es\\\", \\\"fr\\\", \\\"ja\\\")\"\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/YieldContext\",\n \"description\": \"Generation context including source document excerpts and metadata\"\n },\n \"temperature\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1,\n \"description\": \"Inference temperature (0.0 = focused, 1.0 = creative)\"\n },\n \"maxTokens\": {\n \"type\": \"number\",\n \"minimum\": 100,\n \"maximum\": 4000,\n \"description\": \"Maximum tokens to generate\"\n }\n },\n \"required\": [\n \"context\"\n ]\n },\n \"GetAnnotationHistoryResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"contentChecksum\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ]\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"name\",\n \"format\",\n \"contentChecksum\",\n \"creationMethod\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"contentChecksum\": {\n \"type\": \"string\"\n },\n \"parentResourceId\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ]\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"name\",\n \"format\",\n \"contentChecksum\",\n \"parentResourceId\",\n \"creationMethod\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"reason\": {\n \"type\": \"string\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {}\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\",\n \"description\": \"W3C Annotation (creator/created fields are optional in events - they're derived from event userId/timestamp)\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotationId\": {\n \"type\": \"string\",\n \"description\": \"Unified annotation ID\"\n }\n },\n \"required\": [\n \"annotationId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotationId\": {\n \"type\": \"string\",\n \"description\": \"Unified annotation ID\"\n },\n \"targetResourceId\": {\n \"type\": \"string\",\n \"description\": \"For linking motivation\"\n }\n },\n \"required\": [\n \"annotationId\",\n \"targetResourceId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"entityType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"entityType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"entityType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"entityType\"\n ]\n }\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"sequenceNumber\": {\n \"type\": \"number\"\n },\n \"prevEventHash\": {\n \"type\": \"string\"\n },\n \"checksum\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sequenceNumber\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"timestamp\",\n \"userId\",\n \"resourceId\",\n \"payload\",\n \"metadata\"\n ]\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"annotationId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"events\",\n \"total\",\n \"annotationId\",\n \"resourceId\"\n ]\n },\n \"GetAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"resource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n },\n \"resolvedResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n }\n },\n \"required\": [\n \"annotation\",\n \"resource\",\n \"resolvedResource\"\n ]\n },\n \"GetAnnotationsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"total\": {\n \"type\": \"number\",\n \"description\": \"Total number of annotations\"\n },\n \"motivation\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/Motivation\"\n }\n ],\n \"description\": \"Motivation filter applied (if any)\"\n }\n },\n \"required\": [\n \"annotations\",\n \"total\"\n ]\n },\n \"GetEntityTypesResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"entityTypes\"\n ]\n },\n \"GetEventsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"event\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"payload\": {}\n },\n \"required\": [\n \"id\",\n \"type\",\n \"timestamp\",\n \"userId\",\n \"resourceId\"\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"sequenceNumber\": {\n \"type\": \"number\"\n },\n \"prevEventHash\": {\n \"type\": \"string\"\n },\n \"checksum\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sequenceNumber\"\n ]\n }\n },\n \"required\": [\n \"event\",\n \"metadata\"\n ]\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"events\",\n \"total\",\n \"resourceId\"\n ]\n },\n \"GetReferencedByResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"referencedBy\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Reference annotation ID\"\n },\n \"resourceName\": {\n \"type\": \"string\",\n \"description\": \"Name of resource containing the reference\"\n },\n \"target\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\",\n \"description\": \"ID of resource containing the reference\"\n },\n \"selector\": {\n \"type\": \"object\",\n \"properties\": {\n \"exact\": {\n \"type\": \"string\",\n \"description\": \"The selected text that references this resource\"\n }\n },\n \"required\": [\n \"exact\"\n ]\n }\n },\n \"required\": [\n \"source\",\n \"selector\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"resourceName\",\n \"target\"\n ]\n }\n }\n },\n \"required\": [\n \"referencedBy\"\n ]\n },\n \"GetResourceByTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"sourceResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"expiresAt\": {\n \"type\": \"string\",\n \"description\": \"ISO 8601 timestamp when token expires\"\n }\n },\n \"required\": [\n \"sourceResource\",\n \"expiresAt\"\n ]\n },\n \"GetResourceResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"description\": \"All annotations for the resource (highlights, references, assessments, etc.)\"\n },\n \"entityReferences\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"description\": \"Annotations that reference this resource from other resources\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\",\n \"entityReferences\"\n ]\n },\n \"GoogleAuthRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"access_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"access_token\"\n ]\n },\n \"HealthResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\",\n \"enum\": [\n \"connected\",\n \"disconnected\",\n \"unknown\"\n ]\n },\n \"environment\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"message\",\n \"version\",\n \"timestamp\",\n \"database\",\n \"environment\"\n ]\n },\n \"JobStatusResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\",\n \"highlight-annotation\",\n \"assessment-annotation\",\n \"comment-annotation\",\n \"tag-annotation\"\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"startedAt\": {\n \"type\": \"string\"\n },\n \"completedAt\": {\n \"type\": \"string\"\n },\n \"error\": {\n \"type\": \"string\"\n },\n \"progress\": {},\n \"result\": {}\n },\n \"required\": [\n \"jobId\",\n \"type\",\n \"status\",\n \"userId\",\n \"created\"\n ]\n },\n \"ListAnnotationsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"limit\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"annotations\",\n \"total\",\n \"offset\",\n \"limit\"\n ]\n },\n \"ListResourcesResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resources\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"limit\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"resources\",\n \"total\",\n \"offset\",\n \"limit\"\n ]\n },\n \"PasswordAuthRequest\": {\n \"type\": \"object\",\n \"required\": [\n \"email\",\n \"password\"\n ],\n \"properties\": {\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"User email address\"\n },\n \"password\": {\n \"type\": \"string\",\n \"minLength\": 8,\n \"description\": \"User password (minimum 8 characters)\"\n }\n }\n },\n \"MCPGenerateResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"refresh_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"refresh_token\"\n ]\n },\n \"Motivation\": {\n \"type\": \"string\",\n \"enum\": [\n \"assessing\",\n \"bookmarking\",\n \"classifying\",\n \"commenting\",\n \"describing\",\n \"editing\",\n \"highlighting\",\n \"identifying\",\n \"linking\",\n \"moderating\",\n \"questioning\",\n \"replying\",\n \"tagging\"\n ],\n \"description\": \"W3C Web Annotation motivation vocabulary - https://www.w3.org/TR/annotation-vocab/#motivation\"\n },\n \"OAuthConfigResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"providers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"isConfigured\": {\n \"type\": \"boolean\"\n },\n \"clientId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"isConfigured\",\n \"clientId\"\n ]\n }\n },\n \"allowedDomains\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"providers\",\n \"allowedDomains\"\n ]\n },\n \"Representation\": {\n \"type\": \"object\",\n \"description\": \"A specific, byte-addressable rendition of a resource (file/asset/variant).\",\n \"required\": [\n \"mediaType\"\n ],\n \"additionalProperties\": true,\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Stable ID for this representation.\"\n },\n \"@type\": {\n \"description\": \"Type(s), e.g., schema:MediaObject.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"mediaType\": {\n \"type\": \"string\",\n \"description\": \"MIME/media type (e.g., text/markdown, image/png).\"\n },\n \"storageUri\": {\n \"type\": \"string\",\n \"description\": \"Where the bytes live (s3://, file://, https://, ipfs://, etc.).\"\n },\n \"filename\": {\n \"type\": \"string\"\n },\n \"byteSize\": {\n \"description\": \"Size of the payload in bytes.\",\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"checksum\": {\n \"description\": \"Integrity hash (e.g., sha256:abcd…).\",\n \"type\": \"string\"\n },\n \"encoding\": {\n \"type\": \"string\",\n \"description\": \"Compression/transfer encoding if applicable.\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"IETF BCP 47 language tag (e.g., en, es-ES).\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Pixels (images/video).\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Pixels (images/video).\"\n },\n \"duration\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Seconds (audio/video).\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"modified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"conformsTo\": {\n \"description\": \"Profile/shape the bytes conform to (e.g., a JSON profile or SVG profile).\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"rel\": {\n \"description\": \"Semantics of this rendition relative to the resource (e.g., original, thumbnail, preview, derived).\",\n \"type\": \"string\",\n \"enum\": [\n \"original\",\n \"thumbnail\",\n \"preview\",\n \"optimized\",\n \"derived\",\n \"other\"\n ]\n }\n }\n },\n \"BindAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Target resource ID to resolve reference to\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"BindAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"targetResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"ResourceDescriptor\": {\n \"type\": \"object\",\n \"description\": \"Metadata about a resource (1:1 with its URI). JSON-LD subject is @id. Link to concrete bytes via representations.\",\n \"required\": [\n \"@context\",\n \"@id\",\n \"name\",\n \"representations\"\n ],\n \"additionalProperties\": true,\n \"properties\": {\n \"@context\": {\n \"description\": \"JSON-LD context; URI, object, or array of these.\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n ]\n }\n }\n ]\n },\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Canonical URI/URN of the resource being described.\"\n },\n \"@type\": {\n \"description\": \"Type(s) of the resource (IRIs/CURIEs via @context).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"identifier\": {\n \"description\": \"Persistent identifiers (e.g., DOI, URN).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"value\": {\n \"type\": \"string\"\n },\n \"scheme\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": true\n }\n ]\n },\n \"about\": {\n \"description\": \"Topics (IRIs or strings).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"sameAs\": {\n \"description\": \"Equivalent/authoritative references.\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"isPartOf\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"hasPart\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"license\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"dateCreated\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"dateModified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"wasDerivedFrom\": {\n \"description\": \"W3C PROV - source resources this was derived from\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"wasAttributedTo\": {\n \"description\": \"W3C PROV - agents responsible for this resource\",\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/Agent\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Agent\"\n }\n }\n ]\n },\n \"conformsTo\": {\n \"description\": \"Profile/shape URI this resource description conforms to.\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"availableFormats\": {\n \"description\": \"Convenience set summarizing media types across representations.\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"representations\": {\n \"description\": \"Managed or referenced byte-level renditions of this resource.\",\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/Representation\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Representation\"\n }\n }\n ]\n },\n \"archived\": {\n \"type\": \"boolean\",\n \"description\": \"Application-specific: Whether this resource is archived\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Application-specific: Entity types for this resource\"\n },\n \"isDraft\": {\n \"type\": \"boolean\",\n \"description\": \"Application-specific: Whether this resource is a draft\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ],\n \"description\": \"Application-specific: How this resource was created\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\",\n \"description\": \"Application-specific: ID of annotation that triggered generation\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\",\n \"description\": \"Application-specific: ID of source resource for clones/derivatives\"\n }\n }\n },\n \"ResourceLLMContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"mainResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"relatedResources\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"graph\": {\n \"type\": \"object\",\n \"properties\": {\n \"nodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"label\",\n \"metadata\"\n ]\n }\n },\n \"edges\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"source\",\n \"target\",\n \"type\",\n \"metadata\"\n ]\n }\n }\n },\n \"required\": [\n \"nodes\",\n \"edges\"\n ]\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"suggestedReferences\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"mainResourceContent\": {\n \"type\": \"string\",\n \"description\": \"The content of the main resource (included if includeContent=true)\"\n },\n \"relatedResourcesContent\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n },\n \"description\": \"Map of resource IDs to their content (included if includeContent=true)\"\n }\n },\n \"required\": [\n \"mainResource\",\n \"relatedResources\",\n \"annotations\",\n \"graph\"\n ]\n },\n \"SpecificResource\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"SpecificResource\"\n ]\n },\n \"source\": {\n \"type\": \"string\",\n \"description\": \"IRI of the target resource\"\n },\n \"purpose\": {\n \"$ref\": \"#/components/schemas/Motivation\",\n \"description\": \"Why this body is included\"\n }\n },\n \"required\": [\n \"type\",\n \"source\"\n ]\n },\n \"StatusResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"features\": {\n \"type\": \"object\",\n \"properties\": {\n \"semanticContent\": {\n \"type\": \"string\"\n },\n \"collaboration\": {\n \"type\": \"string\"\n },\n \"rbac\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"semanticContent\",\n \"collaboration\",\n \"rbac\"\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"authenticatedAs\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"version\",\n \"features\",\n \"message\"\n ]\n },\n \"TextPositionSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextPositionSelector\"\n ]\n },\n \"start\": {\n \"type\": \"number\",\n \"description\": \"Character offset from resource start\"\n },\n \"end\": {\n \"type\": \"number\",\n \"description\": \"Character offset from resource start\"\n }\n },\n \"required\": [\n \"type\",\n \"start\",\n \"end\"\n ]\n },\n \"TextQuoteSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n \"TextualBody\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextualBody\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"The text content (e.g., entity type name)\"\n },\n \"purpose\": {\n \"$ref\": \"#/components/schemas/Motivation\",\n \"description\": \"Why this body is included\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"MIME type (defaults to text/plain)\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"TokenRefreshRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"refreshToken\": {\n \"type\": \"string\",\n \"example\": \"eyJhbGciOiJIUzI1NiIs...\",\n \"description\": \"Refresh token obtained during login\"\n }\n },\n \"required\": [\n \"refreshToken\"\n ]\n },\n \"TokenRefreshResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"access_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"access_token\"\n ]\n },\n \"UpdateAnnotationBodyRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Resource ID containing the annotation (required for O(1) Layer 3 lookup)\"\n },\n \"operations\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/BodyOperationAdd\"\n },\n {\n \"$ref\": \"#/components/schemas/BodyOperationRemove\"\n },\n {\n \"$ref\": \"#/components/schemas/BodyOperationReplace\"\n }\n ]\n },\n \"minItems\": 1,\n \"description\": \"Array of body modification operations to apply\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"operations\"\n ]\n },\n \"UpdateAnnotationBodyResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"UpdateResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"archived\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"UpdateUserRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n },\n \"UpdateUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"created\",\n \"updatedAt\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"user\"\n ]\n },\n \"UserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"termsAcceptedAt\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"termsAcceptedAt\",\n \"lastLogin\",\n \"created\"\n ]\n },\n \"SvgSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"SvgSelector\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"SVG markup defining the region (must include xmlns attribute)\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"FragmentSelector\": {\n \"type\": \"object\",\n \"description\": \"W3C Web Annotation FragmentSelector for media fragment identifiers (RFC 3778 for PDFs)\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"FragmentSelector\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Media fragment identifier (e.g., 'page=1&viewrect=100,200,50,30' for PDF)\",\n \"example\": \"page=1&viewrect=100,200,50,30\"\n },\n \"conformsTo\": {\n \"type\": \"string\",\n \"description\": \"URI identifying the fragment syntax specification\",\n \"example\": \"http://tools.ietf.org/rfc/rfc3778\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"YieldContext\": {\n \"type\": \"object\",\n \"description\": \"Context information used for AI generation. Includes source document excerpts and metadata.\",\n \"properties\": {\n \"sourceContext\": {\n \"type\": \"object\",\n \"description\": \"Text context from the source document\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\",\n \"description\": \"Text appearing before the selected passage\"\n },\n \"selected\": {\n \"type\": \"string\",\n \"description\": \"The selected text passage (the annotation target)\"\n },\n \"after\": {\n \"type\": \"string\",\n \"description\": \"Text appearing after the selected passage\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"description\": \"Additional context metadata (reserved for future use)\",\n \"properties\": {\n \"resourceType\": {\n \"type\": \"string\",\n \"description\": \"Type of source resource (e.g., 'document', 'image', 'video')\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag of source content\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types associated with the annotation\"\n }\n }\n }\n },\n \"required\": [\n \"sourceContext\"\n ]\n }\n }\n }\n}","/**\n * OpenAPI Schema Validator\n *\n * Validates data against OpenAPI component schemas using Ajv (JSON Schema validator).\n * This enables spec-first architecture where openapi.json is the source of truth.\n */\n\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport openapiSpec from '../../../../specs/openapi.json';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getValidatorLogger = () => getLogger().child({ component: 'openapi-validator' });\n\n// Initialize Ajv with OpenAPI-compatible settings\nconst ajv = new Ajv({\n allErrors: true, // Return all errors, not just the first one\n coerceTypes: true, // Coerce types (e.g., \"123\" -> 123)\n removeAdditional: false, // Don't remove additional properties\n});\n\n// Add format validators (email, uri, date-time, etc.)\naddFormats(ajv);\n\n// Lazy initialization flag to ensure schemas are loaded only once\nlet schemasLoaded = false;\n\n/**\n * Load all schemas from OpenAPI spec into Ajv\n * This is called lazily on first validation to avoid logger initialization issues\n */\nfunction loadSchemas(): void {\n if (schemasLoaded) return;\n\n for (const [name, schema] of Object.entries(openapiSpec.components.schemas)) {\n try {\n ajv.addSchema(schema, `#/components/schemas/${name}`);\n } catch (error) {\n getValidatorLogger().error('Failed to load schema', {\n schemaName: name,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n getValidatorLogger().info('OpenAPI schemas loaded', {\n count: Object.keys(openapiSpec.components.schemas).length\n });\n\n schemasLoaded = true;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ErrorObject[] | null;\n errorMessage?: string;\n}\n\n/**\n * Validate data against an OpenAPI component schema\n *\n * @param schemaName - Name of the schema in components/schemas (e.g., \"CreateAnnotationRequest\")\n * @param data - The data to validate\n * @returns Validation result with errors if invalid\n *\n * @example\n * const result = validateSchema('CreateAnnotationRequest', requestBody);\n * if (!result.valid) {\n * return res.status(400).json({ error: result.errorMessage, details: result.errors });\n * }\n */\nexport function validateSchema(schemaName: string, data: unknown): ValidationResult {\n // Ensure schemas are loaded before validation\n loadSchemas();\n\n const validate = ajv.getSchema(`#/components/schemas/${schemaName}`);\n\n if (!validate) {\n getValidatorLogger().error('Schema not found', {\n schemaName,\n availableSchemas: Object.keys(openapiSpec.components.schemas)\n });\n return {\n valid: false,\n errors: null,\n errorMessage: `Schema ${schemaName} not found in OpenAPI spec`,\n };\n }\n\n const valid = validate(data);\n\n if (!valid) {\n const errorMessage = formatValidationErrors(validate.errors || []);\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage,\n };\n }\n\n return {\n valid: true,\n errors: null,\n };\n}\n\n/**\n * Format Ajv validation errors into a human-readable message\n */\nfunction formatValidationErrors(errors: ErrorObject[]): string {\n if (errors.length === 0) return 'Validation failed';\n\n const messages = errors.map(err => {\n const path = err.instancePath || 'root';\n const message = err.message || 'validation error';\n\n if (err.keyword === 'required' && 'missingProperty' in err.params) {\n return `Missing required property: ${err.params.missingProperty}`;\n }\n\n if (err.keyword === 'type' && 'type' in err.params) {\n return `${path}: ${message} (expected ${err.params.type})`;\n }\n\n if (err.keyword === 'enum' && 'allowedValues' in err.params) {\n return `${path}: must be one of [${(err.params.allowedValues as string[]).join(', ')}]`;\n }\n\n return `${path}: ${message}`;\n });\n\n return messages.join('; ');\n}\n\n/**\n * Get the OpenAPI schema for a component (for debugging/inspection)\n */\nexport function getSchema(schemaName: string): unknown {\n return (openapiSpec.components.schemas as Record<string, unknown>)[schemaName];\n}\n\n/**\n * List all available schema names\n */\nexport function listSchemas(): string[] {\n return Object.keys(openapiSpec.components.schemas);\n}\n","/**\n * Hono middleware for validating requests against OpenAPI schemas\n *\n * This middleware validates request bodies, query parameters, and path parameters\n * against schemas defined in the OpenAPI specification.\n */\n\nimport { type Context, type Next, type MiddlewareHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport { validateSchema } from '../utils/openapi-validator';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getMiddlewareLogger = () => getLogger().child({ component: 'validate-openapi' });\n\n/**\n * Validate request body against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n *\n * @example\n * router.post('/api/annotations',\n * validateRequestBody('CreateAnnotationRequest'),\n * async (c) => {\n * const body = await c.req.json(); // Already validated\n * // ... handler logic\n * }\n * );\n */\nexport function validateRequestBody(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n let body: unknown;\n\n try {\n body = await c.req.json();\n } catch (error) {\n throw new HTTPException(400, {\n message: 'Invalid JSON in request body',\n });\n }\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, body);\n\n if (!valid) {\n getMiddlewareLogger().warn('Request body validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Request validation failed',\n cause: errors,\n });\n }\n\n // Store validated body in context for handler to retrieve\n c.set('validatedBody', body);\n\n await next();\n };\n}\n\n/**\n * Validate query parameters against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validateQuery(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const query = c.req.query();\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, query);\n\n if (!valid) {\n getMiddlewareLogger().warn('Query params validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Query validation failed',\n cause: errors,\n });\n }\n\n c.set('validatedQuery', query);\n\n await next();\n };\n}\n\n/**\n * Validate path parameters against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validateParams(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const params = c.req.param();\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, params);\n\n if (!valid) {\n getMiddlewareLogger().warn('Path params validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Path parameter validation failed',\n cause: errors,\n });\n }\n\n c.set('validatedParams', params);\n\n await next();\n };\n}\n\n/**\n * Generic validation middleware that can validate any part of the request\n *\n * @param target - What to validate ('body', 'query', or 'params')\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validate(\n target: 'body' | 'query' | 'params',\n schemaName: string\n): MiddlewareHandler {\n switch (target) {\n case 'body':\n return validateRequestBody(schemaName);\n case 'query':\n return validateQuery(schemaName);\n case 'params':\n return validateParams(schemaName);\n }\n}\n","import { DatabaseConnection } from '../db';\nimport { JWTService } from './jwt';\nimport { User } from '@prisma/client';\nimport { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { UserId, AccessToken, Email, GoogleCredential } from '@semiont/core';\nimport { userId as makeUserId, accessToken as makeAccessToken, email as makeEmail } from '@semiont/core';\n\nexport interface GoogleUserInfo {\n id: string;\n email: Email;\n name: string;\n picture?: string;\n verified_email: boolean;\n}\n\nexport interface CreateUserResult {\n user: User;\n token: AccessToken;\n isNewUser: boolean;\n}\n\nexport class OAuthService {\n static async verifyGoogleToken(accessToken: GoogleCredential): Promise<GoogleUserInfo> {\n const response = await fetch(`https://www.googleapis.com/oauth2/v2/userinfo?access_token=${accessToken}`);\n\n if (!response.ok) {\n throw new Error('Failed to verify Google token');\n }\n\n const rawUserInfo = await response.json() as { id: string; email: string; name: string; picture?: string; verified_email: boolean };\n\n if (!rawUserInfo.verified_email) {\n throw new Error('Email not verified with Google');\n }\n\n // Brand the email for type safety\n const userInfo: GoogleUserInfo = {\n ...rawUserInfo,\n email: makeEmail(rawUserInfo.email),\n };\n\n return userInfo;\n }\n\n static async createOrUpdateUser(googleUser: GoogleUserInfo): Promise<CreateUserResult> {\n const domain = googleUser.email.split('@')[1];\n \n // Check if domain is allowed\n if (!JWTService.isAllowedDomain(googleUser.email)) {\n throw new Error(`Domain ${domain} is not allowed for authentication`);\n }\n\n // Get database connection\n const prisma = DatabaseConnection.getClient();\n\n // Find or create user\n const existingUser = await prisma.user.findFirst({\n where: {\n OR: [\n { email: googleUser.email },\n { provider: 'google', providerId: googleUser.id }\n ]\n }\n });\n\n let user;\n let isNewUser = false;\n\n if (existingUser) {\n // Update existing user (preserve admin status)\n user = await prisma.user.update({\n where: { id: existingUser.id },\n data: {\n name: googleUser.name,\n image: googleUser.picture || null,\n provider: 'google',\n providerId: googleUser.id,\n ...(domain ? { domain } : {}),\n // Don't change isAdmin - it's managed via CLI command\n lastLogin: new Date(),\n }\n });\n } else {\n // Create new user (default to non-admin, use CLI to grant admin)\n user = await prisma.user.create({\n data: {\n email: googleUser.email,\n name: googleUser.name,\n image: googleUser.picture || null,\n provider: 'google',\n providerId: googleUser.id,\n passwordHash: null,\n domain: domain || '',\n isAdmin: false, // Default to non-admin for security\n lastLogin: new Date(),\n }\n });\n isNewUser = true;\n }\n\n // Generate JWT token\n const jwtPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n ...(user.name && { name: user.name }),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n };\n\n const token = makeAccessToken(JWTService.generateToken(jwtPayload));\n\n return { user, token, isNewUser };\n }\n\n static async getUserFromToken(token: AccessToken): Promise<User> {\n const payload = JWTService.verifyToken(token);\n\n if (!payload.userId) {\n throw new Error('Invalid token: missing userId');\n }\n\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { id: payload.userId }\n });\n\n if (!user || !user.isActive) {\n throw new Error('User not found or inactive');\n }\n\n return user;\n }\n\n static async acceptTerms(userId: UserId): Promise<User> {\n const prisma = DatabaseConnection.getClient();\n\n const user = await prisma.user.update({\n where: { id: userId },\n data: {\n termsAcceptedAt: new Date(),\n }\n });\n\n return user;\n }\n}","import { Context, Next } from 'hono';\nimport { OAuthService } from '../auth/oauth';\nimport { User } from '@prisma/client';\nimport { accessToken } from '@semiont/core';\n\ninterface Variables {\n user: User;\n}\n\nexport interface AuthContext extends Context {\n get: <T extends keyof Variables>(key: T) => Variables[T];\n set: <T extends keyof Variables>(key: T, value: Variables[T]) => void;\n}\n\nexport const authMiddleware = async (c: Context, next: Next): Promise<Response | void> => {\n const logger = c.get('logger');\n const authHeader = c.req.header('Authorization');\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n logger.warn('Authentication failed: Missing Authorization header', {\n type: 'auth_failed',\n reason: 'missing_header',\n path: c.req.path,\n method: c.req.method\n });\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n const tokenStr = authHeader.substring(7).trim(); // Remove 'Bearer ' prefix and trim\n\n if (!tokenStr) {\n logger.warn('Authentication failed: Empty token', {\n type: 'auth_failed',\n reason: 'empty_token',\n path: c.req.path,\n method: c.req.method\n });\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n try {\n const user = await OAuthService.getUserFromToken(accessToken(tokenStr));\n\n // Add user to context\n c.set('user', user);\n\n logger.debug('Authentication successful', {\n type: 'auth_success',\n userId: user.id,\n email: user.email,\n path: c.req.path,\n method: c.req.method\n });\n\n await next();\n return; // Explicit return for successful case\n } catch (error) {\n logger.warn('Authentication failed: Invalid token', {\n type: 'auth_failed',\n reason: 'invalid_token',\n path: c.req.path,\n method: c.req.method,\n error: error instanceof Error ? error.message : String(error)\n });\n return c.json({ error: 'Invalid token' }, 401);\n }\n};\n\nexport const optionalAuthMiddleware = async (c: Context, next: Next) => {\n const authHeader = c.req.header('Authorization');\n\n if (authHeader && authHeader.startsWith('Bearer ')) {\n const tokenStr = authHeader.substring(7);\n\n try {\n const user = await OAuthService.getUserFromToken(accessToken(tokenStr));\n c.set('user', user);\n } catch (error) {\n // Ignore auth errors for optional auth\n }\n }\n\n await next();\n};","/**\n * Authentication Routes - Spec-First Version (Proof of Concept)\n *\n * This demonstrates the new spec-first architecture with:\n * - Plain Hono (no @hono/zod-openapi)\n * - Ajv validation middleware (validates against OpenAPI schemas)\n * - Types from generated OpenAPI types\n * - OpenAPI spec as source of truth\n */\n\nimport { Hono } from 'hono';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport { authMiddleware } from '../middleware/auth';\nimport { DatabaseConnection } from '../db';\nimport { JWTService } from '../auth/jwt';\nimport { OAuthService } from '../auth/oauth';\nimport * as argon2 from 'argon2';\nimport type { User } from '@prisma/client';\nimport type { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { components } from '@semiont/core';\nimport { userId as makeUserId, googleCredential, email as makeEmail } from '@semiont/core';\nimport { getLogger } from '../logger';\nimport { createSafeLogContext } from '../utils/log-sanitizer';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'auth' });\n\n// Types from OpenAPI spec (generated)\ntype PasswordAuthRequest = components['schemas']['PasswordAuthRequest'];\ntype GoogleAuthRequest = components['schemas']['GoogleAuthRequest'];\ntype TokenRefreshRequest = components['schemas']['TokenRefreshRequest'];\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenRefreshResponse = components['schemas']['TokenRefreshResponse'];\ntype UserResponse = components['schemas']['UserResponse'];\ntype AcceptTermsResponse = components['schemas']['AcceptTermsResponse'];\ntype MCPGenerateResponse = components['schemas']['MCPGenerateResponse'];\n\n// Create auth router with plain Hono\nexport const authRouter = new Hono<{ Variables: { user: User; validatedBody: unknown } }>();\n\n/**\n * POST /api/tokens/password\n *\n * Password Authentication\n * Authenticate with email and password\n *\n * Request validation: Uses validateRequestBody middleware with 'PasswordAuthRequest' schema\n * Response type: AuthResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/password',\n validateRequestBody('PasswordAuthRequest'),\n async (c) => {\n try {\n const body = c.get('validatedBody') as PasswordAuthRequest;\n const { email, password } = body;\n\n getRouteLogger().debug('Password auth attempt', { email });\n\n // Get user from database by email\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { email }\n });\n\n // Return same error for user not found and wrong password (security)\n if (!user) {\n getRouteLogger().debug('Password auth failed: user not found', { email });\n return c.json({\n error: 'Invalid credentials'\n }, 401);\n }\n\n getRouteLogger().debug('User found', createSafeLogContext({\n email,\n provider: user.provider,\n isActive: user.isActive,\n hasPasswordHash: !!user.passwordHash\n }));\n\n // Verify user is password provider\n if (user.provider !== 'password') {\n getRouteLogger().debug('Password auth failed: wrong provider', {\n email,\n provider: user.provider\n });\n return c.json({\n error: 'This account uses OAuth. Please sign in with Google.'\n }, 400);\n }\n\n // Verify password hash exists\n if (!user.passwordHash) {\n getRouteLogger().debug('Password auth failed: no password hash', { email });\n return c.json({\n error: 'Password not set for this account'\n }, 400);\n }\n\n // Verify password\n const isValid = await argon2.verify(user.passwordHash, password);\n if (!isValid) {\n getRouteLogger().debug('Password auth failed: invalid password', { email });\n return c.json({\n error: 'Invalid credentials'\n }, 401);\n }\n\n // Check if user is active\n if (!user.isActive) {\n getRouteLogger().debug('Password auth failed: inactive account', { email });\n return c.json({\n error: 'Account is not active'\n }, 403);\n }\n\n getRouteLogger().debug('Password auth successful', { email });\n\n // Generate JWT token\n const jwtPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n ...(user.name && { name: user.name }),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n };\n\n const token = JWTService.generateToken(jwtPayload);\n\n // Update last login\n await prisma.user.update({\n where: { id: user.id },\n data: { lastLogin: new Date() }\n });\n\n const response: AuthResponse = {\n success: true,\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n isAdmin: user.isAdmin,\n },\n token,\n isNewUser: false,\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('Password auth error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({\n error: 'Authentication failed'\n }, 400);\n }\n }\n);\n\n/**\n * POST /api/tokens/google\n *\n * Google OAuth Authentication - Spec-First Version\n * Authenticate with Google OAuth access token\n *\n * Request validation: Uses validateRequestBody middleware with 'GoogleAuthRequest' schema\n * Response type: AuthResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/google',\n validateRequestBody('GoogleAuthRequest'),\n async (c) => {\n try {\n const body = c.get('validatedBody') as GoogleAuthRequest;\n const { access_token } = body;\n\n if (!access_token) {\n return c.json({\n error: 'Missing access token'\n }, 400);\n }\n\n // Verify Google token and get user info\n const googleUser = await OAuthService.verifyGoogleToken(googleCredential(access_token));\n\n // Create or update user\n const { user, token, isNewUser } = await OAuthService.createOrUpdateUser(googleUser);\n\n const response: AuthResponse = {\n success: true,\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n isAdmin: user.isAdmin,\n },\n token,\n isNewUser,\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('OAuth authentication error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n const errorMessage = error instanceof Error ? error.message : 'Authentication failed';\n return c.json({ error: errorMessage }, 400);\n }\n }\n);\n\n/**\n * POST /api/tokens/refresh\n *\n * Refresh Access Token - Spec-First Version\n * Exchange a refresh token for a new access token\n *\n * Request validation: Uses validateRequestBody middleware with 'TokenRefreshRequest' schema\n * Response type: TokenRefreshResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/refresh',\n validateRequestBody('TokenRefreshRequest'),\n async (c) => {\n getRouteLogger().debug('Refresh endpoint hit');\n const body = c.get('validatedBody') as TokenRefreshRequest;\n const { refreshToken } = body;\n\n if (!refreshToken) {\n getRouteLogger().debug('Refresh endpoint: No refresh token provided');\n return c.json({ error: 'Refresh token required' }, 401);\n }\n\n getRouteLogger().debug('Refresh endpoint: Attempting to verify token');\n\n try {\n // Verify refresh token\n const payload = JWTService.verifyToken(refreshToken);\n getRouteLogger().debug('Refresh endpoint: Token verified', { userId: payload.userId });\n\n if (!payload.userId) {\n getRouteLogger().debug('Refresh endpoint: No userId in token payload');\n return c.json({ error: 'Invalid token payload' }, 401);\n }\n\n // Get user from database to ensure they still exist and are active\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { id: payload.userId }\n });\n\n if (!user || !user.isActive) {\n return c.json({ error: 'User not found or inactive' }, 401);\n }\n\n // Generate new short-lived access token (1 hour)\n const accessTokenPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n ...(user.name && { name: user.name })\n };\n const accessToken = JWTService.generateToken(accessTokenPayload, '1h'); // 1 hour expiration\n\n const response: TokenRefreshResponse = {\n access_token: accessToken\n };\n\n return c.json(response, 200);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n getRouteLogger().error('Token refresh error', {\n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined\n });\n\n // Provide specific error messages for different failure modes\n if (errorMessage.includes('expired')) {\n return c.json({ error: 'Refresh token expired - please re-provision' }, 401);\n }\n if (errorMessage.includes('signature')) {\n return c.json({ error: 'Invalid refresh token' }, 401);\n }\n\n return c.json({ error: 'Failed to refresh token' }, 401);\n }\n }\n);\n\n/**\n * GET /api/users/me\n *\n * Get Current User - Get information about the authenticated user\n * Requires authentication\n * Response type: UserResponse from OpenAPI spec\n */\nauthRouter.get('/api/users/me', authMiddleware, async (c) => {\n const user = c.get('user');\n\n const response: UserResponse = {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n isActive: user.isActive,\n termsAcceptedAt: user.termsAcceptedAt?.toISOString() || null,\n lastLogin: user.lastLogin?.toISOString() || null,\n created: user.createdAt.toISOString(),\n };\n\n return c.json(response, 200);\n});\n\n/**\n * POST /api/tokens/mcp-generate\n *\n * Generate MCP Token - Generate a short-lived token for MCP server\n * Requires authentication\n * Response type: MCPGenerateResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/mcp-generate', authMiddleware, async (c) => {\n const user = c.get('user');\n\n try {\n // Generate long-lived refresh token (30 days) for MCP\n const tokenPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n ...(user.name && { name: user.name })\n };\n const refreshToken = JWTService.generateToken(tokenPayload, '30d'); // 30 day expiration\n\n const response: MCPGenerateResponse = {\n refresh_token: refreshToken\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('MCP token generation error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to generate refresh token' }, 401);\n }\n});\n\n/**\n * POST /api/users/accept-terms\n *\n * Accept Terms - Mark terms as accepted for the current user\n * Requires authentication\n * Response type: AcceptTermsResponse from OpenAPI spec\n */\nauthRouter.post('/api/users/accept-terms', authMiddleware, async (c) => {\n const user = c.get('user');\n\n // Update the user's terms acceptance\n await OAuthService.acceptTerms(makeUserId(user.id));\n\n const response: AcceptTermsResponse = {\n success: true,\n message: 'Terms accepted',\n };\n\n return c.json(response, 200);\n});\n\n/**\n * POST /api/users/logout\n *\n * Logout - Logout the current user\n * Requires authentication\n * In JWT-based auth, logout is handled client-side\n * This endpoint exists for consistency and future session management\n */\nauthRouter.post('/api/users/logout', authMiddleware, async (c) => {\n return c.json({\n success: true,\n message: 'Logged out successfully',\n }, 200);\n});\n","/**\n * Log Sanitization Utilities\n *\n * Ensures sensitive data is never logged by mistake.\n * Masks passwords, tokens, API keys, and other sensitive fields.\n */\n\n// Fields that should never be logged\nconst SENSITIVE_FIELDS = [\n 'password',\n 'passwordHash',\n 'token',\n 'accessToken',\n 'refreshToken',\n 'apiKey',\n 'secret',\n 'authorization',\n 'cookie',\n 'sessionId',\n 'creditCard',\n 'ssn',\n 'privateKey',\n 'clientSecret'\n];\n\n// Fields that should be partially masked (show first/last few chars)\nconst PARTIAL_MASK_FIELDS = [\n 'email',\n 'phone',\n 'userId',\n 'accountId'\n];\n\n/**\n * Sanitize an object for logging by removing or masking sensitive fields\n *\n * @param data - The data to sanitize\n * @param options - Sanitization options\n * @returns Sanitized copy of the data\n */\nexport function sanitizeForLogging<T>(\n data: T,\n options: {\n maskValue?: string;\n partialMask?: boolean;\n additionalSensitiveFields?: string[];\n } = {}\n): T {\n const {\n maskValue = '[REDACTED]',\n partialMask = true,\n additionalSensitiveFields = []\n } = options;\n\n const allSensitiveFields = [\n ...SENSITIVE_FIELDS,\n ...additionalSensitiveFields\n ].map(f => f.toLowerCase());\n\n function sanitize(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sanitize);\n }\n\n const sanitized: any = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase();\n\n // Check if field should be completely masked\n if (allSensitiveFields.some(field => lowerKey.includes(field))) {\n sanitized[key] = maskValue;\n }\n // Check if field should be partially masked\n else if (partialMask && PARTIAL_MASK_FIELDS.some(field => lowerKey.includes(field))) {\n sanitized[key] = partialMaskValue(value);\n }\n // Recursively sanitize nested objects\n else if (typeof value === 'object' && value !== null) {\n sanitized[key] = sanitize(value);\n }\n // Keep non-sensitive values as-is\n else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n\n return sanitize(data);\n}\n\n/**\n * Partially mask a value (show first 3 and last 2 characters)\n */\nfunction partialMaskValue(value: any): string {\n if (typeof value !== 'string' || value.length <= 6) {\n return '[MASKED]';\n }\n\n const firstChars = value.substring(0, 3);\n const lastChars = value.substring(value.length - 2);\n const maskLength = Math.max(value.length - 5, 3);\n const mask = '*'.repeat(maskLength);\n\n return `${firstChars}${mask}${lastChars}`;\n}\n\n/**\n * Create a safe logging context by sanitizing all data\n *\n * @param context - The logging context\n * @returns Sanitized context safe for logging\n */\nexport function createSafeLogContext(context: Record<string, any>): Record<string, any> {\n return sanitizeForLogging(context, {\n partialMask: true\n });\n}\n\n/**\n * Sanitize HTTP headers for logging\n * Removes authorization, cookie, and other sensitive headers\n */\nexport function sanitizeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string | string[] | undefined> {\n const sanitized: Record<string, string | string[] | undefined> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'authorization' || lowerKey === 'cookie' || lowerKey === 'x-api-key') {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}","/**\n * Status Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request validation needed (GET endpoint)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { authMiddleware } from '../middleware/auth';\nimport type { User } from '@prisma/client';\nimport type { components } from '@semiont/core';\n\ntype StatusResponse = components['schemas']['StatusResponse'];\n\n// Create status router with plain Hono\nexport const statusRouter = new Hono<{ Variables: { user: User } }>();\n\n// Apply auth middleware\nstatusRouter.use('/api/status', authMiddleware);\n\n/**\n * GET /api/status\n *\n * Get service status and feature availability\n * Requires authentication\n */\nstatusRouter.get('/api/status', async (c) => {\n const user = c.get('user');\n\n const response: StatusResponse = {\n status: 'operational',\n version: '0.1.0',\n features: {\n semanticContent: 'planned',\n collaboration: 'planned',\n rbac: 'planned',\n },\n message: 'Ready to build the future of knowledge management!',\n authenticatedAs: user?.email,\n };\n\n return c.json(response, 200);\n});\n","/**\n * Admin Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { authMiddleware } from '../middleware/auth';\nimport { DatabaseConnection } from '../db';\nimport { User } from '@prisma/client';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\n\ntype UpdateUserRequest = components['schemas']['UpdateUserRequest'];\ntype UpdateUserResponse = components['schemas']['UpdateUserResponse'];\ntype DeleteUserResponse = components['schemas']['DeleteUserResponse'];\ntype OAuthConfigResponseActual = components['schemas']['OAuthConfigResponse'];\n\n// Admin middleware to check admin privileges\nconst adminMiddleware = async (c: any, next: any) => {\n const user = c.get('user');\n\n if (!user || !user.isAdmin) {\n return c.json({ error: 'Forbidden: Admin access required' }, 403);\n }\n\n return next();\n};\n\n// Create admin router\nexport const adminRouter = new Hono<{ Variables: { user: User } }>();\n\n// Apply auth and admin middleware to all admin routes\nadminRouter.use('/api/admin/*', authMiddleware, adminMiddleware);\n\n/**\n * GET /api/admin/users\n *\n * Get a list of all users (admin only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/users', async (c) => {\n const prisma = DatabaseConnection.getClient();\n\n const users = await prisma.user.findMany({\n orderBy: { createdAt: 'desc' },\n select: {\n id: true,\n email: true,\n name: true,\n image: true,\n domain: true,\n provider: true,\n isAdmin: true,\n isActive: true,\n termsAcceptedAt: true,\n lastLogin: true,\n createdAt: true,\n updatedAt: true,\n },\n });\n\n return c.json({\n success: true,\n users: users.map((u) => ({\n ...u,\n termsAcceptedAt: u.termsAcceptedAt?.toISOString() || null,\n lastLogin: u.lastLogin?.toISOString() || null,\n created: u.createdAt.toISOString(),\n updatedAt: u.updatedAt.toISOString(),\n })),\n }, 200);\n});\n\n/**\n * GET /api/admin/users/stats\n *\n * Get user statistics (admin only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/users/stats', async (c) => {\n const prisma = DatabaseConnection.getClient();\n\n const [totalUsers, activeUsers, adminUsers, domainStats, recentUsers] = await Promise.all([\n prisma.user.count(),\n prisma.user.count({ where: { isActive: true } }),\n prisma.user.count({ where: { isAdmin: true } }),\n prisma.user.groupBy({\n by: ['domain'],\n _count: { domain: true },\n orderBy: { _count: { domain: 'desc' } },\n }),\n prisma.user.findMany({\n where: {\n createdAt: {\n gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), // Last 7 days\n },\n },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n orderBy: { createdAt: 'desc' },\n }),\n ]);\n\n return c.json({\n success: true,\n stats: {\n totalUsers,\n activeUsers,\n adminUsers,\n regularUsers: totalUsers - adminUsers,\n domainBreakdown: domainStats.map((d) => ({\n domain: d.domain,\n count: d._count.domain,\n })),\n recentSignups: recentUsers.map((u) => ({\n ...u,\n created: u.createdAt.toISOString(),\n })),\n },\n }, 200);\n});\n\n/**\n * PATCH /api/admin/users/:id\n *\n * Update user properties (admin only)\n * Requires authentication + admin role\n */\nadminRouter.patch('/api/admin/users/:id',\n validateRequestBody('UpdateUserRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as UpdateUserRequest;\n const prisma = DatabaseConnection.getClient();\n\n // Check if user exists\n const existingUser = await prisma.user.findUnique({\n where: { id },\n });\n\n if (!existingUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n // Update user\n const updatedUser = await prisma.user.update({\n where: { id },\n data: {\n ...(body.isAdmin !== undefined && { isAdmin: body.isAdmin }),\n ...(body.isActive !== undefined && { isActive: body.isActive }),\n ...(body.name !== undefined && { name: body.name }),\n },\n });\n\n const response: UpdateUserResponse = {\n success: true,\n user: {\n id: updatedUser.id,\n email: updatedUser.email,\n name: updatedUser.name,\n image: updatedUser.image,\n domain: updatedUser.domain,\n provider: updatedUser.provider,\n isAdmin: updatedUser.isAdmin,\n isActive: updatedUser.isActive,\n lastLogin: updatedUser.lastLogin?.toISOString() || null,\n created: updatedUser.createdAt.toISOString(),\n updatedAt: updatedUser.updatedAt.toISOString(),\n },\n };\n\n return c.json(response, 200);\n }\n);\n\n/**\n * DELETE /api/admin/users/:id\n *\n * Delete a user account (admin only, cannot delete own account)\n * Requires authentication + admin role\n */\nadminRouter.delete('/api/admin/users/:id', async (c) => {\n const { id } = c.req.param();\n const currentUser = c.get('user');\n const prisma = DatabaseConnection.getClient();\n\n // Cannot delete own account\n if (id === currentUser.id) {\n return c.json({ error: 'Cannot delete your own account' }, 400);\n }\n\n // Check if user exists\n const existingUser = await prisma.user.findUnique({\n where: { id },\n });\n\n if (!existingUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n // Delete user\n await prisma.user.delete({\n where: { id },\n });\n\n const response: DeleteUserResponse = {\n success: true,\n message: `User ${existingUser.email} deleted successfully`,\n };\n\n return c.json(response, 200);\n});\n\n/**\n * GET /api/admin/oauth/config\n *\n * Get OAuth provider configuration (admin only, read-only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/oauth/config', async (c) => {\n // Get OAuth configuration from environment\n const allowedDomainsEnv = process.env.OAUTH_ALLOWED_DOMAINS;\n if (!allowedDomainsEnv) {\n throw new Error('OAUTH_ALLOWED_DOMAINS environment variable is not configured');\n }\n\n const allowedDomains = allowedDomainsEnv\n .split(',')\n .map(d => d.trim())\n .filter(d => d.length > 0);\n\n // Check which providers are configured\n const providers = [];\n if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {\n providers.push({\n name: 'google',\n isConfigured: true,\n clientId: process.env.GOOGLE_CLIENT_ID.substring(0, 20) + '...'\n });\n }\n\n const response: OAuthConfigResponseActual = {\n providers,\n allowedDomains\n };\n\n return c.json(response, 200);\n});\n","// Shared imports and types for resource routes\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { authMiddleware } from '../../middleware/auth';\nimport type { EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\n\n// Shared router type\nexport type ResourcesRouterType = Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>;\n\n// Create a router with auth middleware pre-applied\nexport function createResourceRouter(): ResourcesRouterType {\n const router = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\n router.use('/api/resources/*', authMiddleware);\n router.use('/api/clone-tokens/*', authMiddleware);\n router.use('/resources/*', authMiddleware); // W3C URI endpoints also require auth\n return router;\n}","/**\n * Create Resource Route - Multipart/Form-Data Version\n *\n * Handles binary content upload via multipart/form-data:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Parses multipart form data (no JSON validation middleware)\n * - Supports binary content (images, PDFs, video, etc.)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { userId, type CreationMethod } from '@semiont/core';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { ResourceOperations } from '@semiont/make-meaning';\n\ntype ContentFormat = components['schemas']['ContentFormat'];\n\nexport function registerCreateResource(router: ResourcesRouterType) {\n /**\n * POST /resources\n *\n * Create a new resource with binary content support via multipart/form-data\n * Requires authentication\n * Parses FormData (no JSON validation middleware)\n */\n router.post('/resources', async (c) => {\n const user = c.get('user');\n const config = c.get('config');\n\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Parse multipart/form-data\n const formData = await c.req.formData();\n\n // Extract fields\n const name = formData.get('name') as string;\n const file = formData.get('file') as File;\n const formatRaw = formData.get('format') as string;\n const language = formData.get('language') as string | null;\n const entityTypesStr = formData.get('entityTypes') as string | null;\n const creationMethod = formData.get('creationMethod') as string | null;\n\n // Validate required fields\n if (!name || !file || !formatRaw) {\n throw new HTTPException(400, {\n message: 'Missing required fields: name, file, format'\n });\n }\n\n // Type-cast to ContentFormat (OpenAPI validates this enum at spec level)\n const format = formatRaw as ContentFormat;\n\n // Parse entityTypes from JSON string\n const entityTypes = entityTypesStr ? JSON.parse(entityTypesStr) : [];\n\n // Convert File to Buffer\n const arrayBuffer = await file.arrayBuffer();\n const contentBuffer = Buffer.from(arrayBuffer);\n\n // Delegate to make-meaning for resource creation\n const { eventStore, repStore } = c.get('makeMeaning');\n const response = await ResourceOperations.createResource(\n {\n name,\n content: contentBuffer,\n format,\n language: language || undefined,\n entityTypes,\n creationMethod: (creationMethod || undefined) as CreationMethod | undefined,\n },\n userId(user.id),\n eventStore,\n repStore,\n config\n );\n\n // Set Location header to the resource URI\n c.header('Location', response.resource['@id']);\n\n return c.json(response, 201);\n });\n}\n","/**\n * Content Negotiation Middleware\n *\n * Handles W3C-compliant content negotiation for resource and annotation URIs.\n *\n * Per W3C Web Annotation Data Model:\n * - Resource/Annotation URIs MUST be globally resolvable\n * - When Accept: application/ld+json -> return JSON-LD representation\n * - When Accept: text/html -> redirect to frontend viewer\n * - Default to JSON-LD for API clients\n */\n\nimport { Context } from 'hono';\n\n/**\n * Determines if request prefers HTML over JSON-LD\n *\n * Checks both Accept header and User-Agent to detect browsers vs API clients\n */\nexport function prefersHtml(c: Context): boolean {\n const acceptHeader = c.req.header('Accept') || '';\n const userAgent = c.req.header('User-Agent') || '';\n\n // Check what content types are accepted\n const acceptsHtml = acceptHeader.includes('text/html');\n const acceptsJson = acceptHeader.includes('application/json') || acceptHeader.includes('application/ld+json');\n\n // If Accept header has ONLY JSON (no HTML), definitely prefer JSON\n // This handles fetch() API calls: fetch() sends \"Accept: application/json, */*;q=0.1\" or similar\n if (acceptsJson && !acceptsHtml) {\n return false;\n }\n\n // If Accept header has both HTML and JSON, check which comes first (higher priority)\n // e.g., \"text/html,application/json;q=0.9\" -> HTML has higher priority\n // e.g., \"application/json,text/html;q=0.9\" -> JSON has higher priority\n if (acceptsHtml && acceptsJson) {\n const htmlIndex = acceptHeader.indexOf('text/html');\n const jsonIndex = Math.min(\n acceptHeader.indexOf('application/json') >= 0 ? acceptHeader.indexOf('application/json') : Infinity,\n acceptHeader.indexOf('application/ld+json') >= 0 ? acceptHeader.indexOf('application/ld+json') : Infinity\n );\n // If HTML appears first, prefer HTML (browser navigation)\n // If JSON appears first, prefer JSON (API call)\n if (htmlIndex < jsonIndex) {\n return true;\n } else {\n return false;\n }\n }\n\n // Check if User-Agent indicates a browser (Mozilla, Chrome, Safari, Edge, etc.)\n const isBrowser = /Mozilla|Chrome|Safari|Edge|Firefox|Opera/.test(userAgent);\n\n // If User-Agent is a browser AND no Accept header specified, prefer HTML\n // This handles direct browser navigation without explicit Accept\n if (isBrowser && !acceptHeader && !userAgent.includes('curl')) {\n return true;\n }\n\n // If User-Agent is a browser AND accepts HTML (no JSON), prefer HTML\n // This handles direct browser navigation with HTML Accept\n if (isBrowser && acceptsHtml && !userAgent.includes('curl')) {\n return true;\n }\n\n // Default: only prefer HTML if Accept header explicitly includes text/html\n return acceptsHtml && !acceptsJson;\n}\n\n/**\n * Determines if request prefers JSON-LD\n *\n * JSON-LD is the W3C standard format for Web Annotations\n * Returns the opposite of prefersHtml() - they are mutually exclusive\n */\nexport function prefersJsonLd(c: Context): boolean {\n // If client prefers HTML, it doesn't prefer JSON-LD\n if (prefersHtml(c)) {\n return false;\n }\n\n const acceptHeader = c.req.header('Accept') || '';\n\n // Check for explicit JSON-LD request\n if (acceptHeader.includes('application/ld+json')) {\n return true;\n }\n\n // Check for generic JSON request (default to JSON-LD)\n if (acceptHeader.includes('application/json')) {\n return true;\n }\n\n // Default to JSON-LD for API clients\n return true;\n}\n\n/**\n * Gets the frontend URL from environment\n */\nexport function getFrontendUrl(): string {\n const frontendUrl = process.env.FRONTEND_URL;\n if (!frontendUrl) {\n throw new Error('FRONTEND_URL environment variable is required for content negotiation');\n }\n return frontendUrl;\n}\n","/**\n * SSE Client for Semiont Streaming Endpoints\n *\n * Provides type-safe methods for Server-Sent Events streaming.\n * Does NOT use ky - uses native fetch() for SSE support.\n */\n\nimport { createSSEStream } from './stream';\nimport type { SSEStream } from './types';\nimport type { ResourceUri, AnnotationUri } from '@semiont/core';\nimport type { AccessToken, BaseUrl, EntityType, Logger } from '@semiont/core';\nimport type { components } from '@semiont/core';\n\n/**\n * SSE meta event for stream connection lifecycle\n * Internal to SSE infrastructure, not part of core event protocol\n */\nexport const SSE_STREAM_CONNECTED = 'stream-connected' as const;\nexport type SSEStreamConnected = typeof SSE_STREAM_CONNECTED;\n\n/**\n * Request body for reference annotation stream\n */\nexport interface AnnotateReferencesStreamRequest {\n entityTypes: EntityType[];\n includeDescriptiveReferences?: boolean;\n}\n\n/**\n * Request body for generation stream\n * Uses generated type from OpenAPI schema\n */\nexport type YieldResourceStreamRequest = components['schemas']['YieldResourceStreamRequest'];\n\n/**\n * Request body for highlight annotation stream\n */\nexport interface AnnotateHighlightsStreamRequest {\n instructions?: string;\n /** Desired number of highlights per 2000 words (1-15) */\n density?: number;\n}\n\n/**\n * Request body for assessment annotation stream\n */\nexport interface AnnotateAssessmentsStreamRequest {\n instructions?: string;\n tone?: 'analytical' | 'critical' | 'balanced' | 'constructive';\n /** Desired number of assessments per 2000 words (1-10) */\n density?: number;\n}\n\n/**\n * Request body for comment annotation stream\n */\nexport interface AnnotateCommentsStreamRequest {\n instructions?: string;\n tone?: 'scholarly' | 'explanatory' | 'conversational' | 'technical';\n /** Desired number of comments per 2000 words (2-12) */\n density?: number;\n}\n\n/**\n * Request body for tag annotation stream\n */\nexport interface AnnotateTagsStreamRequest {\n schemaId: string;\n categories: string[];\n}\n\n/**\n * SSE Client configuration\n */\nexport interface SSEClientConfig {\n baseUrl: BaseUrl;\n logger?: Logger;\n}\n\n/**\n * Options for SSE requests\n */\nexport interface SSERequestOptions {\n auth?: AccessToken;\n /** EventBus for event-driven architecture (required) */\n eventBus: import('@semiont/core').EventBus;\n}\n\n/**\n * SSE Client for real-time streaming operations\n *\n * Separate from the main HTTP client to clearly mark streaming endpoints.\n * Uses native fetch() instead of ky for SSE support.\n *\n * This client is stateless - auth tokens are passed per-request via options.\n *\n * @example\n * ```typescript\n * const sseClient = new SSEClient({\n * baseUrl: 'http://localhost:4000'\n * });\n *\n * const stream = sseClient.annotateReferences(\n * 'http://localhost:4000/resources/doc-123',\n * { entityTypes: ['Person', 'Organization'] },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((p) => console.log(p.message));\n * stream.onComplete((r) => console.log(`Found ${r.foundCount} entities`));\n * stream.onError((e) => console.error('Detection failed:', e));\n * ```\n */\nexport class SSEClient {\n private baseUrl: BaseUrl;\n private logger?: Logger;\n\n constructor(config: SSEClientConfig) {\n // Remove trailing slash for consistent URL construction\n this.baseUrl = (config.baseUrl.endsWith('/') ? config.baseUrl.slice(0, -1) : config.baseUrl) as BaseUrl;\n this.logger = config.logger;\n }\n\n /**\n * Get common headers for SSE requests\n */\n private getHeaders(auth?: AccessToken): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n if (auth) {\n headers['Authorization'] = `Bearer ${auth}`;\n }\n\n return headers;\n }\n\n /**\n * Extract resource ID from URI\n *\n * Handles both full URIs and plain IDs:\n * - 'http://localhost:4000/resources/doc-123' -> 'doc-123'\n * - 'doc-123' -> 'doc-123'\n */\n private extractId(uri: string): string {\n const parts = uri.split('/');\n return parts[parts.length - 1];\n }\n\n /**\n * Detect annotations in a resource (streaming)\n *\n * Streams entity detection progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (entity types to detect)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateReferences(\n * 'http://localhost:4000/resources/doc-123',\n * { entityTypes: ['Person', 'Organization'] },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`Scanning: ${progress.currentEntityType}`);\n * console.log(`Progress: ${progress.processedEntityTypes}/${progress.totalEntityTypes}`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Found ${result.foundCount} entities`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateReferences(\n resourceId: ResourceUri,\n request: AnnotateReferencesStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-references-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Generate resource from annotation (streaming)\n *\n * Streams resource generation progress via Server-Sent Events.\n *\n * @param resourceId - Source resource URI or ID\n * @param annotationId - Annotation URI or ID to use as generation source\n * @param request - Generation options (title, prompt, language)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.yieldResourceFromAnnotation(\n * 'http://localhost:4000/resources/doc-123',\n * 'http://localhost:4000/annotations/ann-456',\n * { language: 'es', title: 'Spanish Summary' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Yielded resource: ${result.resourceId}`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Yield failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n yieldResourceFromAnnotation(\n resourceId: ResourceUri,\n annotationId: AnnotationUri,\n request: YieldResourceStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const resId = this.extractId(resourceId);\n const annId = this.extractId(annotationId);\n const url = `${this.baseUrl}/resources/${resId}/annotations/${annId}/yield-resource-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['yield:progress'],\n completeEvent: 'yield:finished',\n errorEvent: 'yield:failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect highlights in a resource (streaming)\n *\n * Streams highlight annotation progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateHighlights(\n * 'http://localhost:4000/resources/doc-123',\n * { instructions: 'Focus on key technical points' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} highlights`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateHighlights(\n resourceId: ResourceUri,\n request: AnnotateHighlightsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-highlights-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect assessments in a resource (streaming)\n *\n * Streams assessment annotation progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateAssessments(\n * 'http://localhost:4000/resources/doc-123',\n * { instructions: 'Evaluate claims for accuracy' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} assessments`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateAssessments(\n resourceId: ResourceUri,\n request: AnnotateAssessmentsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-assessments-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect comments in a resource (streaming)\n *\n * Streams comment annotation progress via Server-Sent Events.\n * Uses AI to identify passages that would benefit from explanatory comments\n * and creates comment annotations with contextual information.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions and tone)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateComments(\n * 'http://localhost:4000/resources/doc-123',\n * {\n * instructions: 'Focus on technical terminology',\n * tone: 'scholarly'\n * },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} comments`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateComments(\n resourceId: ResourceUri,\n request: AnnotateCommentsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-comments-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect tags in a resource (streaming)\n *\n * Streams tag annotation progress via Server-Sent Events.\n * Uses AI to identify passages serving specific structural roles\n * (e.g., IRAC, IMRAD, Toulmin) and creates tag annotations with dual-body structure.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (schema and categories to detect)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateTags(\n * 'http://localhost:4000/resources/doc-123',\n * {\n * schemaId: 'legal-irac',\n * categories: ['Issue', 'Rule', 'Application', 'Conclusion']\n * },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(`Processing ${progress.currentCategory}...`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.tagsCreated} tags`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateTags(\n resourceId: ResourceUri,\n request: AnnotateTagsStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-tags-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Subscribe to resource events (long-lived stream)\n *\n * Opens a long-lived SSE connection to receive real-time events for a resource.\n * Used for collaborative editing - see events from other users as they happen.\n *\n * This stream does NOT have a complete event - it stays open until explicitly closed.\n *\n * @param resourceId - Resource URI or ID to subscribe to\n * @param options - Request options (auth token)\n * @returns SSE stream controller with event callback\n *\n * @example\n * ```typescript\n * const stream = sseClient.resourceEvents(\n * 'http://localhost:4000/resources/doc-123',\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((event) => {\n * console.log(`Event: ${event.type}`);\n * console.log(`User: ${event.userId}`);\n * console.log(`Sequence: ${event.metadata.sequenceNumber}`);\n * console.log(`Payload:`, event.payload);\n * });\n *\n * stream.onError((error) => {\n * console.error('Stream error:', error.message);\n * });\n *\n * // Close when no longer needed (e.g., component unmount)\n * stream.close();\n * ```\n */\n resourceEvents(\n resourceId: ResourceUri,\n options: SSERequestOptions & { onConnected?: () => void }\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/events/stream`;\n\n // Events auto-route to EventBus:\n // - Domain events (annotation.added, job.completed, etc.) emit to both their specific channel and 'make-meaning:event'\n // - stream-connected emits to 'stream-connected' channel (subscribers can handle or ignore)\n // No manual .on() registration needed - declarative auto-routing based on Event Map\n const stream = createSSEStream(\n url,\n {\n method: 'GET',\n headers: this.getHeaders(options.auth)\n },\n {\n progressEvents: ['*'], // Accept all event types (long-lived stream)\n completeEvent: null, // Never completes (long-lived)\n errorEvent: null, // No error event (errors throw)\n eventBus: options.eventBus\n },\n this.logger\n );\n\n // Handle onConnected callback by subscribing to SSE stream-connected event\n // Note: Type assertion needed because SSE_STREAM_CONNECTED is SSE infrastructure, not part of EventMap\n if (options.onConnected) {\n const sub = options.eventBus.get(SSE_STREAM_CONNECTED as any).subscribe(() => {\n options.onConnected!();\n sub.unsubscribe(); // One-time callback\n });\n }\n\n return stream;\n }\n}\n","/**\n * Annotation and Selector Utilities\n *\n * Pure TypeScript utilities for working with W3C Web Annotations.\n * No React dependencies - safe to use in any JavaScript environment.\n *\n * Body is either empty array (stub) or single SpecificResource (resolved)\n * Body can be array of TextualBody (tagging) + SpecificResource (linking)\n * Target can be simple string IRI or object with source and optional selector\n */\n\nimport type { components } from '@semiont/core';\nimport type { ResourceUri } from '@semiont/core';\nimport { resourceUri } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\ntype HighlightAnnotation = Annotation;\ntype ReferenceAnnotation = Annotation;\ntype TextPositionSelector = components['schemas']['TextPositionSelector'];\ntype TextQuoteSelector = components['schemas']['TextQuoteSelector'];\ntype SvgSelector = components['schemas']['SvgSelector'];\ntype FragmentSelector = components['schemas']['FragmentSelector'];\ntype Selector = TextPositionSelector | TextQuoteSelector | SvgSelector | FragmentSelector;\n\n// Re-export selector types for convenience\nexport type { TextPositionSelector, TextQuoteSelector, SvgSelector, FragmentSelector, Selector };\n\n/**\n * Get the source from an annotation body (null if stub)\n * Search for SpecificResource in body array\n */\nexport function getBodySource(body: Annotation['body']): ResourceUri | null {\n if (Array.isArray(body)) {\n // Search for SpecificResource with source\n for (const item of body) {\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'source' in item\n ) {\n const itemType = (item as { type: unknown }).type;\n const itemSource = (item as { source: unknown }).source;\n\n if (itemType === 'SpecificResource' && typeof itemSource === 'string') {\n return resourceUri(itemSource);\n }\n }\n }\n return null; // No SpecificResource found = stub\n }\n\n // Single body object (SpecificResource)\n if (\n typeof body === 'object' &&\n body !== null &&\n 'type' in body &&\n 'source' in body\n ) {\n const bodyType = (body as { type: unknown }).type;\n const bodySource = (body as { source: unknown }).source;\n\n if (bodyType === 'SpecificResource' && typeof bodySource === 'string') {\n return resourceUri(bodySource);\n }\n }\n\n return null;\n}\n\n/**\n * Get the type from an annotation body (returns first body type in array)\n */\nexport function getBodyType(body: Annotation['body']): 'TextualBody' | 'SpecificResource' | null {\n if (Array.isArray(body)) {\n if (body.length === 0) {\n return null;\n }\n // Return type of first body item\n if (typeof body[0] === 'object' && body[0] !== null && 'type' in body[0]) {\n const firstType = (body[0] as { type: unknown }).type;\n if (firstType === 'TextualBody' || firstType === 'SpecificResource') {\n return firstType;\n }\n }\n return null;\n }\n\n // Single body object\n if (typeof body === 'object' && body !== null && 'type' in body) {\n const bodyType = (body as { type: unknown }).type;\n if (bodyType === 'TextualBody' || bodyType === 'SpecificResource') {\n return bodyType;\n }\n }\n\n return null;\n}\n\n/**\n * Check if body is resolved (has a source)\n * Check for SpecificResource in body array\n */\nexport function isBodyResolved(body: Annotation['body']): boolean {\n return getBodySource(body) !== null;\n}\n\n/**\n * Get the source IRI from target (handles both string and object forms)\n */\nexport function getTargetSource(target: Annotation['target']): ResourceUri {\n if (typeof target === 'string') {\n return resourceUri(target);\n }\n return resourceUri(target.source);\n}\n\n/**\n * Get the selector from target (undefined if string or no selector)\n */\nexport function getTargetSelector(target: Annotation['target']) {\n if (typeof target === 'string') {\n return undefined;\n }\n return target.selector;\n}\n\n/**\n * Check if target has a selector\n */\nexport function hasTargetSelector(target: Annotation['target']): boolean {\n return typeof target !== 'string' && target.selector !== undefined;\n}\n\n/**\n * Type guard to check if an annotation is a highlight\n */\nexport function isHighlight(annotation: Annotation): annotation is HighlightAnnotation {\n return annotation.motivation === 'highlighting';\n}\n\n/**\n * Type guard to check if an annotation is a reference (linking)\n */\nexport function isReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return annotation.motivation === 'linking';\n}\n\n/**\n * Type guard to check if an annotation is an assessment\n */\nexport function isAssessment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'assessing';\n}\n\n/**\n * Type guard to check if an annotation is a comment\n */\nexport function isComment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'commenting';\n}\n\n/**\n * Type guard to check if an annotation is a tag\n */\nexport function isTag(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'tagging';\n}\n\n/**\n * Extract comment text from a comment annotation's body\n * @param annotation - The annotation to extract comment text from\n * @returns The comment text, or undefined if not a comment or no text found\n */\nexport function getCommentText(annotation: Annotation): string | undefined {\n if (!isComment(annotation)) return undefined;\n const body = Array.isArray(annotation.body) ? annotation.body[0] : annotation.body;\n if (body && 'value' in body) {\n return body.value;\n }\n return undefined;\n}\n\n/**\n * Type guard to check if a reference annotation is a stub (unresolved)\n * Stub if no SpecificResource in body array\n */\nexport function isStubReference(annotation: Annotation): boolean {\n return isReference(annotation) && !isBodyResolved(annotation.body);\n}\n\n/**\n * Type guard to check if a reference annotation is resolved\n * Resolved if SpecificResource exists in body array\n */\nexport function isResolvedReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return isReference(annotation) && isBodyResolved(annotation.body);\n}\n\n// =============================================================================\n// SELECTOR UTILITIES\n// =============================================================================\n\n/**\n * Get the exact text from a selector (single or array)\n *\n * When selector is an array, tries to find a TextQuoteSelector (which has exact text).\n * TextPositionSelector does not have exact text, only character offsets.\n * Handles undefined selector (when target is a string IRI with no selector)\n */\nexport function getExactText(selector: Selector | Selector[] | undefined): string {\n if (!selector) {\n return ''; // No selector means entire resource\n }\n const selectors = Array.isArray(selector) ? selector : [selector];\n\n // Try to find TextQuoteSelector (has exact text)\n const quoteSelector = selectors.find(s => s.type === 'TextQuoteSelector') as TextQuoteSelector | undefined;\n if (quoteSelector) {\n return quoteSelector.exact;\n }\n\n // No TextQuoteSelector found\n return '';\n}\n\n/**\n * Get the exact text from an annotation's target selector\n * Uses getTargetSelector helper to safely get selector\n */\nexport function getAnnotationExactText(annotation: Annotation): string {\n const selector = getTargetSelector(annotation.target);\n return getExactText(selector as Selector | Selector[] | undefined);\n}\n\n/**\n * Get the primary selector from a selector (single or array)\n *\n * When selector is an array, returns the first selector.\n * When selector is a single object, returns it as-is.\n */\nexport function getPrimarySelector(selector: Selector | Selector[]): Selector {\n if (Array.isArray(selector)) {\n if (selector.length === 0) {\n throw new Error('Empty selector array');\n }\n const first = selector[0];\n if (!first) {\n throw new Error('Invalid selector array');\n }\n return first;\n }\n return selector;\n}\n\n/**\n * Get TextPositionSelector from a selector (single or array)\n *\n * Returns the first TextPositionSelector found, or null if none exists.\n * Handles undefined selector (when target is a string IRI with no selector)\n */\nexport function getTextPositionSelector(selector: Selector | Selector[] | undefined): TextPositionSelector | null {\n if (!selector) return null; // No selector means entire resource\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'TextPositionSelector');\n if (!found) return null;\n return found.type === 'TextPositionSelector' ? found : null;\n}\n\n/**\n * Get TextQuoteSelector from a selector (single or array)\n *\n * Returns the first TextQuoteSelector found, or null if none exists.\n */\nexport function getTextQuoteSelector(selector: Selector | Selector[]): TextQuoteSelector | null {\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'TextQuoteSelector');\n if (!found) return null;\n return found.type === 'TextQuoteSelector' ? found : null;\n}\n\n/**\n * Get SvgSelector from a selector (single or array)\n *\n * Returns the first SvgSelector found, or null if none exists.\n */\nexport function getSvgSelector(selector: Selector | Selector[] | undefined): SvgSelector | null {\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'SvgSelector');\n if (!found) return null;\n return found.type === 'SvgSelector' ? found : null;\n}\n\n/**\n * Get FragmentSelector from a selector (single or array)\n *\n * Returns the first FragmentSelector found, or null if none exists.\n */\nexport function getFragmentSelector(selector: Selector | Selector[] | undefined): FragmentSelector | null {\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'FragmentSelector');\n if (!found) return null;\n return found.type === 'FragmentSelector' ? found : null;\n}\n\n/**\n * Validate SVG markup for W3C compliance\n *\n * Checks that:\n * - SVG contains xmlns attribute\n * - SVG is well-formed XML\n * - SVG contains at least one shape element\n *\n * @returns null if valid, error message if invalid\n */\nexport function validateSvgMarkup(svg: string): string | null {\n // Check for xmlns attribute (required by W3C spec)\n if (!svg.includes('xmlns=\"http://www.w3.org/2000/svg\"')) {\n return 'SVG must include xmlns=\"http://www.w3.org/2000/svg\" attribute';\n }\n\n // Check for basic SVG tag structure\n if (!svg.includes('<svg') || !svg.includes('</svg>')) {\n return 'SVG must have opening and closing tags';\n }\n\n // Check for at least one shape element\n const shapeElements = ['rect', 'circle', 'ellipse', 'polygon', 'polyline', 'path', 'line'];\n const hasShape = shapeElements.some(shape =>\n svg.includes(`<${shape}`) || svg.includes(`<${shape} `)\n );\n\n if (!hasShape) {\n return 'SVG must contain at least one shape element (rect, circle, ellipse, polygon, polyline, path, or line)';\n }\n\n return null; // Valid\n}\n\n/**\n * Extract bounding box from SVG markup\n *\n * Attempts to extract x, y, width, height from the SVG viewBox or root element.\n * Returns null if bounding box cannot be determined.\n */\nexport function extractBoundingBox(svg: string): { x: number; y: number; width: number; height: number } | null {\n // Try to extract viewBox attribute from SVG element\n const viewBoxMatch = svg.match(/<svg[^>]*viewBox=\"([^\"]+)\"/);\n if (viewBoxMatch) {\n const values = viewBoxMatch[1].split(/\\s+/).map(parseFloat);\n if (values.length === 4 && values.every(v => !isNaN(v))) {\n return {\n x: values[0],\n y: values[1],\n width: values[2],\n height: values[3]\n };\n }\n }\n\n // Try to extract width/height attributes from SVG element (assume x=0, y=0)\n const svgTagMatch = svg.match(/<svg[^>]*>/);\n if (svgTagMatch) {\n const svgTag = svgTagMatch[0];\n const widthMatch = svgTag.match(/width=\"([^\"]+)\"/);\n const heightMatch = svgTag.match(/height=\"([^\"]+)\"/);\n\n if (widthMatch && heightMatch) {\n const width = parseFloat(widthMatch[1]);\n const height = parseFloat(heightMatch[1]);\n\n if (!isNaN(width) && !isNaN(height)) {\n return { x: 0, y: 0, width, height };\n }\n }\n }\n\n return null;\n}\n","/**\n * Locale information\n * Copied from SDK for frontend use\n */\n\nexport interface LocaleInfo {\n code: string;\n nativeName: string;\n englishName: string;\n}\n\nexport const LOCALES: readonly LocaleInfo[] = [\n { code: 'ar', nativeName: 'العربية', englishName: 'Arabic' },\n { code: 'bn', nativeName: 'বাংলা', englishName: 'Bengali' },\n { code: 'cs', nativeName: 'Čeština', englishName: 'Czech' },\n { code: 'da', nativeName: 'Dansk', englishName: 'Danish' },\n { code: 'de', nativeName: 'Deutsch', englishName: 'German' },\n { code: 'el', nativeName: 'Ελληνικά', englishName: 'Greek' },\n { code: 'en', nativeName: 'English', englishName: 'English' },\n { code: 'es', nativeName: 'Español', englishName: 'Spanish' },\n { code: 'fa', nativeName: 'فارسی', englishName: 'Persian' },\n { code: 'fi', nativeName: 'Suomi', englishName: 'Finnish' },\n { code: 'fr', nativeName: 'Français', englishName: 'French' },\n { code: 'he', nativeName: 'עברית', englishName: 'Hebrew' },\n { code: 'hi', nativeName: 'हिन्दी', englishName: 'Hindi' },\n { code: 'id', nativeName: 'Bahasa Indonesia', englishName: 'Indonesian' },\n { code: 'it', nativeName: 'Italiano', englishName: 'Italian' },\n { code: 'ja', nativeName: '日本語', englishName: 'Japanese' },\n { code: 'ko', nativeName: '한국어', englishName: 'Korean' },\n { code: 'ms', nativeName: 'Bahasa Melayu', englishName: 'Malay' },\n { code: 'nl', nativeName: 'Nederlands', englishName: 'Dutch' },\n { code: 'no', nativeName: 'Norsk', englishName: 'Norwegian' },\n { code: 'pl', nativeName: 'Polski', englishName: 'Polish' },\n { code: 'pt', nativeName: 'Português', englishName: 'Portuguese' },\n { code: 'ro', nativeName: 'Română', englishName: 'Romanian' },\n { code: 'sv', nativeName: 'Svenska', englishName: 'Swedish' },\n { code: 'th', nativeName: 'ไทย', englishName: 'Thai' },\n { code: 'tr', nativeName: 'Türkçe', englishName: 'Turkish' },\n { code: 'uk', nativeName: 'Українська', englishName: 'Ukrainian' },\n { code: 'vi', nativeName: 'Tiếng Việt', englishName: 'Vietnamese' },\n { code: 'zh', nativeName: '中文', englishName: 'Chinese' },\n] as const;\n\n// Create lookup map for efficient access\nconst localeByCode = new Map<string, LocaleInfo>(\n LOCALES.map(locale => [locale.code.toLowerCase(), locale])\n);\n\n/**\n * Get locale information by code\n */\nexport function getLocaleInfo(code: string | undefined): LocaleInfo | undefined {\n if (!code) return undefined;\n return localeByCode.get(code.toLowerCase());\n}\n\n/**\n * Get the native name of a language by its locale code\n */\nexport function getLocaleNativeName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.nativeName;\n}\n\n/**\n * Get the English name of a language by its locale code\n */\nexport function getLocaleEnglishName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.englishName;\n}\n\n/**\n * Format locale code for display as \"Native Name (code)\"\n */\nexport function formatLocaleDisplay(code: string | undefined): string | undefined {\n if (!code) return undefined;\n\n const info = getLocaleInfo(code);\n if (!info) return code;\n\n return `${info.nativeName} (${code.toLowerCase()})`;\n}\n\n/**\n * Get all supported locale codes\n */\nexport function getAllLocaleCodes(): readonly string[] {\n return LOCALES.map(l => l.code);\n}\n","/**\n * Helper functions for working with W3C ResourceDescriptor\n */\n\nimport type { components } from '@semiont/core';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\ntype Representation = components['schemas']['Representation'];\n\n/**\n * Get the resource ID from @id property\n *\n * For internal resources: extracts UUID from \"http://localhost:4000/resources/{uuid}\"\n * For external resources: returns undefined\n *\n * This is used for routing - the frontend URL should contain only the resource ID,\n * not the full HTTP URI.\n */\nexport function getResourceId(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource) return undefined;\n\n const fullId = resource['@id'];\n\n // For internal resources, extract the last path segment\n // http://localhost:4000/resources/{uuid} -> {uuid}\n if (fullId.includes('/resources/')) {\n const parts = fullId.split('/resources/');\n const lastPart = parts[parts.length - 1];\n return lastPart || undefined;\n }\n\n // For external resources, cannot extract ID\n return undefined;\n}\n\n/**\n * Get the primary representation (first or only representation)\n */\nexport function getPrimaryRepresentation(resource: ResourceDescriptor | undefined): Representation | undefined {\n if (!resource?.representations) return undefined;\n const reps = Array.isArray(resource.representations)\n ? resource.representations\n : [resource.representations];\n return reps[0];\n}\n\n/**\n * Get the media type from the primary representation\n */\nexport function getPrimaryMediaType(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.mediaType;\n}\n\n/**\n * Get the checksum from the primary representation\n */\nexport function getChecksum(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.checksum;\n}\n\n/**\n * Get the language from the primary representation\n */\nexport function getLanguage(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.language;\n}\n\n/**\n * Get storage URI from primary representation\n *\n * @param resource - ResourceDescriptor\n * @returns Storage URI or undefined\n */\nexport function getStorageUri(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.storageUri;\n}\n\n/**\n * Get creator agent from wasAttributedTo\n * Handles both single agent and array of agents\n *\n * @param resource - ResourceDescriptor\n * @returns First agent or undefined\n */\nexport function getCreator(resource: ResourceDescriptor | undefined): components['schemas']['Agent'] | undefined {\n if (!resource?.wasAttributedTo) return undefined;\n\n return Array.isArray(resource.wasAttributedTo)\n ? resource.wasAttributedTo[0]\n : resource.wasAttributedTo;\n}\n\n/**\n * Get derived-from URI\n * Handles both single URI and array of URIs\n *\n * @param resource - ResourceDescriptor\n * @returns First derivation URI or undefined\n */\nexport function getDerivedFrom(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource?.wasDerivedFrom) return undefined;\n\n return Array.isArray(resource.wasDerivedFrom)\n ? resource.wasDerivedFrom[0]\n : resource.wasDerivedFrom;\n}\n\n/**\n * Check if resource is archived (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if archived, false otherwise\n */\nexport function isArchived(resource: ResourceDescriptor | undefined): boolean {\n return resource?.archived === true;\n}\n\n/**\n * Get entity types from resource (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns Array of entity types, empty if not set\n */\nexport function getResourceEntityTypes(resource: ResourceDescriptor | undefined): string[] {\n return resource?.entityTypes || [];\n}\n\n/**\n * Check if resource is a draft (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if draft, false otherwise\n */\nexport function isDraft(resource: ResourceDescriptor | undefined): boolean {\n return resource?.isDraft === true;\n}\n\n/**\n * Map charset names to Node.js Buffer encoding names\n * Node.js Buffer.toString() supports: 'utf8', 'utf16le', 'latin1', 'base64', 'hex', 'ascii', 'binary', 'ucs2'\n *\n * @param charset - Charset name (e.g., \"UTF-8\", \"ISO-8859-1\", \"Windows-1252\")\n * @returns Node.js BufferEncoding\n */\nexport function getNodeEncoding(charset: string): BufferEncoding {\n const normalized = charset.toLowerCase().replace(/[-_]/g, '');\n\n // Map common charset names to Node.js encodings\n const charsetMap: Record<string, BufferEncoding> = {\n 'utf8': 'utf8',\n 'iso88591': 'latin1',\n 'latin1': 'latin1',\n 'ascii': 'ascii',\n 'usascii': 'ascii',\n 'utf16le': 'utf16le',\n 'ucs2': 'ucs2',\n 'binary': 'binary',\n 'windows1252': 'latin1', // Windows-1252 is a superset of Latin-1\n 'cp1252': 'latin1',\n };\n\n return charsetMap[normalized] || 'utf8';\n}\n\n/**\n * Decode a representation buffer to string using the correct charset\n * Extracts charset from media type and uses appropriate encoding\n *\n * @param buffer - The raw representation data\n * @param mediaType - Media type with optional charset (e.g., \"text/plain; charset=iso-8859-1\")\n * @returns Decoded string\n *\n * @example\n * ```typescript\n * const content = decodeRepresentation(buffer, \"text/plain; charset=utf-8\");\n * const legacy = decodeRepresentation(buffer, \"text/plain; charset=windows-1252\");\n * ```\n */\nexport function decodeRepresentation(buffer: Buffer, mediaType: string): string {\n // Extract charset from mediaType (e.g., \"text/plain; charset=iso-8859-1\")\n const charsetMatch = mediaType.match(/charset=([^\\s;]+)/i);\n const charset = (charsetMatch?.[1] || 'utf-8').toLowerCase();\n\n // Map to Node.js encoding\n const encoding = getNodeEncoding(charset);\n\n return buffer.toString(encoding);\n}\n","/**\n * Tag Schema Registry\n *\n * Defines structural analysis frameworks for automatic tagging detection.\n * Each schema provides categories that passages can be classified into\n * based on their structural role (not their semantic content).\n *\n * Examples: IRAC (legal), IMRAD (scientific), Toulmin (argumentation)\n */\n\nexport interface TagCategory {\n name: string;\n description: string;\n examples: string[];\n}\n\nexport interface TagSchema {\n id: string;\n name: string;\n description: string;\n domain: 'legal' | 'scientific' | 'general';\n tags: TagCategory[];\n}\n\nexport const TAG_SCHEMAS: Record<string, TagSchema> = {\n 'legal-irac': {\n id: 'legal-irac',\n name: 'Legal Analysis (IRAC)',\n description: 'Issue, Rule, Application, Conclusion framework for legal reasoning',\n domain: 'legal',\n tags: [\n {\n name: 'Issue',\n description: 'The legal question or problem to be resolved',\n examples: [\n 'What is the central legal question?',\n 'What must the court decide?',\n 'What is the dispute about?'\n ]\n },\n {\n name: 'Rule',\n description: 'The relevant law, statute, or legal principle',\n examples: [\n 'What law applies?',\n 'What is the legal standard?',\n 'What statute governs this case?'\n ]\n },\n {\n name: 'Application',\n description: 'How the rule applies to the specific facts',\n examples: [\n 'How does the law apply to these facts?',\n 'Analysis of the case',\n 'How do the facts satisfy the legal standard?'\n ]\n },\n {\n name: 'Conclusion',\n description: 'The resolution or outcome based on the analysis',\n examples: [\n 'What is the court\\'s decision?',\n 'What is the final judgment?',\n 'What is the holding?'\n ]\n }\n ]\n },\n\n 'scientific-imrad': {\n id: 'scientific-imrad',\n name: 'Scientific Paper (IMRAD)',\n description: 'Introduction, Methods, Results, Discussion structure for research papers',\n domain: 'scientific',\n tags: [\n {\n name: 'Introduction',\n description: 'Background, context, and research question',\n examples: [\n 'What is the research question?',\n 'Why is this important?',\n 'What is the hypothesis?'\n ]\n },\n {\n name: 'Methods',\n description: 'Experimental design and procedures',\n examples: [\n 'How was the study conducted?',\n 'What methods were used?',\n 'What was the experimental design?'\n ]\n },\n {\n name: 'Results',\n description: 'Findings and observations',\n examples: [\n 'What did the study find?',\n 'What are the data?',\n 'What were the observations?'\n ]\n },\n {\n name: 'Discussion',\n description: 'Interpretation and implications of results',\n examples: [\n 'What do the results mean?',\n 'What are the implications?',\n 'How do these findings relate to prior work?'\n ]\n }\n ]\n },\n\n 'argument-toulmin': {\n id: 'argument-toulmin',\n name: 'Argument Structure (Toulmin)',\n description: 'Claim, Evidence, Warrant, Counterargument, Rebuttal framework for argumentation',\n domain: 'general',\n tags: [\n {\n name: 'Claim',\n description: 'The main assertion or thesis',\n examples: [\n 'What is being argued?',\n 'What is the main point?',\n 'What position is being taken?'\n ]\n },\n {\n name: 'Evidence',\n description: 'Data or facts supporting the claim',\n examples: [\n 'What supports this claim?',\n 'What are the facts?',\n 'What data is provided?'\n ]\n },\n {\n name: 'Warrant',\n description: 'Reasoning connecting evidence to claim',\n examples: [\n 'Why does this evidence support the claim?',\n 'What is the logic?',\n 'How does this reasoning work?'\n ]\n },\n {\n name: 'Counterargument',\n description: 'Opposing viewpoints or objections',\n examples: [\n 'What are the objections?',\n 'What do critics say?',\n 'What are alternative views?'\n ]\n },\n {\n name: 'Rebuttal',\n description: 'Response to counterarguments',\n examples: [\n 'How is the objection addressed?',\n 'Why is the counterargument wrong?',\n 'How is the criticism answered?'\n ]\n }\n ]\n }\n};\n\n/**\n * Get a tag schema by ID\n */\nexport function getTagSchema(schemaId: string): TagSchema | null {\n return TAG_SCHEMAS[schemaId] || null;\n}\n\n/**\n * Get all available tag schemas\n */\nexport function getAllTagSchemas(): TagSchema[] {\n return Object.values(TAG_SCHEMAS);\n}\n\n/**\n * Get tag schemas filtered by domain\n */\nexport function getTagSchemasByDomain(domain: 'legal' | 'scientific' | 'general'): TagSchema[] {\n return Object.values(TAG_SCHEMAS).filter(schema => schema.domain === domain);\n}\n\n/**\n * Validate that a category name is valid for a schema\n */\nexport function isValidCategory(schemaId: string, categoryName: string): boolean {\n const schema = getTagSchema(schemaId);\n if (!schema) return false;\n return schema.tags.some(tag => tag.name === categoryName);\n}\n\n/**\n * Get a specific category from a schema\n */\nexport function getSchemaCategory(schemaId: string, categoryName: string): TagCategory | null {\n const schema = getTagSchema(schemaId);\n if (!schema) return null;\n return schema.tags.find(tag => tag.name === categoryName) || null;\n}\n","/**\n * Entity Type Extraction Utilities\n *\n * Extract entity types from annotation bodies.\n * Entity types are stored as TextualBody with purpose: \"tagging\"\n */\n\nimport type { components } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\n\n/**\n * Extract entity types from annotation bodies\n * Entity types are stored as TextualBody with purpose: \"tagging\"\n * Accepts any object with a body property matching Annotation['body']\n */\nexport function getEntityTypes(annotation: { body: Annotation['body'] }): string[] {\n // Extract from TextualBody bodies with purpose: \"tagging\"\n if (Array.isArray(annotation.body)) {\n const entityTags: string[] = [];\n\n for (const item of annotation.body) {\n // Runtime check for TextualBody with tagging purpose\n // TypeScript incorrectly narrows the union type here, so we use runtime checks only\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'value' in item &&\n 'purpose' in item\n ) {\n // Access properties as unknown first to avoid TypeScript narrowing issues\n const itemType = (item as { type: unknown }).type;\n const itemValue = (item as { value: unknown }).value;\n const itemPurpose = (item as { purpose: unknown }).purpose;\n\n if (itemType === 'TextualBody' && itemPurpose === 'tagging' && typeof itemValue === 'string' && itemValue.length > 0) {\n entityTags.push(itemValue);\n }\n }\n }\n\n return entityTags;\n }\n\n return [];\n}\n","/**\n * Get Resource URI Route - W3C Content Negotiation\n *\n * Single endpoint for all resource representations via content negotiation:\n * - Accept: application/ld+json -> returns JSON-LD metadata (default)\n * - Accept: text/plain, text/markdown, etc. -> returns raw representation\n * - ?view=semiont -> redirects to Semiont frontend viewer\n *\n * This implements W3C Web Annotation Data Model requirement that\n * resource URIs be globally resolvable.\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { EventQuery } from '@semiont/event-sourcing';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getFrontendUrl } from '../../../middleware/content-negotiation';\nimport { getPrimaryRepresentation, getPrimaryMediaType, decodeRepresentation } from '@semiont/api-client';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'get-resource-uri' });\n\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\ntype Annotation = components['schemas']['Annotation'];\n\nexport function registerGetResourceUri(router: ResourcesRouterType) {\n /**\n * GET /resources/:id\n *\n * W3C-compliant globally resolvable resource URI with full content negotiation:\n * - Accept: application/ld+json -> JSON-LD metadata (default)\n * - Accept: text/plain, text/markdown, etc. -> raw representation\n * - ?view=semiont -> 302 redirect to Semiont frontend viewer\n */\n router.get('/resources/:id', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n const { repStore } = c.get('makeMeaning');\n\n // Check for explicit view=semiont query parameter\n const view = c.req.query('view');\n if (view === 'semiont') {\n const frontendUrl = getFrontendUrl();\n const normalizedBase = frontendUrl.endsWith('/') ? frontendUrl.slice(0, -1) : frontendUrl;\n const redirectUrl = `${normalizedBase}/know/resource/${id}`;\n return c.redirect(redirectUrl, 302);\n }\n\n // Check Accept header for content negotiation\n const acceptHeader = c.req.header('Accept') || 'application/ld+json';\n\n // If requesting raw representation (text/plain, text/markdown, images, etc.)\n if (acceptHeader.includes('text/') || acceptHeader.includes('image/') || acceptHeader.includes('application/pdf')) {\n\n // Get resource metadata from view storage\n let resource: any;\n try {\n resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n } catch (error: any) {\n getRouteLogger().error('Failed to get resource metadata', {\n resourceId: id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, {\n message: 'Failed to retrieve resource'\n });\n }\n\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n // Get primary representation\n const primaryRep = getPrimaryRepresentation(resource);\n if (!primaryRep || !primaryRep.checksum || !primaryRep.mediaType) {\n throw new HTTPException(404, { message: 'Resource representation not found' });\n }\n\n // Read representation from RepresentationStore using content-addressed lookup\n const content = await repStore.retrieve(primaryRep.checksum, primaryRep.mediaType);\n if (!content) {\n throw new HTTPException(404, { message: 'Resource representation not found' });\n }\n\n // Set Content-Type header from representation mediaType (includes charset if specified)\n const mediaType = getPrimaryMediaType(resource);\n if (mediaType) {\n c.header('Content-Type', mediaType);\n }\n\n // For binary formats (images, PDFs), return binary data; for text, decode with correct charset\n if (mediaType?.startsWith('image/') || mediaType === 'application/pdf') {\n // Convert Buffer to Uint8Array for Hono compatibility\n return c.newResponse(new Uint8Array(content), 200, { 'Content-Type': mediaType });\n } else {\n return c.text(decodeRepresentation(content, mediaType || 'text/plain'));\n }\n }\n\n // Otherwise, return JSON-LD metadata (default)\n\n // Read from event store: materializes view from events\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n const events = await query.getResourceEvents(resourceId(id));\n\n let stored: any;\n try {\n stored = await eventStore.views.materializer.materialize(events, resourceId(id));\n } catch (error: any) {\n // Handle corrupted views or broken event chains gracefully\n getRouteLogger().error('Failed to materialize view', {\n resourceId: id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, {\n message: 'Failed to retrieve resource'\n });\n }\n\n if (!stored) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n const annotations = stored.annotations.annotations;\n const entityReferences = annotations.filter((a: Annotation) => {\n if (a.motivation !== 'linking') return false;\n const entityTypes = getEntityTypes({ body: a.body });\n return entityTypes.length > 0;\n });\n\n const response: GetResourceResponse = {\n resource: stored.resource,\n annotations,\n entityReferences,\n };\n\n // Set Content-Type to JSON-LD\n c.header('Content-Type', 'application/ld+json; charset=utf-8');\n\n return c.json(response);\n });\n}\n","/**\n * List Resources Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing (coercion, defaults, validation)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { getResourceEntityTypes } from '@semiont/api-client';\n\ntype ListResourcesResponse = components['schemas']['ListResourcesResponse'];\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\n\nexport function registerListResources(router: ResourcesRouterType) {\n /**\n * GET /resources\n *\n * List all resources with optional filters\n * Query params: offset, limit, entityType, archived, q\n * Requires authentication\n */\n router.get('/resources', async (c) => {\n // Parse query parameters with defaults and coercion\n const query = c.req.query();\n const config = c.get('config');\n const offset = Number(query.offset) || 0;\n const limit = Number(query.limit) || 50;\n const entityType = query.entityType;\n\n // Validate archived parameter (strict validation like Zod)\n let archived: boolean | undefined;\n if (query.archived === 'true') {\n archived = true;\n } else if (query.archived === 'false') {\n archived = false;\n } else if (query.archived !== undefined) {\n throw new HTTPException(400, { message: 'Invalid value for archived parameter. Must be \"true\" or \"false\".' });\n }\n\n const q = query.q;\n\n // Read from view storage projection storage\n let filteredDocs = await ResourceContext.listResources({\n search: q,\n archived,\n }, config);\n\n // Additional filter by entity type (view storage already handles search and archived)\n if (entityType) {\n filteredDocs = filteredDocs.filter((doc: ResourceDescriptor) => getResourceEntityTypes(doc).includes(entityType));\n }\n\n // Paginate\n const paginatedDocs = filteredDocs.slice(offset, offset + limit);\n\n // Add content previews for search results (delegate to service)\n const formattedDocs = q\n ? await ResourceContext.addContentPreviews(paginatedDocs, config)\n : paginatedDocs;\n\n const response: ListResourcesResponse = {\n resources: formattedDocs,\n total: filteredDocs.length,\n offset,\n limit,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Update Resource Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext, AnnotationContext, ResourceOperations } from '@semiont/make-meaning';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { userId, resourceId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\n\ntype Annotation = components['schemas']['Annotation'];\n\ntype UpdateResourceRequest = components['schemas']['UpdateResourceRequest'];\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\n\nexport function registerUpdateResource(router: ResourcesRouterType) {\n /**\n * PATCH /resources/:id\n *\n * Update resource metadata (append-only operations - name and content are immutable)\n * Requires authentication\n * Validates request body against UpdateResourceRequest schema\n */\n router.patch('/resources/:id',\n validateRequestBody('UpdateResourceRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as UpdateResourceRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n // Check resource exists using view storage\n const doc = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!doc) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n\n // Delegate to make-meaning service for business logic\n await ResourceOperations.updateResource(\n {\n resourceId: resourceId(id),\n userId: userId(user.id),\n currentArchived: doc.archived,\n updatedArchived: body.archived,\n currentEntityTypes: doc.entityTypes,\n updatedEntityTypes: body.entityTypes,\n },\n eventStore\n );\n\n // Read annotations from view storage\n const annotations = await AnnotationContext.getAllAnnotations(resourceId(id), config);\n const entityReferences = annotations.filter((a: Annotation) => {\n if (a.motivation !== 'linking') return false;\n const entityTypes = getEntityTypes({ body: a.body });\n return entityTypes.length > 0;\n });\n\n // Return optimistic response (content NOT included - must be fetched separately)\n const response: GetResourceResponse = {\n resource: {\n ...doc,\n archived: body.archived !== undefined ? body.archived : doc.archived,\n entityTypes: body.entityTypes !== undefined ? body.entityTypes : doc.entityTypes,\n },\n annotations,\n entityReferences,\n };\n\n return c.json(response);\n }\n );\n}\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","/**\n * Type-safe SSE helpers\n *\n * Enforces that all SSE event names are defined in Event Map (@semiont/core)\n */\n\nimport type { EventName } from '@semiont/core';\nimport type { SSEStreamingApi } from 'hono/streaming';\n\n/**\n * Write a type-safe SSE event\n *\n * Ensures event names are defined in Event Map at compile-time.\n *\n * @param stream - Hono SSE stream\n * @param options - Event options with type-checked event name\n *\n * @example\n * ```typescript\n * await writeTypedSSE(stream, {\n * event: 'generation:complete', // ✅ Valid event from Event Map\n * data: JSON.stringify(progress),\n * id: String(Date.now())\n * });\n *\n * await writeTypedSSE(stream, {\n * event: 'generation-error', // ❌ TypeScript error - not in Event Map!\n * data: '...'\n * });\n * ```\n */\nexport async function writeTypedSSE(\n stream: SSEStreamingApi,\n options: {\n /** Event name - must be defined in Event Map */\n event: EventName;\n /** Event data (usually JSON stringified) */\n data: string;\n /** Optional event ID */\n id?: string;\n }\n): Promise<void> {\n await stream.writeSSE({\n event: options.event,\n data: options.data,\n id: options.id\n });\n}\n","/**\n * Detect Annotations Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, DetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId, entityType } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateReferencesStreamRequest = components['schemas']['AnnotateReferencesStreamRequest'];\n\ninterface DetectionProgress {\n status: 'started' | 'scanning' | 'complete' | 'error';\n resourceId: ResourceId;\n currentEntityType?: string;\n totalEntityTypes: number;\n processedEntityTypes: number;\n message?: string;\n foundCount?: number;\n percentage?: number;\n}\n\nexport function registerAnnotateReferencesStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-annotations-stream\n *\n * Stream real-time entity detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateReferencesStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-references-stream',\n validateRequestBody('AnnotateReferencesStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateReferencesStreamRequest;\n const { entityTypes, includeDescriptiveReferences } = body;\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'annotate-references-stream',\n resourceId: id\n });\n\n logger.info('Starting reference detection', {\n entityTypes,\n includeDescriptiveReferences\n });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a detection job (this decouples event emission from HTTP client)\n const job: PendingJob<DetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'reference-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n entityTypes: entityTypes.map(et => entityType(et)),\n includeDescriptiveReferences\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('[EventBus] Subscribing to EventBus for resource', { resourceId: id, scopeKey: `${id}:mark:progress` });\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('[EventBus] Received mark:progress event', { progress, resourceId: id });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'scanning',\n resourceId: resourceId(id),\n currentEntityType: progress.currentEntityType,\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: progress.completedEntityTypes?.length || 0,\n foundCount: progress.completedEntityTypes?.reduce((sum, et) => sum + et.foundCount, 0),\n message: progress.message || (progress.currentEntityType\n ? `Scanning for ${progress.currentEntityType}...`\n : 'Processing...'),\n percentage: progress.percentage\n } as DetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'reference-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'linking',\n status: 'complete',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: entityTypes.length,\n foundCount: result?.totalFound,\n message: result?.totalFound !== undefined\n ? `Detection complete! Found ${result.totalFound} entities`\n : 'Detection complete!'\n } as DetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'reference-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try{\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: 0,\n message: event.payload.error || 'Detection failed'\n } as DetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: 0,\n message: error instanceof Error ? error.message : 'Detection failed'\n } as DetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Highlights Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, HighlightDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateHighlightsStreamRequest = components['schemas']['AnnotateHighlightsStreamRequest'];\n\ninterface HighlightDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateHighlightsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-highlights-stream\n *\n * Stream real-time highlight detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateHighlightsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates highlight detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-highlights-stream',\n validateRequestBody('AnnotateHighlightsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateHighlightsStreamRequest;\n const { instructions, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 1 || density > 15)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 1 and 15.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-highlights-stream',\n resourceId: id\n });\n\n logger.info('Starting highlight detection', { instructions: !!instructions, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a highlight detection job\n const job: PendingJob<HighlightDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'highlight-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as HighlightDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as HighlightDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'highlight-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'highlighting',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.highlightsFound,\n createdCount: result?.highlightsCreated,\n message: result?.highlightsCreated !== undefined\n ? `Complete! Created ${result.highlightsCreated} highlights`\n : 'Highlight detection complete!'\n } as HighlightDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'highlight-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Highlight detection failed'\n } as HighlightDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Highlight detection failed'\n } as HighlightDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Assessments Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, AssessmentDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateAssessmentsStreamRequest = components['schemas']['AnnotateAssessmentsStreamRequest'];\n\ninterface AssessmentDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateAssessmentsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-assessments-stream\n *\n * Stream real-time assessment detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateAssessmentsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates assessment detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-assessments-stream',\n validateRequestBody('AnnotateAssessmentsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateAssessmentsStreamRequest;\n const { instructions, tone, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 1 || density > 10)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 1 and 10.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-assessments-stream',\n resourceId: id\n });\n\n logger.info('Starting assessment detection', { instructions: !!instructions, tone, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create an assessment detection job\n const job: PendingJob<AssessmentDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'assessment-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n tone,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as AssessmentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as AssessmentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job.completed (domain event from event store)\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n logger.info('Received job:completed event', { jobType: event.payload.jobType, isStreamClosed });\n if (event.payload.jobType !== 'assessment-annotation') {\n logger.info('Skipping job:completed - wrong jobType', { expected: 'assessment-annotation', actual: event.payload.jobType });\n return;\n }\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'assessing',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.assessmentsFound,\n createdCount: result?.assessmentsCreated,\n message: result?.assessmentsCreated !== undefined\n ? `Complete! Created ${result.assessmentsCreated} assessments`\n : 'Assessment detection complete!'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'assessment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Assessment detection failed'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Assessment detection failed'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Comments Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, CommentDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateCommentsStreamRequest = components['schemas']['AnnotateCommentsStreamRequest'];\n\ninterface CommentDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateCommentsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-comments-stream\n *\n * Stream real-time comment detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateCommentsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates comment detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-comments-stream',\n validateRequestBody('AnnotateCommentsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateCommentsStreamRequest;\n const { instructions, tone, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 2 || density > 12)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 2 and 12.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-comments-stream',\n resourceId: id\n });\n\n logger.info('Starting comment detection', { instructions: !!instructions, tone, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a comment detection job\n const job: PendingJob<CommentDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'comment-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n tone,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as CommentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as CommentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'comment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'commenting',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.commentsFound,\n createdCount: result?.commentsCreated,\n message: result?.commentsCreated !== undefined\n ? `Complete! Created ${result.commentsCreated} comments`\n : 'Comment detection complete!'\n } as CommentDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'comment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Comment detection failed'\n } as CommentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Comment detection failed'\n } as CommentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Tags Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, TagDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getTagSchema } from '@semiont/ontology';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateTagsStreamRequest = components['schemas']['AnnotateTagsStreamRequest'];\n\ninterface TagDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n currentCategory?: string;\n processedCategories?: number;\n totalCategories?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n byCategory?: Record<string, number>;\n}\n\nexport function registerAnnotateTagsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-tags-stream\n *\n * Stream real-time tag detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateTagsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates tag detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-tags-stream',\n validateRequestBody('AnnotateTagsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateTagsStreamRequest;\n const { schemaId, categories } = body;\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'annotate-tags-stream',\n resourceId: id\n });\n\n logger.info('Starting tag detection', { schemaId, categories });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate schema exists\n const schema = getTagSchema(schemaId);\n if (!schema) {\n throw new HTTPException(400, { message: `Invalid tag schema: ${schemaId}` });\n }\n\n // Validate categories\n for (const category of categories) {\n if (!schema.tags.some(t => t.name === category)) {\n throw new HTTPException(400, { message: `Invalid category \"${category}\" for schema ${schemaId}` });\n }\n }\n\n if (categories.length === 0) {\n throw new HTTPException(400, { message: 'At least one category must be selected' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a tag detection job\n const job: PendingJob<TagDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'tag-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n schemaId,\n categories\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n totalCategories: categories.length,\n message: 'Starting detection...'\n } as TagDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n currentCategory: progress.currentCategory,\n processedCategories: progress.processedCategories,\n totalCategories: progress.totalCategories,\n message: progress.message || 'Processing...'\n } as TagDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'tag-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'tagging',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.tagsFound,\n createdCount: result?.tagsCreated,\n byCategory: result?.byCategory,\n message: result?.tagsCreated !== undefined\n ? `Complete! Created ${result.tagsCreated} tags`\n : 'Tag detection complete!'\n } as TagDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'tag-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Tag detection failed'\n } as TagDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Tag detection failed'\n } as TagDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Resource LLM Context Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { LLMContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\n\nexport function registerGetResourceLLMContext(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/llm-context\n *\n * Get resource with full context for LLM processing\n * Includes related resources, annotations, graph representation, and optional summary\n *\n * Query parameters:\n * - depth: 1-3 (default: 2)\n * - maxResources: 1-20 (default: 10)\n * - includeContent: true/false (default: true)\n * - includeSummary: true/false (default: false)\n */\n router.get('/resources/:id/llm-context', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n const makeMeaning = c.get('makeMeaning');\n\n // Parse and validate query parameters\n const depth = query.depth ? Number(query.depth) : 2;\n const maxResources = query.maxResources ? Number(query.maxResources) : 10;\n const includeContent = query.includeContent === 'false' ? false : true;\n const includeSummary = query.includeSummary === 'true' ? true : false;\n\n // Validate depth range\n if (depth < 1 || depth > 3) {\n throw new HTTPException(400, { message: 'Query parameter \"depth\" must be between 1 and 3' });\n }\n\n // Validate maxResources range\n if (maxResources < 1 || maxResources > 20) {\n throw new HTTPException(400, { message: 'Query parameter \"maxResources\" must be between 1 and 20' });\n }\n\n // Delegate to make-meaning for LLM context building\n try {\n const response = await LLMContext.getResourceContext(\n resourceId(id),\n {\n depth,\n maxResources,\n includeContent,\n includeSummary,\n },\n config,\n makeMeaning.inferenceClient\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n throw error;\n }\n });\n}\n","/**\n * Annotation LLM Context Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\nimport { annotationUri } from '@semiont/core';\nimport { getLogger } from '../../../logger';\n\nexport function registerGetAnnotationLLMContext(router: ResourcesRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId/llm-context\n *\n * Get annotation with full context for LLM processing\n * Includes source context (text around annotation), target context (referenced resource if applicable), and metadata\n *\n * Query parameters:\n * - includeSourceContext: true/false (default: true)\n * - includeTargetContext: true/false (default: true)\n * - contextWindow: 100-5000 (default: 1000) - characters before/after selection\n */\n router.get('/resources/:resourceId/annotations/:annotationId/llm-context', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Parse and validate query parameters\n const includeSourceContext = query.includeSourceContext === 'false' ? false : true;\n const includeTargetContext = query.includeTargetContext === 'false' ? false : true;\n const contextWindow = query.contextWindow ? Number(query.contextWindow) : 1000;\n\n // Validate contextWindow range\n if (contextWindow < 100 || contextWindow > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextWindow\" must be between 100 and 5000' });\n }\n\n try {\n // Construct full annotation URI (annotations in views use full URIs as their id)\n const fullAnnotationUri = `${config.services.backend!.publicURL}/annotations/${annotationIdParam}`;\n\n const logger = getLogger().child({\n route: 'annotation-llm-context',\n resourceId: resourceIdParam,\n annotationId: annotationIdParam\n });\n\n // Use shared service to build context\n const response = await AnnotationContext.buildLLMContext(annotationUri(fullAnnotationUri), resourceId(resourceIdParam), config, {\n includeSourceContext,\n includeTargetContext,\n contextWindow\n }, logger);\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error.message === 'Source resource not found') {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n if (error.message === 'Source content not found') {\n throw new HTTPException(404, { message: 'Source content not found' });\n }\n }\n throw error;\n }\n });\n}\n","/**\n * Referenced By Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport type { components } from '@semiont/core';\nimport { resourceUri as makeResourceUri, resourceId as makeResourceId, resourceIdToURI } from '@semiont/core';\nimport { getExactText, getTargetSource, getTargetSelector } from '@semiont/api-client';\nimport type { ResourcesRouterType } from '../shared';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'referenced-by' });\n\ntype GetReferencedByResponse = components['schemas']['GetReferencedByResponse'];\n\nexport function registerGetReferencedBy(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/referenced-by\n *\n * Get resources that reference this resource\n * Requires authentication\n * Returns list of resources with references to this resource\n *\n * Optional query parameter:\n * - motivation: Filter by W3C motivation type (e.g., 'linking', 'commenting', 'highlighting')\n */\n router.get('/resources/:id/referenced-by', async (c) => {\n const { id } = c.req.param();\n const motivation = c.req.query('motivation');\n const config = c.get('config');\n const { graphDb } = c.get('makeMeaning');\n\n // Get all annotations that reference this resource\n // Convert to full URI for graph database lookup\n const resourceUri = resourceIdToURI(makeResourceId(id), config.services.backend!.publicURL);\n getRouteLogger().debug('Looking for annotations referencing resource', {\n resourceId: id,\n resourceUri,\n motivation: motivation || 'all'\n });\n const references = await graphDb.getResourceReferencedBy(resourceUri, motivation);\n getRouteLogger().debug('Found annotations', { count: references.length });\n\n // Get unique resources from the selections\n const docIds = [...new Set(references.map(ref => getTargetSource(ref.target)))];\n getRouteLogger().debug('Unique source resource IDs', { docIds });\n const resources = await Promise.all(docIds.map(docId => graphDb.getResource(makeResourceUri(docId))));\n getRouteLogger().debug('Fetched resources', {\n total: resources.length,\n notFound: resources.filter(r => r === null).length\n });\n\n // Build resource map for lookup (ResourceDescriptor uses @id, not id)\n const docMap = new Map(resources.filter(doc => doc !== null).map(doc => [doc['@id'], doc]));\n getRouteLogger().debug('Resource map created', { keys: Array.from(docMap.keys()) });\n\n // Transform into ReferencedBy structure\n const referencedBy = references.map(ref => {\n const targetSource = getTargetSource(ref.target);\n const targetSelector = getTargetSelector(ref.target);\n const doc = docMap.get(targetSource);\n getRouteLogger().debug('Reference lookup', {\n targetSource,\n found: !!doc,\n name: doc?.name || 'unknown'\n });\n return {\n id: ref.id,\n resourceName: doc?.name || 'Untitled Resource',\n target: {\n source: targetSource,\n selector: {\n exact: targetSelector ? getExactText(targetSelector) : '',\n },\n },\n };\n });\n\n const response: GetReferencedByResponse = {\n referencedBy,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Token Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport {\n CREATION_METHODS,\n resourceId as makeResourceId,\n type ResourceId,\n userId,\n} from '@semiont/core';\nimport { ResourceContext, ResourceOperations } from '@semiont/make-meaning';\nimport type { CloneToken } from '@semiont/core';\nimport { cloneToken as makeCloneToken } from '@semiont/core';\nimport type { ResourcesRouterType } from '../shared';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\n\nimport { getPrimaryRepresentation, getResourceEntityTypes } from '@semiont/api-client';\n\ntype GetResourceByTokenResponse = components['schemas']['GetResourceByTokenResponse'];\ntype CreateResourceFromTokenRequest = components['schemas']['CreateResourceFromTokenRequest'];\ntype CreateResourceFromTokenResponse = components['schemas']['CreateResourceFromTokenResponse'];\ntype CloneResourceWithTokenResponse = components['schemas']['CloneResourceWithTokenResponse'];\n\n// Simple in-memory token store (replace with Redis/DB in production)\nconst cloneTokens = new Map<CloneToken, { resourceId: ResourceId; expiresAt: Date }>();\n\nexport function registerTokenRoutes(router: ResourcesRouterType) {\n /**\n * GET /api/clone-tokens/:token\n *\n * Retrieve a resource using a clone token\n * Requires authentication\n */\n router.get('/api/clone-tokens/:token', async (c) => {\n const { token: tokenStr } = c.req.param();\n const token = makeCloneToken(tokenStr);\n\n const tokenData = cloneTokens.get(token);\n if (!tokenData) {\n throw new HTTPException(404, { message: 'Invalid or expired token' });\n }\n\n if (new Date() > tokenData.expiresAt) {\n cloneTokens.delete(token);\n throw new HTTPException(404, { message: 'Token expired' });\n }\n\n const config = c.get('config');\n const sourceDoc = await ResourceContext.getResourceMetadata(tokenData.resourceId, config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n\n // NOTE: Content is NOT included - frontend should fetch via GET /resources/:id/content\n\n const response: GetResourceByTokenResponse = {\n sourceResource: sourceDoc,\n expiresAt: tokenData.expiresAt.toISOString(),\n };\n\n return c.json(response);\n });\n\n /**\n * POST /api/clone-tokens/create-resource\n *\n * Create a new resource using a clone token\n * Requires authentication\n * Validates request body against CreateResourceFromTokenRequest schema\n */\n router.post('/api/clone-tokens/create-resource',\n validateRequestBody('CreateResourceFromTokenRequest'),\n async (c) => {\n const body = c.get('validatedBody') as CreateResourceFromTokenRequest;\n const user = c.get('user');\n\n const token = makeCloneToken(body.token);\n const tokenData = cloneTokens.get(token);\n if (!tokenData) {\n throw new HTTPException(404, { message: 'Invalid or expired token' });\n }\n\n if (new Date() > tokenData.expiresAt) {\n cloneTokens.delete(token);\n throw new HTTPException(404, { message: 'Token expired' });\n }\n\n const config = c.get('config');\n const { eventStore, repStore } = c.get('makeMeaning');\n\n // Get source resource from materialized views (source of truth)\n const sourceDoc = await ResourceContext.getResourceMetadata(tokenData.resourceId, config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n\n // Get source format and validate it's a supported ContentFormat\n const primaryRep = getPrimaryRepresentation(sourceDoc);\n const mediaType = primaryRep?.mediaType || 'text/plain';\n\n // Validate mediaType is a supported ContentFormat (validation at periphery)\n const validFormats = ['text/plain', 'text/markdown'] as const;\n const format: 'text/plain' | 'text/markdown' = validFormats.includes(mediaType as any)\n ? (mediaType as 'text/plain' | 'text/markdown')\n : 'text/plain';\n\n // Create cloned resource via event sourcing (emits resource.created with creationMethod: CLONE)\n const result = await ResourceOperations.createResource(\n {\n name: body.name,\n content: Buffer.from(body.content),\n format,\n entityTypes: getResourceEntityTypes(sourceDoc),\n creationMethod: CREATION_METHODS.CLONE,\n },\n userId(user.id),\n eventStore,\n repStore,\n config\n );\n\n // Archive original if requested\n if (body.archiveOriginal) {\n await ResourceOperations.updateResource(\n {\n resourceId: tokenData.resourceId,\n userId: userId(user.id),\n currentArchived: sourceDoc.archived,\n updatedArchived: true,\n },\n eventStore\n );\n }\n\n // Clean up token\n cloneTokens.delete(token);\n\n const response: CreateResourceFromTokenResponse = result;\n\n return c.json(response, 201);\n }\n );\n\n /**\n * POST /resources/:id/clone-with-token\n *\n * Generate a temporary token for cloning a resource\n * Requires authentication\n */\n router.post('/resources/:id/clone-with-token', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n const { repStore } = c.get('makeMeaning');\n\n // Look up resource from materialized views (source of truth, not graph DB)\n const sourceDoc = await ResourceContext.getResourceMetadata(makeResourceId(id), config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n // Check if content exists\n const primaryRep = getPrimaryRepresentation(sourceDoc);\n if (!primaryRep?.checksum || !primaryRep?.mediaType) {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n\n try {\n await repStore.retrieve(primaryRep.checksum, primaryRep.mediaType);\n } catch {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n\n // Create token\n const tokenStr = `clone_${Math.random().toString(36).substring(2, 11)}_${Date.now()}`;\n const token = makeCloneToken(tokenStr);\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 minutes\n\n cloneTokens.set(token, {\n resourceId: makeResourceId(id),\n expiresAt,\n });\n\n const response: CloneResourceWithTokenResponse = {\n token,\n expiresAt: expiresAt.toISOString(),\n resource: sourceDoc,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Get Resource Annotations Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport type { ResourcesRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport type { components } from '@semiont/core';\nimport { resourceId } from '@semiont/core';\n\ntype GetAnnotationsResponse = components['schemas']['GetAnnotationsResponse'];\n\nexport function registerGetResourceAnnotations(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/annotations\n *\n * Get all annotations (both highlights and references) in a resource\n * Requires authentication\n * Uses view storage projections\n */\n router.get('/resources/:id/annotations', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n\n const annotations = await AnnotationContext.getAllAnnotations(resourceId(id), config);\n\n const response: GetAnnotationsResponse = {\n annotations,\n total: annotations.length\n };\n\n return c.json(response);\n });\n}\n","/**\n * Resource Events Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { EventQuery } from '@semiont/event-sourcing';\nimport type { ResourcesRouterType } from '../shared';\nimport type { StoredEvent, EventQuery as EventQueryType } from '@semiont/core';\nimport { resourceId } from '@semiont/core';\nimport type { components } from '@semiont/core';\nimport { HTTPException } from 'hono/http-exception';\n\ntype GetEventsResponse = components['schemas']['GetEventsResponse'];\n\nconst eventTypes = [\n 'resource.created',\n 'resource.cloned',\n 'resource.archived',\n 'resource.unarchived',\n 'annotation.added',\n 'annotation.removed',\n 'annotation.body.updated',\n 'entitytag.added',\n 'entitytag.removed',\n] as const;\n\n// Type guard function for event type validation\nfunction isValidEventType(type: string): type is typeof eventTypes[number] {\n return eventTypes.includes(type as any);\n}\n\nexport function registerGetEvents(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/events\n *\n * Get full event history for a resource with optional filtering\n * Requires authentication\n *\n * Query parameters:\n * - type: Event type filter (optional)\n * - userId: User ID filter (optional)\n * - limit: Maximum number of events (1-1000, default: 100)\n */\n router.get('/resources/:id/events', async (c) => {\n const { id } = c.req.param();\n const queryParams = c.req.query();\n\n // Parse and validate query parameters\n const type = queryParams.type;\n const userId = queryParams.userId;\n const limit = queryParams.limit ? Number(queryParams.limit) : 100;\n\n // Validate type if provided\n if (type && !isValidEventType(type)) {\n throw new HTTPException(400, { message: `Invalid event type. Must be one of: ${eventTypes.join(', ')}` });\n }\n\n // Validate limit range\n if (limit < 1 || limit > 1000) {\n throw new HTTPException(400, { message: 'Query parameter \"limit\" must be between 1 and 1000' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n const eventQuery = new EventQuery(eventStore.log.storage);\n\n // Build query filters - type is validated by this point\n const validatedType = type && isValidEventType(type) ? type : undefined;\n const filters: EventQueryType = {\n resourceId: resourceId(id),\n ...(validatedType && { eventTypes: [validatedType] }),\n };\n\n if (userId) {\n filters.userId = userId;\n }\n\n if (limit) {\n filters.limit = limit;\n }\n\n // Query events\n const storedEvents: StoredEvent[] = await eventQuery.queryEvents(filters);\n\n if (!storedEvents || storedEvents.length === 0) {\n const emptyResponse: GetEventsResponse = {\n events: [],\n total: 0,\n resourceId: id,\n };\n return c.json(emptyResponse);\n }\n\n // Validate and transform events to match API response structure\n const events = storedEvents.map(stored => {\n // Validate required top-level properties\n if (!stored.event) {\n throw new Error(`Event missing 'event' property for resource ${id}`);\n }\n if (!stored.metadata) {\n throw new Error(`Event missing 'metadata' property for resource ${id}`);\n }\n\n // Validate required event properties\n const { event, metadata } = stored;\n if (!event.id || !event.type || !event.timestamp || !event.userId || !event.resourceId) {\n throw new Error(`Event ${event.id || 'unknown'} for resource ${id} is missing required properties: ${JSON.stringify({ id: event.id, type: event.type, timestamp: event.timestamp, userId: event.userId, resourceId: event.resourceId })}`);\n }\n if (metadata.sequenceNumber === undefined) {\n throw new Error(`Event ${event.id} for resource ${id} is missing metadata.sequenceNumber`);\n }\n\n // Return nested structure matching StoredEvent interface - map internal resourceId to API resourceId\n return {\n event: {\n id: event.id,\n type: event.type,\n timestamp: event.timestamp,\n userId: event.userId,\n resourceId: event.resourceId, // Map internal resourceId to API resourceId\n payload: event.payload,\n },\n metadata: {\n sequenceNumber: metadata.sequenceNumber,\n prevEventHash: metadata.prevEventHash,\n checksum: metadata.checksum,\n },\n };\n });\n\n const response: GetEventsResponse = {\n events,\n total: events.length,\n resourceId: id,\n };\n\n return c.json(response);\n });\n}\n","import { EventQuery } from '@semiont/event-sourcing';\n\n/**\n * Resource Events Stream Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No response validation (SSE streams validated on request only)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n *\n * SSE Strategy (per SSE-VALIDATION-CONSIDERATIONS.md):\n * - Validate request only (path params)\n * - No response validation (streaming data)\n * - Use TypeScript types for event data structures\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { resourceId } from '@semiont/core';\nimport { resourceUri } from '@semiont/core';\nimport { SSE_STREAM_CONNECTED } from '@semiont/api-client';\nimport { getLogger } from '../../../logger';\n\n/**\n * Resource-scoped SSE event stream for real-time collaboration\n *\n * Opens a long-lived connection that broadcasts all events for a specific resource.\n * Clients receive events as they happen (highlights added, references created, etc.)\n *\n * Use case: Multiple users viewing the same resource see each other's changes in real-time\n */\n\nexport function registerGetEventStream(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/events/stream\n *\n * Open a Server-Sent Events stream to receive real-time resource events\n * Requires authentication\n * Returns text/event-stream\n */\n router.get('/resources/:id/events/stream', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'events-stream',\n resourceId: id\n });\n\n // Construct full resource URI for event subscriptions (consistent with W3C Web Annotation spec)\n const rUri = resourceUri(`${config.services.backend!.publicURL}/resources/${id}`);\n\n logger.info('Client connecting to resource events stream', { resourceUri: rUri });\n\n // Verify resource exists in event store (Event Store - source of truth)\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n const events = await query.getResourceEvents(resourceId(id));\n if (events.length === 0) {\n logger.warn('Resource not found - no events exist');\n throw new HTTPException(404, { message: 'Resource not found - no events exist for this resource' });\n }\n\n logger.info('Resource exists with events', { eventCount: events.length });\n\n return streamSSE(c, async (stream) => {\n\n // Send initial connection message\n logger.info('Sending connection message to client');\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'connected',\n resourceId: id,\n timestamp: new Date().toISOString(),\n message: 'Event stream connected',\n }),\n event: SSE_STREAM_CONNECTED,\n id: String(Date.now()),\n });\n\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n let subscription: ReturnType<typeof eventStore.bus.subscriptions.subscribe> | null = null;\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n if (subscription) {\n subscription.unsubscribe();\n }\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n // Subscribe to events for this resource using full URI\n const streamId = `${id.substring(0, 16)}...${Math.random().toString(36).substring(7)}`;\n logger.info('Subscribing to events for resource URI', { streamId, resourceUri: rUri });\n subscription = eventStore.bus.subscriptions.subscribe(rUri, async (storedEvent) => {\n if (isStreamClosed) {\n logger.info('Stream already closed, ignoring event', { streamId, eventType: storedEvent.event.type });\n return;\n }\n\n logger.info('Received event, attempting to write to SSE stream', {\n streamId,\n eventType: storedEvent.event.type\n });\n\n try {\n const eventData = {\n id: storedEvent.event.id,\n type: storedEvent.event.type,\n timestamp: storedEvent.event.timestamp,\n userId: storedEvent.event.userId,\n resourceId: storedEvent.event.resourceId,\n payload: storedEvent.event.payload,\n metadata: {\n sequenceNumber: storedEvent.metadata.sequenceNumber,\n prevEventHash: storedEvent.metadata.prevEventHash,\n checksum: storedEvent.metadata.checksum,\n },\n };\n\n logger.info('Event data prepared, calling writeSSE', { streamId });\n\n // DEBUG: Test JSON.stringify separately\n let jsonData: string;\n try {\n const startStringify = Date.now();\n jsonData = JSON.stringify(eventData);\n const stringifyTime = Date.now() - startStringify;\n logger.info('JSON.stringify completed', {\n streamId,\n time: stringifyTime,\n size: jsonData.length\n });\n } catch (stringifyError) {\n logger.error('JSON.stringify FAILED', { streamId, error: stringifyError });\n throw stringifyError;\n }\n\n // DEBUG: Log payload structure for annotation.body.updated\n if (storedEvent.event.type === 'annotation.body.updated') {\n logger.info('annotation.body.updated payload', {\n streamId,\n payload: storedEvent.event.payload\n });\n }\n\n const startWrite = Date.now();\n await stream.writeSSE({\n data: jsonData,\n event: storedEvent.event.type,\n id: storedEvent.metadata.sequenceNumber.toString(),\n });\n const writeTime = Date.now() - startWrite;\n logger.info('Successfully wrote event to SSE stream', {\n streamId,\n eventType: storedEvent.event.type,\n time: writeTime\n });\n } catch (error) {\n logger.error('Error writing event to SSE stream', {\n streamId,\n eventType: storedEvent.event.type,\n error\n });\n cleanup();\n }\n });\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from resource events stream');\n cleanup();\n });\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n });\n}\n","/**\n * Create Annotation Route\n * POST /resources/{id}/annotations\n *\n * Creates a new annotation on a resource using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getTextPositionSelector, getSvgSelector, getFragmentSelector, validateSvgMarkup } from '@semiont/api-client';\nimport type { AnnotationAddedEvent } from '@semiont/core';\nimport { resourceId, userId, userToAgent } from '@semiont/core';\nimport { generateAnnotationId } from '@semiont/event-sourcing';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'create-annotation' });\n\ntype Annotation = components['schemas']['Annotation'];\ntype CreateAnnotationRequest = components['schemas']['CreateAnnotationRequest'];\ntype CreateAnnotationResponse = components['schemas']['CreateAnnotationResponse'];\n\nexport function registerCreateAnnotation(router: ResourcesRouterType) {\n /**\n * POST /resources/:id/annotations\n * Create a new annotation/reference in a resource\n */\n router.post('/resources/:id/annotations',\n validateRequestBody('CreateAnnotationRequest'),\n async (c) => {\n const { id } = c.req.param();\n const request = c.get('validatedBody') as CreateAnnotationRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n // Generate annotation ID\n let newAnnotationId: string;\n try {\n const backendUrl = config.services.backend?.publicURL;\n if (!backendUrl) {\n throw new Error('Backend publicURL not configured');\n }\n newAnnotationId = generateAnnotationId(backendUrl);\n } catch (error) {\n getRouteLogger().error('Failed to generate annotation ID', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, { message: 'Failed to create annotation' });\n }\n\n // Validate selector: must have either TextPositionSelector, SvgSelector, or FragmentSelector\n const posSelector = getTextPositionSelector(request.target.selector);\n const svgSelector = getSvgSelector(request.target.selector);\n const fragmentSelector = getFragmentSelector(request.target.selector);\n\n if (!posSelector && !svgSelector && !fragmentSelector) {\n throw new HTTPException(400, { message: 'Either TextPositionSelector, SvgSelector, or FragmentSelector is required for creating annotations' });\n }\n\n // Validate SVG markup if SvgSelector is provided\n if (svgSelector) {\n const svgError = validateSvgMarkup(svgSelector.value);\n if (svgError) {\n throw new HTTPException(400, { message: `Invalid SVG markup: ${svgError}` });\n }\n }\n\n // Validation ensures motivation is present (it's required in schema)\n if (!request.motivation) {\n throw new HTTPException(400, { message: 'motivation is required' });\n }\n\n // Build annotation object (includes W3C required @context and type)\n const annotation: Omit<Annotation, 'creator' | 'created'> = {\n '@context': 'http://www.w3.org/ns/anno.jsonld' as const,\n 'type': 'Annotation' as const,\n id: newAnnotationId,\n motivation: request.motivation,\n target: request.target,\n body: request.body as Annotation['body'],\n modified: new Date().toISOString(),\n };\n\n // Emit unified annotation.added event\n const { eventStore } = c.get('makeMeaning');\n const eventPayload: Omit<AnnotationAddedEvent, 'id' | 'timestamp'> = {\n type: 'annotation.added',\n resourceId: resourceId(id),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotation,\n },\n };\n await eventStore.appendEvent(eventPayload);\n\n // Return optimistic response\n const response: CreateAnnotationResponse = {\n annotation: {\n ...annotation,\n creator: userToAgent(user),\n created: new Date().toISOString(),\n },\n };\n\n return c.json(response, 201);\n }\n );\n}\n","/**\n * Get Annotation Route\n * GET /resources/{resourceId}/annotations/{annotationId}\n *\n * Gets a specific annotation from a resource using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getBodySource } from '@semiont/api-client';\nimport { resourceId as makeResourceId, annotationId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { ResourceContext } from '@semiont/make-meaning';\n\ntype GetAnnotationResponse = components['schemas']['GetAnnotationResponse'];\n\nexport function registerGetAnnotation(router: ResourcesRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId\n * Get a specific annotation from a resource\n */\n router.get('/resources/:resourceId/annotations/:annotationId', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const config = c.get('config');\n\n // Get annotation from view storage\n const annotation = await AnnotationContext.getAnnotation(\n annotationId(annotationIdParam),\n makeResourceId(resourceIdParam),\n config\n );\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n // Get source resource metadata\n const resource = await ResourceContext.getResourceMetadata(\n makeResourceId(resourceIdParam),\n config\n );\n\n // Get resolved resource if annotation body contains a link\n let resolvedResource = null;\n const bodySource = getBodySource(annotation.body);\n if (bodySource) {\n const resolvedId = bodySource.split('/').pop()!;\n resolvedResource = await ResourceContext.getResourceMetadata(\n makeResourceId(resolvedId),\n config\n );\n }\n\n const response: GetAnnotationResponse = {\n annotation,\n resource,\n resolvedResource,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Delete Annotation Route\n * DELETE /resources/{resourceId}/annotations/{annotationId}\n *\n * Deletes an annotation using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { annotationUri } from '@semiont/core';\nimport { resourceId, annotationId, userId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'delete-annotation' });\n\ntype Annotation = components['schemas']['Annotation'];\n\nexport function registerDeleteAnnotation(router: ResourcesRouterType) {\n /**\n * DELETE /resources/:resourceId/annotations/:annotationId\n * Delete an annotation\n */\n router.delete('/resources/:resourceId/annotations/:annotationId', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const user = c.get('user');\n const config = c.get('config');\n\n // Get projection to verify annotation exists\n const projection = await AnnotationContext.getResourceAnnotations(\n resourceId(resourceIdParam),\n config\n );\n\n // Find the annotation in this resource's annotations\n // Annotation IDs in the projection are full URIs, so construct the full URI for comparison\n const fullAnnotationUri = annotationUri(`${config.services.backend!.publicURL}/annotations/${annotationIdParam}`);\n const annotation = projection.annotations.find(\n (a: Annotation) => a.id === fullAnnotationUri\n );\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found in resource' });\n }\n\n // Emit unified annotation.removed event\n const { eventStore } = c.get('makeMeaning');\n getRouteLogger().debug('Emitting annotation.removed event', {\n annotationId: annotationIdParam,\n resourceId: resourceIdParam\n });\n const storedEvent = await eventStore.appendEvent({\n type: 'annotation.removed',\n resourceId: resourceId(resourceIdParam),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotationId: annotationId(annotationIdParam),\n },\n });\n getRouteLogger().debug('Event emitted', {\n annotationId: annotationIdParam,\n sequenceNumber: storedEvent.metadata.sequenceNumber\n });\n\n return c.body(null, 204);\n });\n}\n","/**\n * Update Annotation Body Route\n * PUT /resources/{resourceId}/annotations/{annotationId}/body\n *\n * Updates annotation body using fine-grained operations\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport type { BodyOperation } from '@semiont/core';\nimport { resourceId, annotationId, userId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'update-annotation-body' });\n\ntype UpdateAnnotationBodyRequest = components['schemas']['UpdateAnnotationBodyRequest'];\ntype UpdateAnnotationBodyResponse = components['schemas']['UpdateAnnotationBodyResponse'];\n\nexport function registerUpdateAnnotationBody(router: ResourcesRouterType) {\n /**\n * PUT /resources/:resourceId/annotations/:annotationId/body\n * Apply fine-grained operations to modify annotation body items\n */\n router.put('/resources/:resourceId/annotations/:annotationId/body',\n validateRequestBody('UpdateAnnotationBodyRequest'),\n async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const request = c.get('validatedBody') as UpdateAnnotationBodyRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n getRouteLogger().debug('Body update handler called', {\n annotationId: annotationIdParam,\n operations: request.operations\n });\n\n // Get annotation from view storage\n const annotation = await AnnotationContext.getAnnotation(\n annotationId(annotationIdParam),\n resourceId(resourceIdParam),\n config\n );\n getRouteLogger().debug('View storage lookup result', {\n annotationId: annotationIdParam,\n found: !!annotation\n });\n\n if (!annotation) {\n getRouteLogger().warn('Annotation not found in view storage', {\n annotationId: annotationIdParam,\n resourceId: resourceIdParam\n });\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n // Emit annotation.body.updated event\n const { eventStore } = c.get('makeMeaning');\n await eventStore.appendEvent({\n type: 'annotation.body.updated',\n resourceId: resourceId(resourceIdParam),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotationId: annotationId(annotationIdParam),\n operations: request.operations as BodyOperation[],\n },\n });\n\n // Return optimistic response - Apply operations to body array\n const bodyArray = Array.isArray(annotation.body) ? [...annotation.body] : [];\n\n for (const op of request.operations) {\n if (op.op === 'add') {\n // Add item (idempotent - don't add if already exists)\n const exists = bodyArray.some(item =>\n JSON.stringify(item) === JSON.stringify(op.item)\n );\n if (!exists) {\n bodyArray.push(op.item);\n }\n } else if (op.op === 'remove') {\n // Remove item\n const index = bodyArray.findIndex(item =>\n JSON.stringify(item) === JSON.stringify(op.item)\n );\n if (index !== -1) {\n bodyArray.splice(index, 1);\n }\n } else if (op.op === 'replace') {\n // Replace item\n const index = bodyArray.findIndex(item =>\n JSON.stringify(item) === JSON.stringify(op.oldItem)\n );\n if (index !== -1) {\n bodyArray[index] = op.newItem;\n }\n }\n }\n\n const response: UpdateAnnotationBodyResponse = {\n annotation: {\n ...annotation,\n body: bodyArray,\n },\n };\n\n return c.json(response);\n }\n );\n}\n","/**\n * Generate Resource Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops (previously 500ms intervals)\n * - Subscribes to generation:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { getExactText } from '@semiont/api-client';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, GenerationParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { getTargetSelector } from '@semiont/api-client';\nimport { jobId, entityType } from '@semiont/core';\nimport { userId, resourceId, annotationId as makeAnnotationId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype YieldResourceStreamRequest = components['schemas']['YieldResourceStreamRequest'];\n\ninterface YieldProgress {\n status: 'started' | 'fetching' | 'generating' | 'creating' | 'complete' | 'error';\n referenceId: string;\n resourceName?: string;\n resourceId?: string;\n sourceResourceId?: string;\n percentage: number;\n message?: string;\n}\n\nexport function registerYieldResourceStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:resourceId/annotations/:annotationId/yield-resource-stream\n *\n * Yield a resource from an annotation with streaming progress updates via SSE\n * Requires authentication\n * Validates request body against YieldResourceStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates generation job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:resourceId/annotations/:annotationId/yield-resource-stream',\n validateRequestBody('YieldResourceStreamRequest'),\n async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const body = c.get('validatedBody') as YieldResourceStreamRequest;\n\n const logger = getLogger().child({\n component: 'yield-resource-stream',\n resourceId: resourceIdParam,\n annotationId: annotationIdParam\n });\n\n logger.info('Received generation request', { body });\n\n // User will be available from auth middleware\n const user = c.get('user');\n const config = c.get('config');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n logger.info('Starting resource generation', { language: body.language });\n\n // Validate annotation exists using view storage\n const projection = await AnnotationContext.getResourceAnnotations(resourceId(resourceIdParam), config);\n\n // Debug: log what annotations exist\n const linkingAnnotations = projection.annotations.filter((a: any) => a.motivation === 'linking');\n logger.info('Found linking annotations in resource', {\n count: linkingAnnotations.length,\n ids: linkingAnnotations.map((a: any) => a.id)\n });\n\n // Compare by ID - need to match full annotation URI\n const expectedAnnotationUri = `${config.services.backend!.publicURL}/annotations/${annotationIdParam}`;\n logger.info('Looking for annotation URI', { expectedAnnotationUri });\n\n const reference = projection.annotations.find((a: any) =>\n a.id === expectedAnnotationUri && a.motivation === 'linking'\n );\n\n if (!reference) {\n logger.warn('Annotation not found', {\n expectedUri: expectedAnnotationUri,\n availableIds: projection.annotations.map((a: any) => a.id)\n });\n throw new HTTPException(404, { message: `Annotation ${annotationIdParam} not found in resource ${resourceIdParam}` });\n }\n logger.info('Found matching annotation', { annotationId: reference.id });\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Validate context is provided (required by schema)\n if (!body.context) {\n throw new HTTPException(400, { message: 'Context is required for generation' });\n }\n\n // Create a generation job (this decouples event emission from HTTP client)\n const job: PendingJob<GenerationParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'generation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 3\n },\n params: {\n referenceId: makeAnnotationId(annotationIdParam),\n sourceResourceId: resourceId(resourceIdParam),\n title: body.title,\n prompt: body.prompt,\n language: body.language,\n entityTypes: getEntityTypes(reference).map(et => entityType(et)),\n context: body.context, // NEW - context from frontend modal\n temperature: body.temperature, // NEW - inference parameter\n maxTokens: body.maxTokens // NEW - inference parameter\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created generation job', {\n jobId: job.metadata.id,\n language: job.params.language\n });\n\n // Determine resource name for progress messages\n const targetSelector = getTargetSelector(reference.target);\n const resourceName = body.title || (targetSelector ? getExactText(targetSelector) : '') || 'New Resource';\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit generation:started, generation:progress, generation:completed\n const resourceBus = eventBus.scope(resourceIdParam);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to yield:progress\n subscriptions.push(\n resourceBus.get('yield:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Generation started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n referenceId: reference.id,\n resourceName,\n percentage: 0,\n message: 'Starting...'\n } as YieldProgress),\n event: 'yield:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to yield:progress\n subscriptions.push(\n resourceBus.get('yield:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Generation progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status,\n referenceId: reference.id,\n resourceName,\n percentage: progress.percentage || 0,\n message: progress.message || `${progress.status}...`\n } as YieldProgress),\n event: 'yield:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (isStreamClosed) return;\n logger.info('Generation completed');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'complete',\n referenceId: reference.id,\n resourceName,\n resourceId: event.payload.resultResourceId,\n sourceResourceId: resourceIdParam,\n percentage: 100,\n message: 'Draft resource created! Ready for review.'\n } as YieldProgress),\n event: 'yield:finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from generation stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n referenceId: reference.id,\n percentage: 0,\n message: error instanceof Error ? error.message : 'Generation failed'\n } as YieldProgress),\n event: 'yield:failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","import { EventQuery } from '@semiont/event-sourcing';\n\n/**\n * Annotation History Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { AnnotationsRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { getTargetSource } from '@semiont/api-client';\nimport type { components } from '@semiont/core';\nimport { resourceId as makeResourceId, annotationId as makeAnnotationId } from '@semiont/core';\n\ntype GetAnnotationHistoryResponse = components['schemas']['GetAnnotationHistoryResponse'];\n\nexport function registerGetAnnotationHistory(router: AnnotationsRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId/history\n *\n * Get full event history for a specific annotation (highlight or reference)\n * Requires authentication\n * Returns annotation events sorted by sequence number\n */\n router.get('/resources/:resourceId/annotations/:annotationId/history', async (c) => {\n const { resourceId, annotationId } = c.req.param();\n const config = c.get('config');\n\n // Verify annotation exists using view storage (not GraphDB)\n const annotation = await AnnotationContext.getAnnotation(makeAnnotationId(annotationId), makeResourceId(resourceId), config);\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n if (getTargetSource(annotation.target) !== resourceId) {\n throw new HTTPException(404, { message: 'Annotation does not belong to this resource' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n\n // Get all events for this resource\n const allEvents = await query.queryEvents({\n resourceId: makeResourceId(resourceId),\n });\n\n // Filter events related to this annotation\n const annotationEvents = allEvents.filter(stored => {\n const event = stored.event;\n\n // Check if event is about this annotation\n // Highlight events have highlightId, Reference events have referenceId\n if ('highlightId' in event.payload && event.payload.highlightId === annotationId) return true;\n if ('referenceId' in event.payload && event.payload.referenceId === annotationId) return true;\n\n return false;\n });\n\n // Format events for API response\n const events: GetAnnotationHistoryResponse['events'] = annotationEvents.map(stored => ({\n id: stored.event.id,\n type: stored.event.type as any, // Job events are filtered out above but TS doesn't know\n timestamp: stored.event.timestamp,\n userId: stored.event.userId,\n resourceId: stored.event.resourceId!, // Map internal resourceId to API resourceId\n payload: stored.event.payload as any,\n metadata: {\n sequenceNumber: stored.metadata.sequenceNumber,\n prevEventHash: stored.metadata.prevEventHash,\n checksum: stored.metadata.checksum,\n },\n }));\n\n // Sort by sequence number\n events.sort((a, b) => a.metadata.sequenceNumber - b.metadata.sequenceNumber);\n\n const response: GetAnnotationHistoryResponse = {\n events,\n total: events.length,\n annotationId,\n resourceId: resourceId, // Map internal resourceId to API resourceId\n };\n\n return c.json(response);\n });\n}\n","// Main resources router that combines all individual route files\nimport { createResourceRouter } from './shared';\nimport type { ResourcesRouterType } from './shared';\nimport type { JobQueue } from '@semiont/jobs';\n\n// Import registration functions for all routes\nimport { registerCreateResource } from './routes/create';\nimport { registerGetResourceUri } from './routes/get-uri';\nimport { registerListResources } from './routes/list';\nimport { registerUpdateResource } from './routes/update';\nimport { registerAnnotateReferencesStream } from './routes/annotate-references-stream';\nimport { registerAnnotateHighlightsStream } from './routes/annotate-highlights-stream';\nimport { registerAnnotateAssessmentsStream } from './routes/annotate-assessments-stream';\nimport { registerAnnotateCommentsStream } from './routes/annotate-comments-stream';\nimport { registerAnnotateTagsStream } from './routes/annotate-tags-stream';\nimport { registerGetResourceLLMContext } from './routes/llm-context';\nimport { registerGetAnnotationLLMContext } from './routes/annotation-llm-context';\nimport { registerGetReferencedBy } from './routes/referenced-by';\nimport { registerTokenRoutes } from './routes/token';\nimport { registerGetResourceAnnotations } from './routes/get-annotations';\nimport { registerGetEvents } from './routes/events';\nimport { registerGetEventStream } from './routes/events-stream';\n\n// Nested annotation routes\nimport { registerCreateAnnotation } from './routes/create-annotation';\nimport { registerGetAnnotation } from './routes/get-annotation';\nimport { registerDeleteAnnotation } from './routes/delete-annotation';\nimport { registerUpdateAnnotationBody } from './routes/update-annotation-body';\nimport { registerYieldResourceStream } from './routes/yield-resource-stream';\nimport { registerGetAnnotationHistory } from '../annotations/routes/history';\n\n// Factory function to create resources router with JobQueue\nexport function createResourcesRouter(jobQueue: JobQueue): ResourcesRouterType {\n const resourcesRouter: ResourcesRouterType = createResourceRouter();\n\n// Register all routes\n// NOTE: Register specific paths before generic :id patterns to avoid route conflicts\n// Order: exact paths → literal segments → :id with suffixes → generic :id\n\n// Exact collection paths (no params)\nregisterCreateResource(resourcesRouter); // POST /resources\nregisterListResources(resourcesRouter); // GET /resources\n\n// Routes with literal second segment (before :id routes)\nregisterTokenRoutes(resourcesRouter); // GET /api/clone-tokens/:token, POST /api/clone-tokens/create-resource, POST /resources/:id/clone-with-token\n\n // Routes with :id and specific suffixes\n registerAnnotateReferencesStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-references-stream\n registerAnnotateHighlightsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-highlights-stream\n registerAnnotateAssessmentsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-assessments-stream\n registerAnnotateCommentsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-comments-stream\n registerAnnotateTagsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-tags-stream\n registerGetResourceLLMContext(resourcesRouter); // GET /resources/:id/llm-context\n registerGetAnnotationLLMContext(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId/llm-context\n registerGetReferencedBy(resourcesRouter); // GET /resources/:id/referenced-by\n\n // Annotation routes (nested under resources) - must be before generic :id route\n registerGetResourceAnnotations(resourcesRouter); // GET /resources/:id/annotations (list)\n registerCreateAnnotation(resourcesRouter); // POST /resources/:id/annotations\n registerGetAnnotation(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId\n registerUpdateAnnotationBody(resourcesRouter); // PUT /resources/:resourceId/annotations/:annotationId/body\n registerYieldResourceStream(resourcesRouter, jobQueue); // POST /resources/:resourceId/annotations/:annotationId/yield-resource-stream\n registerGetAnnotationHistory(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId/history\n registerDeleteAnnotation(resourcesRouter); // DELETE /resources/:resourceId/annotations/:annotationId\n\n // Event routes\n registerGetEvents(resourcesRouter); // GET /resources/:id/events\n registerGetEventStream(resourcesRouter); // GET /resources/:id/events/stream\n\n // Generic routes with :id parameter - MUST BE LAST\n registerGetResourceUri(resourcesRouter); // W3C content negotiation for /resources/:id - handles both metadata and raw representations\n registerUpdateResource(resourcesRouter); // PATCH /resources/:id (handles archive via {archived: true})\n\n return resourcesRouter;\n}","// Shared imports and types for annotation routes\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { authMiddleware } from '../../middleware/auth';\nimport type { EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\n\n// Shared router type\nexport type AnnotationsRouterType = Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>;\n\n// Create a router with auth middleware pre-applied\nexport function createAnnotationRouter(): AnnotationsRouterType {\n const router = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\n router.use('/api/annotations/*', authMiddleware);\n router.use('/annotations/*', authMiddleware); // W3C URI endpoints also require auth\n return router;\n}","/**\n * Get Annotation URI Route - W3C Content Negotiation\n *\n * Handles globally resolvable annotation URIs with content negotiation:\n * - Accept: application/ld+json -> returns JSON-LD representation\n * - Accept: text/html (or browser) -> redirects to frontend viewer\n *\n * This implements W3C Web Annotation Data Model requirement that\n * annotation URIs be globally resolvable.\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { AnnotationsRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getBodySource } from '@semiont/api-client';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { uriToResourceId } from '@semiont/core';\nimport { prefersHtml, getFrontendUrl } from '../../../middleware/content-negotiation';\nimport { resourceId as makeResourceId } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\ntype GetAnnotationResponse = components['schemas']['GetAnnotationResponse'];\n\nexport function registerGetAnnotationUri(router: AnnotationsRouterType) {\n /**\n * GET /annotations/:id\n *\n * W3C-compliant globally resolvable annotation URI\n * Supports content negotiation:\n * - JSON-LD for machines (default)\n * - HTML redirect to frontend for browsers\n *\n * Requires resourceId query parameter for O(1) view storage lookup\n */\n router.get('/annotations/:id', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n const resourceUriOrId = query.resourceId;\n\n if (!resourceUriOrId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Extract resource ID from URI if provided as full URI\n let extractedResourceId: string;\n try {\n extractedResourceId = resourceUriOrId.includes('://')\n ? uriToResourceId(resourceUriOrId)\n : resourceUriOrId;\n } catch (error) {\n throw new HTTPException(400, { message: 'Invalid resourceId parameter' });\n }\n\n // Check if client prefers HTML (browser)\n if (prefersHtml(c)) {\n const frontendUrl = getFrontendUrl();\n const normalizedBase = frontendUrl.endsWith('/') ? frontendUrl.slice(0, -1) : frontendUrl;\n const redirectUrl = `${normalizedBase}/annotations/${id}?resourceId=${extractedResourceId}`;\n return c.redirect(redirectUrl, 302);\n }\n\n // Otherwise, return JSON-LD representation\n // O(1) lookup in view storage using resource ID\n const projection = await AnnotationContext.getResourceAnnotations(makeResourceId(extractedResourceId), config);\n\n // Find the annotation\n const annotation = projection.annotations.find((a: Annotation) => a.id === id);\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found in resource' });\n }\n\n // Get resource metadata\n const resource = await ResourceContext.getResourceMetadata(makeResourceId(extractedResourceId), config);\n\n // If it's a linking annotation with a resolved source, get resolved resource\n let resolvedResource = null;\n const bodySource = getBodySource(annotation.body);\n if (annotation.motivation === 'linking' && bodySource) {\n // Extract ID from body source URI if needed\n const bodyDocId = bodySource.includes('://') ? uriToResourceId(bodySource) : bodySource;\n resolvedResource = await ResourceContext.getResourceMetadata(makeResourceId(bodyDocId), config);\n }\n\n const response: GetAnnotationResponse = {\n annotation,\n resource,\n resolvedResource,\n };\n\n // Set Content-Type to JSON-LD\n c.header('Content-Type', 'application/ld+json; charset=utf-8');\n\n return c.json(response);\n });\n}\n","/**\n * Annotation Operations Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { createAnnotationRouter, type AnnotationsRouterType } from './shared';\nimport { annotationId, resourceId as makeResourceId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\n\n// Create router with auth middleware\nexport const operationsRouter: AnnotationsRouterType = createAnnotationRouter();\n\n/**\n * GET /api/annotations/:id/context\n *\n * Get the context around an annotation\n * Requires authentication\n *\n * Query parameters:\n * - contextBefore: Characters before selection (0-5000, default: 100)\n * - contextAfter: Characters after selection (0-5000, default: 100)\n */\noperationsRouter.get('/api/annotations/:id/context', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Require resourceId query parameter\n const resourceId = query.resourceId;\n if (!resourceId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Parse and validate query parameters\n const contextBefore = query.contextBefore ? Number(query.contextBefore) : 100;\n const contextAfter = query.contextAfter ? Number(query.contextAfter) : 100;\n\n // Validate ranges\n if (contextBefore < 0 || contextBefore > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextBefore\" must be between 0 and 5000' });\n }\n if (contextAfter < 0 || contextAfter > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextAfter\" must be between 0 and 5000' });\n }\n\n // Delegate to service for annotation context extraction\n try {\n const response = await AnnotationContext.getAnnotationContext(\n annotationId(id),\n makeResourceId(resourceId),\n contextBefore,\n contextAfter,\n config\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n if (error instanceof Error && error.message === 'Resource content not found') {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n if (error instanceof Error && error.message === 'TextPositionSelector required for context') {\n throw new HTTPException(400, { message: 'TextPositionSelector required for context' });\n }\n throw error;\n }\n});\n\n/**\n * GET /api/annotations/:id/summary\n *\n * Get an AI-generated summary of the annotation in context\n * Requires authentication\n */\noperationsRouter.get('/api/annotations/:id/summary', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Require resourceId query parameter\n const resourceId = query.resourceId;\n if (!resourceId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Delegate to service for annotation summary generation\n try {\n const response = await AnnotationContext.generateAnnotationSummary(\n annotationId(id),\n makeResourceId(resourceId),\n config\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n if (error instanceof Error && error.message === 'Resource content not found') {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n throw error;\n }\n});\n","/**\n * Annotations Router\n *\n * This router now ONLY handles the W3C content negotiation endpoint for flat annotation URIs.\n * All CRUD operations have been moved to nested paths under /resources/{resourceId}/annotations/...\n *\n * Endpoints:\n * - GET /annotations/{id} - W3C content negotiation for annotation URIs\n */\n\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { createAnnotationRouter } from './shared';\nimport { registerGetAnnotationUri } from './routes/get-uri';\nimport { operationsRouter } from './operations';\n\n// Create main annotations router\nexport const annotationsRouter = new Hono<{ Variables: { user: User } }>();\n\n// Register W3C content negotiation endpoint for annotation URIs\nconst uriRouter = createAnnotationRouter();\nregisterGetAnnotationUri(uriRouter);\nannotationsRouter.route('/', uriRouter);\n\n// Register annotation operations (yield-resource-stream, etc.)\nannotationsRouter.route('/', operationsRouter);","/**\n * Entity Types Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport type { User } from '@prisma/client';\nimport { authMiddleware } from '../middleware/auth';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { userId, type EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\nimport { readEntityTypesProjection } from '@semiont/make-meaning';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'entity-types' });\n\ntype AddEntityTypeRequest = components['schemas']['AddEntityTypeRequest'];\ntype AddEntityTypeResponse = components['schemas']['AddEntityTypeResponse'];\ntype BulkAddEntityTypesRequest = components['schemas']['BulkAddEntityTypesRequest'];\ntype GetEntityTypesResponse = components['schemas']['GetEntityTypesResponse'];\n\n// Create router with auth middleware\nexport const entityTypesRouter = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\nentityTypesRouter.use('/api/entity-types/*', authMiddleware);\n\n/**\n * GET /api/entity-types\n * Get list of available entity types from view storage projection\n */\nentityTypesRouter.get('/api/entity-types', async (c) => {\n try {\n const config = c.get('config');\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: GetEntityTypesResponse = { entityTypes };\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('Error fetching entity types', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to fetch entity types', details: error instanceof Error ? error.message : String(error) }, 500);\n }\n});\n\n/**\n * POST /api/entity-types\n * Add a new entity type to the collection (append-only, requires moderator/admin)\n * Emits entitytype.added event → Event Store → view storage projection → Graph Database (graph)\n */\nentityTypesRouter.post('/api/entity-types',\n validateRequestBody('AddEntityTypeRequest'),\n async (c) => {\n // Check moderation permissions\n const user = c.get('user');\n const config = c.get('config');\n if (!user.isModerator && !user.isAdmin) {\n return c.json({ error: 'Forbidden: Moderator or Admin access required' }, 403);\n }\n\n const body = c.get('validatedBody') as AddEntityTypeRequest;\n\n // Emit event (no resourceId for system-level events)\n const { eventStore } = c.get('makeMeaning');\n await eventStore.appendEvent({\n type: 'entitytype.added',\n // resourceId: undefined - system-level event\n userId: userId(user.id),\n version: 1,\n payload: {\n entityType: body.tag,\n },\n });\n\n // Read from view storage\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: AddEntityTypeResponse = { success: true, entityTypes };\n return c.json(response, 200);\n }\n);\n\n/**\n * POST /api/entity-types/bulk\n * Add multiple entity types to the collection (append-only, requires moderator/admin)\n * Emits one entitytype.added event per tag → Event Store → view storage projection → Graph Database (graph)\n */\nentityTypesRouter.post('/api/entity-types/bulk',\n validateRequestBody('BulkAddEntityTypesRequest'),\n async (c) => {\n // Check moderation permissions\n const user = c.get('user');\n const config = c.get('config');\n if (!user.isModerator && !user.isAdmin) {\n return c.json({ error: 'Forbidden: Moderator or Admin access required' }, 403);\n }\n\n const body = c.get('validatedBody') as BulkAddEntityTypesRequest;\n const { eventStore } = c.get('makeMeaning');\n\n // Emit one event per entity type (no resourceId)\n for (const tag of body.tags) {\n await eventStore.appendEvent({\n type: 'entitytype.added',\n // resourceId: undefined - system-level event\n userId: userId(user.id),\n version: 1,\n payload: {\n entityType: tag,\n },\n });\n }\n\n // Read from view storage\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: AddEntityTypeResponse = { success: true, entityTypes };\n return c.json(response, 200);\n }\n);\n","/**\n * Jobs Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport type { User } from '@prisma/client';\nimport type { Context, Next } from 'hono';\nimport type { JobQueue } from '@semiont/jobs';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\n\n// Type for auth middleware - backend will provide this\ntype AuthMiddleware = (c: Context, next: Next) => Promise<Response | void>;\n\ntype JobStatusResponse = components['schemas']['JobStatusResponse'];\n\nexport function createJobsRouter(jobQueue: JobQueue, authMiddleware: AuthMiddleware) {\n // Create jobs router\n const jobsRouter = new Hono<{ Variables: { user: User } }>();\n\n // Apply auth middleware to all jobs routes\n jobsRouter.use('/api/jobs/*', authMiddleware);\n\n /**\n * GET /api/jobs/:id\n *\n * Get job status and progress\n * Requires authentication\n */\n jobsRouter.get('/api/jobs/:id', async (c) => {\n const { id } = c.req.param();\n const user = c.get('user');\n\n const job = await jobQueue.getJob(jobId(id));\n\n if (!job) {\n throw new HTTPException(404, { message: 'Job not found' });\n }\n\n // Verify user owns this job\n if (job.metadata.userId !== user.id) {\n throw new HTTPException(404, { message: 'Job not found' });\n }\n\n // Use discriminated union to safely access state-specific fields\n const response: JobStatusResponse = {\n jobId: job.metadata.id,\n type: job.metadata.type,\n status: job.status,\n userId: job.metadata.userId,\n created: job.metadata.created,\n startedAt: job.status === 'running' || job.status === 'complete' ? job.startedAt : undefined,\n completedAt: job.status === 'complete' || job.status === 'failed' || job.status === 'cancelled' ? job.completedAt : undefined,\n error: job.status === 'failed' ? job.error : undefined,\n progress: job.status === 'running' ? job.progress : undefined,\n result: job.status === 'complete' ? job.result : undefined,\n };\n\n return c.json(response);\n });\n\n return jobsRouter;\n}\n","/**\n * Security Headers Middleware\n *\n * Adds security headers to all responses to protect against common attacks:\n * - X-Frame-Options: Prevents clickjacking\n * - X-Content-Type-Options: Prevents MIME sniffing\n * - Strict-Transport-Security: Enforces HTTPS\n * - Content-Security-Policy: Prevents XSS\n * - X-XSS-Protection: Browser XSS filter\n * - Referrer-Policy: Controls referrer information\n * - Permissions-Policy: Controls browser features\n */\n\nimport { MiddlewareHandler } from 'hono';\n\nexport const securityHeaders = (): MiddlewareHandler => {\n return async (c, next) => {\n await next();\n\n // X-Frame-Options: Prevent clickjacking by disallowing the page to be framed\n c.res.headers.set('X-Frame-Options', 'DENY');\n\n // X-Content-Type-Options: Prevent MIME sniffing\n c.res.headers.set('X-Content-Type-Options', 'nosniff');\n\n // Strict-Transport-Security: Enforce HTTPS for 1 year, including subdomains\n // Only set in production to avoid issues in local development\n if (process.env.NODE_ENV === 'production') {\n c.res.headers.set(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains'\n );\n }\n\n // Content-Security-Policy: Restrict resource loading to prevent XSS\n // This is a strict policy for an API - adjust if serving HTML\n const csp = [\n \"default-src 'none'\", // Block everything by default\n \"frame-ancestors 'none'\", // Don't allow framing (backup to X-Frame-Options)\n \"base-uri 'none'\", // Prevent base tag injection\n \"form-action 'none'\", // No form submissions from this origin\n ].join('; ');\n c.res.headers.set('Content-Security-Policy', csp);\n\n // X-XSS-Protection: Enable browser's XSS filter (legacy, but doesn't hurt)\n c.res.headers.set('X-XSS-Protection', '1; mode=block');\n\n // Referrer-Policy: Don't send referrer information\n c.res.headers.set('Referrer-Policy', 'no-referrer');\n\n // Permissions-Policy: Disable all browser features\n // This is an API, we don't need camera, geolocation, etc.\n const permissions = [\n 'camera=()',\n 'geolocation=()',\n 'microphone=()',\n 'payment=()',\n 'usb=()',\n 'interest-cohort=()', // Disable FLoC tracking\n ].join(', ');\n c.res.headers.set('Permissions-Policy', permissions);\n };\n};\n","/**\n * Request ID Middleware\n *\n * Generates a unique ID for each request and attaches it to the context.\n * Also creates a request-scoped logger with the request ID for correlation.\n */\n\nimport { Context, Next } from 'hono';\nimport { randomUUID } from 'crypto';\nimport { createChildLogger } from '../logger';\nimport type winston from 'winston';\n\n/**\n * Extended Hono Variables to include requestId and logger\n */\ndeclare module 'hono' {\n interface ContextVariableMap {\n requestId: string;\n logger: winston.Logger;\n }\n}\n\n/**\n * Request ID middleware\n *\n * Generates a unique request ID and creates a request-scoped logger.\n * The request ID is included in all logs from this request.\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n *\n * // Later in a route handler:\n * const logger = c.get('logger');\n * logger.info('Processing request'); // Includes requestId automatically\n * ```\n */\nexport const requestIdMiddleware = async (c: Context, next: Next) => {\n // Generate unique request ID\n const requestId = randomUUID();\n\n // Create request-scoped logger with request ID\n const logger = createChildLogger({ requestId });\n\n // Attach to context\n c.set('requestId', requestId);\n c.set('logger', logger);\n\n // Add request ID to response headers for debugging\n c.header('X-Request-ID', requestId);\n\n await next();\n};\n","/**\n * Request Logger Middleware\n *\n * Logs incoming requests and outgoing responses with timing information.\n * Helps debug request flow and identify slow endpoints.\n */\n\nimport { Context, Next } from 'hono';\n\n/**\n * Request logger middleware\n *\n * Logs:\n * - Incoming requests (method, path, query params, user agent)\n * - Outgoing responses (status code, timing)\n *\n * Uses the request-scoped logger from context (set by requestIdMiddleware).\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n * app.use('*', requestLoggerMiddleware);\n * ```\n */\nexport const requestLoggerMiddleware = async (c: Context, next: Next) => {\n const logger = c.get('logger');\n const startTime = Date.now();\n\n const method = c.req.method;\n const path = c.req.path;\n const query = c.req.query();\n const userAgent = c.req.header('User-Agent') || 'unknown';\n\n // Log incoming request\n logger.http('Incoming request', {\n type: 'request_incoming',\n method,\n path,\n query: Object.keys(query).length > 0 ? query : undefined,\n userAgent\n });\n\n // Process request\n await next();\n\n // Log outgoing response\n const duration = Date.now() - startTime;\n const status = c.res.status;\n\n logger.http('Outgoing response', {\n type: 'request_outgoing',\n method,\n path,\n status,\n duration,\n durationMs: duration\n });\n};\n","/**\n * Error Logger Middleware\n *\n * Catches unhandled errors and logs them with full stack traces.\n * Should be one of the last middleware in the chain.\n */\n\nimport { Context, Next } from 'hono';\n\n/**\n * Error logger middleware\n *\n * Catches any errors thrown during request processing and logs them.\n * Ensures errors are logged with full context before returning error responses.\n *\n * IMPORTANT: This should be added BEFORE route handlers but AFTER\n * requestIdMiddleware so errors have the request ID for correlation.\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n * app.use('*', errorLoggerMiddleware);\n * app.use('*', requestLoggerMiddleware);\n * // ... route handlers\n * ```\n */\nexport const errorLoggerMiddleware = async (c: Context, next: Next) => {\n try {\n await next();\n } catch (error) {\n const logger = c.get('logger');\n\n // Log the error with full context\n logger.error('Unhandled error during request processing', {\n type: 'unhandled_error',\n method: c.req.method,\n path: c.req.path,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined\n });\n\n // Re-throw to let Hono's error handler deal with it\n throw error;\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/logger.ts","../src/types/jwt-types.ts","../src/auth/jwt.ts","../src/utils/config.ts","../src/index.ts","../src/db.ts","../src/routes/health.ts","../../../specs/openapi.json","../src/utils/openapi-validator.ts","../src/middleware/validate-openapi.ts","../src/auth/oauth.ts","../src/middleware/auth.ts","../src/routes/auth.ts","../src/utils/log-sanitizer.ts","../src/routes/status.ts","../src/routes/admin.ts","../src/routes/resources/shared.ts","../src/routes/resources/routes/create.ts","../src/middleware/content-negotiation.ts","../../../packages/api-client/src/sse/index.ts","../../../packages/api-client/src/utils/annotations.ts","../../../packages/api-client/src/utils/locales.ts","../../../packages/api-client/src/utils/resources.ts","../../../packages/ontology/src/tag-schemas.ts","../../../packages/ontology/src/entity-extraction.ts","../src/routes/resources/routes/get-uri.ts","../src/routes/resources/routes/list.ts","../src/routes/resources/routes/update.ts","../../../node_modules/nanoid/url-alphabet/index.js","../../../node_modules/nanoid/index.js","../src/lib/sse-helpers.ts","../src/routes/resources/routes/annotate-references-stream.ts","../src/routes/resources/routes/annotate-highlights-stream.ts","../src/routes/resources/routes/annotate-assessments-stream.ts","../src/routes/resources/routes/annotate-comments-stream.ts","../src/routes/resources/routes/annotate-tags-stream.ts","../src/routes/resources/routes/llm-context.ts","../src/routes/resources/routes/annotation-llm-context.ts","../src/routes/resources/routes/referenced-by.ts","../src/routes/resources/routes/token.ts","../src/routes/resources/routes/get-annotations.ts","../src/routes/resources/routes/events.ts","../src/routes/resources/routes/events-stream.ts","../src/routes/resources/routes/create-annotation.ts","../src/routes/resources/routes/get-annotation.ts","../src/routes/resources/routes/delete-annotation.ts","../src/routes/resources/routes/update-annotation-body.ts","../src/routes/resources/routes/yield-resource-stream.ts","../src/routes/annotations/routes/history.ts","../src/routes/resources/index.ts","../src/routes/annotations/shared.ts","../src/routes/annotations/routes/get-uri.ts","../src/routes/annotations/operations.ts","../src/routes/annotations/index.ts","../src/routes/entity-types.ts","../src/routes/jobs/index.ts","../src/middleware/security-headers.ts","../src/middleware/request-id.ts","../src/middleware/request-logger.ts","../src/middleware/error-logger.ts"],"names":["getLoggerConfig","logLevel","level","process","env","LOG_LEVEL","format","LOG_FORMAT","nodeEnv","NODE_ENV","transports","createFormat","config","winston","combine","timestamp","errors","stack","json","printf","message","meta","metaStr","Object","keys","length","JSON","stringify","toUpperCase","createTransports","includes","push","Console","File","filename","initializeLogger","loggerInstance","createLogger","exitOnError","info","getLogger","Error","createChildLogger","context","child","createComponentLogger","component","JWTPayloadSchema","z","object","userId","string","regex","email","name","optional","domain","provider","isAdmin","boolean","iat","number","exp","JWTService","siteConfig","initialize","site","oauthAllowedDomains","Array","isArray","getSiteConfig","setTestConfig","resetConfig","getSecret","secret","JWT_SECRET","generateToken","payload","expiresIn","tokenPayload","jwt","sign","issuer","verifyToken","token","decoded","verify","result","safeParse","success","error","data","makeUserId","makeEmail","JsonWebTokenError","TokenExpiredError","NotBeforeError","isAllowedDomain","parts","split","allowedDomains","nodeFileReader","readIfExists","filePath","absolutePath","resolve","existsSync","readFileSync","readRequired","loadEnvironmentConfig","createConfigLoader","globalForPrisma","global","DatabaseConnection","instance","isInitializing","getClient","prisma","logLevels","getLogLevel","logConfig","map","emit","PrismaClient","log","$on","e","getDBLogger","debug","query","params","duration","target","warn","setClient","client","reset","$disconnect","undefined","disconnect","require","checkHealth","$queryRaw","String","getRouteLogger","healthRouter","Hono","get","c","startupFailed","fs","startupStatus","trim","startsWith","response","status","version","Date","toISOString","database","environment","dbStatus","getValidatorLogger","ajv","Ajv","allErrors","coerceTypes","removeAdditional","keywords","addFormats","convertNullable","obj","record","nullable","type","v","values","schemasLoaded","loadSchemas","schema","entries","openapiSpec","components","schemas","converted","structuredClone","addSchema","schemaName","count","validateSchema","validate","getSchema","availableSchemas","valid","errorMessage","formatValidationErrors","messages","err","path","instancePath","keyword","missingProperty","allowedValues","join","getMiddlewareLogger","validateRequestBody","next","body","req","HTTPException","cause","set","OAuthService","verifyGoogleToken","accessToken","fetch","ok","rawUserInfo","verified_email","userInfo","createOrUpdateUser","googleUser","existingUser","user","findFirst","where","OR","providerId","id","isNewUser","update","image","picture","lastLogin","create","passwordHash","jwtPayload","makeAccessToken","getUserFromToken","findUnique","isActive","acceptTerms","termsAcceptedAt","authMiddleware","logger","authHeader","header","reason","method","tokenStr","substring","SENSITIVE_FIELDS","PARTIAL_MASK_FIELDS","sanitizeForLogging","options","maskValue","partialMask","additionalSensitiveFields","allSensitiveFields","f","toLowerCase","sanitize","sanitized","key","value","lowerKey","some","field","partialMaskValue","firstChars","lastChars","maskLength","Math","max","mask","repeat","createSafeLogContext","authRouter","post","password","hasPasswordHash","isValid","access_token","googleCredential","refreshToken","accessTokenPayload","created","createdAt","refresh_token","statusRouter","use","features","semanticContent","collaboration","rbac","authenticatedAs","adminMiddleware","adminRouter","users","findMany","orderBy","select","updatedAt","u","totalUsers","activeUsers","adminUsers","domainStats","recentUsers","Promise","all","groupBy","by","_count","gte","now","stats","regularUsers","domainBreakdown","d","recentSignups","patch","param","updatedUser","delete","currentUser","allowedDomainsEnv","OAUTH_ALLOWED_DOMAINS","filter","providers","GOOGLE_CLIENT_ID","GOOGLE_CLIENT_SECRET","isConfigured","clientId","createResourceRouter","router","registerCreateResource","formData","file","formatRaw","language","entityTypesStr","creationMethod","entityTypes","parse","arrayBuffer","contentBuffer","Buffer","from","eventStore","repStore","ResourceOperations","createResource","content","resource","prefersHtml","acceptHeader","userAgent","acceptsHtml","acceptsJson","htmlIndex","indexOf","jsonIndex","min","Infinity","isBrowser","test","getFrontendUrl","frontendUrl","FRONTEND_URL","registerGetResourceUri","view","normalizedBase","endsWith","slice","redirectUrl","redirect","ResourceContext","getResourceMetadata","resourceId","primaryRep","getPrimaryRepresentation","checksum","mediaType","retrieve","getPrimaryMediaType","newResponse","Uint8Array","text","decodeRepresentation","EventQuery","storage","events","getResourceEvents","stored","views","materializer","materialize","annotations","entityReferences","a","motivation","getEntityTypes","registerListResources","offset","Number","limit","entityType","archived","q","filteredDocs","listResources","search","doc","getResourceEntityTypes","paginatedDocs","formattedDocs","addContentPreviews","resources","total","registerUpdateResource","updateResource","currentArchived","updatedArchived","currentEntityTypes","updatedEntityTypes","AnnotationContext","getAllAnnotations","urlAlphabet","POOL_SIZE_MULTIPLIER","pool","poolOffset","fillPool","bytes","allocUnsafe","crypto","randomFillSync","nanoid","size","i","writeTypedSSE","stream","writeSSE","event","registerAnnotateReferencesStream","jobQueue","includeDescriptiveReferences","eventBus","job","metadata","jobId","retryCount","maxRetries","et","createJob","streamSSE","isStreamClosed","subscriptions","keepAliveInterval","closeStreamCallback","streamPromise","cleanup","clearInterval","forEach","sub","unsubscribe","resourceBus","scope","scopeKey","subscribe","progress","currentEntityType","totalEntityTypes","processedEntityTypes","completedEntityTypes","foundCount","reduce","sum","percentage","jobType","totalFound","setInterval","raw","signal","addEventListener","sseError","registerAnnotateHighlightsStream","instructions","density","_event","stage","highlightsFound","createdCount","highlightsCreated","registerAnnotateAssessmentsStream","tone","expected","actual","assessmentsFound","assessmentsCreated","registerAnnotateCommentsStream","commentsFound","commentsCreated","registerAnnotateTagsStream","schemaId","categories","getTagSchema","category","tags","t","totalCategories","currentCategory","processedCategories","tagsFound","tagsCreated","byCategory","registerGetResourceLLMContext","makeMeaning","depth","maxResources","includeContent","includeSummary","LLMContext","getResourceContext","inferenceClient","registerGetAnnotationLLMContext","resourceIdParam","annotationId","annotationIdParam","includeSourceContext","includeTargetContext","contextWindow","fullAnnotationUri","services","backend","publicURL","route","buildLLMContext","annotationUri","registerGetReferencedBy","graphDb","resourceUri","resourceIdToURI","makeResourceId","references","getResourceReferencedBy","docIds","Set","ref","getTargetSource","docId","getResource","makeResourceUri","notFound","r","docMap","Map","referencedBy","targetSource","targetSelector","getTargetSelector","found","resourceName","source","selector","exact","getExactText","cloneTokens","registerTokenRoutes","makeCloneToken","tokenData","expiresAt","sourceDoc","sourceResource","validFormats","CREATION_METHODS","CLONE","archiveOriginal","random","toString","registerGetResourceAnnotations","eventTypes","isValidEventType","registerGetEvents","queryParams","eventQuery","validatedType","filters","storedEvents","queryEvents","emptyResponse","sequenceNumber","prevEventHash","registerGetEventStream","rUri","eventCount","SSE_STREAM_CONNECTED","subscription","streamId","bus","storedEvent","eventType","eventData","jsonData","startStringify","stringifyTime","time","stringifyError","startWrite","writeTime","registerCreateAnnotation","request","newAnnotationId","backendUrl","generateAnnotationId","posSelector","getTextPositionSelector","svgSelector","getSvgSelector","fragmentSelector","getFragmentSelector","svgError","validateSvgMarkup","annotation","modified","eventPayload","appendEvent","creator","userToAgent","registerGetAnnotation","getAnnotation","resolvedResource","bodySource","getBodySource","resolvedId","pop","registerDeleteAnnotation","projection","getResourceAnnotations","find","registerUpdateAnnotationBody","put","operations","bodyArray","op","exists","item","index","findIndex","splice","oldItem","newItem","registerYieldResourceStream","linkingAnnotations","ids","expectedAnnotationUri","reference","expectedUri","availableIds","referenceId","makeAnnotationId","sourceResourceId","title","prompt","temperature","maxTokens","resultResourceId","registerGetAnnotationHistory","allEvents","annotationEvents","highlightId","sort","b","createResourcesRouter","resourcesRouter","createAnnotationRouter","registerGetAnnotationUri","resourceUriOrId","extractedResourceId","uriToResourceId","bodyDocId","operationsRouter","contextBefore","contextAfter","getAnnotationContext","generateAnnotationSummary","annotationsRouter","uriRouter","entityTypesRouter","readEntityTypesProjection","details","isModerator","tag","createJobsRouter","jobsRouter","getJob","startedAt","completedAt","securityHeaders","res","headers","csp","permissions","requestIdMiddleware","requestId","randomUUID","requestLoggerMiddleware","startTime","http","durationMs","errorLoggerMiddleware","databaseUrlConstructed","DATABASE_URL","DB_HOST","DB_USER","DB_PASSWORD","dbPort","DB_PORT","dbName","DB_NAME","url","URL","username","hostname","port","pathname","searchParams","SEMIONT_ENV","projectRoot","SEMIONT_ROOT","corsOrigin","backendService","host","ssl","EventBus","startMakeMeaning","__filename","fileURLToPath","__dirname","dirname","app","cors","origin","credentials","openApiPath","openApiContent","openApiSpec","apiUrl","servers","description","swaggerHandler","swaggerUI","persistAuthorization","serve"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core Logger Module\n *\n * Winston-based logging with configurable log levels and structured metadata.\n * Supports environment-based configuration for development and production.\n */\n\nimport winston from 'winston';\n\n/**\n * Log levels supported by the logger\n */\nexport type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'debug';\n\n/**\n * Logger configuration options\n */\nexport interface LoggerConfig {\n level: LogLevel;\n format: 'json' | 'simple';\n transports: ('console' | 'file')[];\n}\n\n/**\n * Get logger configuration from environment config or environment variables\n *\n * Priority:\n * 1. Provided logLevel parameter (from environment config)\n * 2. LOG_LEVEL environment variable\n * 3. Default: 'info'\n *\n * Environment variables:\n * - LOG_LEVEL: error | warn | info | http | debug (fallback if no config provided)\n * - LOG_FORMAT: json | simple (default: json)\n * - NODE_ENV: development | production | test\n */\nexport function getLoggerConfig(logLevel?: LogLevel): LoggerConfig {\n const level = logLevel || (process.env.LOG_LEVEL as LogLevel) || 'info';\n const format = (process.env.LOG_FORMAT || 'json') as 'json' | 'simple';\n const nodeEnv = process.env.NODE_ENV || 'development';\n\n // In test mode, only use console transport with minimal logging\n if (nodeEnv === 'test') {\n return {\n level: 'error', // Only log errors in tests\n format: 'simple',\n transports: ['console']\n };\n }\n\n return {\n level,\n format,\n transports: ['file']\n };\n}\n\n/**\n * Create Winston format based on configuration\n */\nfunction createFormat(config: LoggerConfig): winston.Logform.Format {\n if (config.format === 'json') {\n return winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.json()\n );\n }\n\n // Simple format for development\n return winston.format.combine(\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n winston.format.errors({ stack: true }),\n winston.format.printf(({ level, message, timestamp, ...meta }) => {\n const metaStr = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} [${level.toUpperCase()}] ${message}${metaStr}`;\n })\n );\n}\n\n/**\n * Create Winston transports based on configuration\n */\nfunction createTransports(config: LoggerConfig): winston.transport[] {\n const transports: winston.transport[] = [];\n\n if (config.transports.includes('console')) {\n transports.push(\n new winston.transports.Console({\n level: config.level\n })\n );\n }\n\n if (config.transports.includes('file')) {\n // Separate files for different log levels\n transports.push(\n new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error'\n }),\n new winston.transports.File({\n filename: 'logs/combined.log',\n level: config.level\n })\n );\n }\n\n return transports;\n}\n\n/**\n * Global Winston logger instance\n */\nlet loggerInstance: winston.Logger | null = null;\n\n/**\n * Initialize the global logger\n * Call this once at application startup\n *\n * @param logLevel - Optional log level from environment config\n */\nexport function initializeLogger(logLevel?: LogLevel): winston.Logger {\n const config = getLoggerConfig(logLevel);\n\n loggerInstance = winston.createLogger({\n level: config.level,\n format: createFormat(config),\n transports: createTransports(config),\n // Don't exit on handled exceptions\n exitOnError: false\n });\n\n loggerInstance.info('Logger initialized', {\n level: config.level,\n format: config.format,\n transports: config.transports\n });\n\n return loggerInstance;\n}\n\n/**\n * Get the global logger instance\n * Throws if logger hasn't been initialized\n */\nexport function getLogger(): winston.Logger {\n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call initializeLogger() first.');\n }\n return loggerInstance;\n}\n\n/**\n * Create a child logger with additional context\n *\n * @param context - Additional context fields to include in all log messages\n * @returns Child logger with context\n *\n * @example\n * ```typescript\n * const logger = createChildLogger({ userId: '123', requestId: 'abc' });\n * logger.info('User logged in'); // Will include userId and requestId\n * ```\n */\nexport function createChildLogger(context: Record<string, any>): winston.Logger {\n return getLogger().child(context);\n}\n\n/**\n * Create a logger for a specific component/service\n *\n * @param component - Component name (e.g., 'auth', 'storage', 'api')\n * @returns Child logger with component context\n *\n * @example\n * ```typescript\n * const logger = createComponentLogger('storage');\n * logger.info('File saved successfully', { path: '/tmp/file.txt' });\n * // Output: { component: 'storage', message: 'File saved successfully', path: '/tmp/file.txt' }\n * ```\n */\nexport function createComponentLogger(component: string): winston.Logger {\n return createChildLogger({ component });\n}\n","import { z } from 'zod';\nimport type { GoogleAuthRequest, UserId } from '@semiont/core';\nimport type { Email } from '@semiont/core';\n\n// JWT Payload schema - backend-specific internal type for JWT validation\nexport const JWTPayloadSchema = z.object({\n userId: z.string().regex(/^c[a-z0-9]{24,}$/), // CUID format\n email: z.string().email(),\n name: z.string().optional(),\n domain: z.string(),\n provider: z.string(),\n isAdmin: z.boolean(),\n iat: z.number().optional(),\n exp: z.number().optional(),\n});\n\n// Base Zod-inferred type\ntype JWTPayloadBase = z.infer<typeof JWTPayloadSchema>;\n\n// Branded version for type safety\nexport type JWTPayload = Omit<JWTPayloadBase, 'userId' | 'email'> & {\n userId: UserId;\n email: Email;\n};\n\n// Re-export GoogleAuthRequest type from SDK\nexport type { GoogleAuthRequest };","import jwt from 'jsonwebtoken';\nimport { JWTPayloadSchema } from '../types/jwt-types';\nimport type { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { EnvironmentConfig, UserId, Email } from '@semiont/core';\nimport { userId as makeUserId, email as makeEmail } from '@semiont/core';\n\nexport interface JWTPayload {\n userId: UserId;\n email: Email;\n name?: string;\n domain: string;\n provider: string;\n type?: 'access' | 'refresh';\n iat?: number;\n exp?: number;\n}\n\ninterface SiteConfig {\n domain?: string;\n oauthAllowedDomains?: string[];\n}\n\nexport class JWTService {\n private static siteConfig: SiteConfig | null = null;\n\n /**\n * Initialize JWTService with application configuration\n * Must be called once at application startup before using any other methods\n */\n static initialize(config: EnvironmentConfig): void {\n if (!config.site?.domain) {\n throw new Error('site.domain is required in environment config');\n }\n\n if (!config.site?.oauthAllowedDomains || !Array.isArray(config.site.oauthAllowedDomains)) {\n throw new Error('site.oauthAllowedDomains is required in environment config');\n }\n\n this.siteConfig = {\n domain: config.site.domain,\n oauthAllowedDomains: config.site.oauthAllowedDomains\n };\n }\n\n /**\n * Get site configuration (must call initialize() first)\n */\n private static getSiteConfig(): SiteConfig {\n if (!this.siteConfig) {\n throw new Error('JWTService not initialized. Call JWTService.initialize(config) at application startup.');\n }\n return this.siteConfig;\n }\n\n /**\n * Override configuration for testing purposes\n * @param config The configuration to use\n */\n static setTestConfig(domain: string, oauthAllowedDomains: string[]): void {\n this.siteConfig = { domain, oauthAllowedDomains };\n }\n\n /**\n * Reset configuration cache (useful for testing)\n */\n static resetConfig(): void {\n this.siteConfig = null;\n }\n \n private static getSecret(): string {\n // JWT secret comes from AWS Secrets Manager (injected as env var by ECS) or test setup\n const secret = process.env.JWT_SECRET;\n if (!secret) {\n throw new Error('JWT_SECRET environment variable not found. This should be injected by AWS Secrets Manager in production or set in test setup.');\n }\n if (secret.length < 32) {\n throw new Error('JWT_SECRET must be at least 32 characters long');\n }\n return secret;\n }\n\n static generateToken(\n payload: Omit<ValidatedJWTPayload, 'iat' | 'exp'>, \n expiresIn: string = '7d'\n ): string {\n const config = this.getSiteConfig();\n // Convert payload to plain object for jwt.sign\n const tokenPayload: Record<string, any> = { ...payload };\n return jwt.sign(tokenPayload, this.getSecret(), {\n expiresIn: expiresIn,\n issuer: config.domain || 'localhost',\n } as jwt.SignOptions);\n }\n\n static verifyToken(token: string): ValidatedJWTPayload {\n try {\n // First, verify JWT signature and basic structure\n const decoded = jwt.verify(token, this.getSecret());\n\n // Then validate the payload structure and content\n const result = JWTPayloadSchema.safeParse(decoded);\n\n if (!result.success) {\n throw new Error(`Invalid token payload: ${result.error.message}`);\n }\n\n // Brand the string types for type safety\n return {\n ...result.data,\n userId: makeUserId(result.data.userId),\n email: makeEmail(result.data.email),\n };\n } catch (error) {\n if (error instanceof jwt.JsonWebTokenError) {\n throw new Error('Invalid token signature');\n }\n if (error instanceof jwt.TokenExpiredError) {\n throw new Error('Token has expired');\n }\n if (error instanceof jwt.NotBeforeError) {\n throw new Error('Token not active yet');\n }\n\n // Re-throw validation errors or other errors\n throw error;\n }\n }\n\n static isAllowedDomain(email: Email): boolean {\n const parts = email.split('@');\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n return false;\n }\n const domain = parts[1];\n const config = this.getSiteConfig();\n const allowedDomains = config.oauthAllowedDomains || [];\n return allowedDomains.includes(domain);\n }\n}","/**\n * Backend Configuration Utilities\n *\n * Node.js-specific config loading using @semiont/core's createConfigLoader\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createConfigLoader, type ConfigFileReader } from '@semiont/core';\n\n/**\n * Node.js file reader implementation for config loading\n */\nconst nodeFileReader: ConfigFileReader = {\n readIfExists: (filePath: string) => {\n const absolutePath = path.resolve(filePath);\n return fs.existsSync(absolutePath)\n ? fs.readFileSync(absolutePath, 'utf-8')\n : null;\n },\n\n readRequired: (filePath: string) => {\n const absolutePath = path.resolve(filePath);\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n return fs.readFileSync(absolutePath, 'utf-8');\n },\n};\n\n/**\n * Load environment configuration from filesystem\n * Uses Node.js fs module for file I/O\n *\n * @param projectRoot - Absolute path to project root\n * @param environment - Environment name (e.g., 'local', 'production')\n * @returns Merged and validated environment configuration\n *\n * @example\n * ```typescript\n * const projectRoot = process.env.SEMIONT_ROOT;\n * if (!projectRoot) throw new Error('SEMIONT_ROOT not set');\n * const config = loadEnvironmentConfig(projectRoot, 'production');\n * ```\n */\nexport const loadEnvironmentConfig = createConfigLoader(nodeFileReader);\n","// Environment variables are loaded via Node's --env-file flag (see package.json)\n// Construct DATABASE_URL from components if not already set\n// MUST be done before any Prisma imports!\nlet databaseUrlConstructed = false;\nif (!process.env.DATABASE_URL && process.env.DB_HOST && process.env.DB_USER && process.env.DB_PASSWORD) {\n const dbPort = process.env.DB_PORT;\n const dbName = process.env.DB_NAME;\n\n if (!dbPort) {\n throw new Error('DB_PORT is required when constructing DATABASE_URL from components');\n }\n if (!dbName) {\n throw new Error('DB_NAME is required when constructing DATABASE_URL from components');\n }\n\n const url = new URL('postgresql://localhost');\n url.username = process.env.DB_USER;\n url.password = process.env.DB_PASSWORD; // Automatically URL-encoded by URL class\n url.hostname = process.env.DB_HOST;\n url.port = dbPort;\n url.pathname = `/${dbName}`;\n url.searchParams.set('sslmode', 'require');\n\n process.env.DATABASE_URL = url.toString();\n databaseUrlConstructed = true;\n}\n\nimport { cors } from 'hono/cors';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { swaggerUI } from '@hono/swagger-ui';\nimport { type EnvironmentConfig, EventBus } from '@semiont/core';\nimport { startMakeMeaning } from '@semiont/make-meaning';\nimport { loadEnvironmentConfig } from './utils/config';\n\nimport { User } from '@prisma/client';\n\n// Load configuration from semiont.json + environments/{SEMIONT_ENV}.json\n// SEMIONT_ROOT and SEMIONT_ENV are read from environment\nconst env = process.env.SEMIONT_ENV || 'local';\nconst projectRoot = process.env.SEMIONT_ROOT;\nif (!projectRoot) {\n throw new Error('SEMIONT_ROOT environment variable is not set');\n}\n\nconst config = loadEnvironmentConfig(projectRoot, env);\n\nif (!config.services?.backend) {\n throw new Error('services.backend is required in environment config');\n}\nif (!config.services.backend.corsOrigin) {\n throw new Error('services.backend.corsOrigin is required in environment config');\n}\n\nconst backendService = config.services.backend;\n\n// Import logging utilities\nimport { initializeLogger, getLogger } from './logger';\n\n// Initialize Winston logger with log level from environment config\ninitializeLogger(config.logLevel);\nconst logger = getLogger();\n\n// Log database configuration after logger is initialized\nif (databaseUrlConstructed) {\n logger.info('DATABASE_URL constructed from environment components', {\n host: process.env.DB_HOST,\n port: process.env.DB_PORT,\n database: process.env.DB_NAME,\n ssl: 'required'\n });\n}\n\n// Create global EventBus for real-time events\nconst eventBus = new EventBus();\n\n// Initialize make-meaning service (job queue, workers, graph consumer)\nconst makeMeaning = await startMakeMeaning(config, eventBus, logger);\n\n// Import route definitions\nimport { healthRouter } from './routes/health';\nimport { authRouter } from './routes/auth';\nimport { statusRouter } from './routes/status';\nimport { adminRouter } from './routes/admin';\nimport { createResourcesRouter } from './routes/resources/index';\nimport { annotationsRouter } from './routes/annotations/index';\nimport { entityTypesRouter } from './routes/entity-types';\nimport { createJobsRouter } from './routes/jobs/index';\nimport { authMiddleware } from './middleware/auth';\n\n// Import for static OpenAPI spec\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\n// ESM equivalent of __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Graph database and inference client are accessed via makeMeaning service\n// Import security headers middleware\nimport { securityHeaders } from './middleware/security-headers';\n// Import logging middleware\nimport { requestIdMiddleware } from './middleware/request-id';\nimport { requestLoggerMiddleware } from './middleware/request-logger';\nimport { errorLoggerMiddleware } from './middleware/error-logger';\n\ntype Variables = {\n user: User;\n config: EnvironmentConfig;\n makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>>;\n};\n\n// Create Hono app with proper typing\nconst app = new Hono<{ Variables: Variables }>();\n\n// Add CORS middleware\napp.use('*', cors({\n origin: backendService.corsOrigin,\n credentials: true,\n}));\n\n// Add security headers middleware (after CORS, before other middleware)\napp.use('*', securityHeaders());\n\n// Add logging middleware (order matters!)\napp.use('*', requestIdMiddleware); // Generate request ID first\napp.use('*', errorLoggerMiddleware); // Catch errors second\napp.use('*', requestLoggerMiddleware); // Log requests third\n\n// Inject config and makeMeaning into context for all routes\napp.use('*', async (c, next) => {\n c.set('config', config);\n c.set('makeMeaning', makeMeaning);\n await next();\n});\n\n// Mount route routers\napp.route('/', healthRouter);\napp.route('/', authRouter);\napp.route('/', statusRouter);\napp.route('/', adminRouter);\nconst resourcesRouter = createResourcesRouter(makeMeaning.jobQueue);\napp.route('/', resourcesRouter);\napp.route('/', annotationsRouter);\napp.route('/', entityTypesRouter);\nconst jobsRouter = createJobsRouter(makeMeaning.jobQueue, authMiddleware);\napp.route('/', jobsRouter);\n\n// API Resourceation root - redirect to appropriate format\napp.get('/api', (c) => {\n const acceptHeader = c.req.header('Accept') || '';\n const userAgent = c.req.header('User-Agent') || '';\n const token = c.req.query('token');\n \n // If request is from a browser, redirect to Swagger UI\n if (acceptHeader.includes('text/html') || userAgent.includes('Mozilla')) {\n // Preserve token in redirect if it was provided\n const redirectUrl = token ? `/api/docs?token=${token}` : '/api/docs';\n return c.redirect(redirectUrl);\n }\n\n // For API clients requesting JSON, redirect to OpenAPI spec\n const redirectUrl = token ? `/api/openapi.json?token=${token}` : '/api/openapi.json';\n return c.redirect(redirectUrl);\n});\n\n// Serve OpenAPI JSON specification - now automatically generated\napp.get('/api/openapi.json', (c) => {\n // Serve the static OpenAPI spec from the specs directory\n const openApiPath = path.join(__dirname, '../../../specs/openapi.json');\n const openApiContent = fs.readFileSync(openApiPath, 'utf-8');\n const openApiSpec = JSON.parse(openApiContent);\n\n // Update server URL dynamically\n const port = backendService.port || 4000;\n const apiUrl = backendService.publicURL || `http://localhost:${port}`;\n if (apiUrl) {\n openApiSpec.servers = [\n {\n url: apiUrl,\n description: 'API Server',\n },\n ];\n }\n\n return c.json(openApiSpec);\n});\n\n// Serve Swagger UI resourceation - now public\napp.get('/api/docs', async (c) => {\n // Token is optional for authenticated access\n const token = c.req.query('token');\n \n try {\n const swaggerHandler = swaggerUI({ \n url: token ? `/api/openapi.json?token=${token}` : '/api/openapi.json',\n persistAuthorization: true,\n title: 'Semiont API Resourceation'\n });\n \n // TypeScript workarounds: swaggerUI has type mismatches\n // - It's typed as MiddlewareHandler expecting (c, next) but runtime only uses (c)\n // - Context type incompatibility requires 'as any' cast\n return await swaggerHandler(c as any, async () => {});\n } catch (error) {\n logger.error('Error in /api/docs handler', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to load resourceation', details: String(error) }, 500);\n }\n});\n\n// Redirect /api/swagger to /api/docs for convenience\napp.get('/api/swagger', (c) => {\n const token = c.req.query('token');\n const redirectUrl = token ? `/api/docs?token=${token}` : '/api/docs';\n return c.redirect(redirectUrl);\n});\n\n// 404 handler for non-existent API routes\napp.all('/api/*', (c) => {\n return c.json({ error: 'Not found' }, 404);\n});\n\n// Start server\nconst port = backendService.port || 4000;\nconst nodeEnv = config.env?.NODE_ENV || 'development';\n\n// Only start server if not in test environment\nif (nodeEnv !== 'test') {\n serve({\n fetch: app.fetch,\n port: port,\n hostname: '0.0.0.0'\n }, async (info) => {\n logger.info('Semiont Backend ready', {\n url: `http://localhost:${info.port}/api`,\n environment: nodeEnv\n });\n\n // Initialize JWT Service with configuration\n try {\n const { JWTService } = await import('./auth/jwt');\n JWTService.initialize(config);\n } catch (error) {\n logger.error('Failed to initialize JWT Service', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n\n // Pre-load entity types from graph database for performance\n try {\n const entityTypes = await makeMeaning.graphDb.getEntityTypes();\n logger.info('Loaded entity types from graph database', {\n count: entityTypes.length\n });\n } catch (error) {\n logger.error('Failed to pre-load entity types', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n });\n}\n\nexport type AppType = typeof app;\n\n// Export app for testing\nexport { app };","import { PrismaClient } from '@prisma/client';\nimport type { Logger } from '@semiont/core';\n\nconst globalForPrisma = global as unknown as { prisma: PrismaClient | undefined };\n\n/**\n * Database connection manager with lazy initialization\n * \n * Usage:\n * const prisma = DatabaseConnection.getClient();\n * const user = await prisma.user.findUnique({ where: { id } });\n */\nexport class DatabaseConnection {\n private static instance: PrismaClient | null = null;\n private static isInitializing = false;\n \n /**\n * Get or create the Prisma client instance\n * Lazy loads the connection on first use\n */\n static getClient(): PrismaClient {\n // Check if we already have an instance (either global or local)\n if (globalForPrisma.prisma) {\n return globalForPrisma.prisma;\n }\n\n if (this.instance) {\n return this.instance;\n }\n\n // Prevent multiple simultaneous initializations\n if (this.isInitializing) {\n throw new Error('Database connection is already being initialized');\n }\n\n this.isInitializing = true;\n try {\n // Determine which events to enable based on environment\n const logLevels = this.getLogLevel();\n\n // Create new PrismaClient instance\n // Use 'emit' type to trigger $on() handlers without stdout logging\n const logConfig = logLevels.map(level => ({ emit: 'event' as const, level }));\n\n this.instance = new PrismaClient({\n log: logConfig, // Enable events but not stdout logging\n });\n\n // Setup custom logging to Winston (logs/combined.log)\n // Logger is retrieved lazily inside each handler to avoid initialization order issues\n this.instance.$on('query' as never, (e: any) => {\n this.getDBLogger()?.debug('Query', {\n query: e.query,\n params: e.params,\n duration: `${e.duration}ms`,\n target: e.target\n });\n });\n\n this.instance.$on('error' as never, (e: any) => {\n this.getDBLogger()?.error('Database error', {\n message: e.message,\n target: e.target\n });\n });\n\n this.instance.$on('warn' as never, (e: any) => {\n this.getDBLogger()?.warn('Database warning', {\n message: e.message,\n target: e.target\n });\n });\n\n this.instance.$on('info' as never, (e: any) => {\n this.getDBLogger()?.info('Database info', {\n message: e.message,\n target: e.target\n });\n });\n\n // In non-production, store in global for hot-reload persistence\n if (process.env.NODE_ENV !== 'production') {\n globalForPrisma.prisma = this.instance;\n }\n\n return this.instance;\n } finally {\n this.isInitializing = false;\n }\n }\n \n /**\n * Get appropriate log level based on environment\n * These events are captured by $on() handlers and routed to Winston\n */\n private static getLogLevel(): Array<'query' | 'error' | 'warn' | 'info'> {\n const env = process.env.NODE_ENV;\n\n if (env === 'development') {\n // Enable query logging in development (goes to logs/combined.log via Winston)\n return ['query', 'error', 'warn', 'info'];\n }\n\n // Default to error-only logging for production and test\n return ['error'];\n }\n \n /**\n * Override the Prisma client instance (useful for testing)\n */\n static setClient(client: PrismaClient): void {\n this.instance = client;\n // Also update global if in non-production\n if (process.env.NODE_ENV !== 'production') {\n globalForPrisma.prisma = client;\n }\n }\n \n /**\n * Reset the connection (useful for testing)\n * This will close the existing connection and clear the instance\n */\n static async reset(): Promise<void> {\n if (this.instance) {\n if (typeof this.instance.$disconnect === 'function') {\n await this.instance.$disconnect();\n }\n this.instance = null;\n }\n \n if (globalForPrisma.prisma) {\n if (typeof globalForPrisma.prisma.$disconnect === 'function') {\n await globalForPrisma.prisma.$disconnect();\n }\n globalForPrisma.prisma = undefined;\n }\n }\n \n /**\n * Disconnect from the database\n * Useful for graceful shutdown\n */\n static async disconnect(): Promise<void> {\n const client = this.instance || globalForPrisma.prisma;\n if (client) {\n await client.$disconnect();\n }\n }\n \n /**\n * Get database logger safely (returns null if logger not initialized)\n * This avoids initialization order issues\n */\n private static getDBLogger(): Logger | null {\n try {\n // Dynamic import to avoid circular dependency\n const { getLogger } = require('./logger');\n return getLogger().child({ component: 'database' });\n } catch (error) {\n // Logger not initialized yet - return null and log events will be skipped\n return null;\n }\n }\n\n /**\n * Check database health by attempting a simple query\n * Returns true if connected, false otherwise\n */\n static async checkHealth(): Promise<boolean> {\n try {\n const client = this.getClient();\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n return true;\n } catch (error) {\n this.getDBLogger()?.error('Database health check failed', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return false;\n }\n }\n}\n\n// For convenience, export a getter function\nexport function getDatabase(): PrismaClient {\n return DatabaseConnection.getClient();\n}\n\n// Export prisma for tests\nexport const prisma = DatabaseConnection.getClient();","/**\n * Health Check Route - Spec-First Version\n *\n * This is a proof of concept demonstrating the new spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No Zod schemas (GET endpoint has no request body)\n * - Types come from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { DatabaseConnection } from '../db';\nimport type { components } from '@semiont/core';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'health' });\n\ntype HealthResponse = components['schemas']['HealthResponse'];\n\n// Create health router with plain Hono\nexport const healthRouter = new Hono();\n\n/**\n * GET /api/health\n *\n * Health check endpoint - no validation needed (no request body)\n * Response type comes from OpenAPI spec via generated types\n */\nhealthRouter.get('/api/health', async (c) => {\n const nodeEnv = process.env.NODE_ENV;\n if (!nodeEnv) {\n throw new Error('NODE_ENV environment variable is required');\n }\n\n // Check if startup script had issues (for internal monitoring)\n let startupFailed = false;\n try {\n const fs = await import('fs');\n if (fs.existsSync('/tmp/startup_status')) {\n const startupStatus = fs.readFileSync('/tmp/startup_status', 'utf-8').trim();\n if (startupStatus.startsWith('FAILED')) {\n startupFailed = true;\n // Log internally but don't expose details\n getRouteLogger().error('Startup script failure detected', { startupStatus });\n }\n }\n } catch (e) {\n // Ignore file read errors\n }\n\n if (startupFailed) {\n // Return unhealthy but don't expose internal details\n const response: HealthResponse = {\n status: 'offline',\n message: 'Service is experiencing issues',\n version: '0.1.0',\n timestamp: new Date().toISOString(),\n database: 'unknown',\n environment: nodeEnv,\n };\n return c.json(response, 200); // Always return 200 for health checks (ALB requirement)\n }\n\n const dbStatus = await DatabaseConnection.checkHealth();\n\n const response: HealthResponse = {\n status: 'operational',\n message: 'Semiont API is running',\n version: '0.1.0',\n timestamp: new Date().toISOString(),\n database: dbStatus ? 'connected' : 'disconnected',\n environment: nodeEnv,\n };\n\n return c.json(response, 200);\n});\n","{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Semiont API\",\n \"version\": \"0.1.0\",\n \"description\": \"Semantic Knowledge Platform API\"\n },\n \"servers\": [\n {\n \"url\": \"http://localhost:4000\",\n \"description\": \"API Server\"\n }\n ],\n \"paths\": {\n \"/resources/{id}\": {\n \"get\": {\n \"summary\": \"Get Resource by URI (W3C Content Negotiation)\",\n \"description\": \"W3C-compliant globally resolvable resource URI with content negotiation. Returns JSON-LD metadata (Accept: application/ld+json), raw representation (Accept: text/plain, text/markdown, etc.), or redirects to frontend (?view=semiont). Requires authentication.\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID\"\n },\n {\n \"name\": \"view\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\",\n \"enum\": [\n \"semiont\"\n ]\n },\n \"description\": \"Optional view parameter. If set to 'semiont', redirects to frontend viewer.\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource metadata (JSON-LD) or raw representation\",\n \"content\": {\n \"application/ld+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceResponse\"\n }\n },\n \"text/plain\": {\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"text/markdown\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"302\": {\n \"description\": \"Redirect to frontend viewer (when ?view=semiont)\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n },\n \"patch\": {\n \"summary\": \"Update Resource\",\n \"description\": \"Update resource metadata (append-only operations - name and content are immutable)\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateResourceRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Resource updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/annotations/{id}\": {\n \"get\": {\n \"summary\": \"Get Annotation by URI (W3C Content Negotiation)\",\n \"description\": \"W3C-compliant globally resolvable annotation URI with content negotiation. Returns JSON-LD for API clients (Accept: application/ld+json or application/json). Redirects to frontend for browsers (Accept: text/html or browser User-Agent). Requires authentication and resourceId query parameter.\",\n \"tags\": [\n \"W3C URIs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"description\": \"Resource ID or URI containing the annotation\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation representation (JSON-LD)\",\n \"content\": {\n \"application/ld+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationResponse\"\n }\n }\n }\n },\n \"302\": {\n \"description\": \"Redirect to frontend (for browsers)\"\n },\n \"400\": {\n \"description\": \"Missing resourceId parameter\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/annotations/{id}/context\": {\n \"get\": {\n \"summary\": \"Get Annotation Context\",\n \"description\": \"Get the text context around an annotation with configurable before/after window\",\n \"tags\": [\n \"Annotations\",\n \"Context\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID containing the annotation\"\n },\n {\n \"name\": \"contextBefore\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 5000,\n \"default\": 100\n },\n \"description\": \"Number of characters before the selection\"\n },\n {\n \"name\": \"contextAfter\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 5000,\n \"default\": 100\n },\n \"description\": \"Number of characters after the selection\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotationContextResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid query parameters\"\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/annotations/{id}/summary\": {\n \"get\": {\n \"summary\": \"Get Annotation Summary\",\n \"description\": \"Get an AI-generated summary of the annotation in context\",\n \"tags\": [\n \"Annotations\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Annotation ID\"\n },\n {\n \"name\": \"resourceId\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n },\n \"description\": \"Resource ID containing the annotation\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"AI-generated annotation summary\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ContextualSummaryResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Missing resourceId parameter\"\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/health\": {\n \"get\": {\n \"summary\": \"Health Check\",\n \"description\": \"Check if the API is operational and database is connected\",\n \"tags\": [\n \"System\"\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Health status of the API\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/HealthResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/password\": {\n \"post\": {\n \"summary\": \"Password Authentication\",\n \"description\": \"Authenticate with email and password for users with password provider\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PasswordAuthRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Authentication successful\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AuthResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Bad request - invalid input or OAuth user attempting password auth\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized - invalid credentials\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - account not active\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/google\": {\n \"post\": {\n \"summary\": \"Google OAuth Authentication\",\n \"description\": \"Authenticate with Google OAuth access token\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GoogleAuthRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Successful authentication\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AuthResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid request or authentication failed\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/refresh\": {\n \"post\": {\n \"summary\": \"Refresh Access Token\",\n \"description\": \"Exchange a refresh token for a new access token\",\n \"tags\": [\n \"Authentication\"\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/TokenRefreshRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"New access token generated\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GoogleAuthRequest\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Invalid or expired refresh token\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/tokens/mcp-generate\": {\n \"post\": {\n \"summary\": \"Generate MCP Token\",\n \"description\": \"Generate a short-lived token for MCP server\",\n \"tags\": [\n \"Authentication\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"MCP token generated\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/MCPGenerateResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/me\": {\n \"get\": {\n \"summary\": \"Get Current User\",\n \"description\": \"Get information about the authenticated user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User information\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UserResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/accept-terms\": {\n \"post\": {\n \"summary\": \"Accept Terms\",\n \"description\": \"Mark terms as accepted for the current user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Terms accepted successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/users/logout\": {\n \"post\": {\n \"summary\": \"Logout\",\n \"description\": \"Logout the current user\",\n \"tags\": [\n \"Users\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Logged out successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/status\": {\n \"get\": {\n \"summary\": \"Get Service Status\",\n \"description\": \"Get service status and feature availability\",\n \"tags\": [\n \"General\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Service status information\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/StatusResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users\": {\n \"get\": {\n \"summary\": \"List All Users\",\n \"description\": \"Get a list of all users (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"List of users\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUsersListResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users/stats\": {\n \"get\": {\n \"summary\": \"User Statistics\",\n \"description\": \"Get user statistics (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User statistics\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUserStatsResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/users/{id}\": {\n \"patch\": {\n \"summary\": \"Update User\",\n \"description\": \"Update user properties (admin only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\",\n \"example\": \"user-123\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateUserRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"User updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AdminUpdateUserResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Invalid request\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"User not found\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n },\n \"delete\": {\n \"summary\": \"Delete User\",\n \"description\": \"Delete a user account (admin only, cannot delete own account)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\",\n \"example\": \"user-123\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"User deleted successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AcceptTermsResponse\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"Cannot delete own account\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"User not found\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/admin/oauth/config\": {\n \"get\": {\n \"summary\": \"Get OAuth Configuration\",\n \"description\": \"Get OAuth provider configuration (admin only, read-only)\",\n \"tags\": [\n \"Admin\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"OAuth configuration\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/OAuthConfigResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Unauthorized\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources\": {\n \"post\": {\n \"summary\": \"Create Resource\",\n \"description\": \"Create a new resource\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"multipart/form-data\": {\n \"schema\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"file\",\n \"format\"\n ],\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Resource name\"\n },\n \"file\": {\n \"type\": \"string\",\n \"format\": \"binary\",\n \"description\": \"Binary content of the resource\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"MIME type (e.g., text/markdown, image/png)\"\n },\n \"entityTypes\": {\n \"type\": \"string\",\n \"description\": \"JSON-encoded array of entity types\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"ISO 639-1 language code\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"description\": \"How the resource was created\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\",\n \"description\": \"Source annotation ID (for generated resources)\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\",\n \"description\": \"Source resource ID (for cloned resources)\"\n }\n }\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Resource created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n },\n \"get\": {\n \"summary\": \"List Resources\",\n \"description\": \"List all resources with optional filters\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"number\",\n \"nullable\": true,\n \"default\": 0\n },\n \"required\": false,\n \"name\": \"offset\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"nullable\": true,\n \"default\": 50\n },\n \"required\": false,\n \"name\": \"limit\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"entityType\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n \"required\": false,\n \"name\": \"archived\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"search\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"q\",\n \"in\": \"query\",\n \"description\": \"Search query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resources listed successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ListResourcesResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/annotate-references-stream\": {\n \"post\": {\n \"summary\": \"Annotate References with Progress (SSE)\",\n \"description\": \"Stream real-time reference annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateReferencesStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-highlights-stream\": {\n \"post\": {\n \"summary\": \"Annotate Highlights with Progress (SSE)\",\n \"description\": \"Stream real-time highlight annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateHighlightsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-assessments-stream\": {\n \"post\": {\n \"summary\": \"Annotate Assessments with Progress (SSE)\",\n \"description\": \"Stream real-time assessment annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateAssessmentsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-comments-stream\": {\n \"post\": {\n \"summary\": \"Annotate Comments with Progress (SSE)\",\n \"description\": \"Stream real-time comment annotation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateCommentsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/annotate-tags-stream\": {\n \"post\": {\n \"summary\": \"Annotate Tags with Progress (SSE)\",\n \"description\": \"Stream real-time tag annotation progress via Server-Sent Events. Identifies passages serving specific structural roles (IRAC, IMRAD, Toulmin frameworks).\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotateTagsStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Resource not found\"\n }\n }\n }\n },\n \"/resources/{id}/llm-context\": {\n \"get\": {\n \"summary\": \"Get Resource LLM Context\",\n \"description\": \"Get resource with full context for LLM processing\",\n \"tags\": [\n \"Resources\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 3,\n \"default\": 2\n },\n \"required\": false,\n \"name\": \"depth\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 20,\n \"default\": 10\n },\n \"required\": false,\n \"name\": \"maxResources\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeContent\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": false\n },\n \"required\": false,\n \"name\": \"includeSummary\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"LLM context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ResourceLLMContextResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/llm-context\": {\n \"get\": {\n \"summary\": \"Get Annotation LLM Context\",\n \"description\": \"Get annotation with full context for LLM processing\",\n \"tags\": [\n \"Resources\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeSourceContext\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"true\"\n ]\n },\n {\n \"type\": \"string\",\n \"enum\": [\n \"false\"\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ],\n \"default\": true\n },\n \"required\": false,\n \"name\": \"includeTargetContext\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 100,\n \"maximum\": 5000,\n \"default\": 1000\n },\n \"required\": false,\n \"name\": \"contextWindow\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation LLM context\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AnnotationLLMContextResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/referenced-by\": {\n \"get\": {\n \"summary\": \"Get Referenced By\",\n \"description\": \"Get resources that reference this resource\",\n \"tags\": [\n \"Resources\",\n \"Graph\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"required\": false,\n \"name\": \"motivation\",\n \"in\": \"query\",\n \"description\": \"Filter incoming references by W3C motivation type (e.g., 'linking', 'commenting', 'highlighting')\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resources that reference this resource\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetReferencedByResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/clone-tokens/{token}\": {\n \"get\": {\n \"summary\": \"Get Resource by Clone Token\",\n \"description\": \"Retrieve a resource using a clone token\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"token\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetResourceByTokenResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/clone-tokens/create-resource\": {\n \"post\": {\n \"summary\": \"Create Resource from Clone Token\",\n \"description\": \"Create a new resource using a clone token\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceFromTokenRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Resource created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/clone-with-token\": {\n \"post\": {\n \"summary\": \"Clone Resource with Token\",\n \"description\": \"Generate a temporary token for cloning a resource\",\n \"tags\": [\n \"Resources\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Clone token generated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CloneResourceWithTokenResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/annotations\": {\n \"get\": {\n \"summary\": \"Get Resource Annotations\",\n \"description\": \"Get all annotations (both highlights and references) in a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Resource annotations\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateResourceResponse\"\n }\n }\n }\n }\n }\n },\n \"post\": {\n \"summary\": \"Create Annotation\",\n \"description\": \"Create a new annotation/reference in a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateAnnotationRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"201\": {\n \"description\": \"Annotation created successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateAnnotationResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/events\": {\n \"get\": {\n \"summary\": \"Get Resource Event History\",\n \"description\": \"Get full event history for a resource with optional filtering\",\n \"tags\": [\n \"Resources\",\n \"Events\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\",\n \"enum\": [\n \"resource.created\",\n \"resource.cloned\",\n \"resource.archived\",\n \"resource.unarchived\",\n \"annotation.added\",\n \"annotation.removed\",\n \"annotation.body.updated\",\n \"entitytag.added\",\n \"entitytag.removed\",\n \"entitytype.added\"\n ]\n },\n \"required\": false,\n \"name\": \"type\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": false,\n \"name\": \"userId\",\n \"in\": \"query\"\n },\n {\n \"schema\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 1000,\n \"default\": 100\n },\n \"required\": false,\n \"name\": \"limit\",\n \"in\": \"query\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Events retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetEventsResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{id}/events/stream\": {\n \"get\": {\n \"summary\": \"Subscribe to Resource Events (SSE)\",\n \"description\": \"Open a Server-Sent Events stream to receive real-time resource events\",\n \"tags\": [\n \"Resources\",\n \"Events\",\n \"Real-time\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}\": {\n \"get\": {\n \"summary\": \"Get Annotation\",\n \"description\": \"Get a specific annotation from a resource using nested path\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n },\n \"delete\": {\n \"summary\": \"Delete Annotation\",\n \"description\": \"Delete an annotation from a resource\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Annotation deleted successfully\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/body\": {\n \"put\": {\n \"summary\": \"Update Annotation Body\",\n \"description\": \"Apply fine-grained operations to modify annotation body items (add, remove, or replace TextualBody and SpecificResource items)\",\n \"tags\": [\n \"Resources\",\n \"Annotations\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateAnnotationBodyRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation body updated successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdateAnnotationBodyResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/yield-resource-stream\": {\n \"post\": {\n \"summary\": \"Generate Resource (SSE Stream)\",\n \"description\": \"Stream real-time resource generation progress via Server-Sent Events\",\n \"tags\": [\n \"Resources\",\n \"Annotations\",\n \"Real-time\",\n \"AI\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\",\n \"description\": \"Resource ID\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\",\n \"description\": \"Annotation ID\"\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/YieldResourceStreamRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"SSE stream opened successfully\",\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/EventStreamResponse\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"Authentication required\"\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/resources/{resourceId}/annotations/{annotationId}/history\": {\n \"get\": {\n \"summary\": \"Get Annotation History\",\n \"description\": \"Get full event history for a specific annotation (highlight or reference)\",\n \"tags\": [\n \"Selections\",\n \"Events\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"resourceId\",\n \"in\": \"path\"\n },\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"annotationId\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Annotation history retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetAnnotationHistoryResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Annotation not found\"\n }\n }\n }\n },\n \"/api/entity-types\": {\n \"get\": {\n \"summary\": \"Get Entity Types\",\n \"description\": \"Get list of available entity types for references\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Entity types retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/GetEntityTypesResponse\"\n }\n }\n }\n }\n }\n },\n \"post\": {\n \"summary\": \"Add Entity Type\",\n \"description\": \"Add a new entity type to the collection (append-only, requires moderator/admin)\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Entity type added successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Moderator or Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/entity-types/bulk\": {\n \"post\": {\n \"summary\": \"Bulk Add Entity Types\",\n \"description\": \"Add multiple entity types to the collection (append-only, requires moderator/admin)\",\n \"tags\": [\n \"Selections\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/BulkAddEntityTypesRequest\"\n }\n }\n }\n },\n \"responses\": {\n \"200\": {\n \"description\": \"Entity types added successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/AddEntityTypeResponse\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"Forbidden - Moderator or Admin access required\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n }\n }\n }\n }\n },\n \"/api/jobs/{id}\": {\n \"get\": {\n \"summary\": \"Get Job Status\",\n \"description\": \"Get the current status and progress of an async job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"parameters\": [\n {\n \"schema\": {\n \"type\": \"string\"\n },\n \"required\": true,\n \"name\": \"id\",\n \"in\": \"path\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Job status retrieved successfully\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/JobStatusResponse\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Job not found\"\n }\n }\n }\n }\n },\n \"components\": {\n \"schemas\": {\n \"AcceptTermsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"success\",\n \"message\"\n ]\n },\n \"AddEntityTypeRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"tag\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 100\n }\n },\n \"required\": [\n \"tag\"\n ]\n },\n \"AddEntityTypeResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"success\",\n \"entityTypes\"\n ]\n },\n \"AdminUpdateUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"lastLogin\",\n \"created\",\n \"updatedAt\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"user\"\n ]\n },\n \"AdminUsersListResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"users\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"lastLogin\",\n \"created\",\n \"updatedAt\"\n ]\n }\n }\n },\n \"required\": [\n \"success\",\n \"users\"\n ]\n },\n \"AdminUserStatsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"stats\": {\n \"type\": \"object\",\n \"properties\": {\n \"totalUsers\": {\n \"type\": \"number\"\n },\n \"activeUsers\": {\n \"type\": \"number\"\n },\n \"adminUsers\": {\n \"type\": \"number\"\n },\n \"regularUsers\": {\n \"type\": \"number\"\n },\n \"domainBreakdown\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"domain\": {\n \"type\": \"string\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"domain\",\n \"count\"\n ]\n }\n },\n \"recentSignups\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"created\"\n ]\n }\n }\n },\n \"required\": [\n \"totalUsers\",\n \"activeUsers\",\n \"adminUsers\",\n \"regularUsers\",\n \"domainBreakdown\",\n \"recentSignups\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"stats\"\n ]\n },\n \"Agent\": {\n \"type\": \"object\",\n \"description\": \"Minimal Person/Organization for attribution (W3C PROV compatible)\",\n \"additionalProperties\": true,\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Unique identifier for the agent\"\n },\n \"@type\": {\n \"description\": \"Type(s) of agent (Person, Organization, Software)\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"nickname\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"email_sha1\": {\n \"type\": \"string\"\n },\n \"homepage\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ]\n },\n \"Annotation\": {\n \"type\": \"object\",\n \"properties\": {\n \"@context\": {\n \"type\": \"string\",\n \"enum\": [\n \"http://www.w3.org/ns/anno.jsonld\"\n ],\n \"default\": \"http://www.w3.org/ns/anno.jsonld\",\n \"description\": \"W3C Web Annotation JSON-LD context\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"Annotation\"\n ],\n \"default\": \"Annotation\",\n \"description\": \"W3C Annotation type\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"motivation\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"IRI of the entire resource being annotated\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationTarget\"\n }\n ],\n \"description\": \"W3C Web Annotation target - can be a simple IRI string (entire resource) or an object with source and optional selector (fragment)\"\n },\n \"body\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"maxItems\": 0,\n \"description\": \"Empty array for stub references (Phase 1 pattern)\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationBody\",\n \"description\": \"Single body (TextualBody or SpecificResource)\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"description\": \"Array of mixed TextualBody (tagging) and SpecificResource (linking) bodies\"\n }\n ],\n \"description\": \"W3C Web Annotation body - can be empty array, single body, or array of bodies\"\n },\n \"creator\": {\n \"$ref\": \"#/components/schemas/Agent\"\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"modified\": {\n \"type\": \"string\"\n },\n \"generator\": {\n \"$ref\": \"#/components/schemas/Agent\"\n }\n },\n \"required\": [\n \"@context\",\n \"type\",\n \"id\",\n \"motivation\",\n \"target\",\n \"body\"\n ]\n },\n \"AnnotationBody\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ],\n \"description\": \"Phase 2: Body can be TextualBody (for entity tags, descriptions) or SpecificResource (for links)\"\n },\n \"AnnotationContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"context\": {\n \"type\": \"object\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n },\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"required\": [\n \"annotation\",\n \"context\",\n \"resource\"\n ]\n },\n \"AnnotationLLMContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"sourceResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"targetResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/YieldContext\",\n \"description\": \"Generation context for this annotation\"\n },\n \"sourceContext\": {\n \"type\": \"object\",\n \"description\": \"DEPRECATED: Use 'context' instead. Legacy source context format.\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"before\",\n \"selected\",\n \"after\"\n ]\n },\n \"targetContext\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\"\n ]\n },\n \"suggestedResolution\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"resourceName\": {\n \"type\": \"string\"\n },\n \"confidence\": {\n \"type\": \"number\"\n },\n \"reasoning\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"resourceName\",\n \"confidence\",\n \"reasoning\"\n ]\n }\n },\n \"required\": [\n \"annotation\",\n \"sourceResource\"\n ]\n },\n \"AnnotationTarget\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\",\n \"description\": \"IRI of the resource being annotated\"\n },\n \"selector\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/TextQuoteSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/TextQuoteSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n }\n ]\n }\n }\n ],\n \"description\": \"Optional selector to identify a specific segment of the source resource\"\n }\n },\n \"required\": [\n \"source\"\n ],\n \"description\": \"W3C Web Annotation target object - source is required, selector is optional\"\n },\n \"AsyncJobResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\"\n ]\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"type\",\n \"created\"\n ]\n },\n \"AuthResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"isAdmin\"\n ]\n },\n \"token\": {\n \"type\": \"string\"\n },\n \"isNewUser\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"success\",\n \"user\",\n \"token\",\n \"isNewUser\"\n ]\n },\n \"BodyOperationAdd\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"add\"\n ]\n },\n \"item\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"item\"\n ]\n },\n \"BodyOperationRemove\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"remove\"\n ]\n },\n \"item\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"item\"\n ]\n },\n \"BodyOperationReplace\": {\n \"type\": \"object\",\n \"properties\": {\n \"op\": {\n \"type\": \"string\",\n \"enum\": [\n \"replace\"\n ]\n },\n \"oldItem\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n },\n \"newItem\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/TextualBody\"\n },\n {\n \"$ref\": \"#/components/schemas/SpecificResource\"\n }\n ]\n }\n },\n \"required\": [\n \"op\",\n \"oldItem\",\n \"newItem\"\n ]\n },\n \"BodyType\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextualBody\",\n \"SpecificResource\"\n ],\n \"description\": \"Annotation body type - TextualBody for textual content, SpecificResource for resource links\"\n },\n \"BulkAddEntityTypesRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 100\n }\n }\n },\n \"required\": [\n \"tags\"\n ]\n },\n \"CloneResourceWithTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Generated clone token\"\n },\n \"expiresAt\": {\n \"type\": \"string\",\n \"description\": \"ISO 8601 timestamp when token expires\"\n },\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"required\": [\n \"token\",\n \"expiresAt\",\n \"resource\"\n ]\n },\n \"ContentFormat\": {\n \"type\": \"string\",\n \"description\": \"Content format as MIME type, optionally with charset parameter. Values include: text/plain, text/plain; charset=utf-8, text/plain; charset=iso-8859-1, text/markdown, text/markdown; charset=windows-1252, image/png, image/jpeg, application/pdf\",\n \"example\": \"text/plain; charset=utf-8\"\n },\n \"ContextualSummaryResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"summary\": {\n \"type\": \"string\"\n },\n \"relevantFields\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n },\n \"context\": {\n \"type\": \"object\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\"\n },\n \"selected\": {\n \"type\": \"string\"\n },\n \"after\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n }\n },\n \"required\": [\n \"summary\",\n \"relevantFields\",\n \"context\"\n ]\n },\n \"CreateAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"motivation\": {\n \"$ref\": \"#/components/schemas/Motivation\"\n },\n \"target\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\"\n },\n \"selector\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/TextPositionSelector\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n {\n \"$ref\": \"#/components/schemas/SvgSelector\"\n },\n {\n \"$ref\": \"#/components/schemas/FragmentSelector\"\n }\n ]\n }\n }\n ]\n }\n },\n \"required\": [\n \"source\",\n \"selector\"\n ]\n },\n \"body\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"maxItems\": 0,\n \"description\": \"Empty array (Phase 1 stub pattern - will be migrated to contain entity tag bodies in Phase 2)\"\n },\n {\n \"$ref\": \"#/components/schemas/AnnotationBody\",\n \"description\": \"Single body (TextualBody or SpecificResource)\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/AnnotationBody\"\n },\n \"minItems\": 1,\n \"description\": \"Array of mixed TextualBody (tagging) and SpecificResource (linking) bodies\"\n }\n ]\n }\n },\n \"required\": [\n \"target\",\n \"body\",\n \"motivation\"\n ]\n },\n \"CreateAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"CreateFromAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID of the resource containing the annotation\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"name\",\n \"content\",\n \"format\"\n ]\n },\n \"CreateFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"CreateJobResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\"\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"type\",\n \"status\",\n \"created\"\n ]\n },\n \"CreateResourceFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\"\n ]\n },\n \"CreateResourceFromSelectionRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID of the resource containing the annotation\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n \"prompt\": {\n \"type\": \"string\"\n },\n \"language\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"content\",\n \"name\",\n \"format\"\n ]\n },\n \"CreateResourceFromSelectionResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\"\n ]\n },\n \"CreateResourceFromTokenRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Clone token\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name for the new resource\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Content for the new resource\"\n },\n \"archiveOriginal\": {\n \"type\": \"boolean\",\n \"description\": \"Whether to archive the original resource\"\n }\n },\n \"required\": [\n \"token\",\n \"name\",\n \"content\"\n ]\n },\n \"CreateResourceFromTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"CreateResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 500\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"language\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"content\",\n \"format\",\n \"entityTypes\"\n ]\n },\n \"CreateResourceResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\"\n ]\n },\n \"DeleteAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Resource URI containing the annotation (required for O(1) Layer 3 lookup)\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"DeleteUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"success\",\n \"message\"\n ]\n },\n \"AnnotateReferencesStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types to annotate (e.g., 'Person', 'Organization', 'Location')\"\n },\n \"includeDescriptiveReferences\": {\n \"type\": \"boolean\",\n \"description\": \"Include anaphoric/cataphoric references (e.g., 'the CEO', 'the tech giant') in addition to direct mentions\"\n }\n },\n \"required\": [\n \"entityTypes\"\n ]\n },\n \"AnnotateHighlightsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI highlight annotation\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 15,\n \"description\": \"Optional density: desired number of highlights per 2000 words of text (1-15)\"\n }\n }\n },\n \"AnnotateAssessmentsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI assessment annotation\"\n },\n \"tone\": {\n \"type\": \"string\",\n \"enum\": [\n \"analytical\",\n \"critical\",\n \"balanced\",\n \"constructive\"\n ],\n \"description\": \"Optional tone/style for generated assessments\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 10,\n \"description\": \"Optional density: desired number of assessments per 2000 words of text (1-10)\"\n }\n }\n },\n \"AnnotateCommentsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"instructions\": {\n \"type\": \"string\",\n \"description\": \"Optional instructions to guide AI comment annotation\"\n },\n \"tone\": {\n \"type\": \"string\",\n \"enum\": [\n \"scholarly\",\n \"explanatory\",\n \"conversational\",\n \"technical\"\n ],\n \"description\": \"Optional tone/style for generated comments\"\n },\n \"density\": {\n \"type\": \"number\",\n \"minimum\": 2,\n \"maximum\": 12,\n \"description\": \"Optional density: desired number of comments per 2000 words of text (2-12)\"\n }\n }\n },\n \"AnnotateTagsStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaId\": {\n \"type\": \"string\",\n \"description\": \"Tag schema ID (e.g., 'legal-irac', 'scientific-imrad', 'argument-toulmin')\"\n },\n \"categories\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Categories to annotate from the selected schema (e.g., ['Issue', 'Rule', 'Application', 'Conclusion'])\"\n }\n },\n \"required\": [\n \"schemaId\",\n \"categories\"\n ]\n },\n \"ErrorResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"error\": {\n \"type\": \"string\"\n },\n \"code\": {\n \"type\": \"string\"\n },\n \"details\": {}\n },\n \"required\": [\n \"error\"\n ]\n },\n \"EventStreamResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"event\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"event\",\n \"data\"\n ]\n },\n \"YieldResourceFromAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Optional name for the generated resource\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types for the generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Optional AI prompt for generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language code (e.g., 'en', 'es')\"\n }\n }\n },\n \"YieldResourceFromAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"generated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotation\",\n \"generated\"\n ]\n },\n \"YieldResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Resource ID containing the annotation\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Custom title for generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Custom prompt for content generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language locale (e.g., \\\"es\\\", \\\"fr\\\", \\\"ja\\\")\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"YieldResourceStreamRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Custom title for generated resource\"\n },\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Custom prompt for content generation\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"Language locale for generated content (e.g., \\\"es\\\", \\\"fr\\\", \\\"ja\\\")\"\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/YieldContext\",\n \"description\": \"Generation context including source document excerpts and metadata\"\n },\n \"temperature\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1,\n \"description\": \"Inference temperature (0.0 = focused, 1.0 = creative)\"\n },\n \"maxTokens\": {\n \"type\": \"number\",\n \"minimum\": 100,\n \"maximum\": 4000,\n \"description\": \"Maximum tokens to generate\"\n }\n },\n \"required\": [\n \"context\"\n ]\n },\n \"GetAnnotationHistoryResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"contentChecksum\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ]\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"name\",\n \"format\",\n \"contentChecksum\",\n \"creationMethod\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"$ref\": \"#/components/schemas/ContentFormat\"\n },\n \"contentChecksum\": {\n \"type\": \"string\"\n },\n \"parentResourceId\": {\n \"type\": \"string\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ]\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"name\",\n \"format\",\n \"contentChecksum\",\n \"parentResourceId\",\n \"creationMethod\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"reason\": {\n \"type\": \"string\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {}\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\",\n \"description\": \"W3C Annotation (creator/created fields are optional in events - they're derived from event userId/timestamp)\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotationId\": {\n \"type\": \"string\",\n \"description\": \"Unified annotation ID\"\n }\n },\n \"required\": [\n \"annotationId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"annotationId\": {\n \"type\": \"string\",\n \"description\": \"Unified annotation ID\"\n },\n \"targetResourceId\": {\n \"type\": \"string\",\n \"description\": \"For linking motivation\"\n }\n },\n \"required\": [\n \"annotationId\",\n \"targetResourceId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"entityType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"entityType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"entityType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"entityType\"\n ]\n }\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"sequenceNumber\": {\n \"type\": \"number\"\n },\n \"prevEventHash\": {\n \"type\": \"string\"\n },\n \"checksum\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sequenceNumber\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"timestamp\",\n \"userId\",\n \"resourceId\",\n \"payload\",\n \"metadata\"\n ]\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"annotationId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"events\",\n \"total\",\n \"annotationId\",\n \"resourceId\"\n ]\n },\n \"GetAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"resource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n },\n \"resolvedResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n }\n },\n \"required\": [\n \"annotation\",\n \"resource\",\n \"resolvedResource\"\n ]\n },\n \"GetAnnotationsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"total\": {\n \"type\": \"number\",\n \"description\": \"Total number of annotations\"\n },\n \"motivation\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/Motivation\"\n }\n ],\n \"description\": \"Motivation filter applied (if any)\"\n }\n },\n \"required\": [\n \"annotations\",\n \"total\"\n ]\n },\n \"GetEntityTypesResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"entityTypes\"\n ]\n },\n \"GetEventsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"event\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n },\n \"payload\": {}\n },\n \"required\": [\n \"id\",\n \"type\",\n \"timestamp\",\n \"userId\",\n \"resourceId\"\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"sequenceNumber\": {\n \"type\": \"number\"\n },\n \"prevEventHash\": {\n \"type\": \"string\"\n },\n \"checksum\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sequenceNumber\"\n ]\n }\n },\n \"required\": [\n \"event\",\n \"metadata\"\n ]\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"resourceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"events\",\n \"total\",\n \"resourceId\"\n ]\n },\n \"GetReferencedByResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"referencedBy\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Reference annotation ID\"\n },\n \"resourceName\": {\n \"type\": \"string\",\n \"description\": \"Name of resource containing the reference\"\n },\n \"target\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\",\n \"description\": \"ID of resource containing the reference\"\n },\n \"selector\": {\n \"type\": \"object\",\n \"properties\": {\n \"exact\": {\n \"type\": \"string\",\n \"description\": \"The selected text that references this resource\"\n }\n },\n \"required\": [\n \"exact\"\n ]\n }\n },\n \"required\": [\n \"source\",\n \"selector\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"resourceName\",\n \"target\"\n ]\n }\n }\n },\n \"required\": [\n \"referencedBy\"\n ]\n },\n \"GetResourceByTokenResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"sourceResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"expiresAt\": {\n \"type\": \"string\",\n \"description\": \"ISO 8601 timestamp when token expires\"\n }\n },\n \"required\": [\n \"sourceResource\",\n \"expiresAt\"\n ]\n },\n \"GetResourceResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"description\": \"All annotations for the resource (highlights, references, assessments, etc.)\"\n },\n \"entityReferences\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"description\": \"Annotations that reference this resource from other resources\"\n }\n },\n \"required\": [\n \"resource\",\n \"annotations\",\n \"entityReferences\"\n ]\n },\n \"GoogleAuthRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"access_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"access_token\"\n ]\n },\n \"HealthResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"timestamp\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\",\n \"enum\": [\n \"connected\",\n \"disconnected\",\n \"unknown\"\n ]\n },\n \"environment\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"message\",\n \"version\",\n \"timestamp\",\n \"database\",\n \"environment\"\n ]\n },\n \"JobStatusResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"reference-annotation\",\n \"generation\",\n \"highlight-annotation\",\n \"assessment-annotation\",\n \"comment-annotation\",\n \"tag-annotation\"\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"pending\",\n \"running\",\n \"complete\",\n \"failed\",\n \"cancelled\"\n ]\n },\n \"userId\": {\n \"type\": \"string\"\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"startedAt\": {\n \"type\": \"string\"\n },\n \"completedAt\": {\n \"type\": \"string\"\n },\n \"error\": {\n \"type\": \"string\"\n },\n \"progress\": {},\n \"result\": {}\n },\n \"required\": [\n \"jobId\",\n \"type\",\n \"status\",\n \"userId\",\n \"created\"\n ]\n },\n \"ListAnnotationsResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"limit\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"annotations\",\n \"total\",\n \"offset\",\n \"limit\"\n ]\n },\n \"ListResourcesResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"resources\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"limit\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"resources\",\n \"total\",\n \"offset\",\n \"limit\"\n ]\n },\n \"PasswordAuthRequest\": {\n \"type\": \"object\",\n \"required\": [\n \"email\",\n \"password\"\n ],\n \"properties\": {\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"User email address\"\n },\n \"password\": {\n \"type\": \"string\",\n \"minLength\": 8,\n \"description\": \"User password (minimum 8 characters)\"\n }\n }\n },\n \"MCPGenerateResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"refresh_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"refresh_token\"\n ]\n },\n \"Motivation\": {\n \"type\": \"string\",\n \"enum\": [\n \"assessing\",\n \"bookmarking\",\n \"classifying\",\n \"commenting\",\n \"describing\",\n \"editing\",\n \"highlighting\",\n \"identifying\",\n \"linking\",\n \"moderating\",\n \"questioning\",\n \"replying\",\n \"tagging\"\n ],\n \"description\": \"W3C Web Annotation motivation vocabulary - https://www.w3.org/TR/annotation-vocab/#motivation\"\n },\n \"OAuthConfigResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"providers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"isConfigured\": {\n \"type\": \"boolean\"\n },\n \"clientId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"isConfigured\",\n \"clientId\"\n ]\n }\n },\n \"allowedDomains\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\n \"providers\",\n \"allowedDomains\"\n ]\n },\n \"Representation\": {\n \"type\": \"object\",\n \"description\": \"A specific, byte-addressable rendition of a resource (file/asset/variant).\",\n \"required\": [\n \"mediaType\"\n ],\n \"additionalProperties\": true,\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Stable ID for this representation.\"\n },\n \"@type\": {\n \"description\": \"Type(s), e.g., schema:MediaObject.\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"mediaType\": {\n \"type\": \"string\",\n \"description\": \"MIME/media type (e.g., text/markdown, image/png).\"\n },\n \"storageUri\": {\n \"type\": \"string\",\n \"description\": \"Where the bytes live (s3://, file://, https://, ipfs://, etc.).\"\n },\n \"filename\": {\n \"type\": \"string\"\n },\n \"byteSize\": {\n \"description\": \"Size of the payload in bytes.\",\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"checksum\": {\n \"description\": \"Integrity hash (e.g., sha256:abcd…).\",\n \"type\": \"string\"\n },\n \"encoding\": {\n \"type\": \"string\",\n \"description\": \"Compression/transfer encoding if applicable.\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"IETF BCP 47 language tag (e.g., en, es-ES).\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Pixels (images/video).\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Pixels (images/video).\"\n },\n \"duration\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Seconds (audio/video).\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"modified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"conformsTo\": {\n \"description\": \"Profile/shape the bytes conform to (e.g., a JSON profile or SVG profile).\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"rel\": {\n \"description\": \"Semantics of this rendition relative to the resource (e.g., original, thumbnail, preview, derived).\",\n \"type\": \"string\",\n \"enum\": [\n \"original\",\n \"thumbnail\",\n \"preview\",\n \"optimized\",\n \"derived\",\n \"other\"\n ]\n }\n }\n },\n \"BindAnnotationRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Target resource ID to resolve reference to\"\n }\n },\n \"required\": [\n \"resourceId\"\n ]\n },\n \"BindAnnotationResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n },\n \"targetResource\": {\n \"nullable\": true,\n \"allOf\": [\n {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n ]\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"ResourceDescriptor\": {\n \"type\": \"object\",\n \"description\": \"Metadata about a resource (1:1 with its URI). JSON-LD subject is @id. Link to concrete bytes via representations.\",\n \"required\": [\n \"@context\",\n \"@id\",\n \"name\",\n \"representations\"\n ],\n \"additionalProperties\": true,\n \"properties\": {\n \"@context\": {\n \"description\": \"JSON-LD context; URI, object, or array of these.\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n ]\n }\n }\n ]\n },\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Canonical URI/URN of the resource being described.\"\n },\n \"@type\": {\n \"description\": \"Type(s) of the resource (IRIs/CURIEs via @context).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"identifier\": {\n \"description\": \"Persistent identifiers (e.g., DOI, URN).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"@id\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"value\": {\n \"type\": \"string\"\n },\n \"scheme\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": true\n }\n ]\n },\n \"about\": {\n \"description\": \"Topics (IRIs or strings).\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"sameAs\": {\n \"description\": \"Equivalent/authoritative references.\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"isPartOf\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"hasPart\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"license\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"dateCreated\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"dateModified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"wasDerivedFrom\": {\n \"description\": \"W3C PROV - source resources this was derived from\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"wasAttributedTo\": {\n \"description\": \"W3C PROV - agents responsible for this resource\",\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/Agent\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Agent\"\n }\n }\n ]\n },\n \"conformsTo\": {\n \"description\": \"Profile/shape URI this resource description conforms to.\",\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"availableFormats\": {\n \"description\": \"Convenience set summarizing media types across representations.\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"representations\": {\n \"description\": \"Managed or referenced byte-level renditions of this resource.\",\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/Representation\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Representation\"\n }\n }\n ]\n },\n \"archived\": {\n \"type\": \"boolean\",\n \"description\": \"Application-specific: Whether this resource is archived\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Application-specific: Entity types for this resource\"\n },\n \"isDraft\": {\n \"type\": \"boolean\",\n \"description\": \"Application-specific: Whether this resource is a draft\"\n },\n \"creationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"api\",\n \"upload\",\n \"ui\",\n \"reference\",\n \"clone\",\n \"generated\"\n ],\n \"description\": \"Application-specific: How this resource was created\"\n },\n \"sourceAnnotationId\": {\n \"type\": \"string\",\n \"description\": \"Application-specific: ID of annotation that triggered generation\"\n },\n \"sourceResourceId\": {\n \"type\": \"string\",\n \"description\": \"Application-specific: ID of source resource for clones/derivatives\"\n }\n }\n },\n \"ResourceLLMContextResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"mainResource\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n },\n \"relatedResources\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/ResourceDescriptor\"\n }\n },\n \"annotations\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"graph\": {\n \"type\": \"object\",\n \"properties\": {\n \"nodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"label\",\n \"metadata\"\n ]\n }\n },\n \"edges\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"source\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"source\",\n \"target\",\n \"type\",\n \"metadata\"\n ]\n }\n }\n },\n \"required\": [\n \"nodes\",\n \"edges\"\n ]\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"suggestedReferences\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"mainResourceContent\": {\n \"type\": \"string\",\n \"description\": \"The content of the main resource (included if includeContent=true)\"\n },\n \"relatedResourcesContent\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n },\n \"description\": \"Map of resource IDs to their content (included if includeContent=true)\"\n }\n },\n \"required\": [\n \"mainResource\",\n \"relatedResources\",\n \"annotations\",\n \"graph\"\n ]\n },\n \"SpecificResource\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"SpecificResource\"\n ]\n },\n \"source\": {\n \"type\": \"string\",\n \"description\": \"IRI of the target resource\"\n },\n \"purpose\": {\n \"$ref\": \"#/components/schemas/Motivation\",\n \"description\": \"Why this body is included\"\n }\n },\n \"required\": [\n \"type\",\n \"source\"\n ]\n },\n \"StatusResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"features\": {\n \"type\": \"object\",\n \"properties\": {\n \"semanticContent\": {\n \"type\": \"string\"\n },\n \"collaboration\": {\n \"type\": \"string\"\n },\n \"rbac\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"semanticContent\",\n \"collaboration\",\n \"rbac\"\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"authenticatedAs\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"version\",\n \"features\",\n \"message\"\n ]\n },\n \"TextPositionSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextPositionSelector\"\n ]\n },\n \"start\": {\n \"type\": \"number\",\n \"description\": \"Character offset from resource start\"\n },\n \"end\": {\n \"type\": \"number\",\n \"description\": \"Character offset from resource start\"\n }\n },\n \"required\": [\n \"type\",\n \"start\",\n \"end\"\n ]\n },\n \"TextQuoteSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextQuoteSelector\"\n ]\n },\n \"exact\": {\n \"type\": \"string\"\n },\n \"prefix\": {\n \"type\": \"string\"\n },\n \"suffix\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"exact\"\n ]\n },\n \"TextualBody\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"TextualBody\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"The text content (e.g., entity type name)\"\n },\n \"purpose\": {\n \"$ref\": \"#/components/schemas/Motivation\",\n \"description\": \"Why this body is included\"\n },\n \"format\": {\n \"type\": \"string\",\n \"description\": \"MIME type (defaults to text/plain)\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"TokenRefreshRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"refreshToken\": {\n \"type\": \"string\",\n \"example\": \"eyJhbGciOiJIUzI1NiIs...\",\n \"description\": \"Refresh token obtained during login\"\n }\n },\n \"required\": [\n \"refreshToken\"\n ]\n },\n \"TokenRefreshResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"access_token\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"access_token\"\n ]\n },\n \"UpdateAnnotationBodyRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"Resource ID containing the annotation (required for O(1) Layer 3 lookup)\"\n },\n \"operations\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/BodyOperationAdd\"\n },\n {\n \"$ref\": \"#/components/schemas/BodyOperationRemove\"\n },\n {\n \"$ref\": \"#/components/schemas/BodyOperationReplace\"\n }\n ]\n },\n \"minItems\": 1,\n \"description\": \"Array of body modification operations to apply\"\n }\n },\n \"required\": [\n \"resourceId\",\n \"operations\"\n ]\n },\n \"UpdateAnnotationBodyResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"annotation\": {\n \"$ref\": \"#/components/schemas/Annotation\"\n }\n },\n \"required\": [\n \"annotation\"\n ]\n },\n \"UpdateResourceRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"archived\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"UpdateUserRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n },\n \"UpdateUserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"success\": {\n \"type\": \"boolean\"\n },\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n },\n \"updatedAt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"created\",\n \"updatedAt\"\n ]\n }\n },\n \"required\": [\n \"success\",\n \"user\"\n ]\n },\n \"UserResponse\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"image\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"isAdmin\": {\n \"type\": \"boolean\"\n },\n \"isActive\": {\n \"type\": \"boolean\"\n },\n \"termsAcceptedAt\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"lastLogin\": {\n \"type\": \"string\",\n \"nullable\": true\n },\n \"created\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"email\",\n \"name\",\n \"image\",\n \"domain\",\n \"provider\",\n \"isAdmin\",\n \"isActive\",\n \"termsAcceptedAt\",\n \"lastLogin\",\n \"created\"\n ]\n },\n \"SvgSelector\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"SvgSelector\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"SVG markup defining the region (must include xmlns attribute)\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"FragmentSelector\": {\n \"type\": \"object\",\n \"description\": \"W3C Web Annotation FragmentSelector for media fragment identifiers (RFC 3778 for PDFs)\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"FragmentSelector\"\n ]\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Media fragment identifier (e.g., 'page=1&viewrect=100,200,50,30' for PDF)\",\n \"example\": \"page=1&viewrect=100,200,50,30\"\n },\n \"conformsTo\": {\n \"type\": \"string\",\n \"description\": \"URI identifying the fragment syntax specification\",\n \"example\": \"http://tools.ietf.org/rfc/rfc3778\"\n }\n },\n \"required\": [\n \"type\",\n \"value\"\n ]\n },\n \"YieldContext\": {\n \"type\": \"object\",\n \"description\": \"Context information used for AI generation. Includes source document excerpts and metadata.\",\n \"properties\": {\n \"sourceContext\": {\n \"type\": \"object\",\n \"description\": \"Text context from the source document\",\n \"properties\": {\n \"before\": {\n \"type\": \"string\",\n \"description\": \"Text appearing before the selected passage\"\n },\n \"selected\": {\n \"type\": \"string\",\n \"description\": \"The selected text passage (the annotation target)\"\n },\n \"after\": {\n \"type\": \"string\",\n \"description\": \"Text appearing after the selected passage\"\n }\n },\n \"required\": [\n \"selected\"\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"description\": \"Additional context metadata (reserved for future use)\",\n \"properties\": {\n \"resourceType\": {\n \"type\": \"string\",\n \"description\": \"Type of source resource (e.g., 'document', 'image', 'video')\"\n },\n \"language\": {\n \"type\": \"string\",\n \"description\": \"BCP 47 language tag of source content\"\n },\n \"entityTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Entity types associated with the annotation\"\n }\n }\n }\n },\n \"required\": [\n \"sourceContext\"\n ]\n }\n }\n }\n}","/**\n * OpenAPI Schema Validator\n *\n * Validates data against OpenAPI component schemas using Ajv (JSON Schema validator).\n * This enables spec-first architecture where openapi.json is the source of truth.\n */\n\nimport Ajv, { type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport openapiSpec from '../../../../specs/openapi.json';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getValidatorLogger = () => getLogger().child({ component: 'openapi-validator' });\n\n// Initialize Ajv with OpenAPI-compatible settings\nconst ajv = new Ajv({\n allErrors: true, // Return all errors, not just the first one\n coerceTypes: true, // Coerce types (e.g., \"123\" -> 123)\n removeAdditional: false, // Don't remove additional properties\n keywords: ['example'], // Allow OpenAPI's \"example\" keyword (annotation-only, no validation)\n});\n\n// Add format validators (email, uri, date-time, etc.)\naddFormats(ajv);\n\n/**\n * Convert OpenAPI 3.0 `nullable: true` to JSON Schema `type: [original, \"null\"]`.\n * OpenAPI 3.0 uses `nullable` but Ajv expects JSON Schema draft-07 style.\n * Mutates the object in place (operates on a deep clone).\n */\nfunction convertNullable(obj: unknown): void {\n if (obj === null || obj === undefined || typeof obj !== 'object') return;\n const record = obj as Record<string, unknown>;\n if (record.nullable === true && typeof record.type === 'string') {\n record.type = [record.type, 'null'];\n delete record.nullable;\n }\n for (const v of Object.values(record)) {\n if (typeof v === 'object') convertNullable(v);\n }\n}\n\n// Lazy initialization flag to ensure schemas are loaded only once\nlet schemasLoaded = false;\n\n/**\n * Load all schemas from OpenAPI spec into Ajv\n * This is called lazily on first validation to avoid logger initialization issues\n */\nfunction loadSchemas(): void {\n if (schemasLoaded) return;\n\n for (const [name, schema] of Object.entries(openapiSpec.components.schemas)) {\n try {\n const converted = structuredClone(schema);\n convertNullable(converted);\n ajv.addSchema(converted, `#/components/schemas/${name}`);\n } catch (error) {\n getValidatorLogger().error('Failed to load schema', {\n schemaName: name,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n getValidatorLogger().info('OpenAPI schemas loaded', {\n count: Object.keys(openapiSpec.components.schemas).length\n });\n\n schemasLoaded = true;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ErrorObject[] | null;\n errorMessage?: string;\n}\n\n/**\n * Validate data against an OpenAPI component schema\n *\n * @param schemaName - Name of the schema in components/schemas (e.g., \"CreateAnnotationRequest\")\n * @param data - The data to validate\n * @returns Validation result with errors if invalid\n *\n * @example\n * const result = validateSchema('CreateAnnotationRequest', requestBody);\n * if (!result.valid) {\n * return res.status(400).json({ error: result.errorMessage, details: result.errors });\n * }\n */\nexport function validateSchema(schemaName: string, data: unknown): ValidationResult {\n // Ensure schemas are loaded before validation\n loadSchemas();\n\n const validate = ajv.getSchema(`#/components/schemas/${schemaName}`);\n\n if (!validate) {\n getValidatorLogger().error('Schema not found', {\n schemaName,\n availableSchemas: Object.keys(openapiSpec.components.schemas)\n });\n return {\n valid: false,\n errors: null,\n errorMessage: `Schema ${schemaName} not found in OpenAPI spec`,\n };\n }\n\n const valid = validate(data);\n\n if (!valid) {\n const errorMessage = formatValidationErrors(validate.errors || []);\n return {\n valid: false,\n errors: validate.errors || null,\n errorMessage,\n };\n }\n\n return {\n valid: true,\n errors: null,\n };\n}\n\n/**\n * Format Ajv validation errors into a human-readable message\n */\nfunction formatValidationErrors(errors: ErrorObject[]): string {\n if (errors.length === 0) return 'Validation failed';\n\n const messages = errors.map(err => {\n const path = err.instancePath || 'root';\n const message = err.message || 'validation error';\n\n if (err.keyword === 'required' && 'missingProperty' in err.params) {\n return `Missing required property: ${err.params.missingProperty}`;\n }\n\n if (err.keyword === 'type' && 'type' in err.params) {\n return `${path}: ${message} (expected ${err.params.type})`;\n }\n\n if (err.keyword === 'enum' && 'allowedValues' in err.params) {\n return `${path}: must be one of [${(err.params.allowedValues as string[]).join(', ')}]`;\n }\n\n return `${path}: ${message}`;\n });\n\n return messages.join('; ');\n}\n\n/**\n * Get the OpenAPI schema for a component (for debugging/inspection)\n */\nexport function getSchema(schemaName: string): unknown {\n return (openapiSpec.components.schemas as Record<string, unknown>)[schemaName];\n}\n\n/**\n * List all available schema names\n */\nexport function listSchemas(): string[] {\n return Object.keys(openapiSpec.components.schemas);\n}\n","/**\n * Hono middleware for validating requests against OpenAPI schemas\n *\n * This middleware validates request bodies, query parameters, and path parameters\n * against schemas defined in the OpenAPI specification.\n */\n\nimport { type Context, type Next, type MiddlewareHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport { validateSchema } from '../utils/openapi-validator';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getMiddlewareLogger = () => getLogger().child({ component: 'validate-openapi' });\n\n/**\n * Validate request body against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n *\n * @example\n * router.post('/api/annotations',\n * validateRequestBody('CreateAnnotationRequest'),\n * async (c) => {\n * const body = await c.req.json(); // Already validated\n * // ... handler logic\n * }\n * );\n */\nexport function validateRequestBody(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n let body: unknown;\n\n try {\n body = await c.req.json();\n } catch (error) {\n throw new HTTPException(400, {\n message: 'Invalid JSON in request body',\n });\n }\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, body);\n\n if (!valid) {\n getMiddlewareLogger().warn('Request body validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Request validation failed',\n cause: errors,\n });\n }\n\n // Store validated body in context for handler to retrieve\n c.set('validatedBody', body);\n\n await next();\n };\n}\n\n/**\n * Validate query parameters against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validateQuery(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const query = c.req.query();\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, query);\n\n if (!valid) {\n getMiddlewareLogger().warn('Query params validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Query validation failed',\n cause: errors,\n });\n }\n\n c.set('validatedQuery', query);\n\n await next();\n };\n}\n\n/**\n * Validate path parameters against an OpenAPI schema\n *\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validateParams(schemaName: string): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const params = c.req.param();\n\n const { valid, errors, errorMessage } = validateSchema(schemaName, params);\n\n if (!valid) {\n getMiddlewareLogger().warn('Path params validation failed', {\n schemaName,\n errorMessage,\n errors\n });\n throw new HTTPException(400, {\n message: errorMessage || 'Path parameter validation failed',\n cause: errors,\n });\n }\n\n c.set('validatedParams', params);\n\n await next();\n };\n}\n\n/**\n * Generic validation middleware that can validate any part of the request\n *\n * @param target - What to validate ('body', 'query', or 'params')\n * @param schemaName - Name of the schema in components/schemas\n * @returns Hono middleware function\n */\nexport function validate(\n target: 'body' | 'query' | 'params',\n schemaName: string\n): MiddlewareHandler {\n switch (target) {\n case 'body':\n return validateRequestBody(schemaName);\n case 'query':\n return validateQuery(schemaName);\n case 'params':\n return validateParams(schemaName);\n }\n}\n","import { DatabaseConnection } from '../db';\nimport { JWTService } from './jwt';\nimport { User } from '@prisma/client';\nimport { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { UserId, AccessToken, Email, GoogleCredential } from '@semiont/core';\nimport { userId as makeUserId, accessToken as makeAccessToken, email as makeEmail } from '@semiont/core';\n\nexport interface GoogleUserInfo {\n id: string;\n email: Email;\n name: string;\n picture?: string;\n verified_email: boolean;\n}\n\nexport interface CreateUserResult {\n user: User;\n token: AccessToken;\n isNewUser: boolean;\n}\n\nexport class OAuthService {\n static async verifyGoogleToken(accessToken: GoogleCredential): Promise<GoogleUserInfo> {\n const response = await fetch(`https://www.googleapis.com/oauth2/v2/userinfo?access_token=${accessToken}`);\n\n if (!response.ok) {\n throw new Error('Failed to verify Google token');\n }\n\n const rawUserInfo = await response.json() as { id: string; email: string; name: string; picture?: string; verified_email: boolean };\n\n if (!rawUserInfo.verified_email) {\n throw new Error('Email not verified with Google');\n }\n\n // Brand the email for type safety\n const userInfo: GoogleUserInfo = {\n ...rawUserInfo,\n email: makeEmail(rawUserInfo.email),\n };\n\n return userInfo;\n }\n\n static async createOrUpdateUser(googleUser: GoogleUserInfo): Promise<CreateUserResult> {\n const domain = googleUser.email.split('@')[1];\n \n // Check if domain is allowed\n if (!JWTService.isAllowedDomain(googleUser.email)) {\n throw new Error(`Domain ${domain} is not allowed for authentication`);\n }\n\n // Get database connection\n const prisma = DatabaseConnection.getClient();\n\n // Find or create user\n const existingUser = await prisma.user.findFirst({\n where: {\n OR: [\n { email: googleUser.email },\n { provider: 'google', providerId: googleUser.id }\n ]\n }\n });\n\n let user;\n let isNewUser = false;\n\n if (existingUser) {\n // Update existing user (preserve admin status)\n user = await prisma.user.update({\n where: { id: existingUser.id },\n data: {\n name: googleUser.name,\n image: googleUser.picture || null,\n provider: 'google',\n providerId: googleUser.id,\n ...(domain ? { domain } : {}),\n // Don't change isAdmin - it's managed via CLI command\n lastLogin: new Date(),\n }\n });\n } else {\n // Create new user (default to non-admin, use CLI to grant admin)\n user = await prisma.user.create({\n data: {\n email: googleUser.email,\n name: googleUser.name,\n image: googleUser.picture || null,\n provider: 'google',\n providerId: googleUser.id,\n passwordHash: null,\n domain: domain || '',\n isAdmin: false, // Default to non-admin for security\n lastLogin: new Date(),\n }\n });\n isNewUser = true;\n }\n\n // Generate JWT token\n const jwtPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n ...(user.name && { name: user.name }),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n };\n\n const token = makeAccessToken(JWTService.generateToken(jwtPayload));\n\n return { user, token, isNewUser };\n }\n\n static async getUserFromToken(token: AccessToken): Promise<User> {\n const payload = JWTService.verifyToken(token);\n\n if (!payload.userId) {\n throw new Error('Invalid token: missing userId');\n }\n\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { id: payload.userId }\n });\n\n if (!user || !user.isActive) {\n throw new Error('User not found or inactive');\n }\n\n return user;\n }\n\n static async acceptTerms(userId: UserId): Promise<User> {\n const prisma = DatabaseConnection.getClient();\n\n const user = await prisma.user.update({\n where: { id: userId },\n data: {\n termsAcceptedAt: new Date(),\n }\n });\n\n return user;\n }\n}","import { Context, Next } from 'hono';\nimport { OAuthService } from '../auth/oauth';\nimport { User } from '@prisma/client';\nimport { accessToken } from '@semiont/core';\n\ninterface Variables {\n user: User;\n}\n\nexport interface AuthContext extends Context {\n get: <T extends keyof Variables>(key: T) => Variables[T];\n set: <T extends keyof Variables>(key: T, value: Variables[T]) => void;\n}\n\nexport const authMiddleware = async (c: Context, next: Next): Promise<Response | void> => {\n const logger = c.get('logger');\n const authHeader = c.req.header('Authorization');\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n logger.warn('Authentication failed: Missing Authorization header', {\n type: 'auth_failed',\n reason: 'missing_header',\n path: c.req.path,\n method: c.req.method\n });\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n const tokenStr = authHeader.substring(7).trim(); // Remove 'Bearer ' prefix and trim\n\n if (!tokenStr) {\n logger.warn('Authentication failed: Empty token', {\n type: 'auth_failed',\n reason: 'empty_token',\n path: c.req.path,\n method: c.req.method\n });\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n try {\n const user = await OAuthService.getUserFromToken(accessToken(tokenStr));\n\n // Add user to context\n c.set('user', user);\n\n logger.debug('Authentication successful', {\n type: 'auth_success',\n userId: user.id,\n email: user.email,\n path: c.req.path,\n method: c.req.method\n });\n\n await next();\n return; // Explicit return for successful case\n } catch (error) {\n logger.warn('Authentication failed: Invalid token', {\n type: 'auth_failed',\n reason: 'invalid_token',\n path: c.req.path,\n method: c.req.method,\n error: error instanceof Error ? error.message : String(error)\n });\n return c.json({ error: 'Invalid token' }, 401);\n }\n};\n\nexport const optionalAuthMiddleware = async (c: Context, next: Next) => {\n const authHeader = c.req.header('Authorization');\n\n if (authHeader && authHeader.startsWith('Bearer ')) {\n const tokenStr = authHeader.substring(7);\n\n try {\n const user = await OAuthService.getUserFromToken(accessToken(tokenStr));\n c.set('user', user);\n } catch (error) {\n // Ignore auth errors for optional auth\n }\n }\n\n await next();\n};","/**\n * Authentication Routes - Spec-First Version (Proof of Concept)\n *\n * This demonstrates the new spec-first architecture with:\n * - Plain Hono (no @hono/zod-openapi)\n * - Ajv validation middleware (validates against OpenAPI schemas)\n * - Types from generated OpenAPI types\n * - OpenAPI spec as source of truth\n */\n\nimport { Hono } from 'hono';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport { authMiddleware } from '../middleware/auth';\nimport { DatabaseConnection } from '../db';\nimport { JWTService } from '../auth/jwt';\nimport { OAuthService } from '../auth/oauth';\nimport * as argon2 from 'argon2';\nimport type { User } from '@prisma/client';\nimport type { JWTPayload as ValidatedJWTPayload } from '../types/jwt-types';\nimport type { components } from '@semiont/core';\nimport { userId as makeUserId, googleCredential, email as makeEmail } from '@semiont/core';\nimport { getLogger } from '../logger';\nimport { createSafeLogContext } from '../utils/log-sanitizer';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'auth' });\n\n// Types from OpenAPI spec (generated)\ntype PasswordAuthRequest = components['schemas']['PasswordAuthRequest'];\ntype GoogleAuthRequest = components['schemas']['GoogleAuthRequest'];\ntype TokenRefreshRequest = components['schemas']['TokenRefreshRequest'];\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenRefreshResponse = components['schemas']['TokenRefreshResponse'];\ntype UserResponse = components['schemas']['UserResponse'];\ntype AcceptTermsResponse = components['schemas']['AcceptTermsResponse'];\ntype MCPGenerateResponse = components['schemas']['MCPGenerateResponse'];\n\n// Create auth router with plain Hono\nexport const authRouter = new Hono<{ Variables: { user: User; validatedBody: unknown } }>();\n\n/**\n * POST /api/tokens/password\n *\n * Password Authentication\n * Authenticate with email and password\n *\n * Request validation: Uses validateRequestBody middleware with 'PasswordAuthRequest' schema\n * Response type: AuthResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/password',\n validateRequestBody('PasswordAuthRequest'),\n async (c) => {\n try {\n const body = c.get('validatedBody') as PasswordAuthRequest;\n const { email, password } = body;\n\n getRouteLogger().debug('Password auth attempt', { email });\n\n // Get user from database by email\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { email }\n });\n\n // Return same error for user not found and wrong password (security)\n if (!user) {\n getRouteLogger().debug('Password auth failed: user not found', { email });\n return c.json({\n error: 'Invalid credentials'\n }, 401);\n }\n\n getRouteLogger().debug('User found', createSafeLogContext({\n email,\n provider: user.provider,\n isActive: user.isActive,\n hasPasswordHash: !!user.passwordHash\n }));\n\n // Verify user is password provider\n if (user.provider !== 'password') {\n getRouteLogger().debug('Password auth failed: wrong provider', {\n email,\n provider: user.provider\n });\n return c.json({\n error: 'This account uses OAuth. Please sign in with Google.'\n }, 400);\n }\n\n // Verify password hash exists\n if (!user.passwordHash) {\n getRouteLogger().debug('Password auth failed: no password hash', { email });\n return c.json({\n error: 'Password not set for this account'\n }, 400);\n }\n\n // Verify password\n const isValid = await argon2.verify(user.passwordHash, password);\n if (!isValid) {\n getRouteLogger().debug('Password auth failed: invalid password', { email });\n return c.json({\n error: 'Invalid credentials'\n }, 401);\n }\n\n // Check if user is active\n if (!user.isActive) {\n getRouteLogger().debug('Password auth failed: inactive account', { email });\n return c.json({\n error: 'Account is not active'\n }, 403);\n }\n\n getRouteLogger().debug('Password auth successful', { email });\n\n // Generate JWT token\n const jwtPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n ...(user.name && { name: user.name }),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n };\n\n const token = JWTService.generateToken(jwtPayload);\n\n // Update last login\n await prisma.user.update({\n where: { id: user.id },\n data: { lastLogin: new Date() }\n });\n\n const response: AuthResponse = {\n success: true,\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n isAdmin: user.isAdmin,\n },\n token,\n isNewUser: false,\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('Password auth error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({\n error: 'Authentication failed'\n }, 400);\n }\n }\n);\n\n/**\n * POST /api/tokens/google\n *\n * Google OAuth Authentication - Spec-First Version\n * Authenticate with Google OAuth access token\n *\n * Request validation: Uses validateRequestBody middleware with 'GoogleAuthRequest' schema\n * Response type: AuthResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/google',\n validateRequestBody('GoogleAuthRequest'),\n async (c) => {\n try {\n const body = c.get('validatedBody') as GoogleAuthRequest;\n const { access_token } = body;\n\n if (!access_token) {\n return c.json({\n error: 'Missing access token'\n }, 400);\n }\n\n // Verify Google token and get user info\n const googleUser = await OAuthService.verifyGoogleToken(googleCredential(access_token));\n\n // Create or update user\n const { user, token, isNewUser } = await OAuthService.createOrUpdateUser(googleUser);\n\n const response: AuthResponse = {\n success: true,\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n isAdmin: user.isAdmin,\n },\n token,\n isNewUser,\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('OAuth authentication error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n const errorMessage = error instanceof Error ? error.message : 'Authentication failed';\n return c.json({ error: errorMessage }, 400);\n }\n }\n);\n\n/**\n * POST /api/tokens/refresh\n *\n * Refresh Access Token - Spec-First Version\n * Exchange a refresh token for a new access token\n *\n * Request validation: Uses validateRequestBody middleware with 'TokenRefreshRequest' schema\n * Response type: TokenRefreshResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/refresh',\n validateRequestBody('TokenRefreshRequest'),\n async (c) => {\n getRouteLogger().debug('Refresh endpoint hit');\n const body = c.get('validatedBody') as TokenRefreshRequest;\n const { refreshToken } = body;\n\n if (!refreshToken) {\n getRouteLogger().debug('Refresh endpoint: No refresh token provided');\n return c.json({ error: 'Refresh token required' }, 401);\n }\n\n getRouteLogger().debug('Refresh endpoint: Attempting to verify token');\n\n try {\n // Verify refresh token\n const payload = JWTService.verifyToken(refreshToken);\n getRouteLogger().debug('Refresh endpoint: Token verified', { userId: payload.userId });\n\n if (!payload.userId) {\n getRouteLogger().debug('Refresh endpoint: No userId in token payload');\n return c.json({ error: 'Invalid token payload' }, 401);\n }\n\n // Get user from database to ensure they still exist and are active\n const prisma = DatabaseConnection.getClient();\n const user = await prisma.user.findUnique({\n where: { id: payload.userId }\n });\n\n if (!user || !user.isActive) {\n return c.json({ error: 'User not found or inactive' }, 401);\n }\n\n // Generate new short-lived access token (1 hour)\n const accessTokenPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n ...(user.name && { name: user.name })\n };\n const accessToken = JWTService.generateToken(accessTokenPayload, '1h'); // 1 hour expiration\n\n const response: TokenRefreshResponse = {\n access_token: accessToken\n };\n\n return c.json(response, 200);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n getRouteLogger().error('Token refresh error', {\n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined\n });\n\n // Provide specific error messages for different failure modes\n if (errorMessage.includes('expired')) {\n return c.json({ error: 'Refresh token expired - please re-provision' }, 401);\n }\n if (errorMessage.includes('signature')) {\n return c.json({ error: 'Invalid refresh token' }, 401);\n }\n\n return c.json({ error: 'Failed to refresh token' }, 401);\n }\n }\n);\n\n/**\n * GET /api/users/me\n *\n * Get Current User - Get information about the authenticated user\n * Requires authentication\n * Response type: UserResponse from OpenAPI spec\n */\nauthRouter.get('/api/users/me', authMiddleware, async (c) => {\n const user = c.get('user');\n\n const response: UserResponse = {\n id: user.id,\n email: user.email,\n name: user.name,\n image: user.image,\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n isActive: user.isActive,\n termsAcceptedAt: user.termsAcceptedAt?.toISOString() || null,\n lastLogin: user.lastLogin?.toISOString() || null,\n created: user.createdAt.toISOString(),\n };\n\n return c.json(response, 200);\n});\n\n/**\n * POST /api/tokens/mcp-generate\n *\n * Generate MCP Token - Generate a short-lived token for MCP server\n * Requires authentication\n * Response type: MCPGenerateResponse from OpenAPI spec\n */\nauthRouter.post('/api/tokens/mcp-generate', authMiddleware, async (c) => {\n const user = c.get('user');\n\n try {\n // Generate long-lived refresh token (30 days) for MCP\n const tokenPayload: Omit<ValidatedJWTPayload, 'iat' | 'exp'> = {\n userId: makeUserId(user.id),\n email: makeEmail(user.email),\n domain: user.domain,\n provider: user.provider,\n isAdmin: user.isAdmin,\n ...(user.name && { name: user.name })\n };\n const refreshToken = JWTService.generateToken(tokenPayload, '30d'); // 30 day expiration\n\n const response: MCPGenerateResponse = {\n refresh_token: refreshToken\n };\n\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('MCP token generation error', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to generate refresh token' }, 401);\n }\n});\n\n/**\n * POST /api/users/accept-terms\n *\n * Accept Terms - Mark terms as accepted for the current user\n * Requires authentication\n * Response type: AcceptTermsResponse from OpenAPI spec\n */\nauthRouter.post('/api/users/accept-terms', authMiddleware, async (c) => {\n const user = c.get('user');\n\n // Update the user's terms acceptance\n await OAuthService.acceptTerms(makeUserId(user.id));\n\n const response: AcceptTermsResponse = {\n success: true,\n message: 'Terms accepted',\n };\n\n return c.json(response, 200);\n});\n\n/**\n * POST /api/users/logout\n *\n * Logout - Logout the current user\n * Requires authentication\n * In JWT-based auth, logout is handled client-side\n * This endpoint exists for consistency and future session management\n */\nauthRouter.post('/api/users/logout', authMiddleware, async (c) => {\n return c.json({\n success: true,\n message: 'Logged out successfully',\n }, 200);\n});\n","/**\n * Log Sanitization Utilities\n *\n * Ensures sensitive data is never logged by mistake.\n * Masks passwords, tokens, API keys, and other sensitive fields.\n */\n\n// Fields that should never be logged\nconst SENSITIVE_FIELDS = [\n 'password',\n 'passwordHash',\n 'token',\n 'accessToken',\n 'refreshToken',\n 'apiKey',\n 'secret',\n 'authorization',\n 'cookie',\n 'sessionId',\n 'creditCard',\n 'ssn',\n 'privateKey',\n 'clientSecret'\n];\n\n// Fields that should be partially masked (show first/last few chars)\nconst PARTIAL_MASK_FIELDS = [\n 'email',\n 'phone',\n 'userId',\n 'accountId'\n];\n\n/**\n * Sanitize an object for logging by removing or masking sensitive fields\n *\n * @param data - The data to sanitize\n * @param options - Sanitization options\n * @returns Sanitized copy of the data\n */\nexport function sanitizeForLogging<T>(\n data: T,\n options: {\n maskValue?: string;\n partialMask?: boolean;\n additionalSensitiveFields?: string[];\n } = {}\n): T {\n const {\n maskValue = '[REDACTED]',\n partialMask = true,\n additionalSensitiveFields = []\n } = options;\n\n const allSensitiveFields = [\n ...SENSITIVE_FIELDS,\n ...additionalSensitiveFields\n ].map(f => f.toLowerCase());\n\n function sanitize(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sanitize);\n }\n\n const sanitized: any = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase();\n\n // Check if field should be completely masked\n if (allSensitiveFields.some(field => lowerKey.includes(field))) {\n sanitized[key] = maskValue;\n }\n // Check if field should be partially masked\n else if (partialMask && PARTIAL_MASK_FIELDS.some(field => lowerKey.includes(field))) {\n sanitized[key] = partialMaskValue(value);\n }\n // Recursively sanitize nested objects\n else if (typeof value === 'object' && value !== null) {\n sanitized[key] = sanitize(value);\n }\n // Keep non-sensitive values as-is\n else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n\n return sanitize(data);\n}\n\n/**\n * Partially mask a value (show first 3 and last 2 characters)\n */\nfunction partialMaskValue(value: any): string {\n if (typeof value !== 'string' || value.length <= 6) {\n return '[MASKED]';\n }\n\n const firstChars = value.substring(0, 3);\n const lastChars = value.substring(value.length - 2);\n const maskLength = Math.max(value.length - 5, 3);\n const mask = '*'.repeat(maskLength);\n\n return `${firstChars}${mask}${lastChars}`;\n}\n\n/**\n * Create a safe logging context by sanitizing all data\n *\n * @param context - The logging context\n * @returns Sanitized context safe for logging\n */\nexport function createSafeLogContext(context: Record<string, any>): Record<string, any> {\n return sanitizeForLogging(context, {\n partialMask: true\n });\n}\n\n/**\n * Sanitize HTTP headers for logging\n * Removes authorization, cookie, and other sensitive headers\n */\nexport function sanitizeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string | string[] | undefined> {\n const sanitized: Record<string, string | string[] | undefined> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'authorization' || lowerKey === 'cookie' || lowerKey === 'x-api-key') {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}","/**\n * Status Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request validation needed (GET endpoint)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { authMiddleware } from '../middleware/auth';\nimport type { User } from '@prisma/client';\nimport type { components } from '@semiont/core';\n\ntype StatusResponse = components['schemas']['StatusResponse'];\n\n// Create status router with plain Hono\nexport const statusRouter = new Hono<{ Variables: { user: User } }>();\n\n// Apply auth middleware\nstatusRouter.use('/api/status', authMiddleware);\n\n/**\n * GET /api/status\n *\n * Get service status and feature availability\n * Requires authentication\n */\nstatusRouter.get('/api/status', async (c) => {\n const user = c.get('user');\n\n const response: StatusResponse = {\n status: 'operational',\n version: '0.1.0',\n features: {\n semanticContent: 'planned',\n collaboration: 'planned',\n rbac: 'planned',\n },\n message: 'Ready to build the future of knowledge management!',\n authenticatedAs: user?.email,\n };\n\n return c.json(response, 200);\n});\n","/**\n * Admin Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { authMiddleware } from '../middleware/auth';\nimport { DatabaseConnection } from '../db';\nimport { User } from '@prisma/client';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\n\ntype UpdateUserRequest = components['schemas']['UpdateUserRequest'];\ntype UpdateUserResponse = components['schemas']['UpdateUserResponse'];\ntype DeleteUserResponse = components['schemas']['DeleteUserResponse'];\ntype OAuthConfigResponseActual = components['schemas']['OAuthConfigResponse'];\n\n// Admin middleware to check admin privileges\nconst adminMiddleware = async (c: any, next: any) => {\n const user = c.get('user');\n\n if (!user || !user.isAdmin) {\n return c.json({ error: 'Forbidden: Admin access required' }, 403);\n }\n\n return next();\n};\n\n// Create admin router\nexport const adminRouter = new Hono<{ Variables: { user: User } }>();\n\n// Apply auth and admin middleware to all admin routes\nadminRouter.use('/api/admin/*', authMiddleware, adminMiddleware);\n\n/**\n * GET /api/admin/users\n *\n * Get a list of all users (admin only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/users', async (c) => {\n const prisma = DatabaseConnection.getClient();\n\n const users = await prisma.user.findMany({\n orderBy: { createdAt: 'desc' },\n select: {\n id: true,\n email: true,\n name: true,\n image: true,\n domain: true,\n provider: true,\n isAdmin: true,\n isActive: true,\n termsAcceptedAt: true,\n lastLogin: true,\n createdAt: true,\n updatedAt: true,\n },\n });\n\n return c.json({\n success: true,\n users: users.map((u) => ({\n ...u,\n termsAcceptedAt: u.termsAcceptedAt?.toISOString() || null,\n lastLogin: u.lastLogin?.toISOString() || null,\n created: u.createdAt.toISOString(),\n updatedAt: u.updatedAt.toISOString(),\n })),\n }, 200);\n});\n\n/**\n * GET /api/admin/users/stats\n *\n * Get user statistics (admin only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/users/stats', async (c) => {\n const prisma = DatabaseConnection.getClient();\n\n const [totalUsers, activeUsers, adminUsers, domainStats, recentUsers] = await Promise.all([\n prisma.user.count(),\n prisma.user.count({ where: { isActive: true } }),\n prisma.user.count({ where: { isAdmin: true } }),\n prisma.user.groupBy({\n by: ['domain'],\n _count: { domain: true },\n orderBy: { _count: { domain: 'desc' } },\n }),\n prisma.user.findMany({\n where: {\n createdAt: {\n gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), // Last 7 days\n },\n },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n orderBy: { createdAt: 'desc' },\n }),\n ]);\n\n return c.json({\n success: true,\n stats: {\n totalUsers,\n activeUsers,\n adminUsers,\n regularUsers: totalUsers - adminUsers,\n domainBreakdown: domainStats.map((d) => ({\n domain: d.domain,\n count: d._count.domain,\n })),\n recentSignups: recentUsers.map((u) => ({\n ...u,\n created: u.createdAt.toISOString(),\n })),\n },\n }, 200);\n});\n\n/**\n * PATCH /api/admin/users/:id\n *\n * Update user properties (admin only)\n * Requires authentication + admin role\n */\nadminRouter.patch('/api/admin/users/:id',\n validateRequestBody('UpdateUserRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as UpdateUserRequest;\n const prisma = DatabaseConnection.getClient();\n\n // Check if user exists\n const existingUser = await prisma.user.findUnique({\n where: { id },\n });\n\n if (!existingUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n // Update user\n const updatedUser = await prisma.user.update({\n where: { id },\n data: {\n ...(body.isAdmin !== undefined && { isAdmin: body.isAdmin }),\n ...(body.isActive !== undefined && { isActive: body.isActive }),\n ...(body.name !== undefined && { name: body.name }),\n },\n });\n\n const response: UpdateUserResponse = {\n success: true,\n user: {\n id: updatedUser.id,\n email: updatedUser.email,\n name: updatedUser.name,\n image: updatedUser.image,\n domain: updatedUser.domain,\n provider: updatedUser.provider,\n isAdmin: updatedUser.isAdmin,\n isActive: updatedUser.isActive,\n lastLogin: updatedUser.lastLogin?.toISOString() || null,\n created: updatedUser.createdAt.toISOString(),\n updatedAt: updatedUser.updatedAt.toISOString(),\n },\n };\n\n return c.json(response, 200);\n }\n);\n\n/**\n * DELETE /api/admin/users/:id\n *\n * Delete a user account (admin only, cannot delete own account)\n * Requires authentication + admin role\n */\nadminRouter.delete('/api/admin/users/:id', async (c) => {\n const { id } = c.req.param();\n const currentUser = c.get('user');\n const prisma = DatabaseConnection.getClient();\n\n // Cannot delete own account\n if (id === currentUser.id) {\n return c.json({ error: 'Cannot delete your own account' }, 400);\n }\n\n // Check if user exists\n const existingUser = await prisma.user.findUnique({\n where: { id },\n });\n\n if (!existingUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n // Delete user\n await prisma.user.delete({\n where: { id },\n });\n\n const response: DeleteUserResponse = {\n success: true,\n message: `User ${existingUser.email} deleted successfully`,\n };\n\n return c.json(response, 200);\n});\n\n/**\n * GET /api/admin/oauth/config\n *\n * Get OAuth provider configuration (admin only, read-only)\n * Requires authentication + admin role\n */\nadminRouter.get('/api/admin/oauth/config', async (c) => {\n // Get OAuth configuration from environment\n const allowedDomainsEnv = process.env.OAUTH_ALLOWED_DOMAINS;\n if (!allowedDomainsEnv) {\n throw new Error('OAUTH_ALLOWED_DOMAINS environment variable is not configured');\n }\n\n const allowedDomains = allowedDomainsEnv\n .split(',')\n .map(d => d.trim())\n .filter(d => d.length > 0);\n\n // Check which providers are configured\n const providers = [];\n if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {\n providers.push({\n name: 'google',\n isConfigured: true,\n clientId: process.env.GOOGLE_CLIENT_ID.substring(0, 20) + '...'\n });\n }\n\n const response: OAuthConfigResponseActual = {\n providers,\n allowedDomains\n };\n\n return c.json(response, 200);\n});\n","// Shared imports and types for resource routes\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { authMiddleware } from '../../middleware/auth';\nimport type { EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\n\n// Shared router type\nexport type ResourcesRouterType = Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>;\n\n// Create a router with auth middleware pre-applied\nexport function createResourceRouter(): ResourcesRouterType {\n const router = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\n router.use('/api/resources/*', authMiddleware);\n router.use('/api/clone-tokens/*', authMiddleware);\n router.use('/resources/*', authMiddleware); // W3C URI endpoints also require auth\n return router;\n}","/**\n * Create Resource Route - Multipart/Form-Data Version\n *\n * Handles binary content upload via multipart/form-data:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Parses multipart form data (no JSON validation middleware)\n * - Supports binary content (images, PDFs, video, etc.)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { userId, type CreationMethod } from '@semiont/core';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { ResourceOperations } from '@semiont/make-meaning';\n\ntype ContentFormat = components['schemas']['ContentFormat'];\n\nexport function registerCreateResource(router: ResourcesRouterType) {\n /**\n * POST /resources\n *\n * Create a new resource with binary content support via multipart/form-data\n * Requires authentication\n * Parses FormData (no JSON validation middleware)\n */\n router.post('/resources', async (c) => {\n const user = c.get('user');\n const config = c.get('config');\n\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Parse multipart/form-data\n const formData = await c.req.formData();\n\n // Extract fields\n const name = formData.get('name') as string;\n const file = formData.get('file') as File;\n const formatRaw = formData.get('format') as string;\n const language = formData.get('language') as string | null;\n const entityTypesStr = formData.get('entityTypes') as string | null;\n const creationMethod = formData.get('creationMethod') as string | null;\n\n // Validate required fields\n if (!name || !file || !formatRaw) {\n throw new HTTPException(400, {\n message: 'Missing required fields: name, file, format'\n });\n }\n\n // Type-cast to ContentFormat (OpenAPI validates this enum at spec level)\n const format = formatRaw as ContentFormat;\n\n // Parse entityTypes from JSON string\n const entityTypes = entityTypesStr ? JSON.parse(entityTypesStr) : [];\n\n // Convert File to Buffer\n const arrayBuffer = await file.arrayBuffer();\n const contentBuffer = Buffer.from(arrayBuffer);\n\n // Delegate to make-meaning for resource creation\n const { eventStore, repStore } = c.get('makeMeaning');\n const response = await ResourceOperations.createResource(\n {\n name,\n content: contentBuffer,\n format,\n language: language || undefined,\n entityTypes,\n creationMethod: (creationMethod || undefined) as CreationMethod | undefined,\n },\n userId(user.id),\n eventStore,\n repStore,\n config\n );\n\n // Set Location header to the resource URI\n c.header('Location', response.resource['@id']);\n\n return c.json(response, 201);\n });\n}\n","/**\n * Content Negotiation Middleware\n *\n * Handles W3C-compliant content negotiation for resource and annotation URIs.\n *\n * Per W3C Web Annotation Data Model:\n * - Resource/Annotation URIs MUST be globally resolvable\n * - When Accept: application/ld+json -> return JSON-LD representation\n * - When Accept: text/html -> redirect to frontend viewer\n * - Default to JSON-LD for API clients\n */\n\nimport { Context } from 'hono';\n\n/**\n * Determines if request prefers HTML over JSON-LD\n *\n * Checks both Accept header and User-Agent to detect browsers vs API clients\n */\nexport function prefersHtml(c: Context): boolean {\n const acceptHeader = c.req.header('Accept') || '';\n const userAgent = c.req.header('User-Agent') || '';\n\n // Check what content types are accepted\n const acceptsHtml = acceptHeader.includes('text/html');\n const acceptsJson = acceptHeader.includes('application/json') || acceptHeader.includes('application/ld+json');\n\n // If Accept header has ONLY JSON (no HTML), definitely prefer JSON\n // This handles fetch() API calls: fetch() sends \"Accept: application/json, */*;q=0.1\" or similar\n if (acceptsJson && !acceptsHtml) {\n return false;\n }\n\n // If Accept header has both HTML and JSON, check which comes first (higher priority)\n // e.g., \"text/html,application/json;q=0.9\" -> HTML has higher priority\n // e.g., \"application/json,text/html;q=0.9\" -> JSON has higher priority\n if (acceptsHtml && acceptsJson) {\n const htmlIndex = acceptHeader.indexOf('text/html');\n const jsonIndex = Math.min(\n acceptHeader.indexOf('application/json') >= 0 ? acceptHeader.indexOf('application/json') : Infinity,\n acceptHeader.indexOf('application/ld+json') >= 0 ? acceptHeader.indexOf('application/ld+json') : Infinity\n );\n // If HTML appears first, prefer HTML (browser navigation)\n // If JSON appears first, prefer JSON (API call)\n if (htmlIndex < jsonIndex) {\n return true;\n } else {\n return false;\n }\n }\n\n // Check if User-Agent indicates a browser (Mozilla, Chrome, Safari, Edge, etc.)\n const isBrowser = /Mozilla|Chrome|Safari|Edge|Firefox|Opera/.test(userAgent);\n\n // If User-Agent is a browser AND no Accept header specified, prefer HTML\n // This handles direct browser navigation without explicit Accept\n if (isBrowser && !acceptHeader && !userAgent.includes('curl')) {\n return true;\n }\n\n // If User-Agent is a browser AND accepts HTML (no JSON), prefer HTML\n // This handles direct browser navigation with HTML Accept\n if (isBrowser && acceptsHtml && !userAgent.includes('curl')) {\n return true;\n }\n\n // Default: only prefer HTML if Accept header explicitly includes text/html\n return acceptsHtml && !acceptsJson;\n}\n\n/**\n * Determines if request prefers JSON-LD\n *\n * JSON-LD is the W3C standard format for Web Annotations\n * Returns the opposite of prefersHtml() - they are mutually exclusive\n */\nexport function prefersJsonLd(c: Context): boolean {\n // If client prefers HTML, it doesn't prefer JSON-LD\n if (prefersHtml(c)) {\n return false;\n }\n\n const acceptHeader = c.req.header('Accept') || '';\n\n // Check for explicit JSON-LD request\n if (acceptHeader.includes('application/ld+json')) {\n return true;\n }\n\n // Check for generic JSON request (default to JSON-LD)\n if (acceptHeader.includes('application/json')) {\n return true;\n }\n\n // Default to JSON-LD for API clients\n return true;\n}\n\n/**\n * Gets the frontend URL from environment\n */\nexport function getFrontendUrl(): string {\n const frontendUrl = process.env.FRONTEND_URL;\n if (!frontendUrl) {\n throw new Error('FRONTEND_URL environment variable is required for content negotiation');\n }\n return frontendUrl;\n}\n","/**\n * SSE Client for Semiont Streaming Endpoints\n *\n * Provides type-safe methods for Server-Sent Events streaming.\n * Does NOT use ky - uses native fetch() for SSE support.\n */\n\nimport { createSSEStream } from './stream';\nimport type { SSEStream } from './types';\nimport type { ResourceUri, AnnotationUri } from '@semiont/core';\nimport type { AccessToken, BaseUrl, EntityType, Logger } from '@semiont/core';\nimport type { components } from '@semiont/core';\n\n/**\n * SSE meta event for stream connection lifecycle\n * Internal to SSE infrastructure, not part of core event protocol\n */\nexport const SSE_STREAM_CONNECTED = 'stream-connected' as const;\nexport type SSEStreamConnected = typeof SSE_STREAM_CONNECTED;\n\n/**\n * Request body for reference annotation stream\n */\nexport interface AnnotateReferencesStreamRequest {\n entityTypes: EntityType[];\n includeDescriptiveReferences?: boolean;\n}\n\n/**\n * Request body for generation stream\n * Uses generated type from OpenAPI schema\n */\nexport type YieldResourceStreamRequest = components['schemas']['YieldResourceStreamRequest'];\n\n/**\n * Request body for highlight annotation stream\n */\nexport interface AnnotateHighlightsStreamRequest {\n instructions?: string;\n /** Desired number of highlights per 2000 words (1-15) */\n density?: number;\n}\n\n/**\n * Request body for assessment annotation stream\n */\nexport interface AnnotateAssessmentsStreamRequest {\n instructions?: string;\n tone?: 'analytical' | 'critical' | 'balanced' | 'constructive';\n /** Desired number of assessments per 2000 words (1-10) */\n density?: number;\n}\n\n/**\n * Request body for comment annotation stream\n */\nexport interface AnnotateCommentsStreamRequest {\n instructions?: string;\n tone?: 'scholarly' | 'explanatory' | 'conversational' | 'technical';\n /** Desired number of comments per 2000 words (2-12) */\n density?: number;\n}\n\n/**\n * Request body for tag annotation stream\n */\nexport interface AnnotateTagsStreamRequest {\n schemaId: string;\n categories: string[];\n}\n\n/**\n * SSE Client configuration\n */\nexport interface SSEClientConfig {\n baseUrl: BaseUrl;\n logger?: Logger;\n}\n\n/**\n * Options for SSE requests\n */\nexport interface SSERequestOptions {\n auth?: AccessToken;\n /** EventBus for event-driven architecture (required) */\n eventBus: import('@semiont/core').EventBus;\n}\n\n/**\n * SSE Client for real-time streaming operations\n *\n * Separate from the main HTTP client to clearly mark streaming endpoints.\n * Uses native fetch() instead of ky for SSE support.\n *\n * This client is stateless - auth tokens are passed per-request via options.\n *\n * @example\n * ```typescript\n * const sseClient = new SSEClient({\n * baseUrl: 'http://localhost:4000'\n * });\n *\n * const stream = sseClient.annotateReferences(\n * 'http://localhost:4000/resources/doc-123',\n * { entityTypes: ['Person', 'Organization'] },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((p) => console.log(p.message));\n * stream.onComplete((r) => console.log(`Found ${r.foundCount} entities`));\n * stream.onError((e) => console.error('Detection failed:', e));\n * ```\n */\nexport class SSEClient {\n private baseUrl: BaseUrl;\n private logger?: Logger;\n\n constructor(config: SSEClientConfig) {\n // Remove trailing slash for consistent URL construction\n this.baseUrl = (config.baseUrl.endsWith('/') ? config.baseUrl.slice(0, -1) : config.baseUrl) as BaseUrl;\n this.logger = config.logger;\n }\n\n /**\n * Get common headers for SSE requests\n */\n private getHeaders(auth?: AccessToken): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n if (auth) {\n headers['Authorization'] = `Bearer ${auth}`;\n }\n\n return headers;\n }\n\n /**\n * Extract resource ID from URI\n *\n * Handles both full URIs and plain IDs:\n * - 'http://localhost:4000/resources/doc-123' -> 'doc-123'\n * - 'doc-123' -> 'doc-123'\n */\n private extractId(uri: string): string {\n const parts = uri.split('/');\n return parts[parts.length - 1];\n }\n\n /**\n * Detect annotations in a resource (streaming)\n *\n * Streams entity detection progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (entity types to detect)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateReferences(\n * 'http://localhost:4000/resources/doc-123',\n * { entityTypes: ['Person', 'Organization'] },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`Scanning: ${progress.currentEntityType}`);\n * console.log(`Progress: ${progress.processedEntityTypes}/${progress.totalEntityTypes}`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Found ${result.foundCount} entities`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateReferences(\n resourceId: ResourceUri,\n request: AnnotateReferencesStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-references-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Generate resource from annotation (streaming)\n *\n * Streams resource generation progress via Server-Sent Events.\n *\n * @param resourceId - Source resource URI or ID\n * @param annotationId - Annotation URI or ID to use as generation source\n * @param request - Generation options (title, prompt, language)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.yieldResourceFromAnnotation(\n * 'http://localhost:4000/resources/doc-123',\n * 'http://localhost:4000/annotations/ann-456',\n * { language: 'es', title: 'Spanish Summary' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Yielded resource: ${result.resourceId}`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Yield failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n yieldResourceFromAnnotation(\n resourceId: ResourceUri,\n annotationId: AnnotationUri,\n request: YieldResourceStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const resId = this.extractId(resourceId);\n const annId = this.extractId(annotationId);\n const url = `${this.baseUrl}/resources/${resId}/annotations/${annId}/yield-resource-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['yield:progress'],\n completeEvent: 'yield:finished',\n errorEvent: 'yield:failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect highlights in a resource (streaming)\n *\n * Streams highlight annotation progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateHighlights(\n * 'http://localhost:4000/resources/doc-123',\n * { instructions: 'Focus on key technical points' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} highlights`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateHighlights(\n resourceId: ResourceUri,\n request: AnnotateHighlightsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-highlights-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect assessments in a resource (streaming)\n *\n * Streams assessment annotation progress via Server-Sent Events.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateAssessments(\n * 'http://localhost:4000/resources/doc-123',\n * { instructions: 'Evaluate claims for accuracy' },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(progress.message);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} assessments`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateAssessments(\n resourceId: ResourceUri,\n request: AnnotateAssessmentsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-assessments-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect comments in a resource (streaming)\n *\n * Streams comment annotation progress via Server-Sent Events.\n * Uses AI to identify passages that would benefit from explanatory comments\n * and creates comment annotations with contextual information.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (optional instructions and tone)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateComments(\n * 'http://localhost:4000/resources/doc-123',\n * {\n * instructions: 'Focus on technical terminology',\n * tone: 'scholarly'\n * },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.createdCount} comments`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateComments(\n resourceId: ResourceUri,\n request: AnnotateCommentsStreamRequest = {},\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-comments-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Detect tags in a resource (streaming)\n *\n * Streams tag annotation progress via Server-Sent Events.\n * Uses AI to identify passages serving specific structural roles\n * (e.g., IRAC, IMRAD, Toulmin) and creates tag annotations with dual-body structure.\n *\n * @param resourceId - Resource URI or ID\n * @param request - Detection configuration (schema and categories to detect)\n * @param options - Request options (auth token)\n * @returns SSE stream controller with progress/complete/error callbacks\n *\n * @example\n * ```typescript\n * const stream = sseClient.annotateTags(\n * 'http://localhost:4000/resources/doc-123',\n * {\n * schemaId: 'legal-irac',\n * categories: ['Issue', 'Rule', 'Application', 'Conclusion']\n * },\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((progress) => {\n * console.log(`${progress.status}: ${progress.percentage}%`);\n * console.log(`Processing ${progress.currentCategory}...`);\n * });\n *\n * stream.onComplete((result) => {\n * console.log(`Detection complete! Created ${result.tagsCreated} tags`);\n * });\n *\n * stream.onError((error) => {\n * console.error('Detection failed:', error.message);\n * });\n *\n * // Cleanup when done\n * stream.close();\n * ```\n */\n annotateTags(\n resourceId: ResourceUri,\n request: AnnotateTagsStreamRequest,\n options: SSERequestOptions\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/annotate-tags-stream`;\n\n return createSSEStream(\n url,\n {\n method: 'POST',\n headers: this.getHeaders(options.auth),\n body: JSON.stringify(request)\n },\n {\n progressEvents: ['mark:progress'],\n completeEvent: 'mark:assist-finished',\n errorEvent: 'mark:assist-failed',\n eventBus: options.eventBus,\n eventPrefix: undefined\n },\n this.logger\n );\n }\n\n /**\n * Subscribe to resource events (long-lived stream)\n *\n * Opens a long-lived SSE connection to receive real-time events for a resource.\n * Used for collaborative editing - see events from other users as they happen.\n *\n * This stream does NOT have a complete event - it stays open until explicitly closed.\n *\n * @param resourceId - Resource URI or ID to subscribe to\n * @param options - Request options (auth token)\n * @returns SSE stream controller with event callback\n *\n * @example\n * ```typescript\n * const stream = sseClient.resourceEvents(\n * 'http://localhost:4000/resources/doc-123',\n * { auth: 'your-token' }\n * );\n *\n * stream.onProgress((event) => {\n * console.log(`Event: ${event.type}`);\n * console.log(`User: ${event.userId}`);\n * console.log(`Sequence: ${event.metadata.sequenceNumber}`);\n * console.log(`Payload:`, event.payload);\n * });\n *\n * stream.onError((error) => {\n * console.error('Stream error:', error.message);\n * });\n *\n * // Close when no longer needed (e.g., component unmount)\n * stream.close();\n * ```\n */\n resourceEvents(\n resourceId: ResourceUri,\n options: SSERequestOptions & { onConnected?: () => void }\n ): SSEStream {\n const id = this.extractId(resourceId);\n const url = `${this.baseUrl}/resources/${id}/events/stream`;\n\n // Events auto-route to EventBus:\n // - Domain events (annotation.added, job.completed, etc.) emit to both their specific channel and 'make-meaning:event'\n // - stream-connected emits to 'stream-connected' channel (subscribers can handle or ignore)\n // No manual .on() registration needed - declarative auto-routing based on Event Map\n const stream = createSSEStream(\n url,\n {\n method: 'GET',\n headers: this.getHeaders(options.auth)\n },\n {\n progressEvents: ['*'], // Accept all event types (long-lived stream)\n completeEvent: null, // Never completes (long-lived)\n errorEvent: null, // No error event (errors throw)\n eventBus: options.eventBus\n },\n this.logger\n );\n\n // Handle onConnected callback by subscribing to SSE stream-connected event\n // Note: Type assertion needed because SSE_STREAM_CONNECTED is SSE infrastructure, not part of EventMap\n if (options.onConnected) {\n const sub = options.eventBus.get(SSE_STREAM_CONNECTED as any).subscribe(() => {\n options.onConnected!();\n sub.unsubscribe(); // One-time callback\n });\n }\n\n return stream;\n }\n}\n","/**\n * Annotation and Selector Utilities\n *\n * Pure TypeScript utilities for working with W3C Web Annotations.\n * No React dependencies - safe to use in any JavaScript environment.\n *\n * Body is either empty array (stub) or single SpecificResource (resolved)\n * Body can be array of TextualBody (tagging) + SpecificResource (linking)\n * Target can be simple string IRI or object with source and optional selector\n */\n\nimport type { components } from '@semiont/core';\nimport type { ResourceUri } from '@semiont/core';\nimport { resourceUri } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\ntype HighlightAnnotation = Annotation;\ntype ReferenceAnnotation = Annotation;\ntype TextPositionSelector = components['schemas']['TextPositionSelector'];\ntype TextQuoteSelector = components['schemas']['TextQuoteSelector'];\ntype SvgSelector = components['schemas']['SvgSelector'];\ntype FragmentSelector = components['schemas']['FragmentSelector'];\ntype Selector = TextPositionSelector | TextQuoteSelector | SvgSelector | FragmentSelector;\n\n// Re-export selector types for convenience\nexport type { TextPositionSelector, TextQuoteSelector, SvgSelector, FragmentSelector, Selector };\n\n/**\n * Get the source from an annotation body (null if stub)\n * Search for SpecificResource in body array\n */\nexport function getBodySource(body: Annotation['body']): ResourceUri | null {\n if (Array.isArray(body)) {\n // Search for SpecificResource with source\n for (const item of body) {\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'source' in item\n ) {\n const itemType = (item as { type: unknown }).type;\n const itemSource = (item as { source: unknown }).source;\n\n if (itemType === 'SpecificResource' && typeof itemSource === 'string') {\n return resourceUri(itemSource);\n }\n }\n }\n return null; // No SpecificResource found = stub\n }\n\n // Single body object (SpecificResource)\n if (\n typeof body === 'object' &&\n body !== null &&\n 'type' in body &&\n 'source' in body\n ) {\n const bodyType = (body as { type: unknown }).type;\n const bodySource = (body as { source: unknown }).source;\n\n if (bodyType === 'SpecificResource' && typeof bodySource === 'string') {\n return resourceUri(bodySource);\n }\n }\n\n return null;\n}\n\n/**\n * Get the type from an annotation body (returns first body type in array)\n */\nexport function getBodyType(body: Annotation['body']): 'TextualBody' | 'SpecificResource' | null {\n if (Array.isArray(body)) {\n if (body.length === 0) {\n return null;\n }\n // Return type of first body item\n if (typeof body[0] === 'object' && body[0] !== null && 'type' in body[0]) {\n const firstType = (body[0] as { type: unknown }).type;\n if (firstType === 'TextualBody' || firstType === 'SpecificResource') {\n return firstType;\n }\n }\n return null;\n }\n\n // Single body object\n if (typeof body === 'object' && body !== null && 'type' in body) {\n const bodyType = (body as { type: unknown }).type;\n if (bodyType === 'TextualBody' || bodyType === 'SpecificResource') {\n return bodyType;\n }\n }\n\n return null;\n}\n\n/**\n * Check if body is resolved (has a source)\n * Check for SpecificResource in body array\n */\nexport function isBodyResolved(body: Annotation['body']): boolean {\n return getBodySource(body) !== null;\n}\n\n/**\n * Get the source IRI from target (handles both string and object forms)\n */\nexport function getTargetSource(target: Annotation['target']): ResourceUri {\n if (typeof target === 'string') {\n return resourceUri(target);\n }\n return resourceUri(target.source);\n}\n\n/**\n * Get the selector from target (undefined if string or no selector)\n */\nexport function getTargetSelector(target: Annotation['target']) {\n if (typeof target === 'string') {\n return undefined;\n }\n return target.selector;\n}\n\n/**\n * Check if target has a selector\n */\nexport function hasTargetSelector(target: Annotation['target']): boolean {\n return typeof target !== 'string' && target.selector !== undefined;\n}\n\n/**\n * Type guard to check if an annotation is a highlight\n */\nexport function isHighlight(annotation: Annotation): annotation is HighlightAnnotation {\n return annotation.motivation === 'highlighting';\n}\n\n/**\n * Type guard to check if an annotation is a reference (linking)\n */\nexport function isReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return annotation.motivation === 'linking';\n}\n\n/**\n * Type guard to check if an annotation is an assessment\n */\nexport function isAssessment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'assessing';\n}\n\n/**\n * Type guard to check if an annotation is a comment\n */\nexport function isComment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'commenting';\n}\n\n/**\n * Type guard to check if an annotation is a tag\n */\nexport function isTag(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'tagging';\n}\n\n/**\n * Extract comment text from a comment annotation's body\n * @param annotation - The annotation to extract comment text from\n * @returns The comment text, or undefined if not a comment or no text found\n */\nexport function getCommentText(annotation: Annotation): string | undefined {\n if (!isComment(annotation)) return undefined;\n const body = Array.isArray(annotation.body) ? annotation.body[0] : annotation.body;\n if (body && 'value' in body) {\n return body.value;\n }\n return undefined;\n}\n\n/**\n * Type guard to check if a reference annotation is a stub (unresolved)\n * Stub if no SpecificResource in body array\n */\nexport function isStubReference(annotation: Annotation): boolean {\n return isReference(annotation) && !isBodyResolved(annotation.body);\n}\n\n/**\n * Type guard to check if a reference annotation is resolved\n * Resolved if SpecificResource exists in body array\n */\nexport function isResolvedReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return isReference(annotation) && isBodyResolved(annotation.body);\n}\n\n// =============================================================================\n// SELECTOR UTILITIES\n// =============================================================================\n\n/**\n * Get the exact text from a selector (single or array)\n *\n * When selector is an array, tries to find a TextQuoteSelector (which has exact text).\n * TextPositionSelector does not have exact text, only character offsets.\n * Handles undefined selector (when target is a string IRI with no selector)\n */\nexport function getExactText(selector: Selector | Selector[] | undefined): string {\n if (!selector) {\n return ''; // No selector means entire resource\n }\n const selectors = Array.isArray(selector) ? selector : [selector];\n\n // Try to find TextQuoteSelector (has exact text)\n const quoteSelector = selectors.find(s => s.type === 'TextQuoteSelector') as TextQuoteSelector | undefined;\n if (quoteSelector) {\n return quoteSelector.exact;\n }\n\n // No TextQuoteSelector found\n return '';\n}\n\n/**\n * Get the exact text from an annotation's target selector\n * Uses getTargetSelector helper to safely get selector\n */\nexport function getAnnotationExactText(annotation: Annotation): string {\n const selector = getTargetSelector(annotation.target);\n return getExactText(selector as Selector | Selector[] | undefined);\n}\n\n/**\n * Get the primary selector from a selector (single or array)\n *\n * When selector is an array, returns the first selector.\n * When selector is a single object, returns it as-is.\n */\nexport function getPrimarySelector(selector: Selector | Selector[]): Selector {\n if (Array.isArray(selector)) {\n if (selector.length === 0) {\n throw new Error('Empty selector array');\n }\n const first = selector[0];\n if (!first) {\n throw new Error('Invalid selector array');\n }\n return first;\n }\n return selector;\n}\n\n/**\n * Get TextPositionSelector from a selector (single or array)\n *\n * Returns the first TextPositionSelector found, or null if none exists.\n * Handles undefined selector (when target is a string IRI with no selector)\n */\nexport function getTextPositionSelector(selector: Selector | Selector[] | undefined): TextPositionSelector | null {\n if (!selector) return null; // No selector means entire resource\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'TextPositionSelector');\n if (!found) return null;\n return found.type === 'TextPositionSelector' ? found : null;\n}\n\n/**\n * Get TextQuoteSelector from a selector (single or array)\n *\n * Returns the first TextQuoteSelector found, or null if none exists.\n */\nexport function getTextQuoteSelector(selector: Selector | Selector[]): TextQuoteSelector | null {\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'TextQuoteSelector');\n if (!found) return null;\n return found.type === 'TextQuoteSelector' ? found : null;\n}\n\n/**\n * Get SvgSelector from a selector (single or array)\n *\n * Returns the first SvgSelector found, or null if none exists.\n */\nexport function getSvgSelector(selector: Selector | Selector[] | undefined): SvgSelector | null {\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'SvgSelector');\n if (!found) return null;\n return found.type === 'SvgSelector' ? found : null;\n}\n\n/**\n * Get FragmentSelector from a selector (single or array)\n *\n * Returns the first FragmentSelector found, or null if none exists.\n */\nexport function getFragmentSelector(selector: Selector | Selector[] | undefined): FragmentSelector | null {\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'FragmentSelector');\n if (!found) return null;\n return found.type === 'FragmentSelector' ? found : null;\n}\n\n/**\n * Validate SVG markup for W3C compliance\n *\n * Checks that:\n * - SVG contains xmlns attribute\n * - SVG is well-formed XML\n * - SVG contains at least one shape element\n *\n * @returns null if valid, error message if invalid\n */\nexport function validateSvgMarkup(svg: string): string | null {\n // Check for xmlns attribute (required by W3C spec)\n if (!svg.includes('xmlns=\"http://www.w3.org/2000/svg\"')) {\n return 'SVG must include xmlns=\"http://www.w3.org/2000/svg\" attribute';\n }\n\n // Check for basic SVG tag structure\n if (!svg.includes('<svg') || !svg.includes('</svg>')) {\n return 'SVG must have opening and closing tags';\n }\n\n // Check for at least one shape element\n const shapeElements = ['rect', 'circle', 'ellipse', 'polygon', 'polyline', 'path', 'line'];\n const hasShape = shapeElements.some(shape =>\n svg.includes(`<${shape}`) || svg.includes(`<${shape} `)\n );\n\n if (!hasShape) {\n return 'SVG must contain at least one shape element (rect, circle, ellipse, polygon, polyline, path, or line)';\n }\n\n return null; // Valid\n}\n\n/**\n * Extract bounding box from SVG markup\n *\n * Attempts to extract x, y, width, height from the SVG viewBox or root element.\n * Returns null if bounding box cannot be determined.\n */\nexport function extractBoundingBox(svg: string): { x: number; y: number; width: number; height: number } | null {\n // Try to extract viewBox attribute from SVG element\n const viewBoxMatch = svg.match(/<svg[^>]*viewBox=\"([^\"]+)\"/);\n if (viewBoxMatch) {\n const values = viewBoxMatch[1].split(/\\s+/).map(parseFloat);\n if (values.length === 4 && values.every(v => !isNaN(v))) {\n return {\n x: values[0],\n y: values[1],\n width: values[2],\n height: values[3]\n };\n }\n }\n\n // Try to extract width/height attributes from SVG element (assume x=0, y=0)\n const svgTagMatch = svg.match(/<svg[^>]*>/);\n if (svgTagMatch) {\n const svgTag = svgTagMatch[0];\n const widthMatch = svgTag.match(/width=\"([^\"]+)\"/);\n const heightMatch = svgTag.match(/height=\"([^\"]+)\"/);\n\n if (widthMatch && heightMatch) {\n const width = parseFloat(widthMatch[1]);\n const height = parseFloat(heightMatch[1]);\n\n if (!isNaN(width) && !isNaN(height)) {\n return { x: 0, y: 0, width, height };\n }\n }\n }\n\n return null;\n}\n","/**\n * Locale information\n * Copied from SDK for frontend use\n */\n\nexport interface LocaleInfo {\n code: string;\n nativeName: string;\n englishName: string;\n}\n\nexport const LOCALES: readonly LocaleInfo[] = [\n { code: 'ar', nativeName: 'العربية', englishName: 'Arabic' },\n { code: 'bn', nativeName: 'বাংলা', englishName: 'Bengali' },\n { code: 'cs', nativeName: 'Čeština', englishName: 'Czech' },\n { code: 'da', nativeName: 'Dansk', englishName: 'Danish' },\n { code: 'de', nativeName: 'Deutsch', englishName: 'German' },\n { code: 'el', nativeName: 'Ελληνικά', englishName: 'Greek' },\n { code: 'en', nativeName: 'English', englishName: 'English' },\n { code: 'es', nativeName: 'Español', englishName: 'Spanish' },\n { code: 'fa', nativeName: 'فارسی', englishName: 'Persian' },\n { code: 'fi', nativeName: 'Suomi', englishName: 'Finnish' },\n { code: 'fr', nativeName: 'Français', englishName: 'French' },\n { code: 'he', nativeName: 'עברית', englishName: 'Hebrew' },\n { code: 'hi', nativeName: 'हिन्दी', englishName: 'Hindi' },\n { code: 'id', nativeName: 'Bahasa Indonesia', englishName: 'Indonesian' },\n { code: 'it', nativeName: 'Italiano', englishName: 'Italian' },\n { code: 'ja', nativeName: '日本語', englishName: 'Japanese' },\n { code: 'ko', nativeName: '한국어', englishName: 'Korean' },\n { code: 'ms', nativeName: 'Bahasa Melayu', englishName: 'Malay' },\n { code: 'nl', nativeName: 'Nederlands', englishName: 'Dutch' },\n { code: 'no', nativeName: 'Norsk', englishName: 'Norwegian' },\n { code: 'pl', nativeName: 'Polski', englishName: 'Polish' },\n { code: 'pt', nativeName: 'Português', englishName: 'Portuguese' },\n { code: 'ro', nativeName: 'Română', englishName: 'Romanian' },\n { code: 'sv', nativeName: 'Svenska', englishName: 'Swedish' },\n { code: 'th', nativeName: 'ไทย', englishName: 'Thai' },\n { code: 'tr', nativeName: 'Türkçe', englishName: 'Turkish' },\n { code: 'uk', nativeName: 'Українська', englishName: 'Ukrainian' },\n { code: 'vi', nativeName: 'Tiếng Việt', englishName: 'Vietnamese' },\n { code: 'zh', nativeName: '中文', englishName: 'Chinese' },\n] as const;\n\n// Create lookup map for efficient access\nconst localeByCode = new Map<string, LocaleInfo>(\n LOCALES.map(locale => [locale.code.toLowerCase(), locale])\n);\n\n/**\n * Get locale information by code\n */\nexport function getLocaleInfo(code: string | undefined): LocaleInfo | undefined {\n if (!code) return undefined;\n return localeByCode.get(code.toLowerCase());\n}\n\n/**\n * Get the native name of a language by its locale code\n */\nexport function getLocaleNativeName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.nativeName;\n}\n\n/**\n * Get the English name of a language by its locale code\n */\nexport function getLocaleEnglishName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.englishName;\n}\n\n/**\n * Format locale code for display as \"Native Name (code)\"\n */\nexport function formatLocaleDisplay(code: string | undefined): string | undefined {\n if (!code) return undefined;\n\n const info = getLocaleInfo(code);\n if (!info) return code;\n\n return `${info.nativeName} (${code.toLowerCase()})`;\n}\n\n/**\n * Get all supported locale codes\n */\nexport function getAllLocaleCodes(): readonly string[] {\n return LOCALES.map(l => l.code);\n}\n","/**\n * Helper functions for working with W3C ResourceDescriptor\n */\n\nimport type { components } from '@semiont/core';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\ntype Representation = components['schemas']['Representation'];\n\n/**\n * Get the resource ID from @id property\n *\n * For internal resources: extracts UUID from \"http://localhost:4000/resources/{uuid}\"\n * For external resources: returns undefined\n *\n * This is used for routing - the frontend URL should contain only the resource ID,\n * not the full HTTP URI.\n */\nexport function getResourceId(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource) return undefined;\n\n const fullId = resource['@id'];\n\n // For internal resources, extract the last path segment\n // http://localhost:4000/resources/{uuid} -> {uuid}\n if (fullId.includes('/resources/')) {\n const parts = fullId.split('/resources/');\n const lastPart = parts[parts.length - 1];\n return lastPart || undefined;\n }\n\n // For external resources, cannot extract ID\n return undefined;\n}\n\n/**\n * Get the primary representation (first or only representation)\n */\nexport function getPrimaryRepresentation(resource: ResourceDescriptor | undefined): Representation | undefined {\n if (!resource?.representations) return undefined;\n const reps = Array.isArray(resource.representations)\n ? resource.representations\n : [resource.representations];\n return reps[0];\n}\n\n/**\n * Get the media type from the primary representation\n */\nexport function getPrimaryMediaType(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.mediaType;\n}\n\n/**\n * Get the checksum from the primary representation\n */\nexport function getChecksum(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.checksum;\n}\n\n/**\n * Get the language from the primary representation\n */\nexport function getLanguage(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.language;\n}\n\n/**\n * Get storage URI from primary representation\n *\n * @param resource - ResourceDescriptor\n * @returns Storage URI or undefined\n */\nexport function getStorageUri(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.storageUri;\n}\n\n/**\n * Get creator agent from wasAttributedTo\n * Handles both single agent and array of agents\n *\n * @param resource - ResourceDescriptor\n * @returns First agent or undefined\n */\nexport function getCreator(resource: ResourceDescriptor | undefined): components['schemas']['Agent'] | undefined {\n if (!resource?.wasAttributedTo) return undefined;\n\n return Array.isArray(resource.wasAttributedTo)\n ? resource.wasAttributedTo[0]\n : resource.wasAttributedTo;\n}\n\n/**\n * Get derived-from URI\n * Handles both single URI and array of URIs\n *\n * @param resource - ResourceDescriptor\n * @returns First derivation URI or undefined\n */\nexport function getDerivedFrom(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource?.wasDerivedFrom) return undefined;\n\n return Array.isArray(resource.wasDerivedFrom)\n ? resource.wasDerivedFrom[0]\n : resource.wasDerivedFrom;\n}\n\n/**\n * Check if resource is archived (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if archived, false otherwise\n */\nexport function isArchived(resource: ResourceDescriptor | undefined): boolean {\n return resource?.archived === true;\n}\n\n/**\n * Get entity types from resource (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns Array of entity types, empty if not set\n */\nexport function getResourceEntityTypes(resource: ResourceDescriptor | undefined): string[] {\n return resource?.entityTypes || [];\n}\n\n/**\n * Check if resource is a draft (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if draft, false otherwise\n */\nexport function isDraft(resource: ResourceDescriptor | undefined): boolean {\n return resource?.isDraft === true;\n}\n\n/**\n * Map charset names to Node.js Buffer encoding names\n * Node.js Buffer.toString() supports: 'utf8', 'utf16le', 'latin1', 'base64', 'hex', 'ascii', 'binary', 'ucs2'\n *\n * @param charset - Charset name (e.g., \"UTF-8\", \"ISO-8859-1\", \"Windows-1252\")\n * @returns Node.js BufferEncoding\n */\nexport function getNodeEncoding(charset: string): BufferEncoding {\n const normalized = charset.toLowerCase().replace(/[-_]/g, '');\n\n // Map common charset names to Node.js encodings\n const charsetMap: Record<string, BufferEncoding> = {\n 'utf8': 'utf8',\n 'iso88591': 'latin1',\n 'latin1': 'latin1',\n 'ascii': 'ascii',\n 'usascii': 'ascii',\n 'utf16le': 'utf16le',\n 'ucs2': 'ucs2',\n 'binary': 'binary',\n 'windows1252': 'latin1', // Windows-1252 is a superset of Latin-1\n 'cp1252': 'latin1',\n };\n\n return charsetMap[normalized] || 'utf8';\n}\n\n/**\n * Decode a representation buffer to string using the correct charset\n * Extracts charset from media type and uses appropriate encoding\n *\n * @param buffer - The raw representation data\n * @param mediaType - Media type with optional charset (e.g., \"text/plain; charset=iso-8859-1\")\n * @returns Decoded string\n *\n * @example\n * ```typescript\n * const content = decodeRepresentation(buffer, \"text/plain; charset=utf-8\");\n * const legacy = decodeRepresentation(buffer, \"text/plain; charset=windows-1252\");\n * ```\n */\nexport function decodeRepresentation(buffer: Buffer, mediaType: string): string {\n // Extract charset from mediaType (e.g., \"text/plain; charset=iso-8859-1\")\n const charsetMatch = mediaType.match(/charset=([^\\s;]+)/i);\n const charset = (charsetMatch?.[1] || 'utf-8').toLowerCase();\n\n // Map to Node.js encoding\n const encoding = getNodeEncoding(charset);\n\n return buffer.toString(encoding);\n}\n","/**\n * Tag Schema Registry\n *\n * Defines structural analysis frameworks for automatic tagging detection.\n * Each schema provides categories that passages can be classified into\n * based on their structural role (not their semantic content).\n *\n * Examples: IRAC (legal), IMRAD (scientific), Toulmin (argumentation)\n */\n\nexport interface TagCategory {\n name: string;\n description: string;\n examples: string[];\n}\n\nexport interface TagSchema {\n id: string;\n name: string;\n description: string;\n domain: 'legal' | 'scientific' | 'general';\n tags: TagCategory[];\n}\n\nexport const TAG_SCHEMAS: Record<string, TagSchema> = {\n 'legal-irac': {\n id: 'legal-irac',\n name: 'Legal Analysis (IRAC)',\n description: 'Issue, Rule, Application, Conclusion framework for legal reasoning',\n domain: 'legal',\n tags: [\n {\n name: 'Issue',\n description: 'The legal question or problem to be resolved',\n examples: [\n 'What is the central legal question?',\n 'What must the court decide?',\n 'What is the dispute about?'\n ]\n },\n {\n name: 'Rule',\n description: 'The relevant law, statute, or legal principle',\n examples: [\n 'What law applies?',\n 'What is the legal standard?',\n 'What statute governs this case?'\n ]\n },\n {\n name: 'Application',\n description: 'How the rule applies to the specific facts',\n examples: [\n 'How does the law apply to these facts?',\n 'Analysis of the case',\n 'How do the facts satisfy the legal standard?'\n ]\n },\n {\n name: 'Conclusion',\n description: 'The resolution or outcome based on the analysis',\n examples: [\n 'What is the court\\'s decision?',\n 'What is the final judgment?',\n 'What is the holding?'\n ]\n }\n ]\n },\n\n 'scientific-imrad': {\n id: 'scientific-imrad',\n name: 'Scientific Paper (IMRAD)',\n description: 'Introduction, Methods, Results, Discussion structure for research papers',\n domain: 'scientific',\n tags: [\n {\n name: 'Introduction',\n description: 'Background, context, and research question',\n examples: [\n 'What is the research question?',\n 'Why is this important?',\n 'What is the hypothesis?'\n ]\n },\n {\n name: 'Methods',\n description: 'Experimental design and procedures',\n examples: [\n 'How was the study conducted?',\n 'What methods were used?',\n 'What was the experimental design?'\n ]\n },\n {\n name: 'Results',\n description: 'Findings and observations',\n examples: [\n 'What did the study find?',\n 'What are the data?',\n 'What were the observations?'\n ]\n },\n {\n name: 'Discussion',\n description: 'Interpretation and implications of results',\n examples: [\n 'What do the results mean?',\n 'What are the implications?',\n 'How do these findings relate to prior work?'\n ]\n }\n ]\n },\n\n 'argument-toulmin': {\n id: 'argument-toulmin',\n name: 'Argument Structure (Toulmin)',\n description: 'Claim, Evidence, Warrant, Counterargument, Rebuttal framework for argumentation',\n domain: 'general',\n tags: [\n {\n name: 'Claim',\n description: 'The main assertion or thesis',\n examples: [\n 'What is being argued?',\n 'What is the main point?',\n 'What position is being taken?'\n ]\n },\n {\n name: 'Evidence',\n description: 'Data or facts supporting the claim',\n examples: [\n 'What supports this claim?',\n 'What are the facts?',\n 'What data is provided?'\n ]\n },\n {\n name: 'Warrant',\n description: 'Reasoning connecting evidence to claim',\n examples: [\n 'Why does this evidence support the claim?',\n 'What is the logic?',\n 'How does this reasoning work?'\n ]\n },\n {\n name: 'Counterargument',\n description: 'Opposing viewpoints or objections',\n examples: [\n 'What are the objections?',\n 'What do critics say?',\n 'What are alternative views?'\n ]\n },\n {\n name: 'Rebuttal',\n description: 'Response to counterarguments',\n examples: [\n 'How is the objection addressed?',\n 'Why is the counterargument wrong?',\n 'How is the criticism answered?'\n ]\n }\n ]\n }\n};\n\n/**\n * Get a tag schema by ID\n */\nexport function getTagSchema(schemaId: string): TagSchema | null {\n return TAG_SCHEMAS[schemaId] || null;\n}\n\n/**\n * Get all available tag schemas\n */\nexport function getAllTagSchemas(): TagSchema[] {\n return Object.values(TAG_SCHEMAS);\n}\n\n/**\n * Get tag schemas filtered by domain\n */\nexport function getTagSchemasByDomain(domain: 'legal' | 'scientific' | 'general'): TagSchema[] {\n return Object.values(TAG_SCHEMAS).filter(schema => schema.domain === domain);\n}\n\n/**\n * Validate that a category name is valid for a schema\n */\nexport function isValidCategory(schemaId: string, categoryName: string): boolean {\n const schema = getTagSchema(schemaId);\n if (!schema) return false;\n return schema.tags.some(tag => tag.name === categoryName);\n}\n\n/**\n * Get a specific category from a schema\n */\nexport function getSchemaCategory(schemaId: string, categoryName: string): TagCategory | null {\n const schema = getTagSchema(schemaId);\n if (!schema) return null;\n return schema.tags.find(tag => tag.name === categoryName) || null;\n}\n","/**\n * Entity Type Extraction Utilities\n *\n * Extract entity types from annotation bodies.\n * Entity types are stored as TextualBody with purpose: \"tagging\"\n */\n\nimport type { components } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\n\n/**\n * Extract entity types from annotation bodies\n * Entity types are stored as TextualBody with purpose: \"tagging\"\n * Accepts any object with a body property matching Annotation['body']\n */\nexport function getEntityTypes(annotation: { body: Annotation['body'] }): string[] {\n // Extract from TextualBody bodies with purpose: \"tagging\"\n if (Array.isArray(annotation.body)) {\n const entityTags: string[] = [];\n\n for (const item of annotation.body) {\n // Runtime check for TextualBody with tagging purpose\n // TypeScript incorrectly narrows the union type here, so we use runtime checks only\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'value' in item &&\n 'purpose' in item\n ) {\n // Access properties as unknown first to avoid TypeScript narrowing issues\n const itemType = (item as { type: unknown }).type;\n const itemValue = (item as { value: unknown }).value;\n const itemPurpose = (item as { purpose: unknown }).purpose;\n\n if (itemType === 'TextualBody' && itemPurpose === 'tagging' && typeof itemValue === 'string' && itemValue.length > 0) {\n entityTags.push(itemValue);\n }\n }\n }\n\n return entityTags;\n }\n\n return [];\n}\n","/**\n * Get Resource URI Route - W3C Content Negotiation\n *\n * Single endpoint for all resource representations via content negotiation:\n * - Accept: application/ld+json -> returns JSON-LD metadata (default)\n * - Accept: text/plain, text/markdown, etc. -> returns raw representation\n * - ?view=semiont -> redirects to Semiont frontend viewer\n *\n * This implements W3C Web Annotation Data Model requirement that\n * resource URIs be globally resolvable.\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { EventQuery } from '@semiont/event-sourcing';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getFrontendUrl } from '../../../middleware/content-negotiation';\nimport { getPrimaryRepresentation, getPrimaryMediaType, decodeRepresentation } from '@semiont/api-client';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'get-resource-uri' });\n\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\ntype Annotation = components['schemas']['Annotation'];\n\nexport function registerGetResourceUri(router: ResourcesRouterType) {\n /**\n * GET /resources/:id\n *\n * W3C-compliant globally resolvable resource URI with full content negotiation:\n * - Accept: application/ld+json -> JSON-LD metadata (default)\n * - Accept: text/plain, text/markdown, etc. -> raw representation\n * - ?view=semiont -> 302 redirect to Semiont frontend viewer\n */\n router.get('/resources/:id', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n const { repStore } = c.get('makeMeaning');\n\n // Check for explicit view=semiont query parameter\n const view = c.req.query('view');\n if (view === 'semiont') {\n const frontendUrl = getFrontendUrl();\n const normalizedBase = frontendUrl.endsWith('/') ? frontendUrl.slice(0, -1) : frontendUrl;\n const redirectUrl = `${normalizedBase}/know/resource/${id}`;\n return c.redirect(redirectUrl, 302);\n }\n\n // Check Accept header for content negotiation\n const acceptHeader = c.req.header('Accept') || 'application/ld+json';\n\n // If requesting raw representation (text/plain, text/markdown, images, etc.)\n if (acceptHeader.includes('text/') || acceptHeader.includes('image/') || acceptHeader.includes('application/pdf')) {\n\n // Get resource metadata from view storage\n let resource: any;\n try {\n resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n } catch (error: any) {\n getRouteLogger().error('Failed to get resource metadata', {\n resourceId: id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, {\n message: 'Failed to retrieve resource'\n });\n }\n\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n // Get primary representation\n const primaryRep = getPrimaryRepresentation(resource);\n if (!primaryRep || !primaryRep.checksum || !primaryRep.mediaType) {\n throw new HTTPException(404, { message: 'Resource representation not found' });\n }\n\n // Read representation from RepresentationStore using content-addressed lookup\n const content = await repStore.retrieve(primaryRep.checksum, primaryRep.mediaType);\n if (!content) {\n throw new HTTPException(404, { message: 'Resource representation not found' });\n }\n\n // Set Content-Type header from representation mediaType (includes charset if specified)\n const mediaType = getPrimaryMediaType(resource);\n if (mediaType) {\n c.header('Content-Type', mediaType);\n }\n\n // For binary formats (images, PDFs), return binary data; for text, decode with correct charset\n if (mediaType?.startsWith('image/') || mediaType === 'application/pdf') {\n // Convert Buffer to Uint8Array for Hono compatibility\n return c.newResponse(new Uint8Array(content), 200, { 'Content-Type': mediaType });\n } else {\n return c.text(decodeRepresentation(content, mediaType || 'text/plain'));\n }\n }\n\n // Otherwise, return JSON-LD metadata (default)\n\n // Read from event store: materializes view from events\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n const events = await query.getResourceEvents(resourceId(id));\n\n let stored: any;\n try {\n stored = await eventStore.views.materializer.materialize(events, resourceId(id));\n } catch (error: any) {\n // Handle corrupted views or broken event chains gracefully\n getRouteLogger().error('Failed to materialize view', {\n resourceId: id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, {\n message: 'Failed to retrieve resource'\n });\n }\n\n if (!stored) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n const annotations = stored.annotations.annotations;\n const entityReferences = annotations.filter((a: Annotation) => {\n if (a.motivation !== 'linking') return false;\n const entityTypes = getEntityTypes({ body: a.body });\n return entityTypes.length > 0;\n });\n\n const response: GetResourceResponse = {\n resource: stored.resource,\n annotations,\n entityReferences,\n };\n\n // Set Content-Type to JSON-LD\n c.header('Content-Type', 'application/ld+json; charset=utf-8');\n\n return c.json(response);\n });\n}\n","/**\n * List Resources Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing (coercion, defaults, validation)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { getResourceEntityTypes } from '@semiont/api-client';\n\ntype ListResourcesResponse = components['schemas']['ListResourcesResponse'];\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\n\nexport function registerListResources(router: ResourcesRouterType) {\n /**\n * GET /resources\n *\n * List all resources with optional filters\n * Query params: offset, limit, entityType, archived, q\n * Requires authentication\n */\n router.get('/resources', async (c) => {\n // Parse query parameters with defaults and coercion\n const query = c.req.query();\n const config = c.get('config');\n const offset = Number(query.offset) || 0;\n const limit = Number(query.limit) || 50;\n const entityType = query.entityType;\n\n // Validate archived parameter (strict validation like Zod)\n let archived: boolean | undefined;\n if (query.archived === 'true') {\n archived = true;\n } else if (query.archived === 'false') {\n archived = false;\n } else if (query.archived !== undefined) {\n throw new HTTPException(400, { message: 'Invalid value for archived parameter. Must be \"true\" or \"false\".' });\n }\n\n const q = query.q;\n\n // Read from view storage projection storage\n let filteredDocs = await ResourceContext.listResources({\n search: q,\n archived,\n }, config);\n\n // Additional filter by entity type (view storage already handles search and archived)\n if (entityType) {\n filteredDocs = filteredDocs.filter((doc: ResourceDescriptor) => getResourceEntityTypes(doc).includes(entityType));\n }\n\n // Paginate\n const paginatedDocs = filteredDocs.slice(offset, offset + limit);\n\n // Add content previews for search results (delegate to service)\n const formattedDocs = q\n ? await ResourceContext.addContentPreviews(paginatedDocs, config)\n : paginatedDocs;\n\n const response: ListResourcesResponse = {\n resources: formattedDocs,\n total: filteredDocs.length,\n offset,\n limit,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Update Resource Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext, AnnotationContext, ResourceOperations } from '@semiont/make-meaning';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { userId, resourceId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\n\ntype Annotation = components['schemas']['Annotation'];\n\ntype UpdateResourceRequest = components['schemas']['UpdateResourceRequest'];\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\n\nexport function registerUpdateResource(router: ResourcesRouterType) {\n /**\n * PATCH /resources/:id\n *\n * Update resource metadata (append-only operations - name and content are immutable)\n * Requires authentication\n * Validates request body against UpdateResourceRequest schema\n */\n router.patch('/resources/:id',\n validateRequestBody('UpdateResourceRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as UpdateResourceRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n // Check resource exists using view storage\n const doc = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!doc) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n\n // Delegate to make-meaning service for business logic\n await ResourceOperations.updateResource(\n {\n resourceId: resourceId(id),\n userId: userId(user.id),\n currentArchived: doc.archived,\n updatedArchived: body.archived,\n currentEntityTypes: doc.entityTypes,\n updatedEntityTypes: body.entityTypes,\n },\n eventStore\n );\n\n // Read annotations from view storage\n const annotations = await AnnotationContext.getAllAnnotations(resourceId(id), config);\n const entityReferences = annotations.filter((a: Annotation) => {\n if (a.motivation !== 'linking') return false;\n const entityTypes = getEntityTypes({ body: a.body });\n return entityTypes.length > 0;\n });\n\n // Return optimistic response (content NOT included - must be fetched separately)\n const response: GetResourceResponse = {\n resource: {\n ...doc,\n archived: body.archived !== undefined ? body.archived : doc.archived,\n entityTypes: body.entityTypes !== undefined ? body.entityTypes : doc.entityTypes,\n },\n annotations,\n entityReferences,\n };\n\n return c.json(response);\n }\n );\n}\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","/**\n * Type-safe SSE helpers\n *\n * Enforces that all SSE event names are defined in Event Map (@semiont/core)\n */\n\nimport type { EventName } from '@semiont/core';\nimport type { SSEStreamingApi } from 'hono/streaming';\n\n/**\n * Write a type-safe SSE event\n *\n * Ensures event names are defined in Event Map at compile-time.\n *\n * @param stream - Hono SSE stream\n * @param options - Event options with type-checked event name\n *\n * @example\n * ```typescript\n * await writeTypedSSE(stream, {\n * event: 'generation:complete', // ✅ Valid event from Event Map\n * data: JSON.stringify(progress),\n * id: String(Date.now())\n * });\n *\n * await writeTypedSSE(stream, {\n * event: 'generation-error', // ❌ TypeScript error - not in Event Map!\n * data: '...'\n * });\n * ```\n */\nexport async function writeTypedSSE(\n stream: SSEStreamingApi,\n options: {\n /** Event name - must be defined in Event Map */\n event: EventName;\n /** Event data (usually JSON stringified) */\n data: string;\n /** Optional event ID */\n id?: string;\n }\n): Promise<void> {\n await stream.writeSSE({\n event: options.event,\n data: options.data,\n id: options.id\n });\n}\n","/**\n * Detect Annotations Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, DetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId, entityType } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateReferencesStreamRequest = components['schemas']['AnnotateReferencesStreamRequest'];\n\ninterface DetectionProgress {\n status: 'started' | 'scanning' | 'complete' | 'error';\n resourceId: ResourceId;\n currentEntityType?: string;\n totalEntityTypes: number;\n processedEntityTypes: number;\n message?: string;\n foundCount?: number;\n percentage?: number;\n}\n\nexport function registerAnnotateReferencesStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-annotations-stream\n *\n * Stream real-time entity detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateReferencesStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-references-stream',\n validateRequestBody('AnnotateReferencesStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateReferencesStreamRequest;\n const { entityTypes, includeDescriptiveReferences } = body;\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'annotate-references-stream',\n resourceId: id\n });\n\n logger.info('Starting reference detection', {\n entityTypes,\n includeDescriptiveReferences\n });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a detection job (this decouples event emission from HTTP client)\n const job: PendingJob<DetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'reference-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n entityTypes: entityTypes.map(et => entityType(et)),\n includeDescriptiveReferences\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('[EventBus] Subscribing to EventBus for resource', { resourceId: id, scopeKey: `${id}:mark:progress` });\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('[EventBus] Received mark:progress event', { progress, resourceId: id });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'scanning',\n resourceId: resourceId(id),\n currentEntityType: progress.currentEntityType,\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: progress.completedEntityTypes?.length || 0,\n foundCount: progress.completedEntityTypes?.reduce((sum, et) => sum + et.foundCount, 0),\n message: progress.message || (progress.currentEntityType\n ? `Scanning for ${progress.currentEntityType}...`\n : 'Processing...'),\n percentage: progress.percentage\n } as DetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'reference-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'linking',\n status: 'complete',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: entityTypes.length,\n foundCount: result?.totalFound,\n message: result?.totalFound !== undefined\n ? `Detection complete! Found ${result.totalFound} entities`\n : 'Detection complete!'\n } as DetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'reference-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try{\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: 0,\n message: event.payload.error || 'Detection failed'\n } as DetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n totalEntityTypes: entityTypes.length,\n processedEntityTypes: 0,\n message: error instanceof Error ? error.message : 'Detection failed'\n } as DetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Highlights Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, HighlightDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateHighlightsStreamRequest = components['schemas']['AnnotateHighlightsStreamRequest'];\n\ninterface HighlightDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateHighlightsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-highlights-stream\n *\n * Stream real-time highlight detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateHighlightsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates highlight detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-highlights-stream',\n validateRequestBody('AnnotateHighlightsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateHighlightsStreamRequest;\n const { instructions, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 1 || density > 15)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 1 and 15.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-highlights-stream',\n resourceId: id\n });\n\n logger.info('Starting highlight detection', { instructions: !!instructions, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a highlight detection job\n const job: PendingJob<HighlightDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'highlight-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as HighlightDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as HighlightDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'highlight-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'highlighting',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.highlightsFound,\n createdCount: result?.highlightsCreated,\n message: result?.highlightsCreated !== undefined\n ? `Complete! Created ${result.highlightsCreated} highlights`\n : 'Highlight detection complete!'\n } as HighlightDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'highlight-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Highlight detection failed'\n } as HighlightDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Highlight detection failed'\n } as HighlightDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Assessments Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, AssessmentDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateAssessmentsStreamRequest = components['schemas']['AnnotateAssessmentsStreamRequest'];\n\ninterface AssessmentDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateAssessmentsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-assessments-stream\n *\n * Stream real-time assessment detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateAssessmentsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates assessment detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-assessments-stream',\n validateRequestBody('AnnotateAssessmentsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateAssessmentsStreamRequest;\n const { instructions, tone, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 1 || density > 10)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 1 and 10.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-assessments-stream',\n resourceId: id\n });\n\n logger.info('Starting assessment detection', { instructions: !!instructions, tone, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create an assessment detection job\n const job: PendingJob<AssessmentDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'assessment-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n tone,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as AssessmentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as AssessmentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job.completed (domain event from event store)\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n logger.info('Received job:completed event', { jobType: event.payload.jobType, isStreamClosed });\n if (event.payload.jobType !== 'assessment-annotation') {\n logger.info('Skipping job:completed - wrong jobType', { expected: 'assessment-annotation', actual: event.payload.jobType });\n return;\n }\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'assessing',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.assessmentsFound,\n createdCount: result?.assessmentsCreated,\n message: result?.assessmentsCreated !== undefined\n ? `Complete! Created ${result.assessmentsCreated} assessments`\n : 'Assessment detection complete!'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'assessment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Assessment detection failed'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Assessment detection failed'\n } as AssessmentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Comments Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, CommentDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateCommentsStreamRequest = components['schemas']['AnnotateCommentsStreamRequest'];\n\ninterface CommentDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n}\n\nexport function registerAnnotateCommentsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-comments-stream\n *\n * Stream real-time comment detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateCommentsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates comment detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-comments-stream',\n validateRequestBody('AnnotateCommentsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateCommentsStreamRequest;\n const { instructions, tone, density } = body;\n const config = c.get('config');\n\n // Validate density if provided\n if (density !== undefined && (typeof density !== 'number' || density < 2 || density > 12)) {\n throw new HTTPException(400, { message: 'Invalid density. Must be a number between 2 and 12.' });\n }\n\n const logger = getLogger().child({\n component: 'annotate-comments-stream',\n resourceId: id\n });\n\n logger.info('Starting comment detection', { instructions: !!instructions, tone, density });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a comment detection job\n const job: PendingJob<CommentDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'comment-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n instructions,\n tone,\n density\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n message: 'Starting detection...'\n } as CommentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n message: progress.message || 'Processing...'\n } as CommentDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'comment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'commenting',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.commentsFound,\n createdCount: result?.commentsCreated,\n message: result?.commentsCreated !== undefined\n ? `Complete! Created ${result.commentsCreated} comments`\n : 'Comment detection complete!'\n } as CommentDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'comment-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Comment detection failed'\n } as CommentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Comment detection failed'\n } as CommentDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Detect Tags Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops\n * - Subscribes to detection:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, TagDetectionParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\nimport { userId, resourceId, type ResourceId } from '@semiont/core';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getTagSchema } from '@semiont/ontology';\nimport { getLogger } from '../../../logger';\n\ntype AnnotateTagsStreamRequest = components['schemas']['AnnotateTagsStreamRequest'];\n\ninterface TagDetectionProgress {\n status: 'started' | 'analyzing' | 'creating' | 'complete' | 'error';\n resourceId: ResourceId;\n stage?: 'analyzing' | 'creating';\n percentage?: number;\n currentCategory?: string;\n processedCategories?: number;\n totalCategories?: number;\n message?: string;\n foundCount?: number;\n createdCount?: number;\n byCategory?: Record<string, number>;\n}\n\nexport function registerAnnotateTagsStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:id/detect-tags-stream\n *\n * Stream real-time tag detection progress via Server-Sent Events\n * Requires authentication\n * Validates request body against AnnotateTagsStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates tag detection job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:id/annotate-tags-stream',\n validateRequestBody('AnnotateTagsStreamRequest'),\n async (c) => {\n const { id } = c.req.param();\n const body = c.get('validatedBody') as AnnotateTagsStreamRequest;\n const { schemaId, categories } = body;\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'annotate-tags-stream',\n resourceId: id\n });\n\n logger.info('Starting tag detection', { schemaId, categories });\n\n // User will be available from auth middleware since this is a POST request\n const user = c.get('user');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n // Validate schema exists\n const schema = getTagSchema(schemaId);\n if (!schema) {\n throw new HTTPException(400, { message: `Invalid tag schema: ${schemaId}` });\n }\n\n // Validate categories\n for (const category of categories) {\n if (!schema.tags.some(t => t.name === category)) {\n throw new HTTPException(400, { message: `Invalid category \"${category}\" for schema ${schemaId}` });\n }\n }\n\n if (categories.length === 0) {\n throw new HTTPException(400, { message: 'At least one category must be selected' });\n }\n\n // Validate resource exists using view storage\n const resource = await ResourceContext.getResourceMetadata(resourceId(id), config);\n if (!resource) {\n throw new HTTPException(404, { message: 'Resource not found in view storage projections - resource may need to be recreated' });\n }\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Create a tag detection job\n const job: PendingJob<TagDetectionParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'tag-annotation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 1\n },\n params: {\n resourceId: resourceId(id),\n schemaId,\n categories\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created detection job', { jobId: job.metadata.id });\n\n // Disable proxy buffering for real-time SSE streaming\n c.header('X-Accel-Buffering', 'no');\n c.header('Cache-Control', 'no-cache, no-transform');\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit detection:started, detection:progress, detection:completed, detection:failed\n const resourceBus = eventBus.scope(id);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Detection started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n resourceId: resourceId(id),\n totalCategories: categories.length,\n message: 'Starting detection...'\n } as TagDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to mark:progress\n subscriptions.push(\n resourceBus.get('mark:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Detection progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status || 'analyzing',\n resourceId: resourceId(id),\n stage: progress.status === 'analyzing' || progress.status === 'creating' ? progress.status : undefined,\n percentage: progress.percentage,\n currentCategory: progress.currentCategory,\n processedCategories: progress.processedCategories,\n totalCategories: progress.totalCategories,\n message: progress.message || 'Processing...'\n } as TagDetectionProgress),\n event: 'mark:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (event.payload.jobType !== 'tag-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection completed');\n try {\n const result = event.payload.result;\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n motivation: 'tagging',\n status: 'complete',\n resourceId: resourceId(id),\n percentage: 100,\n foundCount: result?.tagsFound,\n createdCount: result?.tagsCreated,\n byCategory: result?.byCategory,\n message: result?.tagsCreated !== undefined\n ? `Complete! Created ${result.tagsCreated} tags`\n : 'Tag detection complete!'\n } as TagDetectionProgress),\n event: 'mark:assist-finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Subscribe to job:failed\n subscriptions.push(\n resourceBus.get('job:failed').subscribe(async (event) => {\n if (event.payload.jobType !== 'tag-annotation') return;\n if (isStreamClosed) return;\n logger.info('Detection failed', { error: event.payload.error });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: event.payload.error || 'Tag detection failed'\n } as TagDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after failure');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from detection stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n status: 'error',\n resourceId: resourceId(id),\n message: error instanceof Error ? error.message : 'Tag detection failed'\n } as TagDetectionProgress),\n event: 'mark:assist-failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","/**\n * Resource LLM Context Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { LLMContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\n\nexport function registerGetResourceLLMContext(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/llm-context\n *\n * Get resource with full context for LLM processing\n * Includes related resources, annotations, graph representation, and optional summary\n *\n * Query parameters:\n * - depth: 1-3 (default: 2)\n * - maxResources: 1-20 (default: 10)\n * - includeContent: true/false (default: true)\n * - includeSummary: true/false (default: false)\n */\n router.get('/resources/:id/llm-context', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n const makeMeaning = c.get('makeMeaning');\n\n // Parse and validate query parameters\n const depth = query.depth ? Number(query.depth) : 2;\n const maxResources = query.maxResources ? Number(query.maxResources) : 10;\n const includeContent = query.includeContent === 'false' ? false : true;\n const includeSummary = query.includeSummary === 'true' ? true : false;\n\n // Validate depth range\n if (depth < 1 || depth > 3) {\n throw new HTTPException(400, { message: 'Query parameter \"depth\" must be between 1 and 3' });\n }\n\n // Validate maxResources range\n if (maxResources < 1 || maxResources > 20) {\n throw new HTTPException(400, { message: 'Query parameter \"maxResources\" must be between 1 and 20' });\n }\n\n // Delegate to make-meaning for LLM context building\n try {\n const response = await LLMContext.getResourceContext(\n resourceId(id),\n {\n depth,\n maxResources,\n includeContent,\n includeSummary,\n },\n config,\n makeMeaning.inferenceClient\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n throw error;\n }\n });\n}\n","/**\n * Annotation LLM Context Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { resourceId } from '@semiont/core';\nimport { annotationUri } from '@semiont/core';\nimport { getLogger } from '../../../logger';\n\nexport function registerGetAnnotationLLMContext(router: ResourcesRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId/llm-context\n *\n * Get annotation with full context for LLM processing\n * Includes source context (text around annotation), target context (referenced resource if applicable), and metadata\n *\n * Query parameters:\n * - includeSourceContext: true/false (default: true)\n * - includeTargetContext: true/false (default: true)\n * - contextWindow: 100-5000 (default: 1000) - characters before/after selection\n */\n router.get('/resources/:resourceId/annotations/:annotationId/llm-context', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Parse and validate query parameters\n const includeSourceContext = query.includeSourceContext === 'false' ? false : true;\n const includeTargetContext = query.includeTargetContext === 'false' ? false : true;\n const contextWindow = query.contextWindow ? Number(query.contextWindow) : 1000;\n\n // Validate contextWindow range\n if (contextWindow < 100 || contextWindow > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextWindow\" must be between 100 and 5000' });\n }\n\n try {\n // Construct full annotation URI (annotations in views use full URIs as their id)\n const fullAnnotationUri = `${config.services.backend!.publicURL}/annotations/${annotationIdParam}`;\n\n const logger = getLogger().child({\n route: 'annotation-llm-context',\n resourceId: resourceIdParam,\n annotationId: annotationIdParam\n });\n\n // Use shared service to build context\n const response = await AnnotationContext.buildLLMContext(annotationUri(fullAnnotationUri), resourceId(resourceIdParam), config, {\n includeSourceContext,\n includeTargetContext,\n contextWindow\n }, logger);\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error.message === 'Source resource not found') {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n if (error.message === 'Source content not found') {\n throw new HTTPException(404, { message: 'Source content not found' });\n }\n }\n throw error;\n }\n });\n}\n","/**\n * Referenced By Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport type { components } from '@semiont/core';\nimport { resourceUri as makeResourceUri, resourceId as makeResourceId, resourceIdToURI } from '@semiont/core';\nimport { getExactText, getTargetSource, getTargetSelector } from '@semiont/api-client';\nimport type { ResourcesRouterType } from '../shared';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'referenced-by' });\n\ntype GetReferencedByResponse = components['schemas']['GetReferencedByResponse'];\n\nexport function registerGetReferencedBy(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/referenced-by\n *\n * Get resources that reference this resource\n * Requires authentication\n * Returns list of resources with references to this resource\n *\n * Optional query parameter:\n * - motivation: Filter by W3C motivation type (e.g., 'linking', 'commenting', 'highlighting')\n */\n router.get('/resources/:id/referenced-by', async (c) => {\n const { id } = c.req.param();\n const motivation = c.req.query('motivation');\n const config = c.get('config');\n const { graphDb } = c.get('makeMeaning');\n\n // Get all annotations that reference this resource\n // Convert to full URI for graph database lookup\n const resourceUri = resourceIdToURI(makeResourceId(id), config.services.backend!.publicURL);\n getRouteLogger().debug('Looking for annotations referencing resource', {\n resourceId: id,\n resourceUri,\n motivation: motivation || 'all'\n });\n const references = await graphDb.getResourceReferencedBy(resourceUri, motivation);\n getRouteLogger().debug('Found annotations', { count: references.length });\n\n // Get unique resources from the selections\n const docIds = [...new Set(references.map(ref => getTargetSource(ref.target)))];\n getRouteLogger().debug('Unique source resource IDs', { docIds });\n const resources = await Promise.all(docIds.map(docId => graphDb.getResource(makeResourceUri(docId))));\n getRouteLogger().debug('Fetched resources', {\n total: resources.length,\n notFound: resources.filter(r => r === null).length\n });\n\n // Build resource map for lookup (ResourceDescriptor uses @id, not id)\n const docMap = new Map(resources.filter(doc => doc !== null).map(doc => [doc['@id'], doc]));\n getRouteLogger().debug('Resource map created', { keys: Array.from(docMap.keys()) });\n\n // Transform into ReferencedBy structure\n const referencedBy = references.map(ref => {\n const targetSource = getTargetSource(ref.target);\n const targetSelector = getTargetSelector(ref.target);\n const doc = docMap.get(targetSource);\n getRouteLogger().debug('Reference lookup', {\n targetSource,\n found: !!doc,\n name: doc?.name || 'unknown'\n });\n return {\n id: ref.id,\n resourceName: doc?.name || 'Untitled Resource',\n target: {\n source: targetSource,\n selector: {\n exact: targetSelector ? getExactText(targetSelector) : '',\n },\n },\n };\n });\n\n const response: GetReferencedByResponse = {\n referencedBy,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Token Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport {\n CREATION_METHODS,\n resourceId as makeResourceId,\n type ResourceId,\n userId,\n} from '@semiont/core';\nimport { ResourceContext, ResourceOperations } from '@semiont/make-meaning';\nimport type { CloneToken } from '@semiont/core';\nimport { cloneToken as makeCloneToken } from '@semiont/core';\nimport type { ResourcesRouterType } from '../shared';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\n\nimport { getPrimaryRepresentation, getResourceEntityTypes } from '@semiont/api-client';\n\ntype GetResourceByTokenResponse = components['schemas']['GetResourceByTokenResponse'];\ntype CreateResourceFromTokenRequest = components['schemas']['CreateResourceFromTokenRequest'];\ntype CreateResourceFromTokenResponse = components['schemas']['CreateResourceFromTokenResponse'];\ntype CloneResourceWithTokenResponse = components['schemas']['CloneResourceWithTokenResponse'];\n\n// Simple in-memory token store (replace with Redis/DB in production)\nconst cloneTokens = new Map<CloneToken, { resourceId: ResourceId; expiresAt: Date }>();\n\nexport function registerTokenRoutes(router: ResourcesRouterType) {\n /**\n * GET /api/clone-tokens/:token\n *\n * Retrieve a resource using a clone token\n * Requires authentication\n */\n router.get('/api/clone-tokens/:token', async (c) => {\n const { token: tokenStr } = c.req.param();\n const token = makeCloneToken(tokenStr);\n\n const tokenData = cloneTokens.get(token);\n if (!tokenData) {\n throw new HTTPException(404, { message: 'Invalid or expired token' });\n }\n\n if (new Date() > tokenData.expiresAt) {\n cloneTokens.delete(token);\n throw new HTTPException(404, { message: 'Token expired' });\n }\n\n const config = c.get('config');\n const sourceDoc = await ResourceContext.getResourceMetadata(tokenData.resourceId, config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n\n // NOTE: Content is NOT included - frontend should fetch via GET /resources/:id/content\n\n const response: GetResourceByTokenResponse = {\n sourceResource: sourceDoc,\n expiresAt: tokenData.expiresAt.toISOString(),\n };\n\n return c.json(response);\n });\n\n /**\n * POST /api/clone-tokens/create-resource\n *\n * Create a new resource using a clone token\n * Requires authentication\n * Validates request body against CreateResourceFromTokenRequest schema\n */\n router.post('/api/clone-tokens/create-resource',\n validateRequestBody('CreateResourceFromTokenRequest'),\n async (c) => {\n const body = c.get('validatedBody') as CreateResourceFromTokenRequest;\n const user = c.get('user');\n\n const token = makeCloneToken(body.token);\n const tokenData = cloneTokens.get(token);\n if (!tokenData) {\n throw new HTTPException(404, { message: 'Invalid or expired token' });\n }\n\n if (new Date() > tokenData.expiresAt) {\n cloneTokens.delete(token);\n throw new HTTPException(404, { message: 'Token expired' });\n }\n\n const config = c.get('config');\n const { eventStore, repStore } = c.get('makeMeaning');\n\n // Get source resource from materialized views (source of truth)\n const sourceDoc = await ResourceContext.getResourceMetadata(tokenData.resourceId, config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Source resource not found' });\n }\n\n // Get source format and validate it's a supported ContentFormat\n const primaryRep = getPrimaryRepresentation(sourceDoc);\n const mediaType = primaryRep?.mediaType || 'text/plain';\n\n // Validate mediaType is a supported ContentFormat (validation at periphery)\n const validFormats = ['text/plain', 'text/markdown'] as const;\n const format: 'text/plain' | 'text/markdown' = validFormats.includes(mediaType as any)\n ? (mediaType as 'text/plain' | 'text/markdown')\n : 'text/plain';\n\n // Create cloned resource via event sourcing (emits resource.created with creationMethod: CLONE)\n const result = await ResourceOperations.createResource(\n {\n name: body.name,\n content: Buffer.from(body.content),\n format,\n entityTypes: getResourceEntityTypes(sourceDoc),\n creationMethod: CREATION_METHODS.CLONE,\n },\n userId(user.id),\n eventStore,\n repStore,\n config\n );\n\n // Archive original if requested\n if (body.archiveOriginal) {\n await ResourceOperations.updateResource(\n {\n resourceId: tokenData.resourceId,\n userId: userId(user.id),\n currentArchived: sourceDoc.archived,\n updatedArchived: true,\n },\n eventStore\n );\n }\n\n // Clean up token\n cloneTokens.delete(token);\n\n const response: CreateResourceFromTokenResponse = result;\n\n return c.json(response, 201);\n }\n );\n\n /**\n * POST /resources/:id/clone-with-token\n *\n * Generate a temporary token for cloning a resource\n * Requires authentication\n */\n router.post('/resources/:id/clone-with-token', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n const { repStore } = c.get('makeMeaning');\n\n // Look up resource from materialized views (source of truth, not graph DB)\n const sourceDoc = await ResourceContext.getResourceMetadata(makeResourceId(id), config);\n if (!sourceDoc) {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n\n // Check if content exists\n const primaryRep = getPrimaryRepresentation(sourceDoc);\n if (!primaryRep?.checksum || !primaryRep?.mediaType) {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n\n try {\n await repStore.retrieve(primaryRep.checksum, primaryRep.mediaType);\n } catch {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n\n // Create token\n const tokenStr = `clone_${Math.random().toString(36).substring(2, 11)}_${Date.now()}`;\n const token = makeCloneToken(tokenStr);\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 minutes\n\n cloneTokens.set(token, {\n resourceId: makeResourceId(id),\n expiresAt,\n });\n\n const response: CloneResourceWithTokenResponse = {\n token,\n expiresAt: expiresAt.toISOString(),\n resource: sourceDoc,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Get Resource Annotations Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport type { ResourcesRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport type { components } from '@semiont/core';\nimport { resourceId } from '@semiont/core';\n\ntype GetAnnotationsResponse = components['schemas']['GetAnnotationsResponse'];\n\nexport function registerGetResourceAnnotations(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/annotations\n *\n * Get all annotations (both highlights and references) in a resource\n * Requires authentication\n * Uses view storage projections\n */\n router.get('/resources/:id/annotations', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n\n const annotations = await AnnotationContext.getAllAnnotations(resourceId(id), config);\n\n const response: GetAnnotationsResponse = {\n annotations,\n total: annotations.length\n };\n\n return c.json(response);\n });\n}\n","/**\n * Resource Events Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Manual query parameter parsing and validation\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { EventQuery } from '@semiont/event-sourcing';\nimport type { ResourcesRouterType } from '../shared';\nimport type { StoredEvent, EventQuery as EventQueryType } from '@semiont/core';\nimport { resourceId } from '@semiont/core';\nimport type { components } from '@semiont/core';\nimport { HTTPException } from 'hono/http-exception';\n\ntype GetEventsResponse = components['schemas']['GetEventsResponse'];\n\nconst eventTypes = [\n 'resource.created',\n 'resource.cloned',\n 'resource.archived',\n 'resource.unarchived',\n 'annotation.added',\n 'annotation.removed',\n 'annotation.body.updated',\n 'entitytag.added',\n 'entitytag.removed',\n] as const;\n\n// Type guard function for event type validation\nfunction isValidEventType(type: string): type is typeof eventTypes[number] {\n return eventTypes.includes(type as any);\n}\n\nexport function registerGetEvents(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/events\n *\n * Get full event history for a resource with optional filtering\n * Requires authentication\n *\n * Query parameters:\n * - type: Event type filter (optional)\n * - userId: User ID filter (optional)\n * - limit: Maximum number of events (1-1000, default: 100)\n */\n router.get('/resources/:id/events', async (c) => {\n const { id } = c.req.param();\n const queryParams = c.req.query();\n\n // Parse and validate query parameters\n const type = queryParams.type;\n const userId = queryParams.userId;\n const limit = queryParams.limit ? Number(queryParams.limit) : 100;\n\n // Validate type if provided\n if (type && !isValidEventType(type)) {\n throw new HTTPException(400, { message: `Invalid event type. Must be one of: ${eventTypes.join(', ')}` });\n }\n\n // Validate limit range\n if (limit < 1 || limit > 1000) {\n throw new HTTPException(400, { message: 'Query parameter \"limit\" must be between 1 and 1000' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n const eventQuery = new EventQuery(eventStore.log.storage);\n\n // Build query filters - type is validated by this point\n const validatedType = type && isValidEventType(type) ? type : undefined;\n const filters: EventQueryType = {\n resourceId: resourceId(id),\n ...(validatedType && { eventTypes: [validatedType] }),\n };\n\n if (userId) {\n filters.userId = userId;\n }\n\n if (limit) {\n filters.limit = limit;\n }\n\n // Query events\n const storedEvents: StoredEvent[] = await eventQuery.queryEvents(filters);\n\n if (!storedEvents || storedEvents.length === 0) {\n const emptyResponse: GetEventsResponse = {\n events: [],\n total: 0,\n resourceId: id,\n };\n return c.json(emptyResponse);\n }\n\n // Validate and transform events to match API response structure\n const events = storedEvents.map(stored => {\n // Validate required top-level properties\n if (!stored.event) {\n throw new Error(`Event missing 'event' property for resource ${id}`);\n }\n if (!stored.metadata) {\n throw new Error(`Event missing 'metadata' property for resource ${id}`);\n }\n\n // Validate required event properties\n const { event, metadata } = stored;\n if (!event.id || !event.type || !event.timestamp || !event.userId || !event.resourceId) {\n throw new Error(`Event ${event.id || 'unknown'} for resource ${id} is missing required properties: ${JSON.stringify({ id: event.id, type: event.type, timestamp: event.timestamp, userId: event.userId, resourceId: event.resourceId })}`);\n }\n if (metadata.sequenceNumber === undefined) {\n throw new Error(`Event ${event.id} for resource ${id} is missing metadata.sequenceNumber`);\n }\n\n // Return nested structure matching StoredEvent interface - map internal resourceId to API resourceId\n return {\n event: {\n id: event.id,\n type: event.type,\n timestamp: event.timestamp,\n userId: event.userId,\n resourceId: event.resourceId, // Map internal resourceId to API resourceId\n payload: event.payload,\n },\n metadata: {\n sequenceNumber: metadata.sequenceNumber,\n prevEventHash: metadata.prevEventHash,\n checksum: metadata.checksum,\n },\n };\n });\n\n const response: GetEventsResponse = {\n events,\n total: events.length,\n resourceId: id,\n };\n\n return c.json(response);\n });\n}\n","import { EventQuery } from '@semiont/event-sourcing';\n\n/**\n * Resource Events Stream Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No response validation (SSE streams validated on request only)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n *\n * SSE Strategy (per SSE-VALIDATION-CONSIDERATIONS.md):\n * - Validate request only (path params)\n * - No response validation (streaming data)\n * - Use TypeScript types for event data structures\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { resourceId } from '@semiont/core';\nimport { resourceUri } from '@semiont/core';\nimport { SSE_STREAM_CONNECTED } from '@semiont/api-client';\nimport { getLogger } from '../../../logger';\n\n/**\n * Resource-scoped SSE event stream for real-time collaboration\n *\n * Opens a long-lived connection that broadcasts all events for a specific resource.\n * Clients receive events as they happen (highlights added, references created, etc.)\n *\n * Use case: Multiple users viewing the same resource see each other's changes in real-time\n */\n\nexport function registerGetEventStream(router: ResourcesRouterType) {\n /**\n * GET /resources/:id/events/stream\n *\n * Open a Server-Sent Events stream to receive real-time resource events\n * Requires authentication\n * Returns text/event-stream\n */\n router.get('/resources/:id/events/stream', async (c) => {\n const { id } = c.req.param();\n const config = c.get('config');\n\n const logger = getLogger().child({\n component: 'events-stream',\n resourceId: id\n });\n\n // Construct full resource URI for event subscriptions (consistent with W3C Web Annotation spec)\n const rUri = resourceUri(`${config.services.backend!.publicURL}/resources/${id}`);\n\n logger.info('Client connecting to resource events stream', { resourceUri: rUri });\n\n // Verify resource exists in event store (Event Store - source of truth)\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n const events = await query.getResourceEvents(resourceId(id));\n if (events.length === 0) {\n logger.warn('Resource not found - no events exist');\n throw new HTTPException(404, { message: 'Resource not found - no events exist for this resource' });\n }\n\n logger.info('Resource exists with events', { eventCount: events.length });\n\n return streamSSE(c, async (stream) => {\n\n // Send initial connection message\n logger.info('Sending connection message to client');\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'connected',\n resourceId: id,\n timestamp: new Date().toISOString(),\n message: 'Event stream connected',\n }),\n event: SSE_STREAM_CONNECTED,\n id: String(Date.now()),\n });\n\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n let subscription: ReturnType<typeof eventStore.bus.subscriptions.subscribe> | null = null;\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n if (subscription) {\n subscription.unsubscribe();\n }\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n // Subscribe to events for this resource using full URI\n const streamId = `${id.substring(0, 16)}...${Math.random().toString(36).substring(7)}`;\n logger.info('Subscribing to events for resource URI', { streamId, resourceUri: rUri });\n subscription = eventStore.bus.subscriptions.subscribe(rUri, async (storedEvent) => {\n if (isStreamClosed) {\n logger.info('Stream already closed, ignoring event', { streamId, eventType: storedEvent.event.type });\n return;\n }\n\n logger.info('Received event, attempting to write to SSE stream', {\n streamId,\n eventType: storedEvent.event.type\n });\n\n try {\n const eventData = {\n id: storedEvent.event.id,\n type: storedEvent.event.type,\n timestamp: storedEvent.event.timestamp,\n userId: storedEvent.event.userId,\n resourceId: storedEvent.event.resourceId,\n payload: storedEvent.event.payload,\n metadata: {\n sequenceNumber: storedEvent.metadata.sequenceNumber,\n prevEventHash: storedEvent.metadata.prevEventHash,\n checksum: storedEvent.metadata.checksum,\n },\n };\n\n logger.info('Event data prepared, calling writeSSE', { streamId });\n\n // DEBUG: Test JSON.stringify separately\n let jsonData: string;\n try {\n const startStringify = Date.now();\n jsonData = JSON.stringify(eventData);\n const stringifyTime = Date.now() - startStringify;\n logger.info('JSON.stringify completed', {\n streamId,\n time: stringifyTime,\n size: jsonData.length\n });\n } catch (stringifyError) {\n logger.error('JSON.stringify FAILED', { streamId, error: stringifyError });\n throw stringifyError;\n }\n\n // DEBUG: Log payload structure for annotation.body.updated\n if (storedEvent.event.type === 'annotation.body.updated') {\n logger.info('annotation.body.updated payload', {\n streamId,\n payload: storedEvent.event.payload\n });\n }\n\n const startWrite = Date.now();\n await stream.writeSSE({\n data: jsonData,\n event: storedEvent.event.type,\n id: storedEvent.metadata.sequenceNumber.toString(),\n });\n const writeTime = Date.now() - startWrite;\n logger.info('Successfully wrote event to SSE stream', {\n streamId,\n eventType: storedEvent.event.type,\n time: writeTime\n });\n } catch (error) {\n logger.error('Error writing event to SSE stream', {\n streamId,\n eventType: storedEvent.event.type,\n error\n });\n cleanup();\n }\n });\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from resource events stream');\n cleanup();\n });\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n });\n}\n","/**\n * Create Annotation Route\n * POST /resources/{id}/annotations\n *\n * Creates a new annotation on a resource using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getTextPositionSelector, getSvgSelector, getFragmentSelector, validateSvgMarkup } from '@semiont/api-client';\nimport type { AnnotationAddedEvent } from '@semiont/core';\nimport { resourceId, userId, userToAgent } from '@semiont/core';\nimport { generateAnnotationId } from '@semiont/event-sourcing';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'create-annotation' });\n\ntype Annotation = components['schemas']['Annotation'];\ntype CreateAnnotationRequest = components['schemas']['CreateAnnotationRequest'];\ntype CreateAnnotationResponse = components['schemas']['CreateAnnotationResponse'];\n\nexport function registerCreateAnnotation(router: ResourcesRouterType) {\n /**\n * POST /resources/:id/annotations\n * Create a new annotation/reference in a resource\n */\n router.post('/resources/:id/annotations',\n validateRequestBody('CreateAnnotationRequest'),\n async (c) => {\n const { id } = c.req.param();\n const request = c.get('validatedBody') as CreateAnnotationRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n // Generate annotation ID\n let newAnnotationId: string;\n try {\n const backendUrl = config.services.backend?.publicURL;\n if (!backendUrl) {\n throw new Error('Backend publicURL not configured');\n }\n newAnnotationId = generateAnnotationId(backendUrl);\n } catch (error) {\n getRouteLogger().error('Failed to generate annotation ID', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n throw new HTTPException(500, { message: 'Failed to create annotation' });\n }\n\n // Validate selector: must have either TextPositionSelector, SvgSelector, or FragmentSelector\n const posSelector = getTextPositionSelector(request.target.selector);\n const svgSelector = getSvgSelector(request.target.selector);\n const fragmentSelector = getFragmentSelector(request.target.selector);\n\n if (!posSelector && !svgSelector && !fragmentSelector) {\n throw new HTTPException(400, { message: 'Either TextPositionSelector, SvgSelector, or FragmentSelector is required for creating annotations' });\n }\n\n // Validate SVG markup if SvgSelector is provided\n if (svgSelector) {\n const svgError = validateSvgMarkup(svgSelector.value);\n if (svgError) {\n throw new HTTPException(400, { message: `Invalid SVG markup: ${svgError}` });\n }\n }\n\n // Validation ensures motivation is present (it's required in schema)\n if (!request.motivation) {\n throw new HTTPException(400, { message: 'motivation is required' });\n }\n\n // Build annotation object (includes W3C required @context and type)\n const annotation: Omit<Annotation, 'creator' | 'created'> = {\n '@context': 'http://www.w3.org/ns/anno.jsonld' as const,\n 'type': 'Annotation' as const,\n id: newAnnotationId,\n motivation: request.motivation,\n target: request.target,\n body: request.body as Annotation['body'],\n modified: new Date().toISOString(),\n };\n\n // Emit unified annotation.added event\n const { eventStore } = c.get('makeMeaning');\n const eventPayload: Omit<AnnotationAddedEvent, 'id' | 'timestamp'> = {\n type: 'annotation.added',\n resourceId: resourceId(id),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotation,\n },\n };\n await eventStore.appendEvent(eventPayload);\n\n // Return optimistic response\n const response: CreateAnnotationResponse = {\n annotation: {\n ...annotation,\n creator: userToAgent(user),\n created: new Date().toISOString(),\n },\n };\n\n return c.json(response, 201);\n }\n );\n}\n","/**\n * Get Annotation Route\n * GET /resources/{resourceId}/annotations/{annotationId}\n *\n * Gets a specific annotation from a resource using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getBodySource } from '@semiont/api-client';\nimport { resourceId as makeResourceId, annotationId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { ResourceContext } from '@semiont/make-meaning';\n\ntype GetAnnotationResponse = components['schemas']['GetAnnotationResponse'];\n\nexport function registerGetAnnotation(router: ResourcesRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId\n * Get a specific annotation from a resource\n */\n router.get('/resources/:resourceId/annotations/:annotationId', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const config = c.get('config');\n\n // Get annotation from view storage\n const annotation = await AnnotationContext.getAnnotation(\n annotationId(annotationIdParam),\n makeResourceId(resourceIdParam),\n config\n );\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n // Get source resource metadata\n const resource = await ResourceContext.getResourceMetadata(\n makeResourceId(resourceIdParam),\n config\n );\n\n // Get resolved resource if annotation body contains a link\n let resolvedResource = null;\n const bodySource = getBodySource(annotation.body);\n if (bodySource) {\n const resolvedId = bodySource.split('/').pop()!;\n resolvedResource = await ResourceContext.getResourceMetadata(\n makeResourceId(resolvedId),\n config\n );\n }\n\n const response: GetAnnotationResponse = {\n annotation,\n resource,\n resolvedResource,\n };\n\n return c.json(response);\n });\n}\n","/**\n * Delete Annotation Route\n * DELETE /resources/{resourceId}/annotations/{annotationId}\n *\n * Deletes an annotation using nested path format\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { annotationUri } from '@semiont/core';\nimport { resourceId, annotationId, userId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'delete-annotation' });\n\ntype Annotation = components['schemas']['Annotation'];\n\nexport function registerDeleteAnnotation(router: ResourcesRouterType) {\n /**\n * DELETE /resources/:resourceId/annotations/:annotationId\n * Delete an annotation\n */\n router.delete('/resources/:resourceId/annotations/:annotationId', async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const user = c.get('user');\n const config = c.get('config');\n\n // Get projection to verify annotation exists\n const projection = await AnnotationContext.getResourceAnnotations(\n resourceId(resourceIdParam),\n config\n );\n\n // Find the annotation in this resource's annotations\n // Annotation IDs in the projection are full URIs, so construct the full URI for comparison\n const fullAnnotationUri = annotationUri(`${config.services.backend!.publicURL}/annotations/${annotationIdParam}`);\n const annotation = projection.annotations.find(\n (a: Annotation) => a.id === fullAnnotationUri\n );\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found in resource' });\n }\n\n // Emit unified annotation.removed event\n const { eventStore } = c.get('makeMeaning');\n getRouteLogger().debug('Emitting annotation.removed event', {\n annotationId: annotationIdParam,\n resourceId: resourceIdParam\n });\n const storedEvent = await eventStore.appendEvent({\n type: 'annotation.removed',\n resourceId: resourceId(resourceIdParam),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotationId: annotationId(annotationIdParam),\n },\n });\n getRouteLogger().debug('Event emitted', {\n annotationId: annotationIdParam,\n sequenceNumber: storedEvent.metadata.sequenceNumber\n });\n\n return c.body(null, 204);\n });\n}\n","/**\n * Update Annotation Body Route\n * PUT /resources/{resourceId}/annotations/{annotationId}/body\n *\n * Updates annotation body using fine-grained operations\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport type { BodyOperation } from '@semiont/core';\nimport { resourceId, annotationId, userId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport { getLogger } from '../../../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'update-annotation-body' });\n\ntype UpdateAnnotationBodyRequest = components['schemas']['UpdateAnnotationBodyRequest'];\ntype UpdateAnnotationBodyResponse = components['schemas']['UpdateAnnotationBodyResponse'];\n\nexport function registerUpdateAnnotationBody(router: ResourcesRouterType) {\n /**\n * PUT /resources/:resourceId/annotations/:annotationId/body\n * Apply fine-grained operations to modify annotation body items\n */\n router.put('/resources/:resourceId/annotations/:annotationId/body',\n validateRequestBody('UpdateAnnotationBodyRequest'),\n async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const request = c.get('validatedBody') as UpdateAnnotationBodyRequest;\n const user = c.get('user');\n const config = c.get('config');\n\n getRouteLogger().debug('Body update handler called', {\n annotationId: annotationIdParam,\n operations: request.operations\n });\n\n // Get annotation from view storage\n const annotation = await AnnotationContext.getAnnotation(\n annotationId(annotationIdParam),\n resourceId(resourceIdParam),\n config\n );\n getRouteLogger().debug('View storage lookup result', {\n annotationId: annotationIdParam,\n found: !!annotation\n });\n\n if (!annotation) {\n getRouteLogger().warn('Annotation not found in view storage', {\n annotationId: annotationIdParam,\n resourceId: resourceIdParam\n });\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n // Emit annotation.body.updated event\n const { eventStore } = c.get('makeMeaning');\n await eventStore.appendEvent({\n type: 'annotation.body.updated',\n resourceId: resourceId(resourceIdParam),\n userId: userId(user.id),\n version: 1,\n payload: {\n annotationId: annotationId(annotationIdParam),\n operations: request.operations as BodyOperation[],\n },\n });\n\n // Return optimistic response - Apply operations to body array\n const bodyArray = Array.isArray(annotation.body) ? [...annotation.body] : [];\n\n for (const op of request.operations) {\n if (op.op === 'add') {\n // Add item (idempotent - don't add if already exists)\n const exists = bodyArray.some(item =>\n JSON.stringify(item) === JSON.stringify(op.item)\n );\n if (!exists) {\n bodyArray.push(op.item);\n }\n } else if (op.op === 'remove') {\n // Remove item\n const index = bodyArray.findIndex(item =>\n JSON.stringify(item) === JSON.stringify(op.item)\n );\n if (index !== -1) {\n bodyArray.splice(index, 1);\n }\n } else if (op.op === 'replace') {\n // Replace item\n const index = bodyArray.findIndex(item =>\n JSON.stringify(item) === JSON.stringify(op.oldItem)\n );\n if (index !== -1) {\n bodyArray[index] = op.newItem;\n }\n }\n }\n\n const response: UpdateAnnotationBodyResponse = {\n annotation: {\n ...annotation,\n body: bodyArray,\n },\n };\n\n return c.json(response);\n }\n );\n}\n","/**\n * Generate Resource Stream Route - EventBus Version\n *\n * Uses @semiont/core EventBus for real-time progress:\n * - No polling loops (previously 500ms intervals)\n * - Subscribes to generation:* events from EventBus\n * - <50ms latency for progress updates\n * - Resource-scoped event isolation\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request body with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n * - SSE streaming response (no response validation per SSE-VALIDATION-CONSIDERATIONS.md)\n */\n\nimport { streamSSE } from 'hono/streaming';\nimport { HTTPException } from 'hono/http-exception';\nimport type { ResourcesRouterType } from '../shared';\nimport { validateRequestBody } from '../../../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { getExactText } from '@semiont/api-client';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport type { JobQueue, PendingJob, GenerationParams } from '@semiont/jobs';\nimport { nanoid } from 'nanoid';\nimport { getTargetSelector } from '@semiont/api-client';\nimport { jobId, entityType } from '@semiont/core';\nimport { userId, resourceId, annotationId as makeAnnotationId } from '@semiont/core';\nimport { getEntityTypes } from '@semiont/ontology';\nimport { writeTypedSSE } from '../../../lib/sse-helpers';\nimport { getLogger } from '../../../logger';\n\ntype YieldResourceStreamRequest = components['schemas']['YieldResourceStreamRequest'];\n\ninterface YieldProgress {\n status: 'started' | 'fetching' | 'generating' | 'creating' | 'complete' | 'error';\n referenceId: string;\n resourceName?: string;\n resourceId?: string;\n sourceResourceId?: string;\n percentage: number;\n message?: string;\n}\n\nexport function registerYieldResourceStream(router: ResourcesRouterType, jobQueue: JobQueue) {\n /**\n * POST /resources/:resourceId/annotations/:annotationId/yield-resource-stream\n *\n * Yield a resource from an annotation with streaming progress updates via SSE\n * Requires authentication\n * Validates request body against YieldResourceStreamRequest schema\n * Returns SSE stream with progress updates\n *\n * Event-Driven Architecture:\n * - Creates generation job\n * - Subscribes to Event Store for job.* events\n * - Forwards events to client as SSE\n * - <50ms latency (no polling)\n */\n router.post('/resources/:resourceId/annotations/:annotationId/yield-resource-stream',\n validateRequestBody('YieldResourceStreamRequest'),\n async (c) => {\n const { resourceId: resourceIdParam, annotationId: annotationIdParam } = c.req.param();\n const body = c.get('validatedBody') as YieldResourceStreamRequest;\n\n const logger = getLogger().child({\n component: 'yield-resource-stream',\n resourceId: resourceIdParam,\n annotationId: annotationIdParam\n });\n\n logger.info('Received generation request', { body });\n\n // User will be available from auth middleware\n const user = c.get('user');\n const config = c.get('config');\n if (!user) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n logger.info('Starting resource generation', { language: body.language });\n\n // Validate annotation exists using view storage\n const projection = await AnnotationContext.getResourceAnnotations(resourceId(resourceIdParam), config);\n\n // Debug: log what annotations exist\n const linkingAnnotations = projection.annotations.filter((a: any) => a.motivation === 'linking');\n logger.info('Found linking annotations in resource', {\n count: linkingAnnotations.length,\n ids: linkingAnnotations.map((a: any) => a.id)\n });\n\n // Compare by ID - need to match full annotation URI\n const expectedAnnotationUri = `${config.services.backend!.publicURL}/annotations/${annotationIdParam}`;\n logger.info('Looking for annotation URI', { expectedAnnotationUri });\n\n const reference = projection.annotations.find((a: any) =>\n a.id === expectedAnnotationUri && a.motivation === 'linking'\n );\n\n if (!reference) {\n logger.warn('Annotation not found', {\n expectedUri: expectedAnnotationUri,\n availableIds: projection.annotations.map((a: any) => a.id)\n });\n throw new HTTPException(404, { message: `Annotation ${annotationIdParam} not found in resource ${resourceIdParam}` });\n }\n logger.info('Found matching annotation', { annotationId: reference.id });\n\n // Get EventBus for real-time progress subscriptions\n const { eventBus } = c.get('makeMeaning');\n\n // Validate context is provided (required by schema)\n if (!body.context) {\n throw new HTTPException(400, { message: 'Context is required for generation' });\n }\n\n // Create a generation job (this decouples event emission from HTTP client)\n const job: PendingJob<GenerationParams> = {\n status: 'pending',\n metadata: {\n id: jobId(`job-${nanoid()}`),\n type: 'generation',\n userId: userId(user.id),\n created: new Date().toISOString(),\n retryCount: 0,\n maxRetries: 3\n },\n params: {\n referenceId: makeAnnotationId(annotationIdParam),\n sourceResourceId: resourceId(resourceIdParam),\n title: body.title,\n prompt: body.prompt,\n language: body.language,\n entityTypes: getEntityTypes(reference).map(et => entityType(et)),\n context: body.context, // NEW - context from frontend modal\n temperature: body.temperature, // NEW - inference parameter\n maxTokens: body.maxTokens // NEW - inference parameter\n }\n };\n\n await jobQueue.createJob(job);\n logger.info('Created generation job', {\n jobId: job.metadata.id,\n language: job.params.language\n });\n\n // Determine resource name for progress messages\n const targetSelector = getTargetSelector(reference.target);\n const resourceName = body.title || (targetSelector ? getExactText(targetSelector) : '') || 'New Resource';\n\n // Stream job progress to the client using EventBus subscriptions\n return streamSSE(c, async (stream) => {\n // Track if stream is closed to prevent double cleanup\n let isStreamClosed = false;\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n let keepAliveInterval: NodeJS.Timeout | null = null;\n let closeStreamCallback: (() => void) | null = null;\n\n // Return a Promise that only resolves when the stream should close\n // This prevents streamSSE from auto-closing the stream\n const streamPromise = new Promise<void>((resolve) => {\n closeStreamCallback = resolve;\n });\n\n // Centralized cleanup function\n const cleanup = () => {\n if (isStreamClosed) return;\n isStreamClosed = true;\n\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n\n subscriptions.forEach(sub => sub.unsubscribe());\n\n // Close the stream by resolving the promise\n if (closeStreamCallback) {\n closeStreamCallback();\n }\n };\n\n try {\n // Create resource-scoped EventBus for this resource\n // Workers emit generation:started, generation:progress, generation:completed\n const resourceBus = eventBus.scope(resourceIdParam);\n logger.info('Subscribing to EventBus for resource');\n\n // Subscribe to yield:progress\n subscriptions.push(\n resourceBus.get('yield:progress').subscribe(async (_event) => {\n if (isStreamClosed) return;\n logger.info('Generation started');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'started',\n referenceId: reference.id,\n resourceName,\n percentage: 0,\n message: 'Starting...'\n } as YieldProgress),\n event: 'yield:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during start');\n cleanup();\n }\n })\n );\n\n // Subscribe to yield:progress\n subscriptions.push(\n resourceBus.get('yield:progress').subscribe(async (progress) => {\n if (isStreamClosed) return;\n logger.info('Generation progress', { progress });\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: progress.status,\n referenceId: reference.id,\n resourceName,\n percentage: progress.percentage || 0,\n message: progress.message || `${progress.status}...`\n } as YieldProgress),\n event: 'yield:progress',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected during progress');\n cleanup();\n }\n })\n );\n\n // Subscribe to job:completed\n subscriptions.push(\n resourceBus.get('job:completed').subscribe(async (event) => {\n if (isStreamClosed) return;\n logger.info('Generation completed');\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'complete',\n referenceId: reference.id,\n resourceName,\n resourceId: event.payload.resultResourceId,\n sourceResourceId: resourceIdParam,\n percentage: 100,\n message: 'Draft resource created! Ready for review.'\n } as YieldProgress),\n event: 'yield:finished',\n id: String(Date.now())\n });\n } catch (error) {\n logger.warn('Client disconnected after completion');\n }\n cleanup();\n })\n );\n\n // Keep-alive ping every 30 seconds\n keepAliveInterval = setInterval(async () => {\n if (isStreamClosed) {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n }\n return;\n }\n\n try {\n await stream.writeSSE({\n data: ':keep-alive',\n });\n } catch (error) {\n cleanup();\n }\n }, 30000);\n\n // Cleanup on disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n logger.info('Client disconnected from generation stream, job will continue', { jobId: job.metadata.id });\n cleanup();\n });\n\n } catch (error) {\n // Send error event\n try {\n await writeTypedSSE(stream, {\n data: JSON.stringify({\n status: 'error',\n referenceId: reference.id,\n percentage: 0,\n message: error instanceof Error ? error.message : 'Generation failed'\n } as YieldProgress),\n event: 'yield:failed',\n id: String(Date.now())\n });\n } catch (sseError) {\n // Client already disconnected\n logger.warn('Could not send error to client (disconnected), job status is preserved', { jobId: job.metadata.id });\n }\n cleanup();\n }\n\n // Return promise that resolves when stream should close\n // This keeps the SSE connection open until cleanup() is called\n return streamPromise;\n });\n }\n );\n}\n","import { EventQuery } from '@semiont/event-sourcing';\n\n/**\n * Annotation History Route - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - No request body validation needed (GET route with only path params)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { AnnotationsRouterType } from '../shared';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { getTargetSource } from '@semiont/api-client';\nimport type { components } from '@semiont/core';\nimport { resourceId as makeResourceId, annotationId as makeAnnotationId } from '@semiont/core';\n\ntype GetAnnotationHistoryResponse = components['schemas']['GetAnnotationHistoryResponse'];\n\nexport function registerGetAnnotationHistory(router: AnnotationsRouterType) {\n /**\n * GET /resources/:resourceId/annotations/:annotationId/history\n *\n * Get full event history for a specific annotation (highlight or reference)\n * Requires authentication\n * Returns annotation events sorted by sequence number\n */\n router.get('/resources/:resourceId/annotations/:annotationId/history', async (c) => {\n const { resourceId, annotationId } = c.req.param();\n const config = c.get('config');\n\n // Verify annotation exists using view storage (not GraphDB)\n const annotation = await AnnotationContext.getAnnotation(makeAnnotationId(annotationId), makeResourceId(resourceId), config);\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n\n if (getTargetSource(annotation.target) !== resourceId) {\n throw new HTTPException(404, { message: 'Annotation does not belong to this resource' });\n }\n\n const { eventStore } = c.get('makeMeaning');\n const query = new EventQuery(eventStore.log.storage);\n\n // Get all events for this resource\n const allEvents = await query.queryEvents({\n resourceId: makeResourceId(resourceId),\n });\n\n // Filter events related to this annotation\n const annotationEvents = allEvents.filter(stored => {\n const event = stored.event;\n\n // Check if event is about this annotation\n // Highlight events have highlightId, Reference events have referenceId\n if ('highlightId' in event.payload && event.payload.highlightId === annotationId) return true;\n if ('referenceId' in event.payload && event.payload.referenceId === annotationId) return true;\n\n return false;\n });\n\n // Format events for API response\n const events: GetAnnotationHistoryResponse['events'] = annotationEvents.map(stored => ({\n id: stored.event.id,\n type: stored.event.type as any, // Job events are filtered out above but TS doesn't know\n timestamp: stored.event.timestamp,\n userId: stored.event.userId,\n resourceId: stored.event.resourceId!, // Map internal resourceId to API resourceId\n payload: stored.event.payload as any,\n metadata: {\n sequenceNumber: stored.metadata.sequenceNumber,\n prevEventHash: stored.metadata.prevEventHash,\n checksum: stored.metadata.checksum,\n },\n }));\n\n // Sort by sequence number\n events.sort((a, b) => a.metadata.sequenceNumber - b.metadata.sequenceNumber);\n\n const response: GetAnnotationHistoryResponse = {\n events,\n total: events.length,\n annotationId,\n resourceId: resourceId, // Map internal resourceId to API resourceId\n };\n\n return c.json(response);\n });\n}\n","// Main resources router that combines all individual route files\nimport { createResourceRouter } from './shared';\nimport type { ResourcesRouterType } from './shared';\nimport type { JobQueue } from '@semiont/jobs';\n\n// Import registration functions for all routes\nimport { registerCreateResource } from './routes/create';\nimport { registerGetResourceUri } from './routes/get-uri';\nimport { registerListResources } from './routes/list';\nimport { registerUpdateResource } from './routes/update';\nimport { registerAnnotateReferencesStream } from './routes/annotate-references-stream';\nimport { registerAnnotateHighlightsStream } from './routes/annotate-highlights-stream';\nimport { registerAnnotateAssessmentsStream } from './routes/annotate-assessments-stream';\nimport { registerAnnotateCommentsStream } from './routes/annotate-comments-stream';\nimport { registerAnnotateTagsStream } from './routes/annotate-tags-stream';\nimport { registerGetResourceLLMContext } from './routes/llm-context';\nimport { registerGetAnnotationLLMContext } from './routes/annotation-llm-context';\nimport { registerGetReferencedBy } from './routes/referenced-by';\nimport { registerTokenRoutes } from './routes/token';\nimport { registerGetResourceAnnotations } from './routes/get-annotations';\nimport { registerGetEvents } from './routes/events';\nimport { registerGetEventStream } from './routes/events-stream';\n\n// Nested annotation routes\nimport { registerCreateAnnotation } from './routes/create-annotation';\nimport { registerGetAnnotation } from './routes/get-annotation';\nimport { registerDeleteAnnotation } from './routes/delete-annotation';\nimport { registerUpdateAnnotationBody } from './routes/update-annotation-body';\nimport { registerYieldResourceStream } from './routes/yield-resource-stream';\nimport { registerGetAnnotationHistory } from '../annotations/routes/history';\n\n// Factory function to create resources router with JobQueue\nexport function createResourcesRouter(jobQueue: JobQueue): ResourcesRouterType {\n const resourcesRouter: ResourcesRouterType = createResourceRouter();\n\n// Register all routes\n// NOTE: Register specific paths before generic :id patterns to avoid route conflicts\n// Order: exact paths → literal segments → :id with suffixes → generic :id\n\n// Exact collection paths (no params)\nregisterCreateResource(resourcesRouter); // POST /resources\nregisterListResources(resourcesRouter); // GET /resources\n\n// Routes with literal second segment (before :id routes)\nregisterTokenRoutes(resourcesRouter); // GET /api/clone-tokens/:token, POST /api/clone-tokens/create-resource, POST /resources/:id/clone-with-token\n\n // Routes with :id and specific suffixes\n registerAnnotateReferencesStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-references-stream\n registerAnnotateHighlightsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-highlights-stream\n registerAnnotateAssessmentsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-assessments-stream\n registerAnnotateCommentsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-comments-stream\n registerAnnotateTagsStream(resourcesRouter, jobQueue); // POST /resources/:id/annotate-tags-stream\n registerGetResourceLLMContext(resourcesRouter); // GET /resources/:id/llm-context\n registerGetAnnotationLLMContext(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId/llm-context\n registerGetReferencedBy(resourcesRouter); // GET /resources/:id/referenced-by\n\n // Annotation routes (nested under resources) - must be before generic :id route\n registerGetResourceAnnotations(resourcesRouter); // GET /resources/:id/annotations (list)\n registerCreateAnnotation(resourcesRouter); // POST /resources/:id/annotations\n registerGetAnnotation(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId\n registerUpdateAnnotationBody(resourcesRouter); // PUT /resources/:resourceId/annotations/:annotationId/body\n registerYieldResourceStream(resourcesRouter, jobQueue); // POST /resources/:resourceId/annotations/:annotationId/yield-resource-stream\n registerGetAnnotationHistory(resourcesRouter); // GET /resources/:resourceId/annotations/:annotationId/history\n registerDeleteAnnotation(resourcesRouter); // DELETE /resources/:resourceId/annotations/:annotationId\n\n // Event routes\n registerGetEvents(resourcesRouter); // GET /resources/:id/events\n registerGetEventStream(resourcesRouter); // GET /resources/:id/events/stream\n\n // Generic routes with :id parameter - MUST BE LAST\n registerGetResourceUri(resourcesRouter); // W3C content negotiation for /resources/:id - handles both metadata and raw representations\n registerUpdateResource(resourcesRouter); // PATCH /resources/:id (handles archive via {archived: true})\n\n return resourcesRouter;\n}","// Shared imports and types for annotation routes\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { authMiddleware } from '../../middleware/auth';\nimport type { EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\n\n// Shared router type\nexport type AnnotationsRouterType = Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>;\n\n// Create a router with auth middleware pre-applied\nexport function createAnnotationRouter(): AnnotationsRouterType {\n const router = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\n router.use('/api/annotations/*', authMiddleware);\n router.use('/annotations/*', authMiddleware); // W3C URI endpoints also require auth\n return router;\n}","/**\n * Get Annotation URI Route - W3C Content Negotiation\n *\n * Handles globally resolvable annotation URIs with content negotiation:\n * - Accept: application/ld+json -> returns JSON-LD representation\n * - Accept: text/html (or browser) -> redirects to frontend viewer\n *\n * This implements W3C Web Annotation Data Model requirement that\n * annotation URIs be globally resolvable.\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport type { AnnotationsRouterType } from '../shared';\nimport type { components } from '@semiont/core';\nimport { getBodySource } from '@semiont/api-client';\nimport { AnnotationContext } from '@semiont/make-meaning';\nimport { ResourceContext } from '@semiont/make-meaning';\nimport { uriToResourceId } from '@semiont/core';\nimport { prefersHtml, getFrontendUrl } from '../../../middleware/content-negotiation';\nimport { resourceId as makeResourceId } from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\ntype GetAnnotationResponse = components['schemas']['GetAnnotationResponse'];\n\nexport function registerGetAnnotationUri(router: AnnotationsRouterType) {\n /**\n * GET /annotations/:id\n *\n * W3C-compliant globally resolvable annotation URI\n * Supports content negotiation:\n * - JSON-LD for machines (default)\n * - HTML redirect to frontend for browsers\n *\n * Requires resourceId query parameter for O(1) view storage lookup\n */\n router.get('/annotations/:id', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n const resourceUriOrId = query.resourceId;\n\n if (!resourceUriOrId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Extract resource ID from URI if provided as full URI\n let extractedResourceId: string;\n try {\n extractedResourceId = resourceUriOrId.includes('://')\n ? uriToResourceId(resourceUriOrId)\n : resourceUriOrId;\n } catch (error) {\n throw new HTTPException(400, { message: 'Invalid resourceId parameter' });\n }\n\n // Check if client prefers HTML (browser)\n if (prefersHtml(c)) {\n const frontendUrl = getFrontendUrl();\n const normalizedBase = frontendUrl.endsWith('/') ? frontendUrl.slice(0, -1) : frontendUrl;\n const redirectUrl = `${normalizedBase}/annotations/${id}?resourceId=${extractedResourceId}`;\n return c.redirect(redirectUrl, 302);\n }\n\n // Otherwise, return JSON-LD representation\n // O(1) lookup in view storage using resource ID\n const projection = await AnnotationContext.getResourceAnnotations(makeResourceId(extractedResourceId), config);\n\n // Find the annotation\n const annotation = projection.annotations.find((a: Annotation) => a.id === id);\n\n if (!annotation) {\n throw new HTTPException(404, { message: 'Annotation not found in resource' });\n }\n\n // Get resource metadata\n const resource = await ResourceContext.getResourceMetadata(makeResourceId(extractedResourceId), config);\n\n // If it's a linking annotation with a resolved source, get resolved resource\n let resolvedResource = null;\n const bodySource = getBodySource(annotation.body);\n if (annotation.motivation === 'linking' && bodySource) {\n // Extract ID from body source URI if needed\n const bodyDocId = bodySource.includes('://') ? uriToResourceId(bodySource) : bodySource;\n resolvedResource = await ResourceContext.getResourceMetadata(makeResourceId(bodyDocId), config);\n }\n\n const response: GetAnnotationResponse = {\n annotation,\n resource,\n resolvedResource,\n };\n\n // Set Content-Type to JSON-LD\n c.header('Content-Type', 'application/ld+json; charset=utf-8');\n\n return c.json(response);\n });\n}\n","/**\n * Annotation Operations Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { HTTPException } from 'hono/http-exception';\nimport { createAnnotationRouter, type AnnotationsRouterType } from './shared';\nimport { annotationId, resourceId as makeResourceId } from '@semiont/core';\nimport { AnnotationContext } from '@semiont/make-meaning';\n\n// Create router with auth middleware\nexport const operationsRouter: AnnotationsRouterType = createAnnotationRouter();\n\n/**\n * GET /api/annotations/:id/context\n *\n * Get the context around an annotation\n * Requires authentication\n *\n * Query parameters:\n * - contextBefore: Characters before selection (0-5000, default: 100)\n * - contextAfter: Characters after selection (0-5000, default: 100)\n */\noperationsRouter.get('/api/annotations/:id/context', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Require resourceId query parameter\n const resourceId = query.resourceId;\n if (!resourceId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Parse and validate query parameters\n const contextBefore = query.contextBefore ? Number(query.contextBefore) : 100;\n const contextAfter = query.contextAfter ? Number(query.contextAfter) : 100;\n\n // Validate ranges\n if (contextBefore < 0 || contextBefore > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextBefore\" must be between 0 and 5000' });\n }\n if (contextAfter < 0 || contextAfter > 5000) {\n throw new HTTPException(400, { message: 'Query parameter \"contextAfter\" must be between 0 and 5000' });\n }\n\n // Delegate to service for annotation context extraction\n try {\n const response = await AnnotationContext.getAnnotationContext(\n annotationId(id),\n makeResourceId(resourceId),\n contextBefore,\n contextAfter,\n config\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n if (error instanceof Error && error.message === 'Resource content not found') {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n if (error instanceof Error && error.message === 'TextPositionSelector required for context') {\n throw new HTTPException(400, { message: 'TextPositionSelector required for context' });\n }\n throw error;\n }\n});\n\n/**\n * GET /api/annotations/:id/summary\n *\n * Get an AI-generated summary of the annotation in context\n * Requires authentication\n */\noperationsRouter.get('/api/annotations/:id/summary', async (c) => {\n const { id } = c.req.param();\n const query = c.req.query();\n const config = c.get('config');\n\n // Require resourceId query parameter\n const resourceId = query.resourceId;\n if (!resourceId) {\n throw new HTTPException(400, { message: 'resourceId query parameter is required' });\n }\n\n // Delegate to service for annotation summary generation\n try {\n const response = await AnnotationContext.generateAnnotationSummary(\n annotationId(id),\n makeResourceId(resourceId),\n config\n );\n\n return c.json(response);\n } catch (error) {\n if (error instanceof Error && error.message === 'Annotation not found') {\n throw new HTTPException(404, { message: 'Annotation not found' });\n }\n if (error instanceof Error && error.message === 'Resource not found') {\n throw new HTTPException(404, { message: 'Resource not found' });\n }\n if (error instanceof Error && error.message === 'Resource content not found') {\n throw new HTTPException(404, { message: 'Resource content not found' });\n }\n throw error;\n }\n});\n","/**\n * Annotations Router\n *\n * This router now ONLY handles the W3C content negotiation endpoint for flat annotation URIs.\n * All CRUD operations have been moved to nested paths under /resources/{resourceId}/annotations/...\n *\n * Endpoints:\n * - GET /annotations/{id} - W3C content negotiation for annotation URIs\n */\n\nimport { Hono } from 'hono';\nimport { User } from '@prisma/client';\nimport { createAnnotationRouter } from './shared';\nimport { registerGetAnnotationUri } from './routes/get-uri';\nimport { operationsRouter } from './operations';\n\n// Create main annotations router\nexport const annotationsRouter = new Hono<{ Variables: { user: User } }>();\n\n// Register W3C content negotiation endpoint for annotation URIs\nconst uriRouter = createAnnotationRouter();\nregisterGetAnnotationUri(uriRouter);\nannotationsRouter.route('/', uriRouter);\n\n// Register annotation operations (yield-resource-stream, etc.)\nannotationsRouter.route('/', operationsRouter);","/**\n * Entity Types Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Validates request bodies with validateRequestBody middleware\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport type { User } from '@prisma/client';\nimport { authMiddleware } from '../middleware/auth';\nimport { validateRequestBody } from '../middleware/validate-openapi';\nimport type { components } from '@semiont/core';\nimport { userId, type EnvironmentConfig } from '@semiont/core';\nimport type { startMakeMeaning } from '@semiont/make-meaning';\nimport { readEntityTypesProjection } from '@semiont/make-meaning';\nimport { getLogger } from '../logger';\n\n// Lazy initialization to avoid calling getLogger() at module load time\nconst getRouteLogger = () => getLogger().child({ component: 'entity-types' });\n\ntype AddEntityTypeRequest = components['schemas']['AddEntityTypeRequest'];\ntype AddEntityTypeResponse = components['schemas']['AddEntityTypeResponse'];\ntype BulkAddEntityTypesRequest = components['schemas']['BulkAddEntityTypesRequest'];\ntype GetEntityTypesResponse = components['schemas']['GetEntityTypesResponse'];\n\n// Create router with auth middleware\nexport const entityTypesRouter = new Hono<{ Variables: { user: User; config: EnvironmentConfig; makeMeaning: Awaited<ReturnType<typeof startMakeMeaning>> } }>();\nentityTypesRouter.use('/api/entity-types/*', authMiddleware);\n\n/**\n * GET /api/entity-types\n * Get list of available entity types from view storage projection\n */\nentityTypesRouter.get('/api/entity-types', async (c) => {\n try {\n const config = c.get('config');\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: GetEntityTypesResponse = { entityTypes };\n return c.json(response, 200);\n } catch (error) {\n getRouteLogger().error('Error fetching entity types', {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n return c.json({ error: 'Failed to fetch entity types', details: error instanceof Error ? error.message : String(error) }, 500);\n }\n});\n\n/**\n * POST /api/entity-types\n * Add a new entity type to the collection (append-only, requires moderator/admin)\n * Emits entitytype.added event → Event Store → view storage projection → Graph Database (graph)\n */\nentityTypesRouter.post('/api/entity-types',\n validateRequestBody('AddEntityTypeRequest'),\n async (c) => {\n // Check moderation permissions\n const user = c.get('user');\n const config = c.get('config');\n if (!user.isModerator && !user.isAdmin) {\n return c.json({ error: 'Forbidden: Moderator or Admin access required' }, 403);\n }\n\n const body = c.get('validatedBody') as AddEntityTypeRequest;\n\n // Emit event (no resourceId for system-level events)\n const { eventStore } = c.get('makeMeaning');\n await eventStore.appendEvent({\n type: 'entitytype.added',\n // resourceId: undefined - system-level event\n userId: userId(user.id),\n version: 1,\n payload: {\n entityType: body.tag,\n },\n });\n\n // Read from view storage\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: AddEntityTypeResponse = { success: true, entityTypes };\n return c.json(response, 200);\n }\n);\n\n/**\n * POST /api/entity-types/bulk\n * Add multiple entity types to the collection (append-only, requires moderator/admin)\n * Emits one entitytype.added event per tag → Event Store → view storage projection → Graph Database (graph)\n */\nentityTypesRouter.post('/api/entity-types/bulk',\n validateRequestBody('BulkAddEntityTypesRequest'),\n async (c) => {\n // Check moderation permissions\n const user = c.get('user');\n const config = c.get('config');\n if (!user.isModerator && !user.isAdmin) {\n return c.json({ error: 'Forbidden: Moderator or Admin access required' }, 403);\n }\n\n const body = c.get('validatedBody') as BulkAddEntityTypesRequest;\n const { eventStore } = c.get('makeMeaning');\n\n // Emit one event per entity type (no resourceId)\n for (const tag of body.tags) {\n await eventStore.appendEvent({\n type: 'entitytype.added',\n // resourceId: undefined - system-level event\n userId: userId(user.id),\n version: 1,\n payload: {\n entityType: tag,\n },\n });\n }\n\n // Read from view storage\n const entityTypes = await readEntityTypesProjection(config);\n\n const response: AddEntityTypeResponse = { success: true, entityTypes };\n return c.json(response, 200);\n }\n);\n","/**\n * Jobs Routes - Spec-First Version\n *\n * Migrated from code-first to spec-first architecture:\n * - Uses plain Hono (no @hono/zod-openapi)\n * - Types from generated OpenAPI types\n * - OpenAPI spec is the source of truth\n */\n\nimport { Hono } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\nimport type { User } from '@prisma/client';\nimport type { Context, Next } from 'hono';\nimport type { JobQueue } from '@semiont/jobs';\nimport type { components } from '@semiont/core';\nimport { jobId } from '@semiont/core';\n\n// Type for auth middleware - backend will provide this\ntype AuthMiddleware = (c: Context, next: Next) => Promise<Response | void>;\n\ntype JobStatusResponse = components['schemas']['JobStatusResponse'];\n\nexport function createJobsRouter(jobQueue: JobQueue, authMiddleware: AuthMiddleware) {\n // Create jobs router\n const jobsRouter = new Hono<{ Variables: { user: User } }>();\n\n // Apply auth middleware to all jobs routes\n jobsRouter.use('/api/jobs/*', authMiddleware);\n\n /**\n * GET /api/jobs/:id\n *\n * Get job status and progress\n * Requires authentication\n */\n jobsRouter.get('/api/jobs/:id', async (c) => {\n const { id } = c.req.param();\n const user = c.get('user');\n\n const job = await jobQueue.getJob(jobId(id));\n\n if (!job) {\n throw new HTTPException(404, { message: 'Job not found' });\n }\n\n // Verify user owns this job\n if (job.metadata.userId !== user.id) {\n throw new HTTPException(404, { message: 'Job not found' });\n }\n\n // Use discriminated union to safely access state-specific fields\n const response: JobStatusResponse = {\n jobId: job.metadata.id,\n type: job.metadata.type,\n status: job.status,\n userId: job.metadata.userId,\n created: job.metadata.created,\n startedAt: job.status === 'running' || job.status === 'complete' ? job.startedAt : undefined,\n completedAt: job.status === 'complete' || job.status === 'failed' || job.status === 'cancelled' ? job.completedAt : undefined,\n error: job.status === 'failed' ? job.error : undefined,\n progress: job.status === 'running' ? job.progress : undefined,\n result: job.status === 'complete' ? job.result : undefined,\n };\n\n return c.json(response);\n });\n\n return jobsRouter;\n}\n","/**\n * Security Headers Middleware\n *\n * Adds security headers to all responses to protect against common attacks:\n * - X-Frame-Options: Prevents clickjacking\n * - X-Content-Type-Options: Prevents MIME sniffing\n * - Strict-Transport-Security: Enforces HTTPS\n * - Content-Security-Policy: Prevents XSS\n * - X-XSS-Protection: Browser XSS filter\n * - Referrer-Policy: Controls referrer information\n * - Permissions-Policy: Controls browser features\n */\n\nimport { MiddlewareHandler } from 'hono';\n\nexport const securityHeaders = (): MiddlewareHandler => {\n return async (c, next) => {\n await next();\n\n // X-Frame-Options: Prevent clickjacking by disallowing the page to be framed\n c.res.headers.set('X-Frame-Options', 'DENY');\n\n // X-Content-Type-Options: Prevent MIME sniffing\n c.res.headers.set('X-Content-Type-Options', 'nosniff');\n\n // Strict-Transport-Security: Enforce HTTPS for 1 year, including subdomains\n // Only set in production to avoid issues in local development\n if (process.env.NODE_ENV === 'production') {\n c.res.headers.set(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains'\n );\n }\n\n // Content-Security-Policy: Restrict resource loading to prevent XSS\n // This is a strict policy for an API - adjust if serving HTML\n const csp = [\n \"default-src 'none'\", // Block everything by default\n \"frame-ancestors 'none'\", // Don't allow framing (backup to X-Frame-Options)\n \"base-uri 'none'\", // Prevent base tag injection\n \"form-action 'none'\", // No form submissions from this origin\n ].join('; ');\n c.res.headers.set('Content-Security-Policy', csp);\n\n // X-XSS-Protection: Enable browser's XSS filter (legacy, but doesn't hurt)\n c.res.headers.set('X-XSS-Protection', '1; mode=block');\n\n // Referrer-Policy: Don't send referrer information\n c.res.headers.set('Referrer-Policy', 'no-referrer');\n\n // Permissions-Policy: Disable all browser features\n // This is an API, we don't need camera, geolocation, etc.\n const permissions = [\n 'camera=()',\n 'geolocation=()',\n 'microphone=()',\n 'payment=()',\n 'usb=()',\n 'interest-cohort=()', // Disable FLoC tracking\n ].join(', ');\n c.res.headers.set('Permissions-Policy', permissions);\n };\n};\n","/**\n * Request ID Middleware\n *\n * Generates a unique ID for each request and attaches it to the context.\n * Also creates a request-scoped logger with the request ID for correlation.\n */\n\nimport { Context, Next } from 'hono';\nimport { randomUUID } from 'crypto';\nimport { createChildLogger } from '../logger';\nimport type winston from 'winston';\n\n/**\n * Extended Hono Variables to include requestId and logger\n */\ndeclare module 'hono' {\n interface ContextVariableMap {\n requestId: string;\n logger: winston.Logger;\n }\n}\n\n/**\n * Request ID middleware\n *\n * Generates a unique request ID and creates a request-scoped logger.\n * The request ID is included in all logs from this request.\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n *\n * // Later in a route handler:\n * const logger = c.get('logger');\n * logger.info('Processing request'); // Includes requestId automatically\n * ```\n */\nexport const requestIdMiddleware = async (c: Context, next: Next) => {\n // Generate unique request ID\n const requestId = randomUUID();\n\n // Create request-scoped logger with request ID\n const logger = createChildLogger({ requestId });\n\n // Attach to context\n c.set('requestId', requestId);\n c.set('logger', logger);\n\n // Add request ID to response headers for debugging\n c.header('X-Request-ID', requestId);\n\n await next();\n};\n","/**\n * Request Logger Middleware\n *\n * Logs incoming requests and outgoing responses with timing information.\n * Helps debug request flow and identify slow endpoints.\n */\n\nimport { Context, Next } from 'hono';\n\n/**\n * Request logger middleware\n *\n * Logs:\n * - Incoming requests (method, path, query params, user agent)\n * - Outgoing responses (status code, timing)\n *\n * Uses the request-scoped logger from context (set by requestIdMiddleware).\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n * app.use('*', requestLoggerMiddleware);\n * ```\n */\nexport const requestLoggerMiddleware = async (c: Context, next: Next) => {\n const logger = c.get('logger');\n const startTime = Date.now();\n\n const method = c.req.method;\n const path = c.req.path;\n const query = c.req.query();\n const userAgent = c.req.header('User-Agent') || 'unknown';\n\n // Log incoming request\n logger.http('Incoming request', {\n type: 'request_incoming',\n method,\n path,\n query: Object.keys(query).length > 0 ? query : undefined,\n userAgent\n });\n\n // Process request\n await next();\n\n // Log outgoing response\n const duration = Date.now() - startTime;\n const status = c.res.status;\n\n logger.http('Outgoing response', {\n type: 'request_outgoing',\n method,\n path,\n status,\n duration,\n durationMs: duration\n });\n};\n","/**\n * Error Logger Middleware\n *\n * Catches unhandled errors and logs them with full stack traces.\n * Should be one of the last middleware in the chain.\n */\n\nimport { Context, Next } from 'hono';\n\n/**\n * Error logger middleware\n *\n * Catches any errors thrown during request processing and logs them.\n * Ensures errors are logged with full context before returning error responses.\n *\n * IMPORTANT: This should be added BEFORE route handlers but AFTER\n * requestIdMiddleware so errors have the request ID for correlation.\n *\n * @example\n * ```typescript\n * app.use('*', requestIdMiddleware);\n * app.use('*', errorLoggerMiddleware);\n * app.use('*', requestLoggerMiddleware);\n * // ... route handlers\n * ```\n */\nexport const errorLoggerMiddleware = async (c: Context, next: Next) => {\n try {\n await next();\n } catch (error) {\n const logger = c.get('logger');\n\n // Log the error with full context\n logger.error('Unhandled error during request processing', {\n type: 'unhandled_error',\n method: c.req.method,\n path: c.req.path,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined\n });\n\n // Re-throw to let Hono's error handler deal with it\n throw error;\n }\n};\n"]}
|