@sanurb/ringi 0.1.0 → 0.2.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/schemas/review.ts","../src/api/schemas/todo.ts","../src/api/schemas/comment.ts","../src/core/db/migrations.ts","../src/core/db/database.ts","../src/core/repos/comment.repo.ts","../src/core/services/comment.service.ts","../src/core/services/diff.service.ts","../src/core/services/git.service.ts","../src/core/repos/review-file.repo.ts","../src/core/repos/review.repo.ts","../src/core/services/review.service.ts","../src/core/repos/todo.repo.ts","../src/core/services/todo.service.ts","../src/core/services/export.service.ts","../src/core/services/event.service.ts","../src/core/runtime.ts"],"names":["Schema","Schema2","HttpApiSchema2","HttpApiSchema3","Effect","Effect2","row","Effect3","create","getById","getByReview","getByFile","update","resolve","unresolve","remove","getStats","lines","Schema4","HttpApiSchema4","Config2","getRepositoryInfo","getBranchDiff","getCommitDiff","getFileContent","getFileTree","getCommits","stageFiles","unstageFiles","parseHunks","Effect5","randomUUID","Effect6","Schema5","HttpApiSchema5","Effect7","execFile","list","getFileHunks","Option2","Effect8","move","Effect9","Option3","toggle","removeCompleted","reorder","Effect10","exportReview","Effect11","runFork","broadcast","subscribe"],"mappings":"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","file":"chunk-3JLVANJR.js","sourcesContent":["import * as HttpApiSchema from \"@effect/platform/HttpApiSchema\";\nimport * as Schema from \"effect/Schema\";\n\nexport const ReviewId = Schema.String.pipe(Schema.brand(\"ReviewId\"));\nexport type ReviewId = typeof ReviewId.Type;\n\nexport const DIFF_SCOPES = [\n \"uncommitted\",\n \"staged\",\n \"unstaged\",\n \"last-commit\",\n] as const;\nexport type DiffScope = (typeof DIFF_SCOPES)[number];\n\nexport const ReviewStatus = Schema.Literal(\n \"in_progress\",\n \"approved\",\n \"changes_requested\"\n);\nexport type ReviewStatus = typeof ReviewStatus.Type;\n\nexport const ReviewSourceType = Schema.Literal(\"staged\", \"branch\", \"commits\");\nexport type ReviewSourceType = typeof ReviewSourceType.Type;\n\nexport const Review = Schema.Struct({\n baseRef: Schema.NullOr(Schema.String),\n createdAt: Schema.String,\n id: ReviewId,\n repositoryPath: Schema.String,\n snapshotData: Schema.String,\n sourceRef: Schema.NullOr(Schema.String),\n sourceType: ReviewSourceType,\n status: ReviewStatus,\n updatedAt: Schema.String,\n});\nexport type Review = typeof Review.Type;\n\nexport const CreateReviewInput = Schema.Struct({\n sourceRef: Schema.optionalWith(Schema.NullOr(Schema.String), {\n default: () => null,\n }),\n sourceType: Schema.optionalWith(ReviewSourceType, {\n default: () => \"staged\" as const,\n }),\n});\nexport type CreateReviewInput = typeof CreateReviewInput.Type;\n\nexport const UpdateReviewInput = Schema.Struct({\n status: Schema.optionalWith(ReviewStatus, { as: \"Option\" }),\n});\nexport type UpdateReviewInput = typeof UpdateReviewInput.Type;\n\nexport class ReviewNotFound extends Schema.TaggedError<ReviewNotFound>()(\n \"ReviewNotFound\",\n { id: ReviewId },\n HttpApiSchema.annotations({ status: 404 })\n) {}\n","import * as HttpApiSchema from \"@effect/platform/HttpApiSchema\";\nimport * as Schema from \"effect/Schema\";\n\nimport { ReviewId } from \"./review\";\n\nexport const TodoId = Schema.String.pipe(Schema.brand(\"TodoId\"));\nexport type TodoId = typeof TodoId.Type;\n\nexport const Todo = Schema.Struct({\n completed: Schema.Boolean,\n content: Schema.String,\n createdAt: Schema.String,\n id: TodoId,\n position: Schema.Number,\n reviewId: Schema.NullOr(ReviewId),\n updatedAt: Schema.String,\n});\nexport type Todo = typeof Todo.Type;\n\nexport const CreateTodoInput = Schema.Struct({\n content: Schema.String.pipe(Schema.minLength(1)),\n reviewId: Schema.optionalWith(Schema.NullOr(ReviewId), {\n default: () => null,\n }),\n});\nexport type CreateTodoInput = typeof CreateTodoInput.Type;\n\nexport const UpdateTodoInput = Schema.Struct({\n completed: Schema.optionalWith(Schema.Boolean, { as: \"Option\" }),\n content: Schema.optionalWith(Schema.String.pipe(Schema.minLength(1)), {\n as: \"Option\",\n }),\n});\nexport type UpdateTodoInput = typeof UpdateTodoInput.Type;\n\nexport class TodoNotFound extends Schema.TaggedError<TodoNotFound>()(\n \"TodoNotFound\",\n { id: TodoId },\n HttpApiSchema.annotations({ status: 404 })\n) {}\n","import * as HttpApiSchema from \"@effect/platform/HttpApiSchema\";\nimport * as Schema from \"effect/Schema\";\n\nimport { ReviewId } from \"./review\";\n\nexport const CommentId = Schema.String.pipe(Schema.brand(\"CommentId\"));\nexport type CommentId = typeof CommentId.Type;\n\nexport const LineType = Schema.Literal(\"added\", \"removed\", \"context\");\nexport type LineType = typeof LineType.Type;\n\nexport const Comment = Schema.Struct({\n content: Schema.String,\n createdAt: Schema.String,\n filePath: Schema.String,\n id: CommentId,\n lineNumber: Schema.NullOr(Schema.Number),\n lineType: Schema.NullOr(LineType),\n resolved: Schema.Boolean,\n reviewId: ReviewId,\n suggestion: Schema.NullOr(Schema.String),\n updatedAt: Schema.String,\n});\nexport type Comment = typeof Comment.Type;\n\nexport const CreateCommentInput = Schema.Struct({\n content: Schema.String.pipe(Schema.minLength(1)),\n filePath: Schema.String.pipe(Schema.minLength(1)),\n lineNumber: Schema.optionalWith(Schema.NullOr(Schema.Number), {\n default: () => null,\n }),\n lineType: Schema.optionalWith(Schema.NullOr(LineType), {\n default: () => null,\n }),\n suggestion: Schema.optionalWith(Schema.NullOr(Schema.String), {\n default: () => null,\n }),\n});\nexport type CreateCommentInput = typeof CreateCommentInput.Type;\n\nexport const UpdateCommentInput = Schema.Struct({\n content: Schema.optionalWith(Schema.String.pipe(Schema.minLength(1)), {\n as: \"Option\",\n }),\n suggestion: Schema.optionalWith(Schema.NullOr(Schema.String), {\n as: \"Option\",\n }),\n});\nexport type UpdateCommentInput = typeof UpdateCommentInput.Type;\n\nexport class CommentNotFound extends Schema.TaggedError<CommentNotFound>()(\n \"CommentNotFound\",\n { id: CommentId },\n HttpApiSchema.annotations({ status: 404 })\n) {}\n","import type { DatabaseSync } from \"node:sqlite\";\n\nconst migrations: readonly string[] = [\n // v1: reviews table\n `CREATE TABLE IF NOT EXISTS reviews (\n id TEXT PRIMARY KEY,\n repository_path TEXT NOT NULL,\n base_ref TEXT,\n snapshot_data TEXT NOT NULL,\n status TEXT DEFAULT 'in_progress',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n ) STRICT`,\n\n // v2: comments table\n `CREATE TABLE IF NOT EXISTS comments (\n id TEXT PRIMARY KEY,\n review_id TEXT NOT NULL REFERENCES reviews(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n line_number INTEGER,\n line_type TEXT,\n content TEXT NOT NULL,\n suggestion TEXT,\n resolved INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n ) STRICT`,\n\n // v3: add source_type and source_ref to reviews\n `ALTER TABLE reviews ADD COLUMN source_type TEXT DEFAULT 'staged';\n ALTER TABLE reviews ADD COLUMN source_ref TEXT`,\n\n // v4: todos table\n `CREATE TABLE IF NOT EXISTS todos (\n id TEXT PRIMARY KEY,\n content TEXT NOT NULL,\n completed INTEGER DEFAULT 0,\n review_id TEXT REFERENCES reviews(id) ON DELETE CASCADE,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n ) STRICT`,\n\n // v5: add position to todos\n `ALTER TABLE todos ADD COLUMN position INTEGER DEFAULT 0`,\n\n // v6: review_files table\n `CREATE TABLE IF NOT EXISTS review_files (\n id TEXT PRIMARY KEY,\n review_id TEXT NOT NULL REFERENCES reviews(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n old_path TEXT,\n status TEXT NOT NULL,\n additions INTEGER NOT NULL DEFAULT 0,\n deletions INTEGER NOT NULL DEFAULT 0,\n hunks_data TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n ) STRICT`,\n];\n\n/** Apply pending migrations using PRAGMA user_version as the version tracker. */\nexport const runMigrations = (db: DatabaseSync): void => {\n const currentVersion = (\n db.prepare(\"PRAGMA user_version\").get() as { user_version: number }\n ).user_version;\n\n for (let i = currentVersion; i < migrations.length; i++) {\n // v3 (and any future multi-statement migration) uses semicolons to\n // separate statements — split and execute each independently.\n const statements = migrations[i]!.split(\";\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n for (const sql of statements) {\n db.exec(sql);\n }\n\n db.exec(`PRAGMA user_version = ${i + 1}`);\n }\n};\n","import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport * as Config from \"effect/Config\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\n\nimport { runMigrations } from \"./migrations\";\n\n/**\n * Wraps `body` in a SQLite transaction: BEGIN before, COMMIT on success,\n * ROLLBACK on any failure or interruption.\n */\nexport const withTransaction = <A, E, R>(\n db: DatabaseSync,\n body: Effect.Effect<A, E, R>\n): Effect.Effect<A, E, R> =>\n Effect.acquireUseRelease(\n Effect.sync(() => db.exec(\"BEGIN\")),\n () => body,\n (_, exit) =>\n Effect.sync(() => {\n if (Exit.isSuccess(exit)) {\n db.exec(\"COMMIT\");\n } else {\n db.exec(\"ROLLBACK\");\n }\n })\n );\n\nexport class SqliteService extends Effect.Service<SqliteService>()(\n \"@ringi/SqliteService\",\n {\n effect: Effect.gen(function* effect() {\n const dbPath = yield* Config.string(\"DB_PATH\").pipe(\n Config.withDefault(\".ringi/reviews.db\")\n );\n\n mkdirSync(dirname(dbPath), { recursive: true });\n\n const db = new DatabaseSync(dbPath);\n db.exec(\"PRAGMA journal_mode=WAL\");\n db.exec(\"PRAGMA foreign_keys=ON\");\n\n runMigrations(db);\n\n return { db } as const;\n }),\n }\n) {}\n","import * as Effect from \"effect/Effect\";\n\nimport type { Comment, CommentId } from \"@/api/schemas/comment\";\nimport type { ReviewId } from \"@/api/schemas/review\";\nimport { SqliteService } from \"@/core/db/database\";\n\n// ---------------------------------------------------------------------------\n// Internal row shape (snake_case from SQLite)\n// ---------------------------------------------------------------------------\n\ninterface CommentRow {\n id: string;\n review_id: string;\n file_path: string;\n line_number: number | null;\n line_type: string | null;\n content: string;\n suggestion: string | null;\n resolved: number; // SQLite stores booleans as 0/1\n created_at: string;\n updated_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Row → Domain\n// ---------------------------------------------------------------------------\n\nconst rowToComment = (row: CommentRow): Comment => ({\n content: row.content,\n createdAt: row.created_at,\n filePath: row.file_path,\n id: row.id as CommentId,\n lineNumber: row.line_number,\n lineType: row.line_type as Comment[\"lineType\"],\n resolved: row.resolved === 1,\n reviewId: row.review_id as ReviewId,\n suggestion: row.suggestion,\n updatedAt: row.updated_at,\n});\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class CommentRepo extends Effect.Service<CommentRepo>()(\n \"@ringi/CommentRepo\",\n {\n dependencies: [SqliteService.Default],\n effect: Effect.gen(function* effect() {\n const { db } = yield* SqliteService;\n\n // Cached prepared statements for static queries\n const stmtFindById = db.prepare(\"SELECT * FROM comments WHERE id = ?\");\n const stmtFindByReview = db.prepare(\n \"SELECT * FROM comments WHERE review_id = ? ORDER BY created_at ASC\"\n );\n const stmtFindByFile = db.prepare(\n \"SELECT * FROM comments WHERE review_id = ? AND file_path = ? ORDER BY line_number ASC, created_at ASC\"\n );\n const stmtInsert = db.prepare(\n `INSERT INTO comments (id, review_id, file_path, line_number, line_type, content, suggestion, resolved, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 0, datetime('now'), datetime('now'))`\n );\n const stmtDelete = db.prepare(\"DELETE FROM comments WHERE id = ?\");\n const stmtDeleteByReview = db.prepare(\n \"DELETE FROM comments WHERE review_id = ?\"\n );\n const stmtSetResolved = db.prepare(\n \"UPDATE comments SET resolved = ?, updated_at = datetime('now') WHERE id = ?\"\n );\n const stmtCountByReview = db.prepare(\n `SELECT\n COUNT(*) as total,\n SUM(CASE WHEN resolved = 1 THEN 1 ELSE 0 END) as resolved,\n SUM(CASE WHEN resolved = 0 THEN 1 ELSE 0 END) as unresolved,\n SUM(CASE WHEN suggestion IS NOT NULL THEN 1 ELSE 0 END) as with_suggestions\n FROM comments WHERE review_id = ?`\n );\n\n // ------------------------------------------------------------------\n\n const findById = (id: CommentId): Effect.Effect<Comment | null> =>\n Effect.sync(() => {\n const row = stmtFindById.get(id) as CommentRow | undefined;\n return row ? rowToComment(row) : null;\n });\n\n const findByReview = (\n reviewId: ReviewId\n ): Effect.Effect<readonly Comment[]> =>\n Effect.sync(() => {\n const rows = stmtFindByReview.all(\n reviewId\n ) as unknown as CommentRow[];\n return rows.map(rowToComment);\n });\n\n const findByFile = (\n reviewId: ReviewId,\n filePath: string\n ): Effect.Effect<readonly Comment[]> =>\n Effect.sync(() => {\n const rows = stmtFindByFile.all(\n reviewId,\n filePath\n ) as unknown as CommentRow[];\n return rows.map(rowToComment);\n });\n\n const create = (input: {\n id: CommentId;\n reviewId: ReviewId;\n filePath: string;\n lineNumber: number | null;\n lineType: string | null;\n content: string;\n suggestion: string | null;\n }): Effect.Effect<Comment> =>\n Effect.sync(() => {\n stmtInsert.run(\n input.id,\n input.reviewId,\n input.filePath,\n input.lineNumber,\n input.lineType,\n input.content,\n input.suggestion\n );\n return rowToComment(\n stmtFindById.get(input.id) as unknown as CommentRow\n );\n });\n\n const update = (\n id: CommentId,\n updates: { content?: string; suggestion?: string | null }\n ): Effect.Effect<Comment | null> =>\n Effect.sync(() => {\n const setClauses: string[] = [];\n const params: unknown[] = [];\n\n if (updates.content !== undefined) {\n setClauses.push(\"content = ?\");\n params.push(updates.content);\n }\n if (updates.suggestion !== undefined) {\n setClauses.push(\"suggestion = ?\");\n params.push(updates.suggestion);\n }\n\n if (setClauses.length === 0) {\n const row = stmtFindById.get(id) as CommentRow | undefined;\n return row ? rowToComment(row) : null;\n }\n\n setClauses.push(\"updated_at = datetime('now')\");\n params.push(id);\n\n db.prepare(\n `UPDATE comments SET ${setClauses.join(\", \")} WHERE id = ?`\n ).run(...(params as import(\"node:sqlite\").SQLInputValue[]));\n\n const row = stmtFindById.get(id) as CommentRow | undefined;\n return row ? rowToComment(row) : null;\n });\n\n const setResolved = (\n id: CommentId,\n resolved: boolean\n ): Effect.Effect<Comment | null> =>\n Effect.sync(() => {\n stmtSetResolved.run(resolved ? 1 : 0, id);\n const row = stmtFindById.get(id) as CommentRow | undefined;\n return row ? rowToComment(row) : null;\n });\n\n const remove = (id: CommentId): Effect.Effect<boolean> =>\n Effect.sync(() => {\n const result = stmtDelete.run(id);\n return Number(result.changes) > 0;\n });\n\n const removeByReview = (reviewId: ReviewId): Effect.Effect<number> =>\n Effect.sync(() => {\n const result = stmtDeleteByReview.run(reviewId);\n return Number(result.changes);\n });\n\n const countByReview = (\n reviewId: ReviewId\n ): Effect.Effect<{\n total: number;\n resolved: number;\n unresolved: number;\n withSuggestions: number;\n }> =>\n Effect.sync(() => {\n const row = stmtCountByReview.get(reviewId) as unknown as {\n total: number;\n resolved: number;\n unresolved: number;\n with_suggestions: number;\n };\n return {\n resolved: row.resolved,\n total: row.total,\n unresolved: row.unresolved,\n withSuggestions: row.with_suggestions,\n };\n });\n\n return {\n countByReview,\n create,\n findByFile,\n findById,\n findByReview,\n remove,\n removeByReview,\n setResolved,\n update,\n } as const;\n }),\n }\n) {}\n","import { randomUUID } from \"node:crypto\";\n\nimport * as Effect from \"effect/Effect\";\nimport * as Option from \"effect/Option\";\n\nimport type {\n CommentId,\n CreateCommentInput,\n UpdateCommentInput,\n} from \"@/api/schemas/comment\";\nimport { CommentNotFound } from \"@/api/schemas/comment\";\nimport type { ReviewId } from \"@/api/schemas/review\";\nimport { CommentRepo } from \"@/core/repos/comment.repo\";\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class CommentService extends Effect.Service<CommentService>()(\n \"@ringi/CommentService\",\n {\n dependencies: [CommentRepo.Default],\n effect: Effect.sync(() => {\n // -----------------------------------------------------------------------\n // create\n // -----------------------------------------------------------------------\n const create = Effect.fn(\"CommentService.create\")(function* create(\n reviewId: ReviewId,\n input: CreateCommentInput\n ) {\n const repo = yield* CommentRepo;\n const id = randomUUID() as CommentId;\n\n return yield* repo.create({\n content: input.content,\n filePath: input.filePath,\n id,\n lineNumber: input.lineNumber,\n lineType: input.lineType,\n reviewId,\n suggestion: input.suggestion,\n });\n });\n\n // -----------------------------------------------------------------------\n // getById\n // -----------------------------------------------------------------------\n const getById = Effect.fn(\"CommentService.getById\")(function* getById(\n id: CommentId\n ) {\n const repo = yield* CommentRepo;\n const comment = yield* repo.findById(id);\n if (!comment) {\n return yield* new CommentNotFound({ id });\n }\n return comment;\n });\n\n // -----------------------------------------------------------------------\n // getByReview\n // -----------------------------------------------------------------------\n const getByReview = Effect.fn(\"CommentService.getByReview\")(\n function* getByReview(reviewId: ReviewId) {\n const repo = yield* CommentRepo;\n return yield* repo.findByReview(reviewId);\n }\n );\n\n // -----------------------------------------------------------------------\n // getByFile\n // -----------------------------------------------------------------------\n const getByFile = Effect.fn(\"CommentService.getByFile\")(\n function* getByFile(reviewId: ReviewId, filePath: string) {\n const repo = yield* CommentRepo;\n return yield* repo.findByFile(reviewId, filePath);\n }\n );\n\n // -----------------------------------------------------------------------\n // update\n // -----------------------------------------------------------------------\n const update = Effect.fn(\"CommentService.update\")(function* update(\n id: CommentId,\n input: UpdateCommentInput\n ) {\n const repo = yield* CommentRepo;\n\n const updates: { content?: string; suggestion?: string | null } = {};\n if (Option.isSome(input.content)) {\n updates.content = input.content.value;\n }\n if (Option.isSome(input.suggestion)) {\n updates.suggestion = input.suggestion.value;\n }\n\n const comment = yield* repo.update(id, updates);\n if (!comment) {\n return yield* new CommentNotFound({ id });\n }\n return comment;\n });\n\n // -----------------------------------------------------------------------\n // resolve / unresolve\n // -----------------------------------------------------------------------\n const resolve = Effect.fn(\"CommentService.resolve\")(function* resolve(\n id: CommentId\n ) {\n const repo = yield* CommentRepo;\n const comment = yield* repo.setResolved(id, true);\n if (!comment) {\n return yield* new CommentNotFound({ id });\n }\n return comment;\n });\n\n const unresolve = Effect.fn(\"CommentService.unresolve\")(\n function* unresolve(id: CommentId) {\n const repo = yield* CommentRepo;\n const comment = yield* repo.setResolved(id, false);\n if (!comment) {\n return yield* new CommentNotFound({ id });\n }\n return comment;\n }\n );\n\n // -----------------------------------------------------------------------\n // remove\n // -----------------------------------------------------------------------\n const remove = Effect.fn(\"CommentService.remove\")(function* remove(\n id: CommentId\n ) {\n const repo = yield* CommentRepo;\n const existed = yield* repo.remove(id);\n if (!existed) {\n return yield* new CommentNotFound({ id });\n }\n return { success: true as const };\n });\n\n // -----------------------------------------------------------------------\n // getStats\n // -----------------------------------------------------------------------\n const getStats = Effect.fn(\"CommentService.getStats\")(function* getStats(\n reviewId: ReviewId\n ) {\n const repo = yield* CommentRepo;\n return yield* repo.countByReview(reviewId);\n });\n\n // -----------------------------------------------------------------------\n // Public interface\n // -----------------------------------------------------------------------\n return {\n create,\n getByFile,\n getById,\n getByReview,\n getStats,\n remove,\n resolve,\n unresolve,\n update,\n } as const;\n }),\n }\n) {}\n","import type {\n DiffFile,\n DiffHunk,\n DiffLine,\n DiffSummary,\n} from \"@/api/schemas/diff\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst HUNK_HEADER = /@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/;\n\nconst splitIntoFiles = (diffText: string): readonly string[] => {\n const files: string[] = [];\n const lines = diffText.split(\"\\n\");\n let current: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"diff --git\")) {\n if (current.length > 0) {\n files.push(current.join(\"\\n\"));\n }\n current = [line];\n } else {\n current.push(line);\n }\n }\n if (current.length > 0) {\n files.push(current.join(\"\\n\"));\n }\n return files;\n};\n\nconst parseHunks = (lines: readonly string[]): readonly DiffHunk[] => {\n const hunks: DiffHunk[] = [];\n let currentHunk: {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: DiffLine[];\n } | null = null;\n let oldLineNum = 0;\n let newLineNum = 0;\n\n for (const line of lines) {\n const match = line.match(HUNK_HEADER);\n if (match) {\n if (currentHunk) {\n hunks.push(currentHunk);\n }\n const oldStart = Number.parseInt(match[1]!, 10);\n const oldLines = Number.parseInt(match[2] ?? \"1\", 10);\n const newStart = Number.parseInt(match[3]!, 10);\n const newLines = Number.parseInt(match[4] ?? \"1\", 10);\n currentHunk = { lines: [], newLines, newStart, oldLines, oldStart };\n oldLineNum = oldStart;\n newLineNum = newStart;\n continue;\n }\n\n if (!currentHunk) {\n continue;\n }\n\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n currentHunk.lines.push({\n content: line.slice(1),\n newLineNumber: newLineNum++,\n oldLineNumber: null,\n type: \"added\",\n });\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n currentHunk.lines.push({\n content: line.slice(1),\n newLineNumber: null,\n oldLineNumber: oldLineNum++,\n type: \"removed\",\n });\n } else if (line.startsWith(\" \")) {\n currentHunk.lines.push({\n content: line.slice(1),\n newLineNumber: newLineNum++,\n oldLineNumber: oldLineNum++,\n type: \"context\",\n });\n }\n // Skip '\\\', '---', '+++', 'index', mode lines\n }\n\n if (currentHunk) {\n hunks.push(currentHunk);\n }\n return hunks;\n};\n\nconst parseFileDiff = (fileDiff: string): DiffFile | null => {\n const lines = fileDiff.split(\"\\n\");\n const diffLine = lines.find((l) => l.startsWith(\"diff --git\"));\n if (!diffLine) {\n return null;\n }\n\n const pathMatch = diffLine.match(/diff --git a\\/(.+) b\\/(.+)/);\n if (!pathMatch) {\n return null;\n }\n\n const oldPath = pathMatch[1]!;\n const newPath = pathMatch[2]!;\n\n // Status detection (priority order)\n let status: DiffFile[\"status\"] = \"modified\";\n if (lines.some((l) => l.startsWith(\"deleted file mode\"))) {\n status = \"deleted\";\n } else if (lines.some((l) => l.startsWith(\"new file mode\"))) {\n status = \"added\";\n } else if (\n lines.some((l) => l.startsWith(\"rename from\")) ||\n oldPath !== newPath\n ) {\n status = \"renamed\";\n }\n\n const hunks = parseHunks(lines);\n\n let additions = 0;\n let deletions = 0;\n for (const hunk of hunks) {\n for (const line of hunk.lines) {\n if (line.type === \"added\") {\n additions++;\n } else if (line.type === \"removed\") {\n deletions++;\n }\n }\n }\n\n return { additions, deletions, hunks, newPath, oldPath, status };\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Parse a full multi-file unified diff into structured DiffFile objects. */\nexport const parseDiff = (diffText: string): readonly DiffFile[] => {\n if (!diffText.trim()) {\n return [];\n }\n const blocks = splitIntoFiles(diffText);\n const files: DiffFile[] = [];\n for (const block of blocks) {\n const parsed = parseFileDiff(block);\n if (parsed) {\n files.push(parsed);\n }\n }\n return files;\n};\n\n/** Parse a unified diff and return only the first file, or null. */\nexport const parseSingleFileDiff = (diffText: string): DiffFile | null => {\n const files = parseDiff(diffText);\n return files[0] ?? null;\n};\n\n/** Aggregate stats from already-parsed files. */\nexport const getDiffSummary = (files: readonly DiffFile[]): DiffSummary => {\n let totalAdditions = 0;\n let totalDeletions = 0;\n for (const file of files) {\n totalAdditions += file.additions;\n totalDeletions += file.deletions;\n }\n return {\n filesAdded: files.filter((f) => f.status === \"added\").length,\n filesDeleted: files.filter((f) => f.status === \"deleted\").length,\n filesModified: files.filter((f) => f.status === \"modified\").length,\n filesRenamed: files.filter((f) => f.status === \"renamed\").length,\n totalAdditions,\n totalDeletions,\n totalFiles: files.length,\n };\n};\n","import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport * as HttpApiSchema from \"@effect/platform/HttpApiSchema\";\nimport * as Config from \"effect/Config\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\n// ---------------------------------------------------------------------------\n// Error\n// ---------------------------------------------------------------------------\n\nexport class GitError extends Schema.TaggedError<GitError>()(\n \"GitError\",\n { message: Schema.String },\n HttpApiSchema.annotations({ status: 500 })\n) {}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst execGit = (args: readonly string[], repoPath: string) =>\n Effect.tryPromise({\n catch: (error) => new GitError({ message: String(error) }),\n try: () =>\n new Promise<string>((resolve, reject) => {\n execFile(\n \"git\",\n [...args],\n { cwd: repoPath, maxBuffer: 50 * 1024 * 1024 },\n (err, stdout) => {\n if (err) {\n reject(err);\n } else {\n resolve(stdout);\n }\n }\n );\n }),\n });\n\n/** Split git output into non-empty lines. */\nconst lines = (output: string): string[] =>\n output.trim().split(\"\\n\").filter(Boolean);\n\n/** Parse name-status output (e.g. `M\\tfile.ts`). */\nconst parseNameStatus = (output: string) =>\n lines(output).map((line) => {\n const [status, ...rest] = line.split(\"\\t\");\n return { path: rest.join(\"\\t\"), status: status! };\n });\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class GitService extends Effect.Service<GitService>()(\n \"@ringi/GitService\",\n {\n effect: Effect.gen(function* effect() {\n const repoPath = yield* Config.string(\"REPOSITORY_PATH\").pipe(\n Config.withDefault(process.cwd())\n );\n\n // -- repo state --------------------------------------------------------\n\n const hasCommits = execGit([\"rev-parse\", \"HEAD\"], repoPath).pipe(\n Effect.as(true),\n Effect.catchTag(\"GitError\", () => Effect.succeed(false)),\n Effect.withSpan(\"GitService.hasCommits\")\n );\n\n // -- repository info --------------------------------------------------\n\n const getRepositoryInfo = Effect.gen(function* getRepositoryInfo() {\n const name = yield* execGit(\n [\"rev-parse\", \"--show-toplevel\"],\n repoPath\n ).pipe(Effect.map((s) => s.trim().split(\"/\").pop() ?? \"unknown\"));\n\n const branch = yield* execGit(\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n repoPath\n ).pipe(Effect.map((s) => s.trim()));\n\n const remote = yield* execGit(\n [\"config\", \"--get\", \"remote.origin.url\"],\n repoPath\n ).pipe(\n Effect.map((s) => s.trim() || null),\n Effect.catchTag(\"GitError\", () => Effect.succeed(null))\n );\n\n return { branch, name, path: repoPath, remote };\n }).pipe(Effect.withSpan(\"GitService.getRepositoryInfo\"));\n\n // -- diffs -------------------------------------------------------------\n\n const getStagedDiff = execGit(\n [\"diff\", \"--cached\", \"--no-color\", \"--unified=3\"],\n repoPath\n ).pipe(Effect.withSpan(\"GitService.getStagedDiff\"));\n\n const getUncommittedDiff = hasCommits.pipe(\n Effect.flatMap((has) =>\n has\n ? execGit([\"diff\", \"HEAD\", \"--no-color\", \"--unified=3\"], repoPath)\n : Effect.succeed(\"\")\n ),\n Effect.withSpan(\"GitService.getUncommittedDiff\")\n );\n\n const getUnstagedDiff = execGit(\n [\"diff\", \"--no-color\", \"--unified=3\"],\n repoPath\n ).pipe(Effect.withSpan(\"GitService.getUnstagedDiff\"));\n\n const getLastCommitDiff = hasCommits.pipe(\n Effect.flatMap((has) =>\n has\n ? execGit(\n [\"show\", \"HEAD\", \"--format=\", \"--no-color\", \"--unified=3\"],\n repoPath\n )\n : Effect.succeed(\"\")\n ),\n Effect.withSpan(\"GitService.getLastCommitDiff\")\n );\n\n const getBranchDiff = Effect.fn(\"GitService.getBranchDiff\")(\n function* getBranchDiff(branch: string) {\n return yield* execGit(\n [\"diff\", `${branch}...HEAD`, \"--no-color\", \"--unified=3\"],\n repoPath\n );\n }\n );\n\n const getCommitDiff = Effect.fn(\"GitService.getCommitDiff\")(\n function* getCommitDiff(shas: readonly string[]) {\n if (shas.length === 1) {\n return yield* execGit(\n [\"show\", shas[0]!, \"--format=\", \"--no-color\", \"--unified=3\"],\n repoPath\n );\n }\n const first = shas.at(-1)!;\n const last = shas[0]!;\n return yield* execGit(\n [\"diff\", `${first}~1..${last}`, \"--no-color\", \"--unified=3\"],\n repoPath\n );\n }\n );\n\n // -- file lists --------------------------------------------------------\n\n const getStagedFiles = execGit(\n [\"diff\", \"--cached\", \"--name-status\"],\n repoPath\n ).pipe(\n Effect.map(parseNameStatus),\n Effect.withSpan(\"GitService.getStagedFiles\")\n );\n\n const getUncommittedFiles = hasCommits.pipe(\n Effect.flatMap((has) =>\n has\n ? execGit([\"diff\", \"HEAD\", \"--name-status\"], repoPath).pipe(\n Effect.map(parseNameStatus)\n )\n : Effect.succeed([])\n ),\n Effect.withSpan(\"GitService.getUncommittedFiles\")\n );\n\n const getUnstagedFiles = execGit(\n [\"diff\", \"--name-status\"],\n repoPath\n ).pipe(\n Effect.map(parseNameStatus),\n Effect.withSpan(\"GitService.getUnstagedFiles\")\n );\n\n const getLastCommitFiles = hasCommits.pipe(\n Effect.flatMap((has) =>\n has\n ? execGit(\n [\"show\", \"HEAD\", \"--format=\", \"--name-status\"],\n repoPath\n ).pipe(Effect.map(parseNameStatus))\n : Effect.succeed([])\n ),\n Effect.withSpan(\"GitService.getLastCommitFiles\")\n );\n\n // -- file content ------------------------------------------------------\n\n const getFileContent = Effect.fn(\"GitService.getFileContent\")(\n function* getFileContent(\n filePath: string,\n version: \"staged\" | \"head\" | \"working\"\n ) {\n switch (version) {\n case \"staged\": {\n return yield* execGit([\"show\", `:${filePath}`], repoPath);\n }\n case \"head\": {\n return yield* execGit([\"show\", `HEAD:${filePath}`], repoPath);\n }\n case \"working\":\n default: {\n return yield* Effect.tryPromise({\n catch: (error) =>\n new GitError({\n message: `Failed to read ${filePath}: ${String(error)}`,\n }),\n try: () => readFile(join(repoPath, filePath), \"utf8\"),\n });\n }\n }\n }\n );\n\n // -- tree / branches / commits -----------------------------------------\n\n const getFileTree = Effect.fn(\"GitService.getFileTree\")(\n function* getFileTree(ref: string) {\n return yield* execGit(\n [\"ls-tree\", \"-r\", \"--name-only\", ref],\n repoPath\n ).pipe(Effect.map(lines));\n }\n );\n\n const getBranches = execGit(\n [\"branch\", \"--format=%(refname:short)\\t%(HEAD)\"],\n repoPath\n ).pipe(\n Effect.map((output) =>\n lines(output).map((line) => {\n const [name, head] = line.split(\"\\t\");\n return { current: head === \"*\", name: name! };\n })\n ),\n Effect.withSpan(\"GitService.getBranches\")\n );\n\n const getCommits = Effect.fn(\"GitService.getCommits\")(\n function* getCommits(opts: {\n limit?: number;\n offset?: number;\n search?: string;\n }) {\n const limit = (opts.limit ?? 20) + 1; // +1 to detect hasMore\n const args = [\n \"log\",\n `--max-count=${limit}`,\n `--skip=${opts.offset ?? 0}`,\n \"--format=%H\\t%s\\t%an\\t%aI\",\n ];\n if (opts.search) {\n args.push(`--grep=${opts.search}`, \"-i\");\n }\n\n const output = yield* execGit(args, repoPath);\n const rows = lines(output);\n const hasMore = rows.length === limit;\n const commits = (hasMore ? rows.slice(0, -1) : rows).map((line) => {\n const [hash, message, author, date] = line.split(\"\\t\");\n return {\n author: author!,\n date: date!,\n hash: hash!,\n message: message!,\n };\n });\n return { commits, hasMore };\n }\n );\n\n // -- staging operations ------------------------------------------------\n\n const stageFiles = Effect.fn(\"GitService.stageFiles\")(\n function* stageFiles(files: readonly string[]) {\n return yield* execGit([\"add\", \"--\", ...files], repoPath).pipe(\n Effect.as(files)\n );\n }\n );\n\n const stageAll = execGit([\"add\", \"-A\"], repoPath).pipe(\n Effect.flatMap(() => getStagedFiles),\n Effect.map((files) => files.map((f) => f.path)),\n Effect.withSpan(\"GitService.stageAll\")\n );\n\n const unstageFiles = Effect.fn(\"GitService.unstageFiles\")(\n function* unstageFiles(files: readonly string[]) {\n return yield* execGit(\n [\"reset\", \"HEAD\", \"--\", ...files],\n repoPath\n ).pipe(Effect.as(files));\n }\n );\n\n const getRepositoryPath = execGit(\n [\"rev-parse\", \"--show-toplevel\"],\n repoPath\n ).pipe(\n Effect.map((s) => s.trim()),\n Effect.withSpan(\"GitService.getRepositoryPath\")\n );\n\n // -- public interface --------------------------------------------------\n\n return {\n getBranchDiff,\n getBranches,\n getCommitDiff,\n getCommits,\n getFileContent,\n getFileTree,\n getLastCommitDiff,\n getLastCommitFiles,\n getRepositoryInfo,\n getRepositoryPath,\n getStagedDiff,\n getStagedFiles,\n getUncommittedDiff,\n getUncommittedFiles,\n getUnstagedDiff,\n getUnstagedFiles,\n hasCommits,\n stageAll,\n stageFiles,\n unstageFiles,\n } as const;\n }),\n }\n) {}\n","import { randomUUID } from \"node:crypto\";\n\nimport * as Effect from \"effect/Effect\";\n\nimport type { DiffHunk } from \"@/api/schemas/diff\";\nimport type { ReviewId } from \"@/api/schemas/review\";\nimport { SqliteService, withTransaction } from \"@/core/db/database\";\n\n// ---------------------------------------------------------------------------\n// Internal row shapes\n// ---------------------------------------------------------------------------\n\ninterface ReviewFileRow {\n id: string;\n review_id: string;\n file_path: string;\n old_path: string | null;\n status: string;\n additions: number;\n deletions: number;\n hunks_data: string | null;\n created_at: string;\n}\n\ninterface ReviewFileMetadataRow {\n id: string;\n review_id: string;\n file_path: string;\n old_path: string | null;\n status: string;\n additions: number;\n deletions: number;\n created_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Input type for bulk creation\n// ---------------------------------------------------------------------------\n\nexport interface CreateReviewFileInput {\n readonly reviewId: ReviewId;\n readonly filePath: string;\n readonly oldPath: string | null;\n readonly status: string;\n readonly additions: number;\n readonly deletions: number;\n readonly hunksData: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Static helpers\n// ---------------------------------------------------------------------------\n\nexport const parseHunks = (\n hunksData: string | null\n): Effect.Effect<readonly DiffHunk[]> =>\n hunksData == null\n ? Effect.succeed([])\n : Effect.try(() => JSON.parse(hunksData) as readonly DiffHunk[]).pipe(\n Effect.orElseSucceed(() => [] as readonly DiffHunk[])\n );\n\nexport const serializeHunks = (hunks: readonly DiffHunk[]): string =>\n JSON.stringify(hunks);\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class ReviewFileRepo extends Effect.Service<ReviewFileRepo>()(\n \"@ringi/ReviewFileRepo\",\n {\n dependencies: [SqliteService.Default],\n effect: Effect.gen(function* effect() {\n const { db } = yield* SqliteService;\n\n // Cached prepared statements\n const stmtFindByReview = db.prepare(\n `SELECT id, review_id, file_path, old_path, status, additions, deletions, created_at\n FROM review_files WHERE review_id = ? ORDER BY file_path`\n );\n const stmtFindByReviewAndPath = db.prepare(\n \"SELECT * FROM review_files WHERE review_id = ? AND file_path = ?\"\n );\n const stmtInsert = db.prepare(\n `INSERT INTO review_files (id, review_id, file_path, old_path, status, additions, deletions, hunks_data, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`\n );\n const stmtDeleteByReview = db.prepare(\n \"DELETE FROM review_files WHERE review_id = ?\"\n );\n const stmtCountByReview = db.prepare(\n \"SELECT COUNT(*) as count FROM review_files WHERE review_id = ?\"\n );\n\n // ------------------------------------------------------------------\n\n const findByReview = (\n reviewId: ReviewId\n ): Effect.Effect<readonly ReviewFileMetadataRow[]> =>\n Effect.sync(\n () =>\n stmtFindByReview.all(reviewId) as unknown as ReviewFileMetadataRow[]\n );\n\n const findByReviewAndPath = (\n reviewId: ReviewId,\n filePath: string\n ): Effect.Effect<ReviewFileRow | null> =>\n Effect.sync(() => {\n const row = stmtFindByReviewAndPath.get(\n reviewId,\n filePath\n ) as unknown as ReviewFileRow | undefined;\n return row ?? null;\n });\n\n const createBulk = (\n files: readonly CreateReviewFileInput[]\n ): Effect.Effect<void> =>\n withTransaction(\n db,\n Effect.sync(() => {\n for (const f of files) {\n stmtInsert.run(\n randomUUID(),\n f.reviewId,\n f.filePath,\n f.oldPath,\n f.status,\n f.additions,\n f.deletions,\n f.hunksData\n );\n }\n })\n );\n\n const deleteByReview = (reviewId: ReviewId): Effect.Effect<number> =>\n Effect.sync(() => {\n const result = stmtDeleteByReview.run(reviewId);\n return Number(result.changes);\n });\n\n const countByReview = (reviewId: ReviewId): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountByReview.get(reviewId) as { count: number };\n return row.count;\n });\n\n return {\n countByReview,\n createBulk,\n deleteByReview,\n findByReview,\n findByReviewAndPath,\n } as const;\n }),\n }\n) {}\n","import * as Effect from \"effect/Effect\";\n\nimport type { Review, ReviewId } from \"@/api/schemas/review\";\nimport { SqliteService } from \"@/core/db/database\";\n\n// ---------------------------------------------------------------------------\n// Internal row shape (snake_case from SQLite)\n// ---------------------------------------------------------------------------\n\ninterface ReviewRow {\n id: string;\n repository_path: string;\n base_ref: string | null;\n source_type: string;\n source_ref: string | null;\n snapshot_data: string;\n status: string;\n created_at: string;\n updated_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Row → Domain\n// ---------------------------------------------------------------------------\n\nconst rowToReview = (row: ReviewRow): Review => ({\n baseRef: row.base_ref,\n createdAt: row.created_at,\n id: row.id as ReviewId,\n repositoryPath: row.repository_path,\n snapshotData: row.snapshot_data,\n sourceRef: row.source_ref,\n sourceType: row.source_type as Review[\"sourceType\"],\n status: row.status as Review[\"status\"],\n updatedAt: row.updated_at,\n});\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\ninterface FindAllOpts {\n readonly status?: string;\n readonly repositoryPath?: string;\n readonly sourceType?: string;\n readonly page?: number;\n readonly pageSize?: number;\n}\n\nexport class ReviewRepo extends Effect.Service<ReviewRepo>()(\n \"@ringi/ReviewRepo\",\n {\n dependencies: [SqliteService.Default],\n effect: Effect.gen(function* effect() {\n const { db } = yield* SqliteService;\n\n // Cached prepared statements for static queries\n const stmtFindById = db.prepare(\"SELECT * FROM reviews WHERE id = ?\");\n const stmtInsert = db.prepare(\n `INSERT INTO reviews (id, repository_path, base_ref, source_type, source_ref, snapshot_data, status, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`\n );\n const stmtUpdate = db.prepare(\n `UPDATE reviews SET status = COALESCE(?, status), updated_at = datetime('now') WHERE id = ?`\n );\n const stmtDelete = db.prepare(\"DELETE FROM reviews WHERE id = ?\");\n const stmtCountAll = db.prepare(\"SELECT COUNT(*) as count FROM reviews\");\n const stmtCountByStatus = db.prepare(\n \"SELECT COUNT(*) as count FROM reviews WHERE status = ?\"\n );\n\n // ------------------------------------------------------------------\n\n const findById = (id: ReviewId): Effect.Effect<Review | null> =>\n Effect.sync(() => {\n const row = stmtFindById.get(id) as ReviewRow | undefined;\n return row ? rowToReview(row) : null;\n });\n\n const findAll = (\n opts: FindAllOpts = {}\n ): Effect.Effect<{ data: readonly Review[]; total: number }> =>\n Effect.sync(() => {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (opts.status != null) {\n conditions.push(\"status = ?\");\n params.push(opts.status);\n }\n if (opts.repositoryPath != null) {\n conditions.push(\"repository_path = ?\");\n params.push(opts.repositoryPath);\n }\n if (opts.sourceType != null) {\n conditions.push(\"source_type = ?\");\n params.push(opts.sourceType);\n }\n\n const where =\n conditions.length > 0 ? ` WHERE ${conditions.join(\" AND \")}` : \"\";\n\n const page = opts.page ?? 1;\n const pageSize = opts.pageSize ?? 20;\n const offset = (page - 1) * pageSize;\n\n const totalRow = db\n .prepare(`SELECT COUNT(*) as count FROM reviews${where}`)\n .get(\n ...(params as import(\"node:sqlite\").SQLInputValue[])\n ) as unknown as { count: number };\n\n const rows = db\n .prepare(\n `SELECT * FROM reviews${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`\n )\n .all(\n ...(params as import(\"node:sqlite\").SQLInputValue[]),\n pageSize,\n offset\n ) as unknown as ReviewRow[];\n\n return { data: rows.map(rowToReview), total: totalRow.count };\n });\n\n const create = (input: {\n id: ReviewId;\n repositoryPath: string;\n baseRef: string | null;\n sourceType: string;\n sourceRef: string | null;\n snapshotData: string;\n status: string;\n }): Effect.Effect<Review> =>\n Effect.sync(() => {\n stmtInsert.run(\n input.id,\n input.repositoryPath,\n input.baseRef,\n input.sourceType,\n input.sourceRef,\n input.snapshotData,\n input.status\n );\n // Row guaranteed to exist after successful insert\n return rowToReview(\n stmtFindById.get(input.id) as unknown as ReviewRow\n );\n });\n\n const update = (\n id: ReviewId,\n status: string | null\n ): Effect.Effect<Review | null> =>\n Effect.sync(() => {\n stmtUpdate.run(status, id);\n const row = stmtFindById.get(id) as ReviewRow | undefined;\n return row ? rowToReview(row) : null;\n });\n\n const remove = (id: ReviewId): Effect.Effect<boolean> =>\n Effect.sync(() => {\n const result = stmtDelete.run(id);\n return Number(result.changes) > 0;\n });\n\n const countAll = (): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountAll.get() as { count: number };\n return row.count;\n });\n\n const countByStatus = (status: string): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountByStatus.get(status) as { count: number };\n return row.count;\n });\n\n return {\n countAll,\n countByStatus,\n create,\n findAll,\n findById,\n remove,\n update,\n } as const;\n }),\n }\n) {}\n","import { execFile } from \"node:child_process\";\n\nimport * as HttpApiSchema from \"@effect/platform/HttpApiSchema\";\nimport * as Effect from \"effect/Effect\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { DiffFile, DiffHunk } from \"@/api/schemas/diff\";\nimport type {\n CreateReviewInput,\n ReviewId,\n ReviewStatus,\n UpdateReviewInput,\n} from \"@/api/schemas/review\";\nimport { ReviewNotFound } from \"@/api/schemas/review\";\nimport {\n ReviewFileRepo,\n parseHunks,\n serializeHunks,\n} from \"@/core/repos/review-file.repo\";\nimport { ReviewRepo } from \"@/core/repos/review.repo\";\nimport { parseDiff, getDiffSummary } from \"@/core/services/diff.service\";\nimport { GitService } from \"@/core/services/git.service\";\n\n// ---------------------------------------------------------------------------\n// Error\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line max-classes-per-file -- tagged error and service stay co-located for this domain module.\nexport class ReviewError extends Schema.TaggedError<ReviewError>()(\n \"ReviewError\",\n { code: Schema.String, message: Schema.String },\n HttpApiSchema.annotations({ status: 400 })\n) {}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Get HEAD SHA via git rev-parse. */\nconst getHeadSha = (repoPath: string) =>\n Effect.tryPromise({\n catch: () =>\n new ReviewError({ code: \"GIT_ERROR\", message: \"Failed to get HEAD\" }),\n try: () =>\n new Promise<string>((resolve, reject) => {\n execFile(\n \"git\",\n [\"rev-parse\", \"HEAD\"],\n { cwd: repoPath },\n (err, stdout) => {\n if (err) {\n reject(err);\n } else {\n resolve(stdout.trim());\n }\n }\n );\n }),\n });\n\ninterface SnapshotData {\n repository?: Record<string, unknown>;\n files?: DiffFile[];\n version?: number;\n}\n\n/**\n * Parse snapshotData JSON. Handles both v1 and v2 formats gracefully.\n * v1: { files: DiffFile[], repository: {...} }\n * v2: { repository: {...}, version: 2 }\n */\nconst parseSnapshotData = (s: string): Effect.Effect<SnapshotData> =>\n Effect.try(() => JSON.parse(s) as SnapshotData).pipe(\n Effect.orElseSucceed((): SnapshotData => ({}))\n );\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class ReviewService extends Effect.Service<ReviewService>()(\n \"@ringi/ReviewService\",\n {\n dependencies: [\n ReviewRepo.Default,\n ReviewFileRepo.Default,\n GitService.Default,\n ],\n effect: Effect.sync(() => {\n // -----------------------------------------------------------------------\n // create\n // -----------------------------------------------------------------------\n const create = Effect.fn(\"ReviewService.create\")(function* create(\n input: CreateReviewInput\n ) {\n const git = yield* GitService;\n const repo = yield* ReviewRepo;\n const fileRepo = yield* ReviewFileRepo;\n\n const repoPath = yield* git.getRepositoryPath;\n const hasCommitsResult = yield* git.hasCommits;\n if (!hasCommitsResult) {\n return yield* new ReviewError({\n code: \"NO_COMMITS\",\n message: \"Repository has no commits\",\n });\n }\n\n let diffText: string;\n let baseRef: string | null = null;\n const { sourceType, sourceRef } = input;\n\n switch (sourceType) {\n case \"staged\": {\n diffText = yield* git.getStagedDiff;\n if (!diffText.trim()) {\n return yield* new ReviewError({\n code: \"NO_STAGED_CHANGES\",\n message: \"No staged changes\",\n });\n }\n baseRef = yield* getHeadSha(repoPath);\n break;\n }\n case \"branch\": {\n if (!sourceRef) {\n return yield* new ReviewError({\n code: \"INVALID_SOURCE\",\n message: \"Branch name required\",\n });\n }\n diffText = yield* git.getBranchDiff(sourceRef);\n baseRef = sourceRef;\n break;\n }\n case \"commits\": {\n if (!sourceRef) {\n return yield* new ReviewError({\n code: \"INVALID_SOURCE\",\n message: \"Commit SHAs required\",\n });\n }\n const shas = sourceRef\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n if (shas.length === 0) {\n return yield* new ReviewError({\n code: \"INVALID_SOURCE\",\n message: \"No valid commit SHAs\",\n });\n }\n diffText = yield* git.getCommitDiff(shas);\n baseRef = shas.at(-1) ?? null;\n break;\n }\n default: {\n return yield* new ReviewError({\n code: \"INVALID_SOURCE\",\n message: \"Unsupported review source\",\n });\n }\n }\n\n const files = parseDiff(diffText);\n if (files.length === 0) {\n return yield* new ReviewError({\n code: \"NO_CHANGES\",\n message: \"No changes found\",\n });\n }\n\n const repoInfo = yield* git.getRepositoryInfo;\n const reviewId = crypto.randomUUID() as ReviewId;\n const storeHunks = sourceType === \"staged\";\n\n const fileInputs = files.map((f) => ({\n additions: f.additions,\n deletions: f.deletions,\n filePath: f.newPath,\n hunksData: storeHunks ? serializeHunks(f.hunks as DiffHunk[]) : null,\n oldPath: f.oldPath !== f.newPath ? f.oldPath : null,\n reviewId,\n status: f.status,\n }));\n\n const snapshotData = JSON.stringify({\n repository: repoInfo,\n version: 2,\n });\n\n const review = yield* repo.create({\n baseRef,\n id: reviewId,\n repositoryPath: repoPath,\n snapshotData,\n sourceRef: sourceRef ?? null,\n sourceType,\n status: \"in_progress\",\n });\n\n yield* fileRepo.createBulk(fileInputs);\n\n return review;\n });\n\n // -----------------------------------------------------------------------\n // list\n // -----------------------------------------------------------------------\n const list = Effect.fn(\"ReviewService.list\")(function* list(opts: {\n page?: number;\n pageSize?: number;\n status?: ReviewStatus;\n repositoryPath?: string;\n sourceType?: string;\n }) {\n const repo = yield* ReviewRepo;\n const fileRepo = yield* ReviewFileRepo;\n\n const page = opts.page ?? 1;\n const pageSize = opts.pageSize ?? 20;\n\n const result = yield* repo.findAll({\n page,\n pageSize,\n repositoryPath: opts.repositoryPath,\n sourceType: opts.sourceType,\n status: opts.status,\n });\n\n const reviews = [];\n for (const review of result.data) {\n const fileCount = yield* fileRepo.countByReview(review.id);\n const snapshot = yield* parseSnapshotData(review.snapshotData);\n reviews.push({\n ...review,\n fileCount,\n repository: snapshot.repository ?? null,\n });\n }\n\n return {\n hasMore: page * pageSize < result.total,\n page,\n pageSize,\n reviews,\n total: result.total,\n };\n });\n\n // -----------------------------------------------------------------------\n // getById\n // -----------------------------------------------------------------------\n const getById = Effect.fn(\"ReviewService.getById\")(function* getById(\n id: ReviewId\n ) {\n const repo = yield* ReviewRepo;\n const fileRepo = yield* ReviewFileRepo;\n\n const review = yield* repo.findById(id);\n if (!review) {\n return yield* new ReviewNotFound({ id });\n }\n\n // findByReview returns metadata rows (snake_case from DB)\n const fileRows = yield* fileRepo.findByReview(id);\n const files = fileRows.map((r) => ({\n additions: r.additions,\n deletions: r.deletions,\n filePath: r.file_path,\n id: r.id,\n oldPath: r.old_path,\n status: r.status,\n }));\n\n const snapshot = yield* parseSnapshotData(review.snapshotData);\n const summary = getDiffSummary(\n files.map((f) => ({\n additions: f.additions,\n deletions: f.deletions,\n hunks: [],\n newPath: f.filePath,\n oldPath: f.oldPath ?? f.filePath,\n status: f.status as DiffFile[\"status\"],\n }))\n );\n\n return {\n ...review,\n files,\n repository: snapshot.repository ?? null,\n summary,\n };\n });\n\n // -----------------------------------------------------------------------\n // getFileHunks — lazy load hunks for a single file\n // -----------------------------------------------------------------------\n const getFileHunks = Effect.fn(\"ReviewService.getFileHunks\")(\n function* getFileHunks(reviewId: ReviewId, filePath: string) {\n const repo = yield* ReviewRepo;\n const fileRepo = yield* ReviewFileRepo;\n const git = yield* GitService;\n\n const review = yield* repo.findById(reviewId);\n if (!review) {\n return yield* new ReviewNotFound({ id: reviewId });\n }\n\n // Staged reviews store hunks in DB\n const fileRecord = yield* fileRepo.findByReviewAndPath(\n reviewId,\n filePath\n );\n if (fileRecord?.hunks_data) {\n return yield* parseHunks(fileRecord.hunks_data);\n }\n\n // Branch reviews: regenerate from git\n if (review.sourceType === \"branch\" && review.sourceRef) {\n const diff = yield* git.getBranchDiff(review.sourceRef);\n const diffFiles = parseDiff(diff);\n const file = diffFiles.find((f) => f.newPath === filePath);\n return (file?.hunks ?? []) as DiffHunk[];\n }\n\n // Commits reviews: regenerate from git\n if (review.sourceType === \"commits\" && review.sourceRef) {\n const shas = review.sourceRef.split(\",\").map((s) => s.trim());\n const diff = yield* git.getCommitDiff(shas);\n const diffFiles = parseDiff(diff);\n const file = diffFiles.find((f) => f.newPath === filePath);\n return (file?.hunks ?? []) as DiffHunk[];\n }\n\n // Legacy v1 fallback — hunks were embedded in snapshotData\n const snapshot = yield* parseSnapshotData(review.snapshotData);\n if (snapshot.files) {\n const legacyFile = snapshot.files.find(\n (f) => f.newPath === filePath\n );\n return (legacyFile?.hunks ?? []) as DiffHunk[];\n }\n\n return [] as DiffHunk[];\n }\n );\n\n // -----------------------------------------------------------------------\n // update\n // -----------------------------------------------------------------------\n const update = Effect.fn(\"ReviewService.update\")(function* update(\n id: ReviewId,\n input: UpdateReviewInput\n ) {\n const repo = yield* ReviewRepo;\n\n const existing = yield* repo.findById(id);\n if (!existing) {\n return yield* new ReviewNotFound({ id });\n }\n\n const status = Option.getOrNull(input.status);\n const review = yield* repo.update(id, status);\n if (!review) {\n return yield* new ReviewNotFound({ id });\n }\n\n return review;\n });\n\n // -----------------------------------------------------------------------\n // remove\n // -----------------------------------------------------------------------\n const remove = Effect.fn(\"ReviewService.remove\")(function* remove(\n id: ReviewId\n ) {\n const repo = yield* ReviewRepo;\n const fileRepo = yield* ReviewFileRepo;\n\n const existing = yield* repo.findById(id);\n if (!existing) {\n return yield* new ReviewNotFound({ id });\n }\n\n yield* fileRepo.deleteByReview(id);\n yield* repo.remove(id);\n\n return { success: true as const };\n });\n\n // -----------------------------------------------------------------------\n // getStats\n // -----------------------------------------------------------------------\n const getStats = Effect.fn(\"ReviewService.getStats\")(\n function* getStats() {\n const repo = yield* ReviewRepo;\n\n const total = yield* repo.countAll();\n const inProgress = yield* repo.countByStatus(\"in_progress\");\n const approved = yield* repo.countByStatus(\"approved\");\n const changesRequested =\n yield* repo.countByStatus(\"changes_requested\");\n\n return { approved, changesRequested, inProgress, total };\n }\n );\n\n // -----------------------------------------------------------------------\n // Public interface\n // -----------------------------------------------------------------------\n return {\n create,\n getById,\n getFileHunks,\n getStats,\n list,\n remove,\n update,\n } as const;\n }),\n }\n) {}\n","import * as Effect from \"effect/Effect\";\n\nimport type { Todo, TodoId } from \"@/api/schemas/todo\";\nimport { SqliteService, withTransaction } from \"@/core/db/database\";\n\n// ---------------------------------------------------------------------------\n// Internal row shape (snake_case from SQLite)\n// ---------------------------------------------------------------------------\n\ninterface TodoRow {\n id: string;\n content: string;\n completed: number;\n review_id: string | null;\n position: number;\n created_at: string;\n updated_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Row → Domain\n// ---------------------------------------------------------------------------\n\nconst rowToTodo = (row: TodoRow): Todo => ({\n completed: row.completed === 1,\n content: row.content,\n createdAt: row.created_at,\n id: row.id as TodoId,\n position: row.position,\n reviewId: row.review_id as Todo[\"reviewId\"],\n updatedAt: row.updated_at,\n});\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\ninterface FindAllOpts {\n readonly reviewId?: string;\n readonly completed?: boolean;\n readonly limit?: number;\n readonly offset?: number;\n}\n\nexport class TodoRepo extends Effect.Service<TodoRepo>()(\"@ringi/TodoRepo\", {\n dependencies: [SqliteService.Default],\n effect: Effect.gen(function* effect() {\n const { db } = yield* SqliteService;\n\n // Cached prepared statements for static queries\n const stmtFindById = db.prepare(\"SELECT * FROM todos WHERE id = ?\");\n const stmtInsert = db.prepare(\n `INSERT INTO todos (id, content, completed, review_id, position, created_at, updated_at)\n VALUES (?, ?, 0, ?, ?, datetime('now'), datetime('now'))`\n );\n const stmtDelete = db.prepare(\"DELETE FROM todos WHERE id = ?\");\n const stmtDeleteCompleted = db.prepare(\n \"DELETE FROM todos WHERE completed = 1\"\n );\n const stmtNextPosition = db.prepare(\n \"SELECT COALESCE(MAX(position), -1) + 1 AS next_pos FROM todos\"\n );\n const stmtCountAll = db.prepare(\"SELECT COUNT(*) as count FROM todos\");\n const stmtCountCompleted = db.prepare(\n \"SELECT COUNT(*) as count FROM todos WHERE completed = 1\"\n );\n const stmtCountPending = db.prepare(\n \"SELECT COUNT(*) as count FROM todos WHERE completed = 0\"\n );\n\n // ------------------------------------------------------------------\n\n const findById = (id: TodoId): Effect.Effect<Todo | null> =>\n Effect.sync(() => {\n const row = stmtFindById.get(id) as TodoRow | undefined;\n return row ? rowToTodo(row) : null;\n });\n\n const findAll = (\n opts: FindAllOpts = {}\n ): Effect.Effect<{ data: readonly Todo[]; total: number }> =>\n Effect.sync(() => {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (opts.reviewId != null) {\n conditions.push(\"review_id = ?\");\n params.push(opts.reviewId);\n }\n if (opts.completed != null) {\n conditions.push(\"completed = ?\");\n params.push(opts.completed ? 1 : 0);\n }\n\n const where =\n conditions.length > 0 ? ` WHERE ${conditions.join(\" AND \")}` : \"\";\n\n const totalRow = db\n .prepare(`SELECT COUNT(*) as count FROM todos${where}`)\n .get(\n ...(params as import(\"node:sqlite\").SQLInputValue[])\n ) as unknown as { count: number };\n\n const limitClause = opts.limit != null ? ` LIMIT ? OFFSET ?` : \"\";\n const queryParams =\n opts.limit != null\n ? [...params, opts.limit, opts.offset ?? 0]\n : params;\n\n const rows = db\n .prepare(\n `SELECT * FROM todos${where} ORDER BY position ASC${limitClause}`\n )\n .all(\n ...(queryParams as import(\"node:sqlite\").SQLInputValue[])\n ) as unknown as TodoRow[];\n\n return { data: rows.map(rowToTodo), total: totalRow.count };\n });\n\n const create = (input: {\n id: TodoId;\n content: string;\n reviewId: string | null;\n }): Effect.Effect<Todo> =>\n Effect.sync(() => {\n const { next_pos } = stmtNextPosition.get() as unknown as {\n next_pos: number;\n };\n stmtInsert.run(input.id, input.content, input.reviewId, next_pos);\n return rowToTodo(stmtFindById.get(input.id) as unknown as TodoRow);\n });\n\n const update = (\n id: TodoId,\n updates: { content?: string; completed?: boolean }\n ): Effect.Effect<Todo | null> =>\n Effect.sync(() => {\n const sets: string[] = [];\n const params: unknown[] = [];\n\n if (updates.content != null) {\n sets.push(\"content = ?\");\n params.push(updates.content);\n }\n if (updates.completed != null) {\n sets.push(\"completed = ?\");\n params.push(updates.completed ? 1 : 0);\n }\n\n if (sets.length === 0) {\n const row = stmtFindById.get(id) as TodoRow | undefined;\n return row ? rowToTodo(row) : null;\n }\n\n sets.push(\"updated_at = datetime('now')\");\n params.push(id);\n\n db.prepare(`UPDATE todos SET ${sets.join(\", \")} WHERE id = ?`).run(\n ...(params as import(\"node:sqlite\").SQLInputValue[])\n );\n\n const row = stmtFindById.get(id) as TodoRow | undefined;\n return row ? rowToTodo(row) : null;\n });\n\n const toggle = (id: TodoId): Effect.Effect<Todo | null> =>\n Effect.sync(() => {\n const row = stmtFindById.get(id) as TodoRow | undefined;\n if (!row) {\n return null;\n }\n\n const newCompleted = row.completed === 1 ? 0 : 1;\n db.prepare(\n \"UPDATE todos SET completed = ?, updated_at = datetime('now') WHERE id = ?\"\n ).run(newCompleted, id);\n\n return rowToTodo(stmtFindById.get(id) as unknown as TodoRow);\n });\n\n const remove = (id: TodoId): Effect.Effect<boolean> =>\n Effect.sync(() => {\n const result = stmtDelete.run(id);\n return Number(result.changes) > 0;\n });\n\n const removeCompleted = (): Effect.Effect<number> =>\n Effect.sync(() => {\n const result = stmtDeleteCompleted.run();\n return Number(result.changes);\n });\n\n const reorder = (orderedIds: readonly string[]): Effect.Effect<number> =>\n withTransaction(\n db,\n Effect.sync(() => {\n const stmt = db.prepare(\n \"UPDATE todos SET position = ?, updated_at = datetime('now') WHERE id = ?\"\n );\n let updated = 0;\n for (let i = 0; i < orderedIds.length; i++) {\n const result = stmt.run(i, orderedIds[i]!);\n updated += Number(result.changes);\n }\n return updated;\n })\n );\n\n const move = (\n id: TodoId,\n newPosition: number\n ): Effect.Effect<Todo | null> =>\n Effect.gen(function* move() {\n const row = stmtFindById.get(id) as TodoRow | undefined;\n if (!row) {\n return null;\n }\n\n const oldPosition = row.position;\n\n yield* withTransaction(\n db,\n Effect.sync(() => {\n if (newPosition < oldPosition) {\n db.prepare(\n \"UPDATE todos SET position = position + 1, updated_at = datetime('now') WHERE position >= ? AND position < ? AND id != ?\"\n ).run(newPosition, oldPosition, id);\n } else if (newPosition > oldPosition) {\n db.prepare(\n \"UPDATE todos SET position = position - 1, updated_at = datetime('now') WHERE position > ? AND position <= ? AND id != ?\"\n ).run(oldPosition, newPosition, id);\n }\n\n db.prepare(\n \"UPDATE todos SET position = ?, updated_at = datetime('now') WHERE id = ?\"\n ).run(newPosition, id);\n })\n );\n\n return rowToTodo(stmtFindById.get(id) as unknown as TodoRow);\n });\n\n const countAll = (): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountAll.get() as { count: number };\n return row.count;\n });\n\n const countCompleted = (): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountCompleted.get() as { count: number };\n return row.count;\n });\n\n const countPending = (): Effect.Effect<number> =>\n Effect.sync(() => {\n const row = stmtCountPending.get() as { count: number };\n return row.count;\n });\n\n return {\n countAll,\n countCompleted,\n countPending,\n create,\n findAll,\n findById,\n move,\n remove,\n removeCompleted,\n reorder,\n toggle,\n update,\n } as const;\n }),\n}) {}\n","import { randomUUID } from \"node:crypto\";\n\nimport * as Effect from \"effect/Effect\";\nimport * as Option from \"effect/Option\";\n\nimport type {\n CreateTodoInput,\n TodoId,\n UpdateTodoInput,\n} from \"@/api/schemas/todo\";\nimport { TodoNotFound } from \"@/api/schemas/todo\";\nimport { TodoRepo } from \"@/core/repos/todo.repo\";\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class TodoService extends Effect.Service<TodoService>()(\n \"@ringi/TodoService\",\n {\n dependencies: [TodoRepo.Default],\n effect: Effect.sync(() => {\n // -----------------------------------------------------------------------\n // create\n // -----------------------------------------------------------------------\n const create = Effect.fn(\"TodoService.create\")(function* create(\n input: CreateTodoInput\n ) {\n const repo = yield* TodoRepo;\n const id = randomUUID() as TodoId;\n return yield* repo.create({\n content: input.content,\n id,\n reviewId: input.reviewId,\n });\n });\n\n // -----------------------------------------------------------------------\n // getById\n // -----------------------------------------------------------------------\n const getById = Effect.fn(\"TodoService.getById\")(function* getById(\n id: TodoId\n ) {\n const repo = yield* TodoRepo;\n const todo = yield* repo.findById(id);\n if (!todo) {\n return yield* new TodoNotFound({ id });\n }\n return todo;\n });\n\n // -----------------------------------------------------------------------\n // list\n // -----------------------------------------------------------------------\n const list = Effect.fn(\"TodoService.list\")(function* list(\n opts: {\n reviewId?: string;\n completed?: boolean;\n limit?: number;\n offset?: number;\n } = {}\n ) {\n const repo = yield* TodoRepo;\n const result = yield* repo.findAll(opts);\n return {\n data: result.data,\n limit: opts.limit ?? null,\n offset: opts.offset ?? 0,\n total: result.total,\n };\n });\n\n // -----------------------------------------------------------------------\n // update\n // -----------------------------------------------------------------------\n const update = Effect.fn(\"TodoService.update\")(function* update(\n id: TodoId,\n input: UpdateTodoInput\n ) {\n const repo = yield* TodoRepo;\n\n const existing = yield* repo.findById(id);\n if (!existing) {\n return yield* new TodoNotFound({ id });\n }\n\n const updates: { content?: string; completed?: boolean } = {};\n if (Option.isSome(input.content)) {\n updates.content = input.content.value;\n }\n if (Option.isSome(input.completed)) {\n updates.completed = input.completed.value;\n }\n\n const todo = yield* repo.update(id, updates);\n if (!todo) {\n return yield* new TodoNotFound({ id });\n }\n\n return todo;\n });\n\n // -----------------------------------------------------------------------\n // toggle\n // -----------------------------------------------------------------------\n const toggle = Effect.fn(\"TodoService.toggle\")(function* toggle(\n id: TodoId\n ) {\n const repo = yield* TodoRepo;\n const todo = yield* repo.toggle(id);\n if (!todo) {\n return yield* new TodoNotFound({ id });\n }\n return todo;\n });\n\n // -----------------------------------------------------------------------\n // remove\n // -----------------------------------------------------------------------\n const remove = Effect.fn(\"TodoService.remove\")(function* remove(\n id: TodoId\n ) {\n const repo = yield* TodoRepo;\n\n const existing = yield* repo.findById(id);\n if (!existing) {\n return yield* new TodoNotFound({ id });\n }\n\n yield* repo.remove(id);\n return { success: true as const };\n });\n\n // -----------------------------------------------------------------------\n // removeCompleted\n // -----------------------------------------------------------------------\n const removeCompleted = Effect.fn(\"TodoService.removeCompleted\")(\n function* removeCompleted() {\n const repo = yield* TodoRepo;\n const deleted = yield* repo.removeCompleted();\n return { deleted };\n }\n );\n\n // -----------------------------------------------------------------------\n // reorder\n // -----------------------------------------------------------------------\n const reorder = Effect.fn(\"TodoService.reorder\")(function* reorder(\n orderedIds: readonly string[]\n ) {\n const repo = yield* TodoRepo;\n const updated = yield* repo.reorder(orderedIds);\n return { updated };\n });\n\n // -----------------------------------------------------------------------\n // move\n // -----------------------------------------------------------------------\n const move = Effect.fn(\"TodoService.move\")(function* move(\n id: TodoId,\n position: number\n ) {\n const repo = yield* TodoRepo;\n const todo = yield* repo.move(id, position);\n if (!todo) {\n return yield* new TodoNotFound({ id });\n }\n return todo;\n });\n\n // -----------------------------------------------------------------------\n // getStats\n // -----------------------------------------------------------------------\n const getStats = Effect.fn(\"TodoService.getStats\")(function* getStats() {\n const repo = yield* TodoRepo;\n const total = yield* repo.countAll();\n const completed = yield* repo.countCompleted();\n const pending = yield* repo.countPending();\n return { completed, pending, total };\n });\n\n // -----------------------------------------------------------------------\n // Public interface\n // -----------------------------------------------------------------------\n return {\n create,\n getById,\n getStats,\n list,\n move,\n remove,\n removeCompleted,\n reorder,\n toggle,\n update,\n } as const;\n }),\n }\n) {}\n","import * as Effect from \"effect/Effect\";\n\nimport type { ReviewId } from \"@/api/schemas/review\";\nimport { CommentService } from \"@/core/services/comment.service\";\nimport { ReviewService } from \"@/core/services/review.service\";\nimport { TodoService } from \"@/core/services/todo.service\";\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class ExportService extends Effect.Service<ExportService>()(\n \"@ringi/ExportService\",\n {\n dependencies: [\n ReviewService.Default,\n CommentService.Default,\n TodoService.Default,\n ],\n effect: Effect.sync(() => {\n const exportReview = Effect.fn(\"ExportService.exportReview\")(\n function* exportReview(reviewId: ReviewId) {\n const reviewSvc = yield* ReviewService;\n const commentSvc = yield* CommentService;\n const todoSvc = yield* TodoService;\n\n const review = yield* reviewSvc.getById(reviewId);\n\n // review.repository is parsed from snapshotData\n const repo = review.repository as {\n name?: string;\n branch?: string;\n } | null;\n const repoName = repo?.name ?? \"Unknown\";\n const branch = repo?.branch ?? \"unknown\";\n\n const comments = yield* commentSvc.getByReview(reviewId);\n const commentStats = yield* commentSvc.getStats(reviewId);\n const todos = yield* todoSvc.list({ reviewId });\n\n const lines: string[] = [];\n\n // -- Header --\n lines.push(`# Code Review: ${repoName}`);\n lines.push(\"\");\n lines.push(`**Status:** ${review.status}`);\n lines.push(`**Branch:** ${branch}`);\n lines.push(`**Created:** ${review.createdAt}`);\n\n // -- Files Changed --\n if (review.files && review.files.length > 0) {\n lines.push(\"\");\n lines.push(\"## Files Changed\");\n lines.push(\"\");\n lines.push(\"| File | Status | Additions | Deletions |\");\n lines.push(\"|------|--------|-----------|-----------|\");\n for (const f of review.files) {\n const statusLabel =\n f.status === \"modified\"\n ? \"M\"\n : f.status === \"added\"\n ? \"A\"\n : f.status === \"deleted\"\n ? \"D\"\n : f.status;\n lines.push(\n `| ${f.filePath} | ${statusLabel} | +${f.additions} | -${f.deletions} |`\n );\n }\n }\n\n // -- Comments --\n if (comments.length > 0) {\n lines.push(\"\");\n lines.push(\n `## Comments (${commentStats.total} total, ${commentStats.resolved} resolved)`\n );\n\n // Group by file\n const byFile = new Map<string, (typeof comments)[number][]>();\n for (const c of comments) {\n const key = c.filePath ?? \"(general)\";\n const arr = byFile.get(key) ?? [];\n arr.push(c);\n byFile.set(key, arr);\n }\n\n for (const [filePath, fileComments] of byFile) {\n lines.push(\"\");\n lines.push(`### ${filePath}`);\n for (const c of fileComments) {\n lines.push(\"\");\n lines.push(\n `**Line ${c.lineNumber ?? \"–\"}** (${c.lineType ?? \"context\"})`\n );\n lines.push(`> ${c.content}`);\n if (c.suggestion) {\n lines.push(\"\");\n lines.push(\"```suggestion\");\n lines.push(c.suggestion);\n lines.push(\"```\");\n }\n }\n }\n }\n\n // -- Todos --\n if (todos.data.length > 0) {\n const completed = todos.data.filter((t) => t.completed).length;\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\n `## Todos (${todos.total} total, ${completed} completed)`\n );\n lines.push(\"\");\n for (const t of todos.data) {\n const check = t.completed ? \"x\" : \" \";\n lines.push(`- [${check}] ${t.content}`);\n }\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n );\n\n return { exportReview } as const;\n }),\n }\n) {}\n","import { platform } from \"node:os\";\nimport { relative } from \"node:path\";\n\nimport chokidar from \"chokidar\";\nimport * as Effect from \"effect/Effect\";\nimport * as Queue from \"effect/Queue\";\nimport * as Runtime from \"effect/Runtime\";\nimport * as Stream from \"effect/Stream\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type EventType = \"todos\" | \"reviews\" | \"comments\" | \"files\";\n\nexport interface SSEEvent {\n readonly type: EventType;\n readonly data?: unknown;\n readonly timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// Service\n// ---------------------------------------------------------------------------\n\nexport class EventService extends Effect.Service<EventService>()(\n \"@ringi/EventService\",\n {\n effect: Effect.gen(function* effect() {\n const rt = yield* Effect.runtime<never>();\n const runFork = Runtime.runFork(rt);\n const subscribers = new Set<Queue.Queue<SSEEvent>>();\n\n // -- broadcast ---------------------------------------------------------\n\n const broadcast = Effect.fn(\"EventService.broadcast\")(function* broadcast(\n type: EventType,\n data?: unknown\n ) {\n const event: SSEEvent = { data, timestamp: Date.now(), type };\n for (const queue of subscribers) {\n yield* Queue.offer(queue, event);\n }\n });\n\n // -- subscribe ---------------------------------------------------------\n\n const subscribe = Effect.fn(\"EventService.subscribe\")(\n function* subscribe() {\n const queue = yield* Queue.sliding<SSEEvent>(100);\n subscribers.add(queue);\n\n const stream = Stream.fromQueue(queue);\n\n const unsubscribe = Effect.sync(() => {\n subscribers.delete(queue);\n }).pipe(Effect.andThen(Queue.shutdown(queue)));\n\n return { stream, unsubscribe } as const;\n }\n );\n\n // -- file watcher ------------------------------------------------------\n\n const startFileWatcher = (repoPath: string) =>\n Effect.acquireRelease(\n Effect.sync(() => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = chokidar.watch(repoPath, {\n ignoreInitial: true,\n ignored: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.ringi/**\",\n \"**/dist/**\",\n ],\n persistent: true,\n ...(platform() === \"darwin\"\n ? { interval: 1000, usePolling: true }\n : {}),\n });\n\n const debouncedBroadcast = (filePath: string) => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n const rel = relative(repoPath, filePath);\n runFork(broadcast(\"files\", { path: rel }));\n }, 300);\n };\n\n watcher.on(\"add\", debouncedBroadcast);\n watcher.on(\"change\", debouncedBroadcast);\n watcher.on(\"unlink\", debouncedBroadcast);\n\n return watcher;\n }),\n (watcher) => Effect.promise(() => watcher.close())\n );\n\n // -- client count ------------------------------------------------------\n\n const getClientCount = () => Effect.sync(() => subscribers.size);\n\n return {\n broadcast,\n getClientCount,\n startFileWatcher,\n subscribe,\n } as const;\n }),\n }\n) {}\n","import * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\n\nimport { SqliteService } from \"@/core/db/database\";\nimport { CommentRepo } from \"@/core/repos/comment.repo\";\nimport { ReviewFileRepo } from \"@/core/repos/review-file.repo\";\nimport { ReviewRepo } from \"@/core/repos/review.repo\";\nimport { TodoRepo } from \"@/core/repos/todo.repo\";\nimport { CommentService } from \"@/core/services/comment.service\";\nimport { EventService } from \"@/core/services/event.service\";\nimport { ExportService } from \"@/core/services/export.service\";\nimport { GitService } from \"@/core/services/git.service\";\nimport { ReviewService } from \"@/core/services/review.service\";\nimport { TodoService } from \"@/core/services/todo.service\";\n\nexport const CoreLive = Layer.mergeAll(\n ReviewService.Default,\n ReviewRepo.Default,\n ReviewFileRepo.Default,\n CommentService.Default,\n CommentRepo.Default,\n TodoService.Default,\n TodoRepo.Default,\n GitService.Default,\n EventService.Default,\n ExportService.Default,\n SqliteService.Default\n);\n\nexport const createCoreRuntime = () => ManagedRuntime.make(CoreLive);\n"]}