@omiron33/omi-neuron-web 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/api/index.cjs +943 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +140 -0
- package/dist/api/index.d.ts +140 -0
- package/dist/api/index.js +934 -0
- package/dist/api/index.js.map +1 -0
- package/dist/chunk-BSOSHBDR.cjs +300 -0
- package/dist/chunk-BSOSHBDR.cjs.map +1 -0
- package/dist/chunk-COO66N7H.cjs +950 -0
- package/dist/chunk-COO66N7H.cjs.map +1 -0
- package/dist/chunk-FXKXMSLY.cjs +270 -0
- package/dist/chunk-FXKXMSLY.cjs.map +1 -0
- package/dist/chunk-PSDVPB7Y.js +289 -0
- package/dist/chunk-PSDVPB7Y.js.map +1 -0
- package/dist/chunk-RQCGONPN.js +937 -0
- package/dist/chunk-RQCGONPN.js.map +1 -0
- package/dist/chunk-RTSFO7BW.cjs +592 -0
- package/dist/chunk-RTSFO7BW.cjs.map +1 -0
- package/dist/chunk-TFLMPBX7.js +262 -0
- package/dist/chunk-TFLMPBX7.js.map +1 -0
- package/dist/chunk-XNR42GCJ.js +547 -0
- package/dist/chunk-XNR42GCJ.js.map +1 -0
- package/dist/cli/index.cjs +571 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +563 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/database-B0vplyA4.d.cts +41 -0
- package/dist/database-B0vplyA4.d.ts +41 -0
- package/dist/edge-BzsYe2Ed.d.cts +269 -0
- package/dist/edge-BzsYe2Ed.d.ts +269 -0
- package/dist/index.cjs +895 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1484 -0
- package/dist/index.d.ts +1484 -0
- package/dist/index.js +654 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/index.cjs +32 -0
- package/dist/migration/index.cjs.map +1 -0
- package/dist/migration/index.d.cts +51 -0
- package/dist/migration/index.d.ts +51 -0
- package/dist/migration/index.js +3 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/query-helpers-D8po5Mn-.d.cts +777 -0
- package/dist/query-helpers-DvQTA2_Z.d.ts +777 -0
- package/dist/visualization/index.cjs +485 -0
- package/dist/visualization/index.cjs.map +1 -0
- package/dist/visualization/index.d.cts +134 -0
- package/dist/visualization/index.d.ts +134 -0
- package/dist/visualization/index.js +460 -0
- package/dist/visualization/index.js.map +1 -0
- package/docker/docker-compose.template.yml +28 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/repositories/base.ts","../../src/api/repositories/node-repository.ts","../../src/api/routes/nodes.ts","../../src/api/repositories/edge-repository.ts","../../src/api/routes/edges.ts","../../src/api/query-builder.ts","../../src/api/routes/graph.ts","../../src/api/routes/analyze.ts","../../src/api/repositories/settings-repository.ts","../../src/api/routes/settings.ts","../../src/api/routes/search.ts","../../src/api/routes/health.ts","../../src/api/routes/factory.ts","../../src/api/repositories/cluster-repository.ts","../../src/api/repositories/analysis-run-repository.ts","../../src/api/middleware/cors.ts","../../src/api/middleware/error-handler.ts","../../src/api/middleware/logging.ts","../../src/api/middleware/timing.ts","../../src/api/middleware/index.ts"],"names":["pipeline","body","input","results"],"mappings":"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","file":"index.js","sourcesContent":["import type { Database } from '../../storage/database';\nimport {\n buildDelete,\n buildInsert,\n buildSelect,\n buildUpdate,\n buildWhereClause,\n type SelectOptions,\n type WhereClause,\n} from '../../storage/query-helpers';\n\nexport interface QueryOptions extends SelectOptions {\n where?: WhereClause;\n}\n\nexport abstract class BaseRepository<T, CreateDTO, UpdateDTO> {\n constructor(protected db: Database, protected tableName: string) {}\n\n async findById(id: string): Promise<T | null> {\n const { sql, values } = buildSelect(this.tableName, '*', { id });\n const rows = await this.db.query<T>(sql, values);\n return rows[0] ?? null;\n }\n\n async findAll(options?: QueryOptions): Promise<T[]> {\n const { sql, values } = buildSelect(\n this.tableName,\n '*',\n options?.where,\n options\n );\n return this.db.query<T>(sql, values);\n }\n\n async create(data: CreateDTO): Promise<T> {\n const { sql, values } = buildInsert(this.tableName, data as Record<string, unknown>);\n const rows = await this.db.query<T>(sql, values);\n return rows[0];\n }\n\n async update(id: string, data: UpdateDTO): Promise<T | null> {\n const { sql, values } = buildUpdate(this.tableName, data as Record<string, unknown>, { id });\n const rows = await this.db.query<T>(sql, values);\n return rows[0] ?? null;\n }\n\n async delete(id: string): Promise<boolean> {\n const { sql, values } = buildDelete(this.tableName, { id });\n const count = await this.db.execute(sql, values);\n return count > 0;\n }\n\n async count(where?: WhereClause): Promise<number> {\n const whereResult = buildWhereClause(where);\n const sql = `SELECT COUNT(*)::int as count FROM ${this.tableName} ${whereResult.clause}`;\n const rows = await this.db.query<{ count: number }>(sql, whereResult.values);\n return Number(rows[0]?.count ?? 0);\n }\n}\n","import type { Database } from '../../storage/database';\nimport type { NeuronNode, NeuronNodeCreate, NeuronNodeUpdate } from '../../core/types/node';\nimport type { QueryOptions } from './base';\nimport { BaseRepository } from './base';\n\nconst mapNodeRow = (row: Record<string, unknown>): NeuronNode => ({\n id: row.id as string,\n slug: row.slug as string,\n label: row.label as string,\n nodeType: row.node_type as string,\n domain: row.domain as string,\n summary: (row.summary as string | null) ?? null,\n description: (row.description as string | null) ?? null,\n content: (row.content as string | null) ?? null,\n metadata: (row.metadata as Record<string, unknown>) ?? {},\n tier: (row.tier as NeuronNode['tier']) ?? undefined,\n visualPriority: (row.visual_priority as number | undefined) ?? undefined,\n positionOverride: (row.position_override as [number, number, number] | null) ?? null,\n connectionCount: (row.connection_count as number | undefined) ?? 0,\n inboundCount: (row.inbound_count as number | undefined) ?? 0,\n outboundCount: (row.outbound_count as number | undefined) ?? 0,\n analysisStatus: (row.analysis_status as NeuronNode['analysisStatus']) ?? 'pending',\n analysisError: (row.analysis_error as string | null) ?? null,\n embedding: (row.embedding as number[] | null) ?? null,\n embeddingModel: (row.embedding_model as string | null) ?? null,\n embeddingGeneratedAt: (row.embedding_generated_at as Date | null) ?? null,\n clusterId: (row.cluster_id as string | null) ?? null,\n clusterSimilarity: (row.cluster_similarity as number | null) ?? null,\n createdAt: row.created_at as Date,\n updatedAt: row.updated_at as Date,\n});\n\nexport class NodeRepository extends BaseRepository<NeuronNode, NeuronNodeCreate, NeuronNodeUpdate> {\n constructor(db: Database) {\n super(db, 'nodes');\n }\n\n override async findById(id: string): Promise<NeuronNode | null> {\n const row = await this.db.queryOne<Record<string, unknown>>('SELECT * FROM nodes WHERE id = $1', [id]);\n return row ? mapNodeRow(row) : null;\n }\n\n override async findAll(options?: QueryOptions): Promise<NeuronNode[]> {\n const rows = await super.findAll(options);\n return (rows as unknown as Record<string, unknown>[]).map(mapNodeRow);\n }\n\n async findBySlug(slug: string): Promise<NeuronNode | null> {\n const row = await this.db.queryOne<Record<string, unknown>>('SELECT * FROM nodes WHERE slug = $1', [slug]);\n return row ? mapNodeRow(row) : null;\n }\n\n async findByDomain(domain: string): Promise<NeuronNode[]> {\n const rows = await this.db.query<Record<string, unknown>>('SELECT * FROM nodes WHERE domain = $1', [domain]);\n return rows.map(mapNodeRow);\n }\n\n async findByCluster(clusterId: string): Promise<NeuronNode[]> {\n const rows = await this.db.query<Record<string, unknown>>('SELECT * FROM nodes WHERE cluster_id = $1', [clusterId]);\n return rows.map(mapNodeRow);\n }\n\n async search(query: string): Promise<NeuronNode[]> {\n const rows = await this.db.query<Record<string, unknown>>(\n `SELECT * FROM nodes WHERE label ILIKE $1 OR summary ILIKE $1 OR content ILIKE $1`,\n [`%${query}%`]\n );\n return rows.map(mapNodeRow);\n }\n\n async batchCreate(nodes: NeuronNodeCreate[]): Promise<NeuronNode[]> {\n const created: NeuronNode[] = [];\n for (const node of nodes) {\n const row = await this.db.queryOne<Record<string, unknown>>(\n `INSERT INTO nodes (slug, label, node_type, domain, summary, description, content, metadata, tier)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING *`,\n [\n node.slug,\n node.label,\n node.nodeType ?? 'concept',\n node.domain ?? 'general',\n node.summary ?? null,\n node.description ?? null,\n node.content ?? null,\n node.metadata ?? {},\n node.tier ?? null,\n ]\n );\n if (row) created.push(mapNodeRow(row));\n }\n return created;\n }\n\n async updateConnectionCounts(nodeId: string): Promise<void> {\n const inbound = await this.db.queryOne<{ count: string }>(\n 'SELECT COUNT(*)::int as count FROM edges WHERE to_node_id = $1',\n [nodeId]\n );\n const outbound = await this.db.queryOne<{ count: string }>(\n 'SELECT COUNT(*)::int as count FROM edges WHERE from_node_id = $1',\n [nodeId]\n );\n const inboundCount = Number(inbound?.count ?? 0);\n const outboundCount = Number(outbound?.count ?? 0);\n await this.db.execute(\n 'UPDATE nodes SET inbound_count = $1, outbound_count = $2, connection_count = $3 WHERE id = $4',\n [inboundCount, outboundCount, inboundCount + outboundCount, nodeId]\n );\n }\n}\n","import { listNodesParamsSchema } from '../../core/schemas/api';\nimport { nodeBatchCreateSchema, nodeUpdateSchema } from '../../core/schemas/node';\nimport type { NeuronConfig } from '../../core/types/settings';\nimport { createDatabase } from '../../storage/factory';\nimport { NodeRepository } from '../repositories/node-repository';\n\nexport const createNodesRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const repo = new NodeRepository(db);\n\n return {\n async GET(request: Request) {\n const url = new URL(request.url);\n const params = listNodesParamsSchema.parse(Object.fromEntries(url.searchParams));\n const nodes = await repo.findAll({\n where: {},\n limit: params.limit,\n offset: params.page ? (params.page - 1) * (params.limit ?? 50) : undefined,\n });\n return Response.json({\n nodes,\n pagination: {\n page: params.page ?? 1,\n limit: params.limit ?? nodes.length,\n total: nodes.length,\n totalPages: 1,\n hasNext: false,\n hasPrev: false,\n },\n meta: {\n queryTime: 0,\n filters: params,\n },\n });\n },\n async POST(request: Request) {\n const body = await request.json();\n const input = nodeBatchCreateSchema.parse(body);\n const created = await repo.batchCreate(input.nodes);\n return Response.json({ created, skipped: [], analysisJobId: null }, { status: 201 });\n },\n async PATCH(request: Request) {\n const url = new URL(request.url);\n const id = url.pathname.split('/').pop();\n if (!id) return new Response('Missing id', { status: 400 });\n const body = await request.json();\n const input = nodeUpdateSchema.parse(body);\n const updated = await repo.update(id, input);\n return Response.json(updated);\n },\n async DELETE(request: Request) {\n const url = new URL(request.url);\n const id = url.pathname.split('/').pop();\n if (!id) return new Response('Missing id', { status: 400 });\n const deleted = await repo.delete(id);\n return Response.json({ deleted, edgesRemoved: 0 });\n },\n };\n};\n","import type { Database } from '../../storage/database';\nimport type { NeuronEdge, NeuronEdgeCreate, NeuronEdgeUpdate } from '../../core/types/edge';\nimport { BaseRepository } from './base';\n\nconst mapEdgeRow = (row: Record<string, unknown>): NeuronEdge => ({\n id: row.id as string,\n fromNodeId: row.from_node_id as string,\n toNodeId: row.to_node_id as string,\n relationshipType: row.relationship_type as string,\n strength: Number(row.strength ?? 0.5),\n confidence: Number(row.confidence ?? 1),\n evidence: (row.evidence as NeuronEdge['evidence']) ?? [],\n label: (row.label as string | null) ?? null,\n description: (row.description as string | null) ?? null,\n metadata: (row.metadata as Record<string, unknown>) ?? {},\n source: row.source as NeuronEdge['source'],\n sourceModel: (row.source_model as string | null) ?? null,\n createdAt: row.created_at as Date,\n updatedAt: row.updated_at as Date,\n bidirectional: Boolean(row.bidirectional ?? false),\n});\n\nexport class EdgeRepository extends BaseRepository<NeuronEdge, NeuronEdgeCreate, NeuronEdgeUpdate> {\n constructor(db: Database) {\n super(db, 'edges');\n }\n\n override async findById(id: string): Promise<NeuronEdge | null> {\n const row = await this.db.queryOne<Record<string, unknown>>('SELECT * FROM edges WHERE id = $1', [id]);\n return row ? mapEdgeRow(row) : null;\n }\n\n override async findAll(): Promise<NeuronEdge[]> {\n const rows = await this.db.query<Record<string, unknown>>('SELECT * FROM edges');\n return rows.map(mapEdgeRow);\n }\n\n async findByNodeId(nodeId: string, direction: 'inbound' | 'outbound' | 'both' = 'both') {\n let sql = 'SELECT * FROM edges WHERE from_node_id = $1 OR to_node_id = $1';\n if (direction === 'inbound') {\n sql = 'SELECT * FROM edges WHERE to_node_id = $1';\n }\n if (direction === 'outbound') {\n sql = 'SELECT * FROM edges WHERE from_node_id = $1';\n }\n const rows = await this.db.query<Record<string, unknown>>(sql, [nodeId]);\n return rows.map(mapEdgeRow);\n }\n\n async findBetweenNodes(fromId: string, toId: string): Promise<NeuronEdge[]> {\n const rows = await this.db.query<Record<string, unknown>>(\n 'SELECT * FROM edges WHERE from_node_id = $1 AND to_node_id = $2',\n [fromId, toId]\n );\n return rows.map(mapEdgeRow);\n }\n\n async deleteByNodeId(nodeId: string): Promise<number> {\n return this.db.execute('DELETE FROM edges WHERE from_node_id = $1 OR to_node_id = $1', [nodeId]);\n }\n\n async batchCreate(edges: NeuronEdgeCreate[]): Promise<NeuronEdge[]> {\n const created: NeuronEdge[] = [];\n for (const edge of edges) {\n const row = await this.db.queryOne<Record<string, unknown>>(\n `INSERT INTO edges (from_node_id, to_node_id, relationship_type, strength, confidence, evidence, label, description, metadata, source, bidirectional)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, 'manual', $10)\n RETURNING *`,\n [\n edge.fromNodeId,\n edge.toNodeId,\n edge.relationshipType ?? 'related_to',\n edge.strength ?? 0.5,\n edge.confidence ?? 1,\n edge.evidence ?? [],\n edge.label ?? null,\n edge.description ?? null,\n edge.metadata ?? {},\n edge.bidirectional ?? false,\n ]\n );\n if (row) created.push(mapEdgeRow(row));\n }\n return created;\n }\n}\n","import { listEdgesParamsSchema } from '../../core/schemas/api';\nimport { edgeCreateSchema, edgeUpdateSchema } from '../../core/schemas/edge';\nimport type { NeuronConfig } from '../../core/types/settings';\nimport { createDatabase } from '../../storage/factory';\nimport { EdgeRepository } from '../repositories/edge-repository';\n\nexport const createEdgesRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const repo = new EdgeRepository(db);\n\n return {\n async GET(request: Request) {\n const url = new URL(request.url);\n const params = listEdgesParamsSchema.parse(Object.fromEntries(url.searchParams));\n const edges = await repo.findAll();\n return Response.json({\n edges,\n pagination: {\n page: params.page ?? 1,\n limit: params.limit ?? edges.length,\n total: edges.length,\n totalPages: 1,\n hasNext: false,\n hasPrev: false,\n },\n });\n },\n async POST(request: Request) {\n const body = await request.json();\n const input = edgeCreateSchema.array().safeParse(body.edges ?? body);\n if (!input.success) {\n return Response.json({ error: input.error.message }, { status: 400 });\n }\n const created = await repo.batchCreate(input.data);\n return Response.json({ created, errors: [] }, { status: 201 });\n },\n async PATCH(request: Request) {\n const url = new URL(request.url);\n const id = url.pathname.split('/').pop();\n if (!id) return new Response('Missing id', { status: 400 });\n const body = await request.json();\n const input = edgeUpdateSchema.parse(body);\n const updated = await repo.update(id, input);\n return Response.json(updated);\n },\n async DELETE(request: Request) {\n const url = new URL(request.url);\n const id = url.pathname.split('/').pop();\n if (!id) return new Response('Missing id', { status: 400 });\n const deleted = await repo.delete(id);\n return Response.json({ deleted });\n },\n };\n};\n","import type { Database } from '../storage/database';\nimport type {\n ExpandGraphRequest,\n ExpandGraphResponse,\n FindPathRequest,\n FindPathResponse,\n GetGraphParams,\n GetGraphResponse,\n} from '../core/types/api';\nimport type { NeuronVisualEdge, NeuronVisualNode } from '../core/types';\n\nconst mapVisualNode = (row: Record<string, unknown>): NeuronVisualNode => ({\n id: row.id as string,\n slug: row.slug as string,\n label: row.label as string,\n domain: row.domain as string,\n tier: (row.tier as NeuronVisualNode['tier']) ?? undefined,\n metadata: (row.metadata as Record<string, unknown>) ?? {},\n ref: (row.ref as string | null) ?? null,\n connectionCount: Number(row.connection_count ?? 0),\n position: (row.position_override as [number, number, number] | null) ?? undefined,\n});\n\nconst mapVisualEdge = (row: Record<string, unknown>): NeuronVisualEdge => ({\n id: row.id as string,\n from: row.from_slug as string,\n to: row.to_slug as string,\n relationshipType: row.relationship_type as string,\n strength: Number(row.strength ?? 0.5),\n label: (row.label as string | null) ?? null,\n});\n\nexport class GraphQueryBuilder {\n constructor(private db: Database) {}\n\n buildGraphQuery(params: GetGraphParams): { sql: string; values: unknown[] } {\n const values: unknown[] = [];\n const filters: string[] = [];\n\n if (params.domains?.length) {\n values.push(params.domains);\n filters.push(`domain = ANY($${values.length})`);\n }\n if (params.nodeTypes?.length) {\n values.push(params.nodeTypes);\n filters.push(`node_type = ANY($${values.length})`);\n }\n if (params.clusterIds?.length) {\n values.push(params.clusterIds);\n filters.push(`cluster_id = ANY($${values.length})`);\n }\n if (params.nodeIds?.length) {\n values.push(params.nodeIds);\n filters.push(`id = ANY($${values.length})`);\n }\n\n const where = filters.length ? `WHERE ${filters.join(' AND ')}` : '';\n const limit = params.maxNodes ? `LIMIT ${params.maxNodes}` : '';\n\n const sql = `\n WITH filtered_nodes AS (\n SELECT * FROM nodes\n ${where}\n ${limit}\n )\n SELECT * FROM filtered_nodes;\n `;\n\n return { sql, values };\n }\n\n buildExpansionQuery(params: ExpandGraphRequest): { sql: string; values: unknown[] } {\n const values: unknown[] = [params.fromNodeIds, params.depth ?? 1];\n const sql = `\n WITH RECURSIVE expanded AS (\n SELECT id, slug, label, domain, tier, metadata, position_override, connection_count, 1 as depth\n FROM nodes\n WHERE id = ANY($1)\n\n UNION ALL\n\n SELECT n.id, n.slug, n.label, n.domain, n.tier, n.metadata, n.position_override, n.connection_count, e.depth + 1\n FROM expanded e\n JOIN edges ed ON ed.from_node_id = e.id OR ed.to_node_id = e.id\n JOIN nodes n ON (n.id = ed.from_node_id OR n.id = ed.to_node_id)\n WHERE e.depth < $2\n )\n SELECT DISTINCT * FROM expanded;\n `;\n\n return { sql, values };\n }\n\n buildPathQuery(params: FindPathRequest): { sql: string; values: unknown[] } {\n const values: unknown[] = [params.fromNodeId, params.toNodeId, params.maxDepth ?? 5];\n const sql = `\n WITH RECURSIVE paths AS (\n SELECT ARRAY[from_node_id, to_node_id] as path,\n ARRAY[id] as edge_ids,\n strength as total_strength,\n 1 as depth\n FROM edges\n WHERE from_node_id = $1\n\n UNION ALL\n\n SELECT p.path || e.to_node_id,\n p.edge_ids || e.id,\n p.total_strength + e.strength,\n p.depth + 1\n FROM paths p\n JOIN edges e ON e.from_node_id = p.path[array_upper(p.path, 1)]\n WHERE NOT e.to_node_id = ANY(p.path)\n AND p.depth < $3\n )\n SELECT * FROM paths\n WHERE path[array_upper(path, 1)] = $2\n ORDER BY array_length(path, 1), total_strength DESC;\n `;\n\n return { sql, values };\n }\n\n async getGraph(params: GetGraphParams): Promise<GetGraphResponse> {\n const { sql, values } = this.buildGraphQuery(params);\n const nodes = await this.db.query<Record<string, unknown>>(sql, values);\n const nodeIds = nodes.map((node) => node.id as string);\n\n const edges = await this.db.query<Record<string, unknown>>(\n `SELECT e.*, n1.slug as from_slug, n2.slug as to_slug\n FROM edges e\n JOIN nodes n1 ON e.from_node_id = n1.id\n JOIN nodes n2 ON e.to_node_id = n2.id\n WHERE e.from_node_id = ANY($1) AND e.to_node_id = ANY($1)`,\n [nodeIds]\n );\n\n return {\n nodes: nodes.map(mapVisualNode),\n edges: edges.map(mapVisualEdge),\n clusters: [],\n meta: {\n totalNodes: nodes.length,\n totalEdges: edges.length,\n truncated: Boolean(params.maxNodes && nodes.length >= params.maxNodes),\n queryTime: 0,\n },\n };\n }\n\n async expandGraph(params: ExpandGraphRequest): Promise<ExpandGraphResponse> {\n const { sql, values } = this.buildExpansionQuery(params);\n const nodes = await this.db.query<Record<string, unknown>>(sql, values);\n const nodeIds = nodes.map((node) => node.id as string);\n\n const edges = await this.db.query<Record<string, unknown>>(\n `SELECT e.*, n1.slug as from_slug, n2.slug as to_slug\n FROM edges e\n JOIN nodes n1 ON e.from_node_id = n1.id\n JOIN nodes n2 ON e.to_node_id = n2.id\n WHERE e.from_node_id = ANY($1) AND e.to_node_id = ANY($1)`,\n [nodeIds]\n );\n\n return {\n nodes: nodes.map(mapVisualNode),\n edges: edges.map(mapVisualEdge),\n };\n }\n\n async findPaths(params: FindPathRequest): Promise<FindPathResponse> {\n const { sql, values } = this.buildPathQuery(params);\n const rows = await this.db.query<{ path: string[]; edge_ids: string[]; total_strength: number }>(\n sql,\n values\n );\n\n return {\n paths: rows.map((row) => ({\n nodes: row.path,\n edges: row.edge_ids,\n length: row.path.length,\n totalStrength: row.total_strength,\n })),\n };\n }\n}\n","import { expandGraphRequestSchema, findPathRequestSchema, getGraphParamsSchema } from '../../core/schemas/api';\nimport type { NeuronConfig } from '../../core/types/settings';\nimport { createDatabase } from '../../storage/factory';\nimport { GraphQueryBuilder } from '../query-builder';\n\nexport const createGraphRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const builder = new GraphQueryBuilder(db);\n\n return {\n async GET(request: Request) {\n const url = new URL(request.url);\n const params = getGraphParamsSchema.parse(Object.fromEntries(url.searchParams));\n const result = await builder.getGraph({\n ...params,\n nodeTypes: params.nodeTypes ? (Array.isArray(params.nodeTypes) ? params.nodeTypes : [params.nodeTypes]) : undefined,\n domains: params.domains ? (Array.isArray(params.domains) ? params.domains : [params.domains]) : undefined,\n clusterIds: params.clusterIds ? (Array.isArray(params.clusterIds) ? params.clusterIds : [params.clusterIds]) : undefined,\n nodeIds: params.nodeIds ? (Array.isArray(params.nodeIds) ? params.nodeIds : [params.nodeIds]) : undefined,\n relationshipTypes: params.relationshipTypes\n ? (Array.isArray(params.relationshipTypes) ? params.relationshipTypes : [params.relationshipTypes])\n : undefined,\n });\n return Response.json(result);\n },\n async POST(request: Request) {\n const url = new URL(request.url);\n if (url.pathname.endsWith('/expand')) {\n const body = await request.json();\n const input = expandGraphRequestSchema.parse(body);\n const result = await builder.expandGraph(input);\n return Response.json(result);\n }\n if (url.pathname.endsWith('/path')) {\n const body = await request.json();\n const input = findPathRequestSchema.parse(body);\n const result = await builder.findPaths(input);\n return Response.json(result);\n }\n return new Response('Unsupported', { status: 404 });\n },\n };\n};\n","import type { NeuronConfig } from '../../core/types/settings';\nimport { analysisRequestSchema } from '../../core/schemas/analysis';\nimport { createDatabase } from '../../storage/factory';\nimport { EventBus } from '../../core/events/event-bus';\nimport { EmbeddingsService } from '../../core/analysis/embeddings-service';\nimport { ClusteringEngine } from '../../core/analysis/clustering-engine';\nimport { RelationshipEngine } from '../../core/analysis/relationship-engine';\nimport { AnalysisPipeline } from '../../core/analysis/pipeline';\n\nconst buildPipeline = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const events = new EventBus();\n const embeddings = new EmbeddingsService(\n {\n openaiApiKey: config.openai.apiKey,\n model: config.analysis.embeddingModel,\n batchSize: config.analysis.embeddingBatchSize,\n rateLimit: config.analysis.openaiRateLimit,\n cacheTTL: config.analysis.embeddingCacheTTL,\n maxRetries: config.openai.maxRetries ?? 3,\n },\n db\n );\n const clustering = new ClusteringEngine(db, embeddings);\n const relationships = new RelationshipEngine(db, {\n model: config.analysis.relationshipInferenceModel,\n minConfidence: config.analysis.relationshipMinConfidence,\n maxPerNode: config.analysis.relationshipMaxPerNode,\n similarityThreshold: config.analysis.clusterSimilarityThreshold,\n includeExisting: true,\n batchSize: 10,\n rateLimit: config.analysis.openaiRateLimit,\n });\n return new AnalysisPipeline(db, embeddings, clustering, relationships, events);\n};\n\nexport const createAnalyzeRoutes = (config: NeuronConfig) => {\n return {\n async POST(request: Request) {\n const url = new URL(request.url);\n if (url.pathname.endsWith('/cancel')) {\n const jobId = url.pathname.split('/').slice(-2)[0];\n const pipeline = buildPipeline(config);\n const cancelled = await pipeline.cancelJob(jobId);\n return Response.json({ cancelled });\n }\n\n const body = await request.json();\n const input = analysisRequestSchema.parse(body);\n const pipeline = buildPipeline(config);\n let job;\n if (input.action === 'embeddings') {\n job = await pipeline.runEmbeddings(input.options ?? {});\n } else if (input.action === 'cluster') {\n job = await pipeline.runClustering(input.options ?? {});\n } else if (input.action === 'infer_relationships') {\n job = await pipeline.runRelationships(input.options ?? {});\n } else {\n job = await pipeline.runFull(input.options ?? {});\n }\n return Response.json({ jobId: job.id, status: job.status });\n },\n async GET(request: Request) {\n const url = new URL(request.url);\n if (url.pathname.endsWith('/history')) {\n const pipeline = buildPipeline(config);\n const jobs = await pipeline.listJobs({ limit: 50 });\n return Response.json({ jobs });\n }\n const jobId = url.pathname.split('/').pop();\n if (!jobId) return new Response('Missing job id', { status: 400 });\n const pipeline = buildPipeline(config);\n const job = await pipeline.getJob(jobId);\n return Response.json({ job });\n },\n };\n};\n","import type { Database } from '../../storage/database';\nimport type { NeuronSettings, NeuronSettingsUpdate } from '../../core/types/settings';\nimport { DEFAULT_ANALYSIS_SETTINGS, DEFAULT_VISUALIZATION_SETTINGS } from '../../core/types/settings';\n\nconst deepMerge = (target: Record<string, unknown>, source: Record<string, unknown>) => {\n const output = { ...target };\n Object.entries(source).forEach(([key, value]) => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n output[key] = deepMerge((output[key] as Record<string, unknown>) ?? {}, value as Record<string, unknown>);\n } else if (value !== undefined) {\n output[key] = value as unknown;\n }\n });\n return output;\n};\n\nconst defaultSettings = (): NeuronSettings => ({\n instance: {\n name: 'default',\n version: '0.1.0',\n repoName: 'omi-neuron-web',\n },\n visualization: DEFAULT_VISUALIZATION_SETTINGS,\n analysis: DEFAULT_ANALYSIS_SETTINGS,\n nodeTypes: [],\n domains: [],\n relationshipTypes: [],\n});\n\nexport class SettingsRepository {\n constructor(private db: Database) {}\n\n async get(): Promise<NeuronSettings> {\n const row = await this.db.queryOne<{\n visualization: Record<string, unknown> | null;\n analysis: Record<string, unknown> | null;\n node_types: NeuronSettings['nodeTypes'] | null;\n domains: NeuronSettings['domains'] | null;\n relationship_types: NeuronSettings['relationshipTypes'] | null;\n }>('SELECT visualization, analysis, node_types, domains, relationship_types FROM settings WHERE id = $1', [\n 'default',\n ]);\n\n if (!row) {\n return defaultSettings();\n }\n\n return {\n ...defaultSettings(),\n visualization: { ...DEFAULT_VISUALIZATION_SETTINGS, ...(row.visualization ?? {}) },\n analysis: { ...DEFAULT_ANALYSIS_SETTINGS, ...(row.analysis ?? {}) },\n nodeTypes: row.node_types ?? [],\n domains: row.domains ?? [],\n relationshipTypes: row.relationship_types ?? [],\n };\n }\n\n async update(settings: NeuronSettingsUpdate): Promise<NeuronSettings> {\n const current = await this.get();\n const merged = deepMerge(current as unknown as Record<string, unknown>, settings as Record<string, unknown>);\n await this.db.execute(\n `INSERT INTO settings (id, visualization, analysis, node_types, domains, relationship_types)\n VALUES ('default', $1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET visualization = $1, analysis = $2, node_types = $3, domains = $4, relationship_types = $5, updated_at = NOW()`,\n [\n merged.visualization,\n merged.analysis,\n merged.nodeTypes,\n merged.domains,\n merged.relationshipTypes,\n ]\n );\n return merged as unknown as NeuronSettings;\n }\n\n async reset(sections?: string[]): Promise<NeuronSettings> {\n const defaults = defaultSettings() as unknown as Record<string, unknown>;\n if (sections?.length) {\n const current = await this.get();\n const updated = { ...(current as unknown as Record<string, unknown>) };\n sections.forEach((section) => {\n updated[section] = defaults[section];\n });\n return this.update(updated as NeuronSettingsUpdate);\n }\n\n await this.db.execute(\n `INSERT INTO settings (id, visualization, analysis, node_types, domains, relationship_types)\n VALUES ('default', $1, $2, $3, $4, $5)\n ON CONFLICT (id) DO UPDATE SET visualization = $1, analysis = $2, node_types = $3, domains = $4, relationship_types = $5, updated_at = NOW()`,\n [\n defaults.visualization,\n defaults.analysis,\n defaults.nodeTypes,\n defaults.domains,\n defaults.relationshipTypes,\n ]\n );\n\n return defaults as unknown as NeuronSettings;\n }\n}\n","import type { NeuronConfig, NeuronSettingsUpdate } from '../../core/types/settings';\nimport { neuronSettingsUpdateSchema } from '../../core/schemas/settings';\nimport { createDatabase } from '../../storage/factory';\nimport { SettingsRepository } from '../repositories/settings-repository';\n\nexport const createSettingsRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const repo = new SettingsRepository(db);\n\n return {\n async GET() {\n const settings = await repo.get();\n return Response.json({ settings });\n },\n async PATCH(request: Request) {\n const body = await request.json();\n const input = neuronSettingsUpdateSchema.parse(body) as NeuronSettingsUpdate;\n const settings = await repo.update(input);\n return Response.json({ settings });\n },\n async POST(request: Request) {\n const url = new URL(request.url);\n if (!url.pathname.endsWith('/reset')) {\n return new Response('Not found', { status: 404 });\n }\n const body = await request.json().catch(() => ({}));\n const settings = await repo.reset(body?.sections);\n return Response.json({ settings });\n },\n };\n};\n","import type { NeuronConfig } from '../../core/types/settings';\nimport { semanticSearchRequestSchema, findSimilarRequestSchema } from '../../core/schemas/api';\nimport { createDatabase } from '../../storage/factory';\nimport { EmbeddingsService } from '../../core/analysis/embeddings-service';\nimport { ScoringEngine } from '../../core/analysis/scoring-engine';\n\nexport const createSearchRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n const embeddings = new EmbeddingsService(\n {\n openaiApiKey: config.openai.apiKey,\n model: config.analysis.embeddingModel,\n batchSize: config.analysis.embeddingBatchSize,\n rateLimit: config.analysis.openaiRateLimit,\n cacheTTL: config.analysis.embeddingCacheTTL,\n maxRetries: config.openai.maxRetries ?? 3,\n },\n db\n );\n const scoring = new ScoringEngine(db);\n\n return {\n async POST(request: Request) {\n const url = new URL(request.url);\n if (url.pathname.endsWith('/similar')) {\n const body = await request.json();\n const input = findSimilarRequestSchema.parse(body);\n const results = await scoring.findSimilar(input.nodeId, input.limit ?? 10, input.excludeConnected ?? false);\n return Response.json({ results });\n }\n\n const body = await request.json();\n const input = semanticSearchRequestSchema.parse(body);\n const embedding = await embeddings.generateEmbedding(input.query);\n const results = await scoring.scoreForQuery(embedding);\n return Response.json({ results: results.slice(0, input.limit ?? 10) });\n },\n };\n};\n","import type { NeuronConfig } from '../../core/types/settings';\nimport { createDatabase } from '../../storage/factory';\n\nexport const createHealthRoutes = (config: NeuronConfig) => {\n const db = createDatabase(config);\n return {\n async GET() {\n const ok = await db.isConnected();\n return Response.json({ status: ok ? 'ok' : 'degraded', time: new Date().toISOString() });\n },\n };\n};\n","import type { NeuronConfig } from '../../core/types/settings';\nimport { createNodesRoutes } from './nodes';\nimport { createEdgesRoutes } from './edges';\nimport { createGraphRoutes } from './graph';\nimport { createAnalyzeRoutes } from './analyze';\nimport { createSettingsRoutes } from './settings';\nimport { createSearchRoutes } from './search';\nimport { createHealthRoutes } from './health';\n\nexport function createNeuronRoutes(config: NeuronConfig) {\n return {\n nodes: createNodesRoutes(config),\n edges: createEdgesRoutes(config),\n graph: createGraphRoutes(config),\n analyze: createAnalyzeRoutes(config),\n settings: createSettingsRoutes(config),\n search: createSearchRoutes(config),\n health: createHealthRoutes(config),\n };\n}\n","import type { Database } from '../../storage/database';\nimport type { NeuronCluster } from '../../core/types/cluster';\nimport { BaseRepository } from './base';\n\nconst mapClusterRow = (row: Record<string, unknown>): NeuronCluster => ({\n id: row.id as string,\n label: row.label as string,\n clusterType: (row.cluster_type as string | null) ?? 'topic',\n centroid: (row.centroid as number[] | null) ?? [],\n memberCount: Number(row.member_count ?? 0),\n avgSimilarity: (row.avg_similarity as number | null) ?? 0,\n cohesion: (row.cohesion as number | null) ?? 0,\n description: (row.description as string | null) ?? null,\n keywords: (row.keywords as string[] | null) ?? [],\n metadata: (row.metadata as Record<string, unknown>) ?? {},\n createdAt: row.created_at as Date,\n updatedAt: row.updated_at as Date,\n lastRecomputedAt: (row.last_recomputed_at as Date | null) ?? null,\n});\n\nexport class ClusterRepository extends BaseRepository<NeuronCluster, NeuronCluster, Partial<NeuronCluster>> {\n constructor(db: Database) {\n super(db, 'clusters');\n }\n\n override async findById(id: string): Promise<NeuronCluster | null> {\n const row = await this.db.queryOne<Record<string, unknown>>('SELECT * FROM clusters WHERE id = $1', [id]);\n return row ? mapClusterRow(row) : null;\n }\n\n async findWithMembers(clusterId: string): Promise<{\n cluster: NeuronCluster | null;\n members: Array<{ nodeId: string; similarityScore: number }>;\n }> {\n const cluster = await this.findById(clusterId);\n const memberships = await this.db.query<{ node_id: string; similarity_score: number }>(\n 'SELECT node_id, similarity_score FROM cluster_memberships WHERE cluster_id = $1',\n [clusterId]\n );\n return {\n cluster,\n members: memberships.map((row) => ({ nodeId: row.node_id, similarityScore: row.similarity_score })),\n };\n }\n\n async updateCentroid(clusterId: string, centroid: number[]): Promise<void> {\n await this.db.execute('UPDATE clusters SET centroid = $1 WHERE id = $2', [centroid, clusterId]);\n }\n\n async addMember(clusterId: string, nodeId: string, similarity: number): Promise<void> {\n await this.db.execute(\n 'INSERT INTO cluster_memberships (node_id, cluster_id, similarity_score, is_primary) VALUES ($1, $2, $3, true) ON CONFLICT (node_id, cluster_id) DO UPDATE SET similarity_score = $3',\n [nodeId, clusterId, similarity]\n );\n }\n\n async removeMember(clusterId: string, nodeId: string): Promise<void> {\n await this.db.execute('DELETE FROM cluster_memberships WHERE cluster_id = $1 AND node_id = $2', [\n clusterId,\n nodeId,\n ]);\n }\n}\n","import type { Database } from '../../storage/database';\nimport type { AnalysisRun } from '../../core/types/analysis';\nimport { BaseRepository } from './base';\n\nexport class AnalysisRunRepository extends BaseRepository<AnalysisRun, AnalysisRun, Partial<AnalysisRun>> {\n constructor(db: Database) {\n super(db, 'analysis_runs');\n }\n\n async findActive(): Promise<AnalysisRun[]> {\n return this.db.query<AnalysisRun>('SELECT * FROM analysis_runs WHERE status = $1', ['running']);\n }\n\n async updateProgress(id: string, progress: number): Promise<void> {\n await this.db.execute('UPDATE analysis_runs SET progress = $1 WHERE id = $2', [progress, id]);\n }\n\n async markCompleted(id: string, results: object): Promise<void> {\n await this.db.execute(\n 'UPDATE analysis_runs SET status = $1, results = $2, completed_at = NOW() WHERE id = $3',\n ['completed', results, id]\n );\n }\n\n async markFailed(id: string, error: string): Promise<void> {\n await this.db.execute(\n 'UPDATE analysis_runs SET status = $1, error_message = $2, completed_at = NOW() WHERE id = $3',\n ['failed', error, id]\n );\n }\n}\n","import type { RouteHandler } from './error-handler';\n\nexport interface CorsOptions {\n origins?: string[];\n}\n\nexport const withCors = (options?: CorsOptions) => (handler: RouteHandler): RouteHandler => async (request) => {\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: buildCorsHeaders(options),\n });\n }\n\n const response = await handler(request);\n const headers = new Headers(response.headers);\n const corsHeaders = buildCorsHeaders(options);\n corsHeaders.forEach((value, key) => headers.set(key, value));\n return new Response(response.body, { status: response.status, headers });\n};\n\nconst buildCorsHeaders = (options?: CorsOptions): Headers => {\n const headers = new Headers();\n headers.set('Access-Control-Allow-Origin', options?.origins?.join(',') ?? '*');\n headers.set('Access-Control-Allow-Methods', 'GET,POST,PATCH,DELETE,OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type,Authorization');\n return headers;\n};\n","export class ApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n }\n}\n\nexport type RouteHandler = (request: Request) => Promise<Response>;\n\nexport const handleError = (error: unknown): Response => {\n if (error instanceof ApiError) {\n return Response.json(\n {\n error: error.message,\n code: error.code,\n statusCode: error.statusCode,\n details: error.details,\n },\n { status: error.statusCode }\n );\n }\n\n const message = error instanceof Error ? error.message : 'Internal error';\n return Response.json(\n {\n error: message,\n code: 'INTERNAL_ERROR',\n statusCode: 500,\n },\n { status: 500 }\n );\n};\n\nexport const withErrorHandler = (handler: RouteHandler): RouteHandler => async (request) => {\n try {\n return await handler(request);\n } catch (error) {\n return handleError(error);\n }\n};\n","import type { RouteHandler } from './error-handler';\n\nexport const withLogging = (handler: RouteHandler): RouteHandler => async (request) => {\n const start = Date.now();\n const response = await handler(request);\n const duration = Date.now() - start;\n // eslint-disable-next-line no-console\n console.log(`[omi-neuron] ${request.method} ${request.url} -> ${response.status} (${duration}ms)`);\n return response;\n};\n","import type { RouteHandler } from './error-handler';\n\nexport const withTiming = (handler: RouteHandler): RouteHandler => async (request) => {\n const start = Date.now();\n const response = await handler(request);\n const duration = Date.now() - start;\n const headers = new Headers(response.headers);\n headers.set('X-Response-Time', `${duration}ms`);\n return new Response(response.body, { status: response.status, headers });\n};\n","import type { RouteHandler } from './error-handler';\nimport { withCors, type CorsOptions } from './cors';\nimport { withErrorHandler } from './error-handler';\nimport { withLogging } from './logging';\nimport { withTiming } from './timing';\n\nexport interface MiddlewareOptions {\n cors?: CorsOptions;\n}\n\nconst compose = (...handlers: Array<(handler: RouteHandler) => RouteHandler>) => {\n return (handler: RouteHandler) => handlers.reduceRight((acc, fn) => fn(acc), handler);\n};\n\nexport const withNeuronMiddleware = (handler: RouteHandler, options?: MiddlewareOptions) => {\n const chain = [withErrorHandler, withLogging, withTiming];\n if (options?.cors) {\n chain.push(withCors(options.cors));\n }\n return compose(...chain)(handler);\n};\n"]}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var crypto = require('crypto');
|
|
4
|
+
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
8
|
+
|
|
9
|
+
// src/storage/migrations/001_initial_schema.ts
|
|
10
|
+
var migration001 = {
|
|
11
|
+
version: "001",
|
|
12
|
+
name: "initial_schema",
|
|
13
|
+
up: `
|
|
14
|
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
17
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
18
|
+
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
19
|
+
label VARCHAR(500) NOT NULL,
|
|
20
|
+
node_type VARCHAR(100) NOT NULL DEFAULT 'concept',
|
|
21
|
+
domain VARCHAR(100) NOT NULL DEFAULT 'general',
|
|
22
|
+
summary TEXT,
|
|
23
|
+
description TEXT,
|
|
24
|
+
content TEXT,
|
|
25
|
+
metadata JSONB DEFAULT '{}',
|
|
26
|
+
tier VARCHAR(20),
|
|
27
|
+
visual_priority INTEGER DEFAULT 50,
|
|
28
|
+
position_override DOUBLE PRECISION[3],
|
|
29
|
+
connection_count INTEGER DEFAULT 0,
|
|
30
|
+
inbound_count INTEGER DEFAULT 0,
|
|
31
|
+
outbound_count INTEGER DEFAULT 0,
|
|
32
|
+
analysis_status VARCHAR(20) DEFAULT 'pending',
|
|
33
|
+
analysis_error TEXT,
|
|
34
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
35
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
39
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
40
|
+
from_node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
|
41
|
+
to_node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
|
|
42
|
+
relationship_type VARCHAR(100) NOT NULL DEFAULT 'related_to',
|
|
43
|
+
strength DOUBLE PRECISION DEFAULT 0.5,
|
|
44
|
+
confidence DOUBLE PRECISION DEFAULT 1.0,
|
|
45
|
+
evidence JSONB DEFAULT '[]',
|
|
46
|
+
label VARCHAR(255),
|
|
47
|
+
description TEXT,
|
|
48
|
+
metadata JSONB DEFAULT '{}',
|
|
49
|
+
source VARCHAR(20) NOT NULL DEFAULT 'manual',
|
|
50
|
+
source_model VARCHAR(100),
|
|
51
|
+
bidirectional BOOLEAN DEFAULT FALSE,
|
|
52
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
53
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
54
|
+
UNIQUE(from_node_id, to_node_id, relationship_type)
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
58
|
+
id VARCHAR(50) PRIMARY KEY DEFAULT 'default',
|
|
59
|
+
visualization JSONB DEFAULT '{}',
|
|
60
|
+
analysis JSONB DEFAULT '{}',
|
|
61
|
+
node_types JSONB DEFAULT '[]',
|
|
62
|
+
domains JSONB DEFAULT '[]',
|
|
63
|
+
relationship_types JSONB DEFAULT '[]',
|
|
64
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_slug ON nodes(slug);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_domain ON nodes(domain);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_node_type ON nodes(node_type);
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_analysis_status ON nodes(analysis_status);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_edges_from_node ON edges(from_node_id);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_edges_to_node ON edges(to_node_id);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(relationship_type);
|
|
74
|
+
`.trim(),
|
|
75
|
+
down: `
|
|
76
|
+
DROP TABLE IF EXISTS settings;
|
|
77
|
+
DROP TABLE IF EXISTS edges;
|
|
78
|
+
DROP TABLE IF EXISTS nodes;
|
|
79
|
+
DROP EXTENSION IF EXISTS "uuid-ossp";
|
|
80
|
+
`.trim()
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/storage/migrations/002_embeddings.ts
|
|
84
|
+
var migration002 = {
|
|
85
|
+
version: "002",
|
|
86
|
+
name: "embeddings",
|
|
87
|
+
up: `
|
|
88
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
89
|
+
|
|
90
|
+
ALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding vector(1536);
|
|
91
|
+
ALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding_model VARCHAR(100);
|
|
92
|
+
ALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding_generated_at TIMESTAMP WITH TIME ZONE;
|
|
93
|
+
|
|
94
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_embedding ON nodes
|
|
95
|
+
USING hnsw (embedding vector_cosine_ops)
|
|
96
|
+
WITH (m = 16, ef_construction = 64);
|
|
97
|
+
`.trim(),
|
|
98
|
+
down: `
|
|
99
|
+
DROP INDEX IF EXISTS idx_nodes_embedding;
|
|
100
|
+
ALTER TABLE nodes DROP COLUMN IF EXISTS embedding;
|
|
101
|
+
ALTER TABLE nodes DROP COLUMN IF EXISTS embedding_model;
|
|
102
|
+
ALTER TABLE nodes DROP COLUMN IF EXISTS embedding_generated_at;
|
|
103
|
+
DROP EXTENSION IF EXISTS vector;
|
|
104
|
+
`.trim()
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// src/storage/migrations/003_clusters.ts
|
|
108
|
+
var migration003 = {
|
|
109
|
+
version: "003",
|
|
110
|
+
name: "clusters",
|
|
111
|
+
up: `
|
|
112
|
+
CREATE TABLE IF NOT EXISTS clusters (
|
|
113
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
114
|
+
label VARCHAR(255) NOT NULL,
|
|
115
|
+
cluster_type VARCHAR(100) DEFAULT 'topic',
|
|
116
|
+
centroid vector(1536),
|
|
117
|
+
member_count INTEGER DEFAULT 0,
|
|
118
|
+
avg_similarity DOUBLE PRECISION,
|
|
119
|
+
cohesion DOUBLE PRECISION,
|
|
120
|
+
description TEXT,
|
|
121
|
+
keywords TEXT[] DEFAULT '{}',
|
|
122
|
+
metadata JSONB DEFAULT '{}',
|
|
123
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
124
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
125
|
+
last_recomputed_at TIMESTAMP WITH TIME ZONE
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
CREATE TABLE IF NOT EXISTS cluster_memberships (
|
|
129
|
+
node_id UUID REFERENCES nodes(id) ON DELETE CASCADE,
|
|
130
|
+
cluster_id UUID REFERENCES clusters(id) ON DELETE CASCADE,
|
|
131
|
+
similarity_score DOUBLE PRECISION NOT NULL,
|
|
132
|
+
is_primary BOOLEAN DEFAULT FALSE,
|
|
133
|
+
assigned_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
134
|
+
PRIMARY KEY (node_id, cluster_id)
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
ALTER TABLE nodes ADD COLUMN IF NOT EXISTS cluster_id UUID REFERENCES clusters(id) ON DELETE SET NULL;
|
|
138
|
+
ALTER TABLE nodes ADD COLUMN IF NOT EXISTS cluster_similarity DOUBLE PRECISION;
|
|
139
|
+
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_cluster_memberships_cluster ON cluster_memberships(cluster_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_cluster ON nodes(cluster_id);
|
|
142
|
+
`.trim(),
|
|
143
|
+
down: `
|
|
144
|
+
DROP TABLE IF EXISTS cluster_memberships;
|
|
145
|
+
DROP TABLE IF EXISTS clusters;
|
|
146
|
+
ALTER TABLE nodes DROP COLUMN IF EXISTS cluster_id;
|
|
147
|
+
ALTER TABLE nodes DROP COLUMN IF EXISTS cluster_similarity;
|
|
148
|
+
`.trim()
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// src/storage/migrations/004_analysis_runs.ts
|
|
152
|
+
var migration004 = {
|
|
153
|
+
version: "004",
|
|
154
|
+
name: "analysis_runs",
|
|
155
|
+
up: `
|
|
156
|
+
CREATE TABLE IF NOT EXISTS analysis_runs (
|
|
157
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
158
|
+
run_type VARCHAR(50) NOT NULL,
|
|
159
|
+
input_params JSONB DEFAULT '{}',
|
|
160
|
+
results JSONB DEFAULT '{}',
|
|
161
|
+
status VARCHAR(20) NOT NULL DEFAULT 'queued',
|
|
162
|
+
progress INTEGER DEFAULT 0,
|
|
163
|
+
started_at TIMESTAMP WITH TIME ZONE,
|
|
164
|
+
completed_at TIMESTAMP WITH TIME ZONE,
|
|
165
|
+
duration_ms INTEGER,
|
|
166
|
+
error_message TEXT,
|
|
167
|
+
error_stack TEXT,
|
|
168
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_analysis_runs_status ON analysis_runs(status);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS idx_analysis_runs_created ON analysis_runs(created_at DESC);
|
|
173
|
+
`.trim(),
|
|
174
|
+
down: `
|
|
175
|
+
DROP TABLE IF EXISTS analysis_runs;
|
|
176
|
+
`.trim()
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// src/storage/migrations/index.ts
|
|
180
|
+
var migrations = [
|
|
181
|
+
migration001,
|
|
182
|
+
migration002,
|
|
183
|
+
migration003,
|
|
184
|
+
migration004
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
// src/storage/migrations/runner.ts
|
|
188
|
+
var MigrationRunner = class {
|
|
189
|
+
constructor(db) {
|
|
190
|
+
this.db = db;
|
|
191
|
+
}
|
|
192
|
+
async getStatus() {
|
|
193
|
+
await this.ensureMigrationTable();
|
|
194
|
+
const applied = await this.getApplied();
|
|
195
|
+
const appliedMap = new Map(applied.map((item) => [item.version, item]));
|
|
196
|
+
return migrations.map((migration) => ({
|
|
197
|
+
version: migration.version,
|
|
198
|
+
name: migration.name,
|
|
199
|
+
appliedAt: appliedMap.get(migration.version)?.appliedAt ?? null,
|
|
200
|
+
status: appliedMap.has(migration.version) ? "applied" : "pending"
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
async getPending() {
|
|
204
|
+
const status = await this.getStatus();
|
|
205
|
+
return status.filter((item) => item.status === "pending").map((item) => migrations.find((m) => m.version === item.version)).filter(Boolean);
|
|
206
|
+
}
|
|
207
|
+
async getApplied() {
|
|
208
|
+
await this.ensureMigrationTable();
|
|
209
|
+
const rows = await this.db.query(
|
|
210
|
+
"SELECT version, name, applied_at FROM neuron_migrations ORDER BY version"
|
|
211
|
+
);
|
|
212
|
+
return rows.map((row) => ({
|
|
213
|
+
version: row.version,
|
|
214
|
+
name: row.name,
|
|
215
|
+
appliedAt: row.applied_at
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
async up(options) {
|
|
219
|
+
const pending = await this.getPending();
|
|
220
|
+
const targetIndex = options?.to ? pending.findIndex((m) => m.version === options.to) + 1 : pending.length;
|
|
221
|
+
const toApply = pending.slice(0, targetIndex > 0 ? targetIndex : pending.length);
|
|
222
|
+
for (const migration of toApply) {
|
|
223
|
+
await this.applyMigration(migration);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async down(options) {
|
|
227
|
+
await this.ensureMigrationTable();
|
|
228
|
+
const applied = await this.getApplied();
|
|
229
|
+
const appliedMigrations = applied.map((item) => migrations.find((m) => m.version === item.version)).filter(Boolean);
|
|
230
|
+
const reversed = [...appliedMigrations].reverse();
|
|
231
|
+
let toRollback = [];
|
|
232
|
+
if (options?.to) {
|
|
233
|
+
const idx = reversed.findIndex((m) => m.version === options.to);
|
|
234
|
+
toRollback = idx >= 0 ? reversed.slice(0, idx + 1) : [];
|
|
235
|
+
} else if (options?.count) {
|
|
236
|
+
toRollback = reversed.slice(0, options.count);
|
|
237
|
+
} else {
|
|
238
|
+
toRollback = reversed.slice(0, 1);
|
|
239
|
+
}
|
|
240
|
+
for (const migration of toRollback) {
|
|
241
|
+
await this.rollbackMigration(migration);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async reset() {
|
|
245
|
+
await this.down({ count: migrations.length });
|
|
246
|
+
await this.up();
|
|
247
|
+
}
|
|
248
|
+
async dryRun(direction) {
|
|
249
|
+
if (direction === "up") {
|
|
250
|
+
const pending = await this.getPending();
|
|
251
|
+
return pending.map((m) => m.up);
|
|
252
|
+
}
|
|
253
|
+
const applied = await this.getApplied();
|
|
254
|
+
const appliedMigrations = applied.map((item) => migrations.find((m) => m.version === item.version)).filter(Boolean).reverse();
|
|
255
|
+
return appliedMigrations.map((m) => m.down);
|
|
256
|
+
}
|
|
257
|
+
async ensureMigrationTable() {
|
|
258
|
+
await this.db.execute(`
|
|
259
|
+
CREATE TABLE IF NOT EXISTS neuron_migrations (
|
|
260
|
+
version VARCHAR(10) PRIMARY KEY,
|
|
261
|
+
name VARCHAR(255) NOT NULL,
|
|
262
|
+
applied_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
263
|
+
checksum VARCHAR(64)
|
|
264
|
+
);
|
|
265
|
+
`);
|
|
266
|
+
}
|
|
267
|
+
async applyMigration(migration) {
|
|
268
|
+
const checksum = this.computeChecksum(migration);
|
|
269
|
+
await this.db.transaction(async (client) => {
|
|
270
|
+
await client.query(migration.up);
|
|
271
|
+
await client.query(
|
|
272
|
+
"INSERT INTO neuron_migrations (version, name, checksum) VALUES ($1, $2, $3)",
|
|
273
|
+
[migration.version, migration.name, checksum]
|
|
274
|
+
);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
async rollbackMigration(migration) {
|
|
278
|
+
await this.db.transaction(async (client) => {
|
|
279
|
+
await client.query(migration.down);
|
|
280
|
+
await client.query("DELETE FROM neuron_migrations WHERE version = $1", [
|
|
281
|
+
migration.version
|
|
282
|
+
]);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
computeChecksum(migration) {
|
|
286
|
+
const hash = crypto__default.default.createHash("sha256");
|
|
287
|
+
hash.update(migration.up);
|
|
288
|
+
hash.update(migration.down);
|
|
289
|
+
return hash.digest("hex");
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
exports.MigrationRunner = MigrationRunner;
|
|
294
|
+
exports.migration001 = migration001;
|
|
295
|
+
exports.migration002 = migration002;
|
|
296
|
+
exports.migration003 = migration003;
|
|
297
|
+
exports.migration004 = migration004;
|
|
298
|
+
exports.migrations = migrations;
|
|
299
|
+
//# sourceMappingURL=chunk-BSOSHBDR.cjs.map
|
|
300
|
+
//# sourceMappingURL=chunk-BSOSHBDR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/migrations/001_initial_schema.ts","../src/storage/migrations/002_embeddings.ts","../src/storage/migrations/003_clusters.ts","../src/storage/migrations/004_analysis_runs.ts","../src/storage/migrations/index.ts","../src/storage/migrations/runner.ts"],"names":["crypto"],"mappings":"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","file":"chunk-BSOSHBDR.cjs","sourcesContent":["import type { Migration } from './runner';\n\nexport const migration001: Migration = {\n version: '001',\n name: 'initial_schema',\n up: `\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n\nCREATE TABLE IF NOT EXISTS nodes (\n id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n slug VARCHAR(255) UNIQUE NOT NULL,\n label VARCHAR(500) NOT NULL,\n node_type VARCHAR(100) NOT NULL DEFAULT 'concept',\n domain VARCHAR(100) NOT NULL DEFAULT 'general',\n summary TEXT,\n description TEXT,\n content TEXT,\n metadata JSONB DEFAULT '{}',\n tier VARCHAR(20),\n visual_priority INTEGER DEFAULT 50,\n position_override DOUBLE PRECISION[3],\n connection_count INTEGER DEFAULT 0,\n inbound_count INTEGER DEFAULT 0,\n outbound_count INTEGER DEFAULT 0,\n analysis_status VARCHAR(20) DEFAULT 'pending',\n analysis_error TEXT,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\nCREATE TABLE IF NOT EXISTS edges (\n id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n from_node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,\n to_node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,\n relationship_type VARCHAR(100) NOT NULL DEFAULT 'related_to',\n strength DOUBLE PRECISION DEFAULT 0.5,\n confidence DOUBLE PRECISION DEFAULT 1.0,\n evidence JSONB DEFAULT '[]',\n label VARCHAR(255),\n description TEXT,\n metadata JSONB DEFAULT '{}',\n source VARCHAR(20) NOT NULL DEFAULT 'manual',\n source_model VARCHAR(100),\n bidirectional BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n UNIQUE(from_node_id, to_node_id, relationship_type)\n);\n\nCREATE TABLE IF NOT EXISTS settings (\n id VARCHAR(50) PRIMARY KEY DEFAULT 'default',\n visualization JSONB DEFAULT '{}',\n analysis JSONB DEFAULT '{}',\n node_types JSONB DEFAULT '[]',\n domains JSONB DEFAULT '[]',\n relationship_types JSONB DEFAULT '[]',\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_nodes_slug ON nodes(slug);\nCREATE INDEX IF NOT EXISTS idx_nodes_domain ON nodes(domain);\nCREATE INDEX IF NOT EXISTS idx_nodes_node_type ON nodes(node_type);\nCREATE INDEX IF NOT EXISTS idx_nodes_analysis_status ON nodes(analysis_status);\nCREATE INDEX IF NOT EXISTS idx_edges_from_node ON edges(from_node_id);\nCREATE INDEX IF NOT EXISTS idx_edges_to_node ON edges(to_node_id);\nCREATE INDEX IF NOT EXISTS idx_edges_type ON edges(relationship_type);\n `.trim(),\n down: `\nDROP TABLE IF EXISTS settings;\nDROP TABLE IF EXISTS edges;\nDROP TABLE IF EXISTS nodes;\nDROP EXTENSION IF EXISTS \"uuid-ossp\";\n `.trim(),\n};\n","import type { Migration } from './runner';\n\nexport const migration002: Migration = {\n version: '002',\n name: 'embeddings',\n up: `\nCREATE EXTENSION IF NOT EXISTS vector;\n\nALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding vector(1536);\nALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding_model VARCHAR(100);\nALTER TABLE nodes ADD COLUMN IF NOT EXISTS embedding_generated_at TIMESTAMP WITH TIME ZONE;\n\nCREATE INDEX IF NOT EXISTS idx_nodes_embedding ON nodes\nUSING hnsw (embedding vector_cosine_ops)\nWITH (m = 16, ef_construction = 64);\n `.trim(),\n down: `\nDROP INDEX IF EXISTS idx_nodes_embedding;\nALTER TABLE nodes DROP COLUMN IF EXISTS embedding;\nALTER TABLE nodes DROP COLUMN IF EXISTS embedding_model;\nALTER TABLE nodes DROP COLUMN IF EXISTS embedding_generated_at;\nDROP EXTENSION IF EXISTS vector;\n `.trim(),\n};\n","import type { Migration } from './runner';\n\nexport const migration003: Migration = {\n version: '003',\n name: 'clusters',\n up: `\nCREATE TABLE IF NOT EXISTS clusters (\n id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n label VARCHAR(255) NOT NULL,\n cluster_type VARCHAR(100) DEFAULT 'topic',\n centroid vector(1536),\n member_count INTEGER DEFAULT 0,\n avg_similarity DOUBLE PRECISION,\n cohesion DOUBLE PRECISION,\n description TEXT,\n keywords TEXT[] DEFAULT '{}',\n metadata JSONB DEFAULT '{}',\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n last_recomputed_at TIMESTAMP WITH TIME ZONE\n);\n\nCREATE TABLE IF NOT EXISTS cluster_memberships (\n node_id UUID REFERENCES nodes(id) ON DELETE CASCADE,\n cluster_id UUID REFERENCES clusters(id) ON DELETE CASCADE,\n similarity_score DOUBLE PRECISION NOT NULL,\n is_primary BOOLEAN DEFAULT FALSE,\n assigned_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n PRIMARY KEY (node_id, cluster_id)\n);\n\nALTER TABLE nodes ADD COLUMN IF NOT EXISTS cluster_id UUID REFERENCES clusters(id) ON DELETE SET NULL;\nALTER TABLE nodes ADD COLUMN IF NOT EXISTS cluster_similarity DOUBLE PRECISION;\n\nCREATE INDEX IF NOT EXISTS idx_cluster_memberships_cluster ON cluster_memberships(cluster_id);\nCREATE INDEX IF NOT EXISTS idx_nodes_cluster ON nodes(cluster_id);\n `.trim(),\n down: `\nDROP TABLE IF EXISTS cluster_memberships;\nDROP TABLE IF EXISTS clusters;\nALTER TABLE nodes DROP COLUMN IF EXISTS cluster_id;\nALTER TABLE nodes DROP COLUMN IF EXISTS cluster_similarity;\n `.trim(),\n};\n","import type { Migration } from './runner';\n\nexport const migration004: Migration = {\n version: '004',\n name: 'analysis_runs',\n up: `\nCREATE TABLE IF NOT EXISTS analysis_runs (\n id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n run_type VARCHAR(50) NOT NULL,\n input_params JSONB DEFAULT '{}',\n results JSONB DEFAULT '{}',\n status VARCHAR(20) NOT NULL DEFAULT 'queued',\n progress INTEGER DEFAULT 0,\n started_at TIMESTAMP WITH TIME ZONE,\n completed_at TIMESTAMP WITH TIME ZONE,\n duration_ms INTEGER,\n error_message TEXT,\n error_stack TEXT,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_analysis_runs_status ON analysis_runs(status);\nCREATE INDEX IF NOT EXISTS idx_analysis_runs_created ON analysis_runs(created_at DESC);\n `.trim(),\n down: `\nDROP TABLE IF EXISTS analysis_runs;\n `.trim(),\n};\n","import type { Migration } from './runner';\nimport { migration001 } from './001_initial_schema';\nimport { migration002 } from './002_embeddings';\nimport { migration003 } from './003_clusters';\nimport { migration004 } from './004_analysis_runs';\n\nexport const migrations: Migration[] = [\n migration001,\n migration002,\n migration003,\n migration004,\n];\n\nexport * from './runner';\nexport * from './001_initial_schema';\nexport * from './002_embeddings';\nexport * from './003_clusters';\nexport * from './004_analysis_runs';\n","import crypto from 'node:crypto';\nimport type { Database } from '../database';\nimport { migrations } from './index';\n\nexport interface Migration {\n version: string;\n name: string;\n up: string;\n down: string;\n}\n\nexport interface MigrationStatus {\n version: string;\n name: string;\n appliedAt: Date | null;\n status: 'applied' | 'pending';\n}\n\nexport class MigrationRunner {\n constructor(private db: Database) {}\n\n async getStatus(): Promise<MigrationStatus[]> {\n await this.ensureMigrationTable();\n const applied = await this.getApplied();\n const appliedMap = new Map(applied.map((item) => [item.version, item]));\n\n return migrations.map((migration) => ({\n version: migration.version,\n name: migration.name,\n appliedAt: appliedMap.get(migration.version)?.appliedAt ?? null,\n status: appliedMap.has(migration.version) ? 'applied' : 'pending',\n }));\n }\n\n async getPending(): Promise<Migration[]> {\n const status = await this.getStatus();\n return status\n .filter((item) => item.status === 'pending')\n .map((item) => migrations.find((m) => m.version === item.version)!)\n .filter(Boolean);\n }\n\n async getApplied(): Promise<Array<{ version: string; name: string; appliedAt: Date }>> {\n await this.ensureMigrationTable();\n const rows = await this.db.query<{ version: string; name: string; applied_at: Date }>(\n 'SELECT version, name, applied_at FROM neuron_migrations ORDER BY version'\n );\n return rows.map((row) => ({\n version: row.version,\n name: row.name,\n appliedAt: row.applied_at,\n }));\n }\n\n async up(options?: { to?: string }): Promise<void> {\n const pending = await this.getPending();\n const targetIndex = options?.to\n ? pending.findIndex((m) => m.version === options.to) + 1\n : pending.length;\n const toApply = pending.slice(0, targetIndex > 0 ? targetIndex : pending.length);\n\n for (const migration of toApply) {\n await this.applyMigration(migration);\n }\n }\n\n async down(options?: { to?: string; count?: number }): Promise<void> {\n await this.ensureMigrationTable();\n const applied = await this.getApplied();\n const appliedMigrations = applied\n .map((item) => migrations.find((m) => m.version === item.version)!)\n .filter(Boolean);\n const reversed = [...appliedMigrations].reverse();\n\n let toRollback: Migration[] = [];\n if (options?.to) {\n const idx = reversed.findIndex((m) => m.version === options.to);\n toRollback = idx >= 0 ? reversed.slice(0, idx + 1) : [];\n } else if (options?.count) {\n toRollback = reversed.slice(0, options.count);\n } else {\n toRollback = reversed.slice(0, 1);\n }\n\n for (const migration of toRollback) {\n await this.rollbackMigration(migration);\n }\n }\n\n async reset(): Promise<void> {\n await this.down({ count: migrations.length });\n await this.up();\n }\n\n async dryRun(direction: 'up' | 'down'): Promise<string[]> {\n if (direction === 'up') {\n const pending = await this.getPending();\n return pending.map((m) => m.up);\n }\n\n const applied = await this.getApplied();\n const appliedMigrations = applied\n .map((item) => migrations.find((m) => m.version === item.version)!)\n .filter(Boolean)\n .reverse();\n\n return appliedMigrations.map((m) => m.down);\n }\n\n private async ensureMigrationTable(): Promise<void> {\n await this.db.execute(`\n CREATE TABLE IF NOT EXISTS neuron_migrations (\n version VARCHAR(10) PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n applied_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n checksum VARCHAR(64)\n );\n `);\n }\n\n private async applyMigration(migration: Migration): Promise<void> {\n const checksum = this.computeChecksum(migration);\n await this.db.transaction(async (client) => {\n await client.query(migration.up);\n await client.query(\n 'INSERT INTO neuron_migrations (version, name, checksum) VALUES ($1, $2, $3)',\n [migration.version, migration.name, checksum]\n );\n });\n }\n\n private async rollbackMigration(migration: Migration): Promise<void> {\n await this.db.transaction(async (client) => {\n await client.query(migration.down);\n await client.query('DELETE FROM neuron_migrations WHERE version = $1', [\n migration.version,\n ]);\n });\n }\n\n private computeChecksum(migration: Migration): string {\n const hash = crypto.createHash('sha256');\n hash.update(migration.up);\n hash.update(migration.down);\n return hash.digest('hex');\n }\n}\n"]}
|