@kimuson/claude-code-viewer 0.4.12 → 0.4.14
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 +1 -0
- package/dist/main.js +525 -445
- package/dist/main.js.map +4 -4
- package/dist/static/assets/{ProtectedRoute-CdwJtygx.js → ProtectedRoute-BzJk3rey.js} +1 -1
- package/dist/static/assets/{eye-vRHkOT2Y.js → eye-B5gmioqG.js} +1 -1
- package/dist/static/assets/{index-CKGQ--tS.js → index-BmfDiIO7.js} +1 -1
- package/dist/static/assets/{index-DnV70LdM.js → index-Bnpk63z-.js} +36 -36
- package/dist/static/assets/{index-BENMSEhP.js → index-CD2UAYAO.js} +1 -1
- package/dist/static/assets/index-XlCGs7Gh.css +1 -0
- package/dist/static/assets/{label-CMEANyku.js → label-CZmxYtll.js} +1 -1
- package/dist/static/assets/{login-CWyt9fyL.js → login-zJ8NgNeJ.js} +1 -1
- package/dist/static/assets/messages-Bglth_PW.js +1 -0
- package/dist/static/assets/messages-CI-bn0hx.js +1 -0
- package/dist/static/assets/messages-ny4ztBtq.js +1 -0
- package/dist/static/assets/{session-h5mv6_Wi.js → session-17BtrmxA.js} +1 -1
- package/dist/static/assets/{session-40GpSLiu.js → session-DXbcjdEx.js} +58 -53
- package/dist/static/index.html +2 -2
- package/package.json +1 -1
- package/dist/static/assets/index-CF6ATi6V.css +0 -1
- package/dist/static/assets/messages-B4nydqXe.js +0 -1
- package/dist/static/assets/messages-DQZZWrCH.js +0 -1
- package/dist/static/assets/messages-DRQIx4IO.js +0 -1
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/server/main.ts", "../src/server/core/agent-session/index.ts", "../src/server/core/agent-session/infrastructure/AgentSessionRepository.ts", "../src/lib/conversation-schema/index.ts", "../src/lib/conversation-schema/entry/AssistantEntrySchema.ts", "../src/lib/conversation-schema/message/AssistantMessageSchema.ts", "../src/lib/conversation-schema/content/TextContentSchema.ts", "../src/lib/conversation-schema/content/ThinkingContentSchema.ts", "../src/lib/conversation-schema/content/ToolResultContentSchema.ts", "../src/lib/conversation-schema/content/ImageContentSchema.ts", "../src/lib/conversation-schema/content/ToolUseContentSchema.ts", "../src/lib/conversation-schema/entry/BaseEntrySchema.ts", "../src/lib/conversation-schema/entry/FileHIstorySnapshotEntrySchema.ts", "../src/lib/conversation-schema/entry/QueueOperationEntrySchema.ts", "../src/lib/conversation-schema/content/DocumentContentSchema.ts", "../src/lib/conversation-schema/entry/SummaryEntrySchema.ts", "../src/lib/conversation-schema/entry/SystemEntrySchema.ts", "../src/lib/conversation-schema/entry/UserEntrySchema.ts", "../src/lib/conversation-schema/message/UserMessageSchema.ts", "../src/server/core/claude-code/functions/parseJsonl.ts", "../src/server/core/project/functions/id.ts", "../src/server/core/agent-session/presentation/AgentSessionController.ts", "../src/server/core/claude-code/presentation/ClaudeCodeController.ts", "../src/server/core/platform/services/ApplicationContext.ts", "../src/server/core/platform/services/EnvService.ts", "../src/server/core/platform/schema.ts", "../src/server/core/project/infrastructure/ProjectRepository.ts", "../src/server/core/project/services/ProjectMetaService.ts", "../src/server/lib/storage/FileCacheStorage/index.ts", "../src/server/lib/storage/FileCacheStorage/PersistentService.ts", "../src/server/lib/config/paths.ts", "../src/server/core/claude-code/functions/scanCommandFiles.ts", "../src/server/core/claude-code/models/ClaudeCodeVersion.ts", "../src/server/core/claude-code/services/ClaudeCodeService.ts", "../src/server/core/claude-code/functions/parseMcpListOutput.ts", "../src/server/core/claude-code/models/ClaudeCode.ts", "../src/server/core/claude-code/presentation/ClaudeCodePermissionController.ts", "../src/server/core/claude-code/services/ClaudeCodePermissionService.ts", "../src/server/core/events/services/EventBus.ts", "../src/server/core/claude-code/presentation/ClaudeCodeSessionProcessController.ts", "../src/server/core/platform/services/UserConfigService.ts", "../src/lib/i18n/localeDetection.ts", "../src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts", "../src/lib/controllablePromise.ts", "../src/server/core/session/infrastructure/SessionRepository.ts", "../src/server/core/claude-code/functions/parseUserMessage.ts", "../src/server/core/session/functions/id.ts", "../src/server/core/session/functions/isRegularSessionFile.ts", "../src/server/core/session/infrastructure/VirtualConversationDatabase.ts", "../src/server/core/session/services/SessionMetaService.ts", "../src/server/core/session/constants/pricing.ts", "../src/server/core/session/functions/calculateSessionCost.ts", "../src/server/core/session/functions/extractFirstUserText.ts", "../src/server/core/session/functions/isValidFirstMessage.ts", "../src/server/core/claude-code/functions/createMessageGenerator.ts", "../src/server/core/claude-code/functions/fallbackSdkMessage.ts", "../src/server/core/claude-code/models/CCSessionProcess.ts", "../src/server/core/claude-code/services/ClaudeCodeSessionProcessService.ts", "../src/server/core/events/presentation/SSEController.ts", "../src/server/core/events/functions/adaptInternalEventToSSE.ts", "../src/server/core/events/functions/typeSafeSSE.ts", "../src/server/core/events/services/fileWatcher.ts", "../src/server/core/events/functions/parseSessionFilePath.ts", "../src/server/core/feature-flag/presentation/FeatureFlagController.ts", "../src/server/core/file-system/presentation/FileSystemController.ts", "../src/server/core/file-system/functions/getDirectoryListing.ts", "../src/server/core/file-system/functions/getFileCompletion.ts", "../src/server/core/git/presentation/GitController.ts", "../src/server/core/git/functions/getDiff.ts", "../src/server/core/git/functions/utils.ts", "../src/server/core/git/services/GitService.ts", "../src/server/core/git/functions/parseGitBranchesOutput.ts", "../src/server/core/git/functions/parseGitCommitsOutput.ts", "../src/server/core/project/presentation/ProjectController.ts", "../src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts", "../src/server/core/scheduler/config.ts", "../src/server/core/scheduler/schema.ts", "../src/server/core/scheduler/domain/Scheduler.ts", "../src/server/core/scheduler/domain/Job.ts", "../src/server/core/scheduler/presentation/SchedulerController.ts", "../src/server/core/search/presentation/SearchController.ts", "../src/server/core/search/services/SearchService.ts", "../src/server/core/search/functions/extractSearchableText.ts", "../src/server/core/session/presentation/SessionController.ts", "../src/server/core/session/services/ExportService.ts", "../src/server/hono/app.ts", "../src/server/hono/initialize.ts", "../src/server/hono/middleware/auth.middleware.ts", "../src/server/hono/route.ts", "../package.json", "../src/server/core/claude-code/schema.ts", "../src/server/core/git/schema.ts", "../src/server/lib/config/config.ts", "../src/lib/i18n/schema.ts", "../src/server/lib/effect/toEffectResponse.ts", "../src/server/hono/middleware/config.middleware.ts", "../src/server/lib/config/parseUserConfig.ts", "../src/server/lib/effect/layers.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { NodeContext } from \"@effect/platform-node\";\nimport { serve } from \"@hono/node-server\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { Effect } from \"effect\";\nimport { AgentSessionLayer } from \"./core/agent-session\";\nimport { AgentSessionController } from \"./core/agent-session/presentation/AgentSessionController\";\nimport { ClaudeCodeController } from \"./core/claude-code/presentation/ClaudeCodeController\";\nimport { ClaudeCodePermissionController } from \"./core/claude-code/presentation/ClaudeCodePermissionController\";\nimport { ClaudeCodeSessionProcessController } from \"./core/claude-code/presentation/ClaudeCodeSessionProcessController\";\nimport { ClaudeCodeLifeCycleService } from \"./core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ClaudeCodePermissionService } from \"./core/claude-code/services/ClaudeCodePermissionService\";\nimport { ClaudeCodeService } from \"./core/claude-code/services/ClaudeCodeService\";\nimport { ClaudeCodeSessionProcessService } from \"./core/claude-code/services/ClaudeCodeSessionProcessService\";\nimport { SSEController } from \"./core/events/presentation/SSEController\";\nimport { FileWatcherService } from \"./core/events/services/fileWatcher\";\nimport { FeatureFlagController } from \"./core/feature-flag/presentation/FeatureFlagController\";\nimport { FileSystemController } from \"./core/file-system/presentation/FileSystemController\";\nimport { GitController } from \"./core/git/presentation/GitController\";\nimport { GitService } from \"./core/git/services/GitService\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService\";\nimport { SchedulerConfigBaseDir } from \"./core/scheduler/config\";\nimport { SchedulerService } from \"./core/scheduler/domain/Scheduler\";\nimport { SchedulerController } from \"./core/scheduler/presentation/SchedulerController\";\nimport { SearchController } from \"./core/search/presentation/SearchController\";\nimport { SearchService } from \"./core/search/services/SearchService\";\nimport { SessionRepository } from \"./core/session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"./core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionController } from \"./core/session/presentation/SessionController\";\nimport { SessionMetaService } from \"./core/session/services/SessionMetaService\";\nimport { honoApp } from \"./hono/app\";\nimport { InitializeService } from \"./hono/initialize\";\nimport { AuthMiddleware } from \"./hono/middleware/auth.middleware\";\nimport { routes } from \"./hono/route\";\nimport { platformLayer } from \"./lib/effect/layers\";\n\n// biome-ignore lint/style/noProcessEnv: allow only here\nconst isDevelopment = process.env.NODE_ENV === \"development\";\n\nif (!isDevelopment) {\n const staticPath = resolve(import.meta.dirname, \"static\");\n console.log(\"Serving static files from \", staticPath);\n\n honoApp.use(\n \"/assets/*\",\n serveStatic({\n root: staticPath,\n }),\n );\n\n honoApp.use(\"*\", async (c, next) => {\n if (c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n const html = await readFile(resolve(staticPath, \"index.html\"), \"utf-8\");\n return c.html(html);\n });\n}\n\nconst program = routes(honoApp)\n // \u4F9D\u5B58\u306E\u6D45\u3044\u9806\u306B\u30B3\u30F3\u30C6\u30CA\u306B pipe \u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\n .pipe(\n /** Presentation */\n Effect.provide(ProjectController.Live),\n Effect.provide(SessionController.Live),\n Effect.provide(AgentSessionController.Live),\n Effect.provide(GitController.Live),\n Effect.provide(ClaudeCodeController.Live),\n Effect.provide(ClaudeCodeSessionProcessController.Live),\n Effect.provide(ClaudeCodePermissionController.Live),\n Effect.provide(FileSystemController.Live),\n Effect.provide(SSEController.Live),\n Effect.provide(SchedulerController.Live),\n Effect.provide(FeatureFlagController.Live),\n Effect.provide(SearchController.Live),\n )\n .pipe(\n /** Application */\n Effect.provide(InitializeService.Live),\n Effect.provide(FileWatcherService.Live),\n Effect.provide(AuthMiddleware.Live),\n )\n .pipe(\n /** Domain */\n Effect.provide(ClaudeCodeLifeCycleService.Live),\n Effect.provide(ClaudeCodePermissionService.Live),\n Effect.provide(ClaudeCodeSessionProcessService.Live),\n Effect.provide(ClaudeCodeService.Live),\n Effect.provide(GitService.Live),\n Effect.provide(SchedulerService.Live),\n Effect.provide(SchedulerConfigBaseDir.Live),\n Effect.provide(SearchService.Live),\n )\n .pipe(\n /** Infrastructure */\n Effect.provide(ProjectRepository.Live),\n Effect.provide(SessionRepository.Live),\n Effect.provide(ProjectMetaService.Live),\n Effect.provide(SessionMetaService.Live),\n Effect.provide(VirtualConversationDatabase.Live),\n Effect.provide(AgentSessionLayer),\n )\n .pipe(\n /** Platform */\n Effect.provide(platformLayer),\n Effect.provide(NodeContext.layer),\n );\n\nawait Effect.runPromise(program);\n\nconst port = isDevelopment\n ? // biome-ignore lint/style/noProcessEnv: allow only here\n (process.env.DEV_BE_PORT ?? \"3401\")\n : // biome-ignore lint/style/noProcessEnv: allow only here\n (process.env.PORT ?? \"3000\");\n\nserve(\n {\n fetch: honoApp.fetch,\n port: parseInt(port, 10),\n },\n (info) => {\n console.log(`Server is running on http://localhost:${info.port}`);\n },\n);\n", "import { Layer } from \"effect\";\nimport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository\";\n\nexport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository\";\nexport { AgentSessionController } from \"./presentation/AgentSessionController\";\n\n// Layer composition for dependency injection\n// Note: AgentSessionMappingService is no longer used since agentId-based lookup\n// replaced the session-id x prompt mapping approach\nexport const AgentSessionLayer = Layer.mergeAll(AgentSessionRepository.Live);\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport type { ExtendedConversation } from \"../../types\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n /**\n * Get agent session conversations by agentId.\n * Directly reads agent-${agentId}.jsonl file from project directory.\n * Returns null if file does not exist.\n */\n const getAgentSessionByAgentId = (\n projectId: string,\n agentId: string,\n ): Effect.Effect<ExtendedConversation[] | null, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n const agentFilePath = path.resolve(projectPath, `agent-${agentId}.jsonl`);\n\n // Check if file exists\n const exists = yield* fs.exists(agentFilePath);\n if (!exists) {\n return null;\n }\n\n const content = yield* fs.readFileString(agentFilePath);\n const conversations = parseJsonl(content);\n return conversations;\n });\n\n return {\n getAgentSessionByAgentId,\n };\n});\n\nexport class AgentSessionRepository extends Context.Tag(\n \"AgentSessionRepository\",\n)<\n AgentSessionRepository,\n {\n readonly getAgentSessionByAgentId: (\n projectId: string,\n agentId: string,\n ) => Effect.Effect<ExtendedConversation[] | null, Error>;\n }\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n\nexport type IAgentSessionRepository = Context.Tag.Service<\n typeof AgentSessionRepository\n>;\n", "import { z } from \"zod\";\nimport {\n type AssistantEntry,\n AssistantEntrySchema,\n} from \"./entry/AssistantEntrySchema\";\nimport { FileHistorySnapshotEntrySchema } from \"./entry/FileHIstorySnapshotEntrySchema\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema\";\nimport { type UserEntry, UserEntrySchema } from \"./entry/UserEntrySchema\";\n\nexport const ConversationSchema = z.union([\n UserEntrySchema,\n AssistantEntrySchema,\n SummaryEntrySchema,\n SystemEntrySchema,\n FileHistorySnapshotEntrySchema,\n QueueOperationEntrySchema,\n]);\n\nexport type Conversation = z.infer<typeof ConversationSchema>;\nexport type SidechainConversation = UserEntry | AssistantEntry | SystemEntry;\n", "import { z } from \"zod\";\nimport { AssistantMessageSchema } from \"../message/AssistantMessageSchema\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const AssistantEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"assistant\"),\n\n // required\n message: AssistantMessageSchema,\n\n // optional\n requestId: z.string().optional(),\n isApiErrorMessage: z.boolean().optional(),\n});\n\nexport type AssistantEntry = z.infer<typeof AssistantEntrySchema>;\n", "import { z } from \"zod\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ThinkingContentSchema } from \"../content/ThinkingContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\nimport { ToolUseContentSchema } from \"../content/ToolUseContentSchema\";\n\nconst AssistantMessageContentSchema = z.union([\n ThinkingContentSchema,\n TextContentSchema,\n ToolUseContentSchema,\n ToolResultContentSchema,\n]);\n\nexport type AssistantMessageContent = z.infer<\n typeof AssistantMessageContentSchema\n>;\n\nexport const AssistantMessageSchema = z.object({\n id: z.string(),\n container: z.null().optional(),\n type: z.literal(\"message\"),\n role: z.literal(\"assistant\"),\n model: z.string(),\n content: z.array(AssistantMessageContentSchema),\n stop_reason: z.string().nullable(),\n stop_sequence: z.string().nullable(),\n usage: z.object({\n input_tokens: z.number(),\n cache_creation_input_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n cache_creation: z\n .object({\n ephemeral_5m_input_tokens: z.number(),\n ephemeral_1h_input_tokens: z.number(),\n })\n .optional(),\n output_tokens: z.number(),\n service_tier: z.string().nullable().optional(),\n server_tool_use: z\n .object({\n web_search_requests: z.number(),\n })\n .optional(),\n }),\n});\n", "import { z } from \"zod\";\n\nexport const TextContentSchema = z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n});\n", "import { z } from \"zod\";\n\nexport const ThinkingContentSchema = z.object({\n type: z.literal(\"thinking\"),\n thinking: z.string(),\n signature: z.string().optional(),\n});\n", "import { z } from \"zod\";\nimport { ImageContentSchema } from \"./ImageContentSchema\";\nimport { TextContentSchema } from \"./TextContentSchema\";\n\nexport const ToolResultContentSchema = z.object({\n type: z.literal(\"tool_result\"),\n tool_use_id: z.string(),\n content: z.union([\n z.string(),\n z.array(z.union([TextContentSchema, ImageContentSchema])),\n ]),\n is_error: z.boolean().optional(),\n});\n\nexport type ToolResultContent = z.infer<typeof ToolResultContentSchema>;\n", "import { z } from \"zod\";\n\nexport const ImageContentSchema = z.object({\n type: z.literal(\"image\"),\n source: z.object({\n type: z.literal(\"base64\"),\n data: z.string(),\n media_type: z.enum([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]),\n }),\n});\n", "import { z } from \"zod\";\n\nexport const ToolUseContentSchema = z.object({\n type: z.literal(\"tool_use\"),\n id: z.string(),\n name: z.string(),\n input: z.record(z.string(), z.unknown()),\n});\n", "import { z } from \"zod\";\n\nexport const BaseEntrySchema = z.object({\n // required\n isSidechain: z.boolean(),\n userType: z.enum([\"external\"]),\n cwd: z.string(),\n sessionId: z.string(),\n version: z.string(),\n uuid: z.uuid(),\n timestamp: z.string(),\n\n // nullable\n parentUuid: z.uuid().nullable(),\n\n // optional\n isMeta: z.boolean().optional(),\n toolUseResult: z.unknown().optional(), // \u30B9\u30AD\u30FC\u30DE\u304C\u30C4\u30FC\u30EB\u3054\u3068\u306B\u7570\u306A\u308A\u3059\u304E\u308B\u3057\u5229\u7528\u3082\u3057\u306A\u305D\u3046\u306A\u306E\u3067 unknown\n gitBranch: z.string().optional(),\n isCompactSummary: z.boolean().optional(),\n});\n", "import { z } from \"zod\";\n\nexport const FileHistorySnapshotEntrySchema = z.object({\n // discriminator\n type: z.literal(\"file-history-snapshot\"),\n\n // required\n messageId: z.string(),\n snapshot: z.object({\n messageId: z.string(),\n trackedFileBackups: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n }),\n isSnapshotUpdate: z.boolean(),\n});\n\nexport type FileHistorySnapshotEntry = z.infer<\n typeof FileHistorySnapshotEntrySchema\n>;\n", "import { z } from \"zod\";\nimport { DocumentContentSchema } from \"../content/DocumentContentSchema\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\n\nconst QueueOperationContentSchema = z.union([\n z.string(),\n TextContentSchema,\n ToolResultContentSchema,\n ImageContentSchema,\n DocumentContentSchema,\n]);\n\nexport const QueueOperationEntrySchema = z.union([\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"enqueue\"),\n content: z.union([\n z.string(),\n z.array(z.union([z.string(), QueueOperationContentSchema])),\n ]),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"dequeue\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n]);\n\nexport type QueueOperationEntry = z.infer<typeof QueueOperationEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const DocumentContentSchema = z.object({\n type: z.literal(\"document\"),\n source: z.union([\n z.object({\n media_type: z.literal(\"text/plain\"),\n type: z.literal(\"text\"),\n data: z.string(),\n }),\n z.object({\n media_type: z.enum([\"application/pdf\"]),\n type: z.literal(\"base64\"),\n data: z.string(),\n }),\n ]),\n});\n", "import { z } from \"zod\";\n\nexport const SummaryEntrySchema = z.object({\n type: z.literal(\"summary\"),\n summary: z.string(),\n leafUuid: z.string().uuid(),\n});\n\nexport type SummaryEntry = z.infer<typeof SummaryEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const SystemEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"system\"),\n\n // required\n content: z.string(),\n toolUseID: z.string(),\n level: z.enum([\"info\"]),\n});\n\nexport type SystemEntry = z.infer<typeof SystemEntrySchema>;\n", "import { z } from \"zod\";\nimport { UserMessageSchema } from \"../message/UserMessageSchema\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const UserEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"user\"),\n\n // required\n message: UserMessageSchema,\n});\n\nexport type UserEntry = z.infer<typeof UserEntrySchema>;\n", "import { z } from \"zod\";\nimport { DocumentContentSchema } from \"../content/DocumentContentSchema\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\n\nconst UserMessageContentSchema = z.union([\n z.string(),\n TextContentSchema,\n ToolResultContentSchema,\n ImageContentSchema,\n DocumentContentSchema,\n]);\n\nexport type UserMessageContent = z.infer<typeof UserMessageContentSchema>;\n\nexport const UserMessageSchema = z.object({\n role: z.literal(\"user\"),\n content: z.union([\n z.string(),\n z.array(z.union([z.string(), UserMessageContentSchema])),\n ]),\n});\n", "import { ConversationSchema } from \"../../../../lib/conversation-schema\";\nimport type { ErrorJsonl, ExtendedConversation } from \"../../types\";\n\nexport const parseJsonl = (content: string): ExtendedConversation[] => {\n const lines = content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n\n return lines.map((line, index) => {\n const parsed = ConversationSchema.safeParse(JSON.parse(line));\n if (!parsed.success) {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n return parsed.data;\n });\n};\n", "import { dirname } from \"node:path\";\n\nexport const encodeProjectId = (fullPath: string) => {\n return Buffer.from(fullPath).toString(\"base64url\");\n};\n\nexport const decodeProjectId = (id: string) => {\n return Buffer.from(id, \"base64url\").toString(\"utf-8\");\n};\n\nexport const encodeProjectIdFromSessionFilePath = (sessionFilePath: string) => {\n return encodeProjectId(dirname(sessionFilePath));\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { AgentSessionRepository } from \"../infrastructure/AgentSessionRepository\";\n\nconst LayerImpl = Effect.gen(function* () {\n const repository = yield* AgentSessionRepository;\n\n /**\n * Get agent session by agentId.\n * Directly reads agent-${agentId}.jsonl file without mapping service.\n */\n const getAgentSession = (params: { projectId: string; agentId: string }) =>\n Effect.gen(function* () {\n const { projectId, agentId } = params;\n\n // Read conversations directly using agentId\n const conversations = yield* repository.getAgentSessionByAgentId(\n projectId,\n agentId,\n );\n\n if (conversations === null) {\n return {\n status: 200,\n response: {\n agentSessionId: null,\n conversations: [],\n },\n } as const satisfies ControllerResponse;\n }\n\n return {\n status: 200,\n response: {\n agentSessionId: agentId,\n conversations,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getAgentSession,\n };\n});\n\nexport type IAgentSessionController = InferEffect<typeof LayerImpl>;\n\nexport class AgentSessionController extends Context.Tag(\n \"AgentSessionController\",\n)<AgentSessionController, IAgentSessionController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { scanCommandFilesRecursively } from \"../functions/scanCommandFiles\";\nimport * as ClaudeCodeVersion from \"../models/ClaudeCodeVersion\";\nimport { ClaudeCodeService } from \"../services/ClaudeCodeService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeService = yield* ClaudeCodeService;\n const context = yield* ApplicationContext;\n // FileSystem and Path are required by scanCommandFilesRecursively\n yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getClaudeCommands = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n const globalCommands: string[] = yield* scanCommandFilesRecursively(\n context.claudeCodePaths.claudeCommandsDirPath,\n );\n\n const projectCommands: string[] =\n project.meta.projectPath === null\n ? []\n : yield* scanCommandFilesRecursively(\n path.resolve(project.meta.projectPath, \".claude\", \"commands\"),\n );\n\n return {\n response: {\n globalCommands: globalCommands,\n projectCommands: projectCommands,\n defaultCommands: [\"init\", \"compact\", \"security-review\", \"review\"],\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getMcpListRoute = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n const servers = yield* claudeCodeService.getMcpList(projectId);\n return {\n response: { servers },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getClaudeCodeMeta = () =>\n Effect.gen(function* () {\n const config = yield* claudeCodeService.getClaudeCodeMeta();\n return {\n response: {\n executablePath: config.claudeCodeExecutablePath,\n version: config.claudeCodeVersion\n ? ClaudeCodeVersion.versionText(config.claudeCodeVersion)\n : null,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getAvailableFeatures = () =>\n Effect.gen(function* () {\n const features = yield* claudeCodeService.getAvailableFeatures();\n const featuresList = Object.entries(features).flatMap(([key, value]) => {\n return [\n {\n name: key as keyof typeof features,\n enabled: value,\n },\n ];\n });\n\n return {\n response: { features: featuresList },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getClaudeCommands,\n getMcpListRoute,\n getClaudeCodeMeta,\n getAvailableFeatures,\n };\n});\n\nexport type IClaudeCodeController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodeController extends Context.Tag(\"ClaudeCodeController\")<\n ClaudeCodeController,\n IClaudeCodeController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { Path } from \"@effect/platform\";\nimport { Effect, Context as EffectContext, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EnvService } from \"./EnvService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n const globalClaudeDirectoryPath = yield* envService\n .getEnv(\"GLOBAL_CLAUDE_DIR\")\n .pipe(\n Effect.map((envVar) =>\n envVar === undefined\n ? path.resolve(homedir(), \".claude\")\n : path.resolve(envVar),\n ),\n );\n\n const claudeCodePaths = {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(globalClaudeDirectoryPath, \"commands\"),\n claudeProjectsDirPath: path.resolve(globalClaudeDirectoryPath, \"projects\"),\n } as const satisfies {\n globalClaudeDirectoryPath: string;\n claudeCommandsDirPath: string;\n claudeProjectsDirPath: string;\n };\n\n return {\n claudeCodePaths,\n };\n});\n\nexport type IApplicationContext = InferEffect<typeof LayerImpl>;\nexport class ApplicationContext extends EffectContext.Tag(\"ApplicationContext\")<\n ApplicationContext,\n IApplicationContext\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { type EnvSchema, envSchema } from \"../schema\";\n\nconst LayerImpl = Effect.gen(function* () {\n const envRef = yield* Ref.make<EnvSchema | undefined>(undefined);\n\n const parseEnv = () => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n const parsed = envSchema.safeParse(process.env);\n if (!parsed.success) {\n console.error(parsed.error);\n throw new Error(`Invalid environment variables: ${parsed.error.message}`);\n }\n\n return parsed.data;\n };\n\n const getEnv = <Key extends keyof EnvSchema>(\n key: Key,\n ): Effect.Effect<EnvSchema[Key]> => {\n return Effect.gen(function* () {\n yield* Ref.update(envRef, (existingEnv) => {\n if (existingEnv === undefined) {\n return parseEnv();\n }\n return existingEnv;\n });\n\n const env = yield* Ref.get(envRef);\n if (env === undefined) {\n throw new Error(\n \"Unexpected error: Environment variables are not loaded\",\n );\n }\n\n return env[key];\n });\n };\n\n return {\n getEnv,\n };\n});\n\nexport type IEnvService = InferEffect<typeof LayerImpl>;\n\nexport class EnvService extends Context.Tag(\"EnvService\")<\n EnvService,\n IEnvService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { z } from \"zod\";\n\nexport const envSchema = z.object({\n NODE_ENV: z\n .enum([\"development\", \"production\", \"test\"])\n .optional()\n .default(\"development\"),\n GLOBAL_CLAUDE_DIR: z.string().optional(),\n NEXT_PHASE: z.string().optional(),\n PORT: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((val) => parseInt(val, 10)),\n PATH: z.string().optional(),\n CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH: z.string().optional(),\n CLAUDE_CODE_VIEWER_AUTH_PASSWORD: z.string().optional(),\n});\n\nexport type EnvSchema = z.infer<typeof envSchema>;\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport type { Project } from \"../../types\";\nimport { decodeProjectId, encodeProjectId } from \"../functions/id\";\nimport { ProjectMetaService } from \"../services/ProjectMetaService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectMetaService = yield* ProjectMetaService;\n const context = yield* ApplicationContext;\n\n const getProject = (projectId: string) =>\n Effect.gen(function* () {\n const fullPath = decodeProjectId(projectId);\n\n // Check if project directory exists\n const exists = yield* fs.exists(fullPath);\n if (!exists) {\n return yield* Effect.fail(new Error(\"Project not found\"));\n }\n\n // Get file stats\n const stat = yield* fs.stat(fullPath);\n\n // Get project metadata\n const meta = yield* projectMetaService.getProjectMeta(projectId);\n\n return {\n project: {\n id: projectId,\n claudeProjectPath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n meta,\n },\n };\n });\n\n const getProjects = () =>\n Effect.gen(function* () {\n // Check if the claude projects directory exists\n const dirExists = yield* fs.exists(\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n if (!dirExists) {\n console.warn(\n `Claude projects directory not found at ${context.claudeCodePaths.claudeProjectsDirPath}`,\n );\n return { projects: [] };\n }\n\n // Read directory entries\n const entries = yield* fs.readDirectory(\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n\n // Filter directories and map to Project objects\n const projectEffects = entries.map((entry) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(\n context.claudeCodePaths.claudeProjectsDirPath,\n entry,\n );\n\n // Check if it's a directory\n const stat = yield* Effect.tryPromise(() =>\n fs.stat(fullPath).pipe(Effect.runPromise),\n ).pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (!stat || stat.type !== \"Directory\") {\n return null;\n }\n\n const id = encodeProjectId(fullPath);\n const meta = yield* projectMetaService.getProjectMeta(id);\n\n return {\n id,\n claudeProjectPath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n meta,\n } satisfies Project;\n }),\n );\n\n // Execute all effects in parallel and filter out nulls\n const projectsWithNulls = yield* Effect.all(projectEffects, {\n concurrency: \"unbounded\",\n });\n const projects = projectsWithNulls.filter(\n (p): p is Project => p !== null,\n );\n\n // Sort by last modified date (newest first)\n const sortedProjects = projects.sort((a, b) => {\n return (\n (b.lastModifiedAt ? b.lastModifiedAt.getTime() : 0) -\n (a.lastModifiedAt ? a.lastModifiedAt.getTime() : 0)\n );\n });\n\n return { projects: sortedProjects };\n });\n\n return {\n getProject,\n getProjects,\n };\n});\n\nexport type IProjectRepository = InferEffect<typeof LayerImpl>;\nexport class ProjectRepository extends Context.Tag(\"ProjectRepository\")<\n ProjectRepository,\n IProjectRepository\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option, Ref } from \"effect\";\nimport { z } from \"zod\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport {\n FileCacheStorage,\n makeFileCacheStorageLayer,\n} from \"../../../lib/storage/FileCacheStorage\";\nimport { PersistentService } from \"../../../lib/storage/FileCacheStorage/PersistentService\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport type { ProjectMeta } from \"../../types\";\nimport { decodeProjectId } from \"../functions/id\";\n\nconst ProjectPathSchema = z.string().nullable();\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectPathCache = yield* FileCacheStorage<string | null>();\n const projectMetaCacheRef = yield* Ref.make(new Map<string, ProjectMeta>());\n\n const extractProjectPathFromJsonl = (\n filePath: string,\n ): Effect.Effect<string | null, Error> =>\n Effect.gen(function* () {\n const cached = yield* projectPathCache.get(filePath);\n if (cached !== undefined) {\n return cached;\n }\n\n const content = yield* fs.readFileString(filePath);\n const lines = content.split(\"\\n\");\n\n let cwd: string | null = null;\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\n\n if (\n conversation === undefined ||\n conversation.type === \"summary\" ||\n conversation.type === \"x-error\" ||\n conversation.type === \"file-history-snapshot\" ||\n conversation.type === \"queue-operation\"\n ) {\n continue;\n }\n\n cwd = conversation.cwd;\n break;\n }\n\n if (cwd !== null) {\n yield* projectPathCache.set(filePath, cwd);\n }\n\n return cwd;\n });\n\n const getProjectMeta = (\n projectId: string,\n ): Effect.Effect<ProjectMeta, Error> =>\n Effect.gen(function* () {\n const metaCache = yield* Ref.get(projectMetaCacheRef);\n const cached = metaCache.get(projectId);\n if (cached !== undefined) {\n return cached;\n }\n\n const claudeProjectPath = decodeProjectId(projectId);\n\n const dirents = yield* fs.readDirectory(claudeProjectPath);\n const fileEntries = yield* Effect.all(\n dirents\n .filter((name) => name.endsWith(\".jsonl\"))\n .map((name) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(claudeProjectPath, name);\n const stat = yield* fs.stat(fullPath);\n const mtime = Option.getOrElse(stat.mtime, () => new Date(0));\n return {\n fullPath,\n mtime,\n } as const;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n const files = fileEntries.sort((a, b) => {\n return a.mtime.getTime() - b.mtime.getTime();\n });\n\n let projectPath: string | null = null;\n\n for (const file of files) {\n projectPath = yield* extractProjectPathFromJsonl(file.fullPath);\n\n if (projectPath === null) {\n continue;\n }\n\n break;\n }\n\n const projectMeta: ProjectMeta = {\n projectName: projectPath ? path.basename(projectPath) : null,\n projectPath,\n sessionCount: files.length,\n };\n\n yield* Ref.update(projectMetaCacheRef, (cache) => {\n cache.set(projectId, projectMeta);\n return cache;\n });\n\n return projectMeta;\n });\n\n const invalidateProject = (projectId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(projectMetaCacheRef, (cache) => {\n cache.delete(projectId);\n return cache;\n });\n });\n\n return {\n getProjectMeta,\n invalidateProject,\n };\n});\n\nexport type IProjectMetaService = InferEffect<typeof LayerImpl>;\n\nexport class ProjectMetaService extends Context.Tag(\"ProjectMetaService\")<\n ProjectMetaService,\n IProjectMetaService\n>() {\n static Live = Layer.effect(this, LayerImpl).pipe(\n Layer.provide(\n makeFileCacheStorageLayer(\"project-path-cache\", ProjectPathSchema),\n ),\n Layer.provide(PersistentService.Live),\n );\n}\n", "import type { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref, Runtime } from \"effect\";\nimport type { z } from \"zod\";\nimport { PersistentService } from \"./PersistentService\";\n\nexport interface FileCacheStorageService<T> {\n readonly get: (key: string) => Effect.Effect<T | undefined>;\n readonly set: (key: string, value: T) => Effect.Effect<void>;\n readonly invalidate: (key: string) => Effect.Effect<void>;\n readonly getAll: () => Effect.Effect<Map<string, T>>;\n}\n\nexport const FileCacheStorage = <T>() =>\n Context.GenericTag<FileCacheStorageService<T>>(\"FileCacheStorage\");\n\nexport const makeFileCacheStorageLayer = <T>(\n storageKey: string,\n schema: z.ZodType<T>,\n) =>\n Layer.effect(\n FileCacheStorage<T>(),\n Effect.gen(function* () {\n const persistentService = yield* PersistentService;\n\n const runtime = yield* Effect.runtime<FileSystem.FileSystem>();\n\n const storageRef = yield* Effect.gen(function* () {\n const persistedData = yield* persistentService.load(storageKey);\n\n const initialMap = new Map<string, T>();\n for (const [key, value] of persistedData) {\n const parsed = schema.safeParse(value);\n if (parsed.success) {\n initialMap.set(key, parsed.data);\n }\n }\n\n return yield* Ref.make(initialMap);\n });\n\n const syncToFile = (entries: readonly [string, T][]) => {\n Runtime.runFork(runtime)(persistentService.save(storageKey, entries));\n };\n\n return {\n get: (key: string) =>\n Effect.gen(function* () {\n const storage = yield* Ref.get(storageRef);\n return storage.get(key);\n }),\n\n set: (key: string, value: T) =>\n Effect.gen(function* () {\n const before = yield* Ref.get(storageRef);\n const beforeString = JSON.stringify(Array.from(before.entries()));\n\n yield* Ref.update(storageRef, (map) => {\n map.set(key, value);\n return map;\n });\n\n const after = yield* Ref.get(storageRef);\n const afterString = JSON.stringify(Array.from(after.entries()));\n\n if (beforeString !== afterString) {\n syncToFile(Array.from(after.entries()));\n }\n }),\n\n invalidate: (key: string) =>\n Effect.gen(function* () {\n const before = yield* Ref.get(storageRef);\n\n if (!before.has(key)) {\n return;\n }\n\n yield* Ref.update(storageRef, (map) => {\n map.delete(key);\n return map;\n });\n\n const after = yield* Ref.get(storageRef);\n syncToFile(Array.from(after.entries()));\n }),\n\n getAll: () =>\n Effect.gen(function* () {\n const storage = yield* Ref.get(storageRef);\n return new Map(storage);\n }),\n };\n }),\n );\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { z } from \"zod\";\nimport { claudeCodeViewerCacheDirPath } from \"../../config/paths\";\nimport type { InferEffect } from \"../../effect/types\";\n\nconst saveSchema = z.array(z.tuple([z.string(), z.unknown()]));\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n\n const getCacheFilePath = (key: string) =>\n path.resolve(claudeCodeViewerCacheDirPath, `${key}.json`);\n\n const load = (key: string) => {\n const cacheFilePath = getCacheFilePath(key);\n\n return Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(claudeCodeViewerCacheDirPath))) {\n yield* fs.makeDirectory(claudeCodeViewerCacheDirPath, {\n recursive: true,\n });\n }\n\n if (!(yield* fs.exists(cacheFilePath))) {\n yield* fs.writeFileString(cacheFilePath, \"[]\");\n } else {\n const content = yield* fs.readFileString(cacheFilePath);\n const parsed = (() => {\n try {\n return saveSchema.parse(JSON.parse(content));\n } catch (error) {\n console.error(`Cache file parse error: ${error}`);\n return undefined;\n }\n })();\n\n if (parsed === undefined || parsed.length === 0) {\n console.error(`Cache file removed: ${cacheFilePath}`);\n yield* fs.writeFileString(cacheFilePath, \"[]\");\n } else {\n return parsed;\n }\n }\n\n return [];\n });\n };\n\n const save = (key: string, entries: readonly [string, unknown][]) => {\n const cacheFilePath = getCacheFilePath(key);\n\n return Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n yield* fs.writeFileString(cacheFilePath, JSON.stringify(entries));\n });\n };\n\n return {\n load,\n save,\n };\n});\n\nexport type IPersistentService = InferEffect<typeof LayerImpl>;\n\nexport class PersistentService extends Context.Tag(\"PersistentService\")<\n PersistentService,\n IPersistentService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport const claudeCodeViewerCacheDirPath = resolve(\n homedir(),\n \".claude-code-viewer\",\n \"cache\",\n);\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\n\n/**\n * Convert file path to command name by creating a colon-separated path\n * relative to the base directory.\n *\n * @param filePath - Absolute path to the .md file\n * @param baseDir - Base directory path (commands directory)\n * @returns Command name (e.g., \"frontend:impl\" for \"baseDir/frontend/impl.md\")\n *\n * @example\n * pathToCommandName(\"/base/commands/impl.md\", \"/base/commands\") // => \"impl\"\n * pathToCommandName(\"/base/commands/frontend/impl.md\", \"/base/commands\") // => \"frontend:impl\"\n */\nexport const pathToCommandName = (\n filePath: string,\n baseDir: string,\n): string => {\n // Normalize base directory by removing trailing slash\n const normalizedBaseDir = baseDir.endsWith(\"/\")\n ? baseDir.slice(0, -1)\n : baseDir;\n\n // Get relative path from base directory\n const relativePath = filePath.startsWith(normalizedBaseDir)\n ? filePath.slice(normalizedBaseDir.length + 1)\n : filePath;\n\n // Remove .md extension and convert path separators to colons\n return relativePath.replace(/\\.md$/, \"\").replace(/\\//g, \":\");\n};\n\n/**\n * Recursively scan a directory for .md files and return them as command names.\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Directory path to scan\n * @returns Array of command names (e.g., [\"impl\", \"frontend:impl\"])\n *\n * @example\n * // For directory structure:\n * // commands/\n * // impl.md\n * // frontend/\n * // impl.md\n * scanCommandFilesRecursively(\"/path/to/commands\")\n * // => [\"impl\", \"frontend:impl\"]\n */\nexport const scanCommandFilesRecursively = (\n dirPath: string,\n): Effect.Effect<string[], never, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n // Helper function to recursively scan directories\n const scanDirectory = (\n currentPath: string,\n ): Effect.Effect<\n string[],\n PlatformError,\n FileSystem.FileSystem | Path.Path\n > =>\n Effect.gen(function* () {\n // Check if directory exists\n const exists = yield* fs.exists(currentPath);\n if (!exists) {\n return [];\n }\n\n // Read directory contents\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each item\n const results = yield* Effect.forEach(\n items,\n (item) =>\n Effect.gen(function* () {\n // Skip hidden files and directories\n if (item.startsWith(\".\")) {\n return [];\n }\n\n const itemPath = path.join(currentPath, item);\n const info = yield* fs.stat(itemPath);\n\n if (info.type === \"Directory\") {\n // Recursively scan subdirectory\n return yield* scanDirectory(itemPath);\n }\n if (info.type === \"File\" && item.endsWith(\".md\")) {\n // Convert file path to command name\n return [pathToCommandName(itemPath, dirPath)];\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Flatten the results array\n return results.flat();\n });\n\n // Wrap in match to handle errors gracefully\n return yield* scanDirectory(dirPath).pipe(\n Effect.match({\n onSuccess: (items) => items,\n onFailure: () => [],\n }),\n );\n });\n", "import { z } from \"zod\";\n\nconst versionRegex = /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/;\nconst versionSchema = z\n .object({\n major: z.string().transform((value) => Number.parseInt(value, 10)),\n minor: z.string().transform((value) => Number.parseInt(value, 10)),\n patch: z.string().transform((value) => Number.parseInt(value, 10)),\n })\n .refine((data) =>\n [data.major, data.minor, data.patch].every((value) => !Number.isNaN(value)),\n );\n\nexport type ClaudeCodeVersion = z.infer<typeof versionSchema>;\n\nexport const fromCLIString = (\n versionOutput: string,\n): ClaudeCodeVersion | null => {\n const groups = versionOutput.trim().match(versionRegex)?.groups;\n\n if (groups === undefined) {\n return null;\n }\n\n const parsed = versionSchema.safeParse(groups);\n if (!parsed.success) {\n return null;\n }\n\n return parsed.data;\n};\n\nexport const versionText = (version: ClaudeCodeVersion) =>\n `${version.major}.${version.minor}.${version.patch}`;\n\nexport const equals = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n a.major === b.major && a.minor === b.minor && a.patch === b.patch;\n\nexport const greaterThan = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n a.major > b.major ||\n (a.major === b.major &&\n (a.minor > b.minor || (a.minor === b.minor && a.patch > b.patch)));\n\nexport const greaterThanOrEqual = (\n a: ClaudeCodeVersion,\n b: ClaudeCodeVersion,\n) => equals(a, b) || greaterThan(a, b);\n", "import { Context, Data, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { parseMcpListOutput } from \"../functions/parseMcpListOutput\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\n\nclass ProjectPathNotFoundError extends Data.TaggedError(\n \"ProjectPathNotFoundError\",\n)<{\n projectId: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n\n const getClaudeCodeMeta = () =>\n Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n return config;\n });\n\n const getAvailableFeatures = () =>\n Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n const features = ClaudeCode.getAvailableFeatures(\n config.claudeCodeVersion,\n );\n return features;\n });\n\n const getMcpList = (projectId: string) =>\n Effect.gen(function* () {\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n return yield* Effect.fail(new ProjectPathNotFoundError({ projectId }));\n }\n\n const output = yield* ClaudeCode.getMcpListOutput(\n project.meta.projectPath,\n );\n return parseMcpListOutput(output);\n });\n\n return {\n getClaudeCodeMeta,\n getMcpList,\n getAvailableFeatures,\n };\n});\n\nexport type IClaudeCodeService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeService extends Context.Tag(\"ClaudeCodeService\")<\n ClaudeCodeService,\n IClaudeCodeService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export interface McpServer {\n name: string;\n command: string;\n}\n\nexport const parseMcpListOutput = (output: string) => {\n const servers: McpServer[] = [];\n const lines = output.trim().split(\"\\n\");\n\n for (const line of lines) {\n // Skip header lines and status indicators\n if (line.includes(\"Checking MCP server health\") || line.trim() === \"\") {\n continue;\n }\n\n // Parse lines like \"context7: npx -y @upstash/context7-mcp@latest - \u2713 Connected\"\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const name = line.substring(0, colonIndex).trim();\n const rest = line.substring(colonIndex + 1).trim();\n\n // Remove status indicators (\u2713 Connected, \u2717 Failed, etc.)\n const command = rest.replace(/\\s*-\\s*[\u2713\u2717].*$/, \"\").trim();\n\n if (name && command) {\n servers.push({ name, command });\n }\n }\n }\n\n return servers;\n};\n", "import { query as agentSdkQuery } from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n type CanUseTool,\n query as claudeCodeQuery,\n} from \"@anthropic-ai/claude-code\";\nimport { Command, Path } from \"@effect/platform\";\nimport { Data, Effect } from \"effect\";\nimport { EnvService } from \"../../platform/services/EnvService\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\ntype AgentSdkQuery = typeof agentSdkQuery;\ntype AgentSdkPrompt = Parameters<AgentSdkQuery>[0][\"prompt\"];\ntype AgentSdkQueryOptions = NonNullable<\n Parameters<AgentSdkQuery>[0][\"options\"]\n>;\n\n/**\n * npx \u5B9F\u884C\u6642\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF08_npx/.../node_modules/.bin\uFF09\u5185\u306E\u30D1\u30B9\u3092\u691C\u51FA\u3059\u308B\u3002\n */\nexport const isNpxShimPath = (path: string) =>\n /_npx[/\\\\].*node_modules[\\\\/]\\.bin/.test(path);\n\nclass ClaudeCodePathNotFoundError extends Data.TaggedError(\n \"ClaudeCodePathNotFoundError\",\n)<{\n message: string;\n}> {}\n\nconst resolveClaudeCodePath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n // 1. Environment variable (highest priority)\n const specifiedExecutablePath = yield* envService.getEnv(\n \"CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH\",\n );\n if (specifiedExecutablePath !== undefined) {\n return path.resolve(specifiedExecutablePath);\n }\n\n // 2. System PATH lookup\n const pathEnv = yield* envService.getEnv(\"PATH\");\n const whichClaude = yield* Command.string(\n Command.make(\"which\", \"claude\").pipe(\n Command.env({\n PATH: pathEnv,\n }),\n // DO NOT Specify `runInShell(true)` here, it causes resolve node_modules/.bin/claude to be executed.\n ),\n ).pipe(\n Effect.map((output) => output.trim()),\n // npx \u5B9F\u884C\u6642\u306B `.npm/_npx/.../node_modules/.bin/claude` \u304C\u6700\u512A\u5148\u3067\u89E3\u6C7A\u3055\u308C\u308B\u306E\u3092\u9632\u3050\n Effect.map((output) => (output === \"\" ? null : output)), // \u5B58\u5728\u3057\u306A\u3044\u6642\u3001\u7A7A\u6587\u5B57\u306B\u306A\u308B\u6A21\u69D8\n Effect.catchAll(() => Effect.succeed(null)),\n );\n\n if (whichClaude !== null && !isNpxShimPath(whichClaude)) {\n return whichClaude;\n }\n\n const buildInClaude = yield* Command.string(\n Command.make(\"which\", \"claude\").pipe(Command.runInShell(true)),\n ).pipe(\n Effect.map((output) => output.trim()),\n Effect.map((output) => (output === \"\" ? null : output)), // \u5B58\u5728\u3057\u306A\u3044\u6642\u3001\u7A7A\u6587\u5B57\u306B\u306A\u308B\u6A21\u69D8\n Effect.catchAll(() => Effect.succeed(null)),\n );\n\n if (buildInClaude === null || isNpxShimPath(buildInClaude)) {\n return yield* Effect.fail(\n new ClaudeCodePathNotFoundError({\n message: \"Claude Code CLI not found in any location\",\n }),\n );\n }\n\n return buildInClaude;\n});\n\nexport const Config = Effect.gen(function* () {\n const claudeCodeExecutablePath = yield* resolveClaudeCodePath;\n\n const claudeCodeVersion = ClaudeCodeVersion.fromCLIString(\n yield* Command.string(Command.make(claudeCodeExecutablePath, \"--version\")),\n );\n\n return {\n claudeCodeExecutablePath,\n claudeCodeVersion,\n };\n});\n\nexport const getMcpListOutput = (projectCwd: string) =>\n Effect.gen(function* () {\n const { claudeCodeExecutablePath } = yield* Config;\n const output = yield* Command.string(\n Command.make(\n \"cd\",\n projectCwd,\n \"&&\",\n claudeCodeExecutablePath,\n \"mcp\",\n \"list\",\n ).pipe(Command.runInShell(true)),\n );\n return output;\n });\n\nexport const getAvailableFeatures = (\n claudeCodeVersion: ClaudeCodeVersion.ClaudeCodeVersion | null,\n) => ({\n canUseTool:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 82,\n })\n : false,\n uuidOnSDKMessage:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 86,\n })\n : false,\n agentSdk:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 125, // ClaudeCodeAgentSDK is available since v1.0.125\n })\n : false,\n sidechainSeparation:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 0,\n patch: 28, // Sidechain conversations stored in agent-*.jsonl since v2.0.28\n })\n : false,\n});\n\nexport const query = (\n prompt: AgentSdkPrompt,\n options: AgentSdkQueryOptions,\n) => {\n const { canUseTool, permissionMode, ...baseOptions } = options;\n\n return Effect.gen(function* () {\n const { claudeCodeExecutablePath, claudeCodeVersion } = yield* Config;\n const availableFeatures = getAvailableFeatures(claudeCodeVersion);\n\n const options: AgentSdkQueryOptions = {\n pathToClaudeCodeExecutable: claudeCodeExecutablePath,\n ...baseOptions,\n ...(availableFeatures.canUseTool\n ? { canUseTool, permissionMode }\n : {\n permissionMode: \"bypassPermissions\",\n }),\n };\n\n if (availableFeatures.agentSdk) {\n return agentSdkQuery({\n prompt,\n options: {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: [\"user\", \"project\", \"local\"],\n ...options,\n },\n });\n }\n\n const fallbackCanUseTool = (() => {\n const canUseTool = options.canUseTool;\n if (canUseTool === undefined) {\n return undefined;\n }\n\n const fn: CanUseTool = async (toolName, input, canUseToolOptions) => {\n const response = await canUseTool(toolName, input, {\n signal: canUseToolOptions.signal,\n suggestions: canUseToolOptions.suggestions,\n toolUseID: undefined as unknown as string,\n });\n return response;\n };\n\n return fn;\n })();\n\n return claudeCodeQuery({\n prompt,\n options: {\n ...options,\n canUseTool: fallbackCanUseTool,\n },\n });\n });\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PermissionResponse } from \"../../../../types/permissions\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodePermissionService } from \"../services/ClaudeCodePermissionService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodePermissionService = yield* ClaudeCodePermissionService;\n\n const permissionResponse = (options: {\n permissionResponse: PermissionResponse;\n }) =>\n Effect.sync(() => {\n const { permissionResponse } = options;\n\n Effect.runFork(\n claudeCodePermissionService.respondToPermissionRequest(\n permissionResponse,\n ),\n );\n\n return {\n status: 200,\n response: {\n message: \"Permission response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n permissionResponse,\n };\n});\n\nexport type IClaudeCodePermissionController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodePermissionController extends Context.Tag(\n \"ClaudeCodePermissionController\",\n)<ClaudeCodePermissionController, IClaudeCodePermissionController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { CanUseTool } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type {\n PermissionRequest,\n PermissionResponse,\n} from \"../../../../types/permissions\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingPermissionRequestsRef = yield* Ref.make<\n Map<string, PermissionRequest>\n >(new Map());\n const permissionResponsesRef = yield* Ref.make<\n Map<string, PermissionResponse>\n >(new Map());\n const eventBus = yield* EventBus;\n\n const waitPermissionResponse = (\n request: PermissionRequest,\n options: { timeoutMs: number },\n ) =>\n Effect.gen(function* () {\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n requests.set(request.id, request);\n return requests;\n });\n\n yield* eventBus.emit(\"permissionRequested\", {\n permissionRequest: request,\n });\n\n let passedMs = 0;\n let response: PermissionResponse | null = null;\n while (passedMs < options.timeoutMs) {\n const responses = yield* Ref.get(permissionResponsesRef);\n response = responses.get(request.id) ?? null;\n if (response !== null) {\n break;\n }\n\n yield* Effect.sleep(1000);\n passedMs += 1000;\n }\n\n return response;\n });\n\n const createCanUseToolRelatedOptions = (options: {\n taskId: string;\n userConfig: UserConfig;\n sessionId?: string;\n }) => {\n const { taskId, userConfig, sessionId } = options;\n\n return Effect.gen(function* () {\n const claudeCodeConfig = yield* ClaudeCode.Config;\n\n if (\n !ClaudeCode.getAvailableFeatures(claudeCodeConfig.claudeCodeVersion)\n .canUseTool\n ) {\n return {\n permissionMode: \"bypassPermissions\",\n } as const;\n }\n\n const canUseTool: CanUseTool = async (toolName, toolInput, _options) => {\n if (userConfig.permissionMode !== \"default\") {\n // Convert Claude Code permission modes to canUseTool behaviors\n if (\n userConfig.permissionMode === \"bypassPermissions\" ||\n userConfig.permissionMode === \"acceptEdits\"\n ) {\n return {\n behavior: \"allow\" as const,\n updatedInput: toolInput,\n };\n } else {\n // plan mode should deny actual tool execution\n return {\n behavior: \"deny\" as const,\n message: \"Tool execution is disabled in plan mode\",\n };\n }\n }\n\n const permissionRequest: PermissionRequest = {\n id: ulid(),\n taskId,\n sessionId,\n toolName,\n toolInput,\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(\n waitPermissionResponse(permissionRequest, { timeoutMs: 60000 }),\n );\n\n if (response === null) {\n return {\n behavior: \"deny\" as const,\n message: \"Permission request timed out\",\n };\n }\n\n if (response.decision === \"allow\") {\n return {\n behavior: \"allow\" as const,\n updatedInput: toolInput,\n };\n } else {\n return {\n behavior: \"deny\" as const,\n message: \"Permission denied by user\",\n };\n }\n };\n\n return {\n canUseTool,\n permissionMode: userConfig.permissionMode,\n } as const;\n });\n };\n\n const respondToPermissionRequest = (\n response: PermissionResponse,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(permissionResponsesRef, (responses) => {\n responses.set(response.permissionRequestId, response);\n return responses;\n });\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n requests.delete(response.permissionRequestId);\n return requests;\n });\n });\n\n return {\n createCanUseToolRelatedOptions,\n respondToPermissionRequest,\n };\n});\n\nexport type IClaudeCodePermissionService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodePermissionService extends Context.Tag(\n \"ClaudeCodePermissionService\",\n)<ClaudeCodePermissionService, IClaudeCodePermissionService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration\";\n\ntype Listener<T> = (data: T) => void | Promise<void>;\n\nconst layerImpl = Effect.gen(function* () {\n const listenersMap = new Map<\n keyof InternalEventDeclaration,\n Set<Listener<unknown>>\n >();\n\n const getListeners = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n ): Set<Listener<InternalEventDeclaration[EventName]>> => {\n if (!listenersMap.has(event)) {\n listenersMap.set(event, new Set());\n }\n return listenersMap.get(event) as Set<\n Listener<InternalEventDeclaration[EventName]>\n >;\n };\n\n const emit = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n data: InternalEventDeclaration[EventName],\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listeners = getListeners(event);\n\n void Promise.allSettled(\n Array.from(listeners).map(async (listener) => {\n await listener(data);\n }),\n );\n });\n\n const on = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n listener: Listener<InternalEventDeclaration[EventName]>,\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n listeners.add(listener);\n });\n\n const off = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n listener: Listener<InternalEventDeclaration[EventName]>,\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n listeners.delete(listener);\n });\n\n return {\n emit,\n on,\n off,\n } as const;\n});\n\nexport type IEventBus = InferEffect<typeof layerImpl>;\n\nexport class EventBus extends Context.Tag(\"EventBus\")<EventBus, IEventBus>() {\n static Live = Layer.effect(this, layerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PublicSessionProcess } from \"../../../../types/session-process\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator\";\nimport { ClaudeCodeLifeCycleService } from \"../services/ClaudeCodeLifeCycleService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const userConfigService = yield* UserConfigService;\n\n const getSessionProcesses = () =>\n Effect.gen(function* () {\n const publicSessionProcesses =\n yield* claudeCodeLifeCycleService.getPublicSessionProcesses();\n\n return {\n response: {\n processes: publicSessionProcesses.map(\n (p): PublicSessionProcess => ({\n id: p.def.sessionProcessId,\n projectId: p.def.projectId,\n sessionId: p.sessionId,\n status: p.type === \"paused\" ? \"paused\" : \"running\",\n }),\n ),\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const createSessionProcess = (options: {\n projectId: string;\n input: UserMessageInput;\n baseSessionId?: string | undefined;\n }) =>\n Effect.gen(function* () {\n const { projectId, input, baseSessionId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n const userConfig = yield* userConfigService.getUserConfig();\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400 as const,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.startTask({\n baseSession: {\n cwd: project.meta.projectPath,\n projectId,\n sessionId: baseSessionId,\n },\n userConfig,\n input,\n });\n\n const { sessionId } = yield* result.yieldSessionInitialized();\n\n return {\n status: 201 as const,\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId,\n sessionId,\n },\n },\n } as const satisfies ControllerResponse;\n });\n\n const continueSessionProcess = (options: {\n projectId: string;\n input: UserMessageInput;\n baseSessionId: string;\n sessionProcessId: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, input, baseSessionId, sessionProcessId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.continueTask({\n sessionProcessId,\n input,\n baseSessionId,\n });\n\n return {\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId: result.sessionProcess.def.projectId,\n sessionId: baseSessionId,\n },\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSessionProcesses,\n createSessionProcess,\n continueSessionProcess,\n };\n});\n\nexport type IClaudeCodeSessionProcessController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodeSessionProcessController extends Context.Tag(\n \"ClaudeCodeSessionProcessController\",\n)<ClaudeCodeSessionProcessController, IClaudeCodeSessionProcessController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport { DEFAULT_LOCALE } from \"../../../../lib/i18n/localeDetection\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\n\nconst LayerImpl = Effect.gen(function* () {\n const configRef = yield* Ref.make<UserConfig>({\n hideNoUserMessageSession: true,\n unifySameTitleSession: false,\n enterKeyBehavior: \"shift-enter-send\",\n permissionMode: \"default\",\n locale: DEFAULT_LOCALE,\n theme: \"system\",\n });\n\n const setUserConfig = (newConfig: UserConfig) =>\n Effect.gen(function* () {\n yield* Ref.update(configRef, () => newConfig);\n });\n\n const getUserConfig = () =>\n Effect.gen(function* () {\n const config = yield* Ref.get(configRef);\n return config;\n });\n\n return {\n getUserConfig,\n setUserConfig,\n };\n});\n\nexport type IUserConfigService = InferEffect<typeof LayerImpl>;\nexport class UserConfigService extends Context.Tag(\"UserConfigService\")<\n UserConfigService,\n IUserConfigService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { SupportedLocale } from \"./schema\";\n\nexport const DEFAULT_LOCALE: SupportedLocale = \"en\";\n\nconst normalizeTag = (tag?: string): SupportedLocale | undefined => {\n if (!tag) {\n return undefined;\n }\n\n const normalized = tag.trim().toLowerCase().replaceAll(\"_\", \"-\");\n if (normalized.length === 0 || normalized === \"*\") {\n return undefined;\n }\n\n if (normalized.startsWith(\"zh\")) {\n return \"zh_CN\";\n }\n\n if (normalized.startsWith(\"ja\") || normalized.startsWith(\"jp\")) {\n return \"ja\";\n }\n\n if (normalized.startsWith(\"en\")) {\n return \"en\";\n }\n\n return undefined;\n};\n\nexport const detectLocaleFromAcceptLanguage = (\n header: string | undefined,\n): SupportedLocale | undefined => {\n if (!header) {\n return undefined;\n }\n\n const preferences = header\n // Convert the raw Accept-Language header (e.g. \"en-US;q=0.8, fr\")\n // into a list of { tag, quality, index } entries that we can sort.\n .split(\",\")\n .map((part, index) => {\n const [rawTag, ...params] = part.trim().split(\";\");\n const qParam = params\n .map((param) => param.trim())\n .find((param) => param.startsWith(\"q=\"));\n const quality = qParam ? Number.parseFloat(qParam.slice(2)) : 1;\n\n return {\n tag: rawTag,\n quality: Number.isNaN(quality) ? 1 : quality,\n index,\n };\n })\n // Example result for \"en-US;q=0.8, fr\":\n // [{ tag: \"en-US\", quality: 0.8, index: 0 }, { tag: \"fr\", quality: 1, index: 1 }]\n .filter((item) => Boolean(item.tag))\n .sort((a, b) => {\n if (b.quality !== a.quality) {\n return b.quality - a.quality;\n }\n return a.index - b.index;\n });\n\n for (const preference of preferences) {\n const locale = normalizeTag(preference.tag);\n if (locale) {\n return locale;\n }\n }\n\n return undefined;\n};\n\ntype NavigatorLike = Pick<Navigator, \"language\" | \"languages\">;\n\nexport const detectLocaleFromNavigator = (\n nav?: NavigatorLike,\n): SupportedLocale | undefined => {\n if (!nav) {\n return undefined;\n }\n\n let languages: readonly string[];\n if (nav.languages && nav.languages.length > 0) {\n languages = nav.languages;\n } else if (nav.language) {\n languages = [nav.language];\n } else {\n languages = [];\n }\n\n for (const language of languages) {\n const locale = normalizeTag(language);\n if (locale) {\n return locale;\n }\n }\n\n return undefined;\n};\n\nexport const resolvePreferredLocale = (\n options: { acceptLanguageHeader?: string; navigator?: NavigatorLike } = {},\n): SupportedLocale => {\n return (\n detectLocaleFromAcceptLanguage(options.acceptLanguageHeader) ||\n detectLocaleFromNavigator(options.navigator) ||\n DEFAULT_LOCALE\n );\n};\n", "import type {\n SDKMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { FileSystem, Path } from \"@effect/platform\";\nimport type { CommandExecutor } from \"@effect/platform/CommandExecutor\";\nimport { Context, Effect, Layer, Runtime } from \"effect\";\nimport { ulid } from \"ulid\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport type { EnvService } from \"../../platform/services/EnvService\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"../../session/infrastructure/VirtualConversationDatabase\";\nimport type { SessionMetaService } from \"../../session/services/SessionMetaService\";\nimport {\n createMessageGenerator,\n type UserMessageInput,\n} from \"../functions/createMessageGenerator\";\nimport { fallbackSdkMessage } from \"../functions/fallbackSdkMessage\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\nimport { ClaudeCodePermissionService } from \"./ClaudeCodePermissionService\";\nimport { ClaudeCodeSessionProcessService } from \"./ClaudeCodeSessionProcessService\";\n\nexport type MessageGenerator = () => AsyncGenerator<\n SDKUserMessage,\n void,\n unknown\n>;\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBusService = yield* EventBus;\n const sessionRepository = yield* SessionRepository;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n const permissionService = yield* ClaudeCodePermissionService;\n\n const runtime = yield* Effect.runtime<\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor\n | VirtualConversationDatabase\n | SessionMetaService\n | ClaudeCodePermissionService\n | EnvService\n >();\n\n const continueTask = (options: {\n sessionProcessId: string;\n baseSessionId: string;\n input: UserMessageInput;\n }) => {\n const { sessionProcessId, baseSessionId, input } = options;\n\n return Effect.gen(function* () {\n const { sessionProcess, task } =\n yield* sessionProcessService.continueSessionProcess({\n sessionProcessId,\n taskDef: {\n type: \"continue\",\n sessionId: baseSessionId,\n baseSessionId: baseSessionId,\n taskId: ulid(),\n },\n });\n\n const virtualConversation =\n yield* CCSessionProcess.createVirtualConversation(sessionProcess, {\n sessionId: baseSessionId,\n userMessage: input.text,\n });\n\n yield* virtualConversationDatabase.createVirtualConversation(\n sessionProcess.def.projectId,\n baseSessionId,\n [virtualConversation],\n );\n\n sessionProcess.def.setNextMessage(input);\n return {\n sessionProcess,\n task,\n };\n });\n };\n\n const startTask = (options: {\n userConfig: UserConfig;\n baseSession: {\n cwd: string;\n projectId: string;\n sessionId?: string;\n };\n input: UserMessageInput;\n }) => {\n const { baseSession, input, userConfig } = options;\n\n return Effect.gen(function* () {\n const {\n generateMessages,\n setNextMessage,\n setHooks: setMessageGeneratorHooks,\n } = createMessageGenerator();\n\n const { sessionProcess, task } =\n yield* sessionProcessService.startSessionProcess({\n sessionDef: {\n projectId: baseSession.projectId,\n cwd: baseSession.cwd,\n abortController: new AbortController(),\n setNextMessage,\n sessionProcessId: ulid(),\n },\n taskDef:\n baseSession.sessionId === undefined\n ? {\n type: \"new\",\n taskId: ulid(),\n }\n : {\n type: \"resume\",\n taskId: ulid(),\n sessionId: undefined,\n baseSessionId: baseSession.sessionId,\n },\n });\n\n const sessionInitializedPromise = controllablePromise<{\n sessionId: string;\n }>();\n const sessionFileCreatedPromise = controllablePromise<{\n sessionId: string;\n }>();\n\n setMessageGeneratorHooks({\n onNewUserMessageResolved: async (input) => {\n Effect.runFork(\n sessionProcessService.toNotInitializedState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n rawUserMessage: input.text,\n }),\n );\n },\n });\n\n const handleMessage = (message: SDKMessage) =>\n Effect.gen(function* () {\n const processState = yield* sessionProcessService.getSessionProcess(\n sessionProcess.def.sessionProcessId,\n );\n\n if (processState.type === \"completed\") {\n return \"break\" as const;\n }\n\n if (processState.type === \"paused\") {\n // rule: paused \u306F not_initialized \u306B\u66F4\u65B0\u3055\u308C\u3066\u304B\u3089\u304F\u308B\u60F3\u5B9A\n yield* Effect.die(\n new Error(\"Illegal state: paused is not expected\"),\n );\n }\n\n if (\n message.type === \"system\" &&\n message.subtype === \"init\" &&\n processState.type === \"not_initialized\"\n ) {\n yield* sessionProcessService.toInitializedState({\n sessionProcessId: processState.def.sessionProcessId,\n initContext: {\n initMessage: message,\n },\n });\n\n // Virtual Conversation Creation\n const virtualConversation =\n yield* CCSessionProcess.createVirtualConversation(processState, {\n sessionId: message.session_id,\n userMessage: processState.rawUserMessage,\n });\n\n if (processState.currentTask.def.type === \"new\") {\n // \u672B\u5C3E\u306B\u8FFD\u52A0\u3059\u308B\u3060\u3051\u3067 OK\n yield* virtualConversationDatabase.createVirtualConversation(\n baseSession.projectId,\n message.session_id,\n [virtualConversation],\n );\n } else if (processState.currentTask.def.type === \"resume\") {\n const existingSession = yield* sessionRepository.getSession(\n processState.def.projectId,\n processState.currentTask.def.baseSessionId,\n );\n\n const copiedConversations =\n existingSession.session === null\n ? []\n : existingSession.session.conversations;\n\n yield* virtualConversationDatabase.createVirtualConversation(\n processState.def.projectId,\n message.session_id,\n [...copiedConversations, virtualConversation],\n );\n } else {\n // do nothing\n }\n\n sessionInitializedPromise.resolve({\n sessionId: message.session_id,\n });\n\n yield* eventBusService.emit(\"sessionListChanged\", {\n projectId: processState.def.projectId,\n });\n\n yield* eventBusService.emit(\"sessionChanged\", {\n projectId: processState.def.projectId,\n sessionId: message.session_id,\n });\n\n return \"continue\" as const;\n }\n\n if (\n message.type === \"assistant\" &&\n processState.type === \"initialized\"\n ) {\n yield* sessionProcessService.toFileCreatedState({\n sessionProcessId: processState.def.sessionProcessId,\n });\n\n sessionFileCreatedPromise.resolve({\n sessionId: message.session_id,\n });\n\n yield* virtualConversationDatabase.deleteVirtualConversations(\n message.session_id,\n );\n }\n\n if (\n message.type === \"result\" &&\n processState.type === \"file_created\"\n ) {\n yield* sessionProcessService.toPausedState({\n sessionProcessId: processState.def.sessionProcessId,\n resultMessage: message,\n });\n\n yield* eventBusService.emit(\"sessionChanged\", {\n projectId: processState.def.projectId,\n sessionId: message.session_id,\n });\n\n return \"continue\" as const;\n }\n\n return \"continue\" as const;\n });\n\n const handleSessionProcessDaemon = async () => {\n const messageIter = await Runtime.runPromise(runtime)(\n Effect.gen(function* () {\n const permissionOptions =\n yield* permissionService.createCanUseToolRelatedOptions({\n taskId: task.def.taskId,\n userConfig,\n sessionId: task.def.baseSessionId,\n });\n\n return yield* ClaudeCode.query(generateMessages(), {\n resume: task.def.baseSessionId,\n cwd: sessionProcess.def.cwd,\n abortController: sessionProcess.def.abortController,\n ...permissionOptions,\n });\n }),\n );\n\n setNextMessage(input);\n\n try {\n for await (const message of messageIter) {\n const fallbackMessage = fallbackSdkMessage(message);\n\n const result = await Runtime.runPromise(runtime)(\n handleMessage(fallbackMessage),\n ).catch((error) => {\n // iter \u81EA\u4F53\u304C\u843D\u3061\u3066\u306A\u3051\u308C\u3070\u7D99\u7D9A\u3057\u305F\u3044\u306E\u3067\u63E1\u308A\u3064\u3076\u3059\n Effect.runFork(\n sessionProcessService.changeTaskState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n taskId: task.def.taskId,\n nextTask: {\n status: \"failed\",\n def: task.def,\n error: error,\n },\n }),\n );\n\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n\n return \"continue\" as const;\n });\n\n if (result === \"break\") {\n break;\n } else {\n }\n }\n } catch (error) {\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n\n await Effect.runPromise(\n sessionProcessService.changeTaskState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n taskId: task.def.taskId,\n nextTask: {\n status: \"failed\",\n def: task.def,\n error: error,\n },\n }),\n );\n }\n };\n\n const daemonPromise = handleSessionProcessDaemon()\n .catch((error) => {\n console.error(\"Error occur in task daemon process\", error);\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n throw error;\n })\n .finally(() => {\n Effect.runFork(\n Effect.gen(function* () {\n const currentProcess =\n yield* sessionProcessService.getSessionProcess(\n sessionProcess.def.sessionProcessId,\n );\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n });\n }),\n );\n });\n\n return {\n sessionProcess,\n task,\n daemonPromise,\n awaitSessionInitialized: async () =>\n await sessionInitializedPromise.promise,\n awaitSessionFileCreated: async () =>\n await sessionFileCreatedPromise.promise,\n yieldSessionInitialized: () =>\n Effect.promise(() => sessionInitializedPromise.promise),\n yieldSessionFileCreated: () =>\n Effect.promise(() => sessionFileCreatedPromise.promise),\n };\n });\n };\n\n const getPublicSessionProcesses = () =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n return processes.filter((process) => CCSessionProcess.isPublic(process));\n });\n\n const abortTask = (sessionProcessId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const currentProcess =\n yield* sessionProcessService.getSessionProcess(sessionProcessId);\n\n currentProcess.def.abortController.abort();\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n });\n });\n\n const abortAllTasks = () =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n\n for (const process of processes) {\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: process.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n });\n }\n });\n\n return {\n continueTask,\n startTask,\n abortTask,\n abortAllTasks,\n getPublicSessionProcesses,\n };\n});\n\nexport type IClaudeCodeLifeCycleService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeLifeCycleService extends Context.Tag(\n \"ClaudeCodeLifeCycleService\",\n)<ClaudeCodeLifeCycleService, IClaudeCodeLifeCycleService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export type ControllablePromise<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n status: \"pending\" | \"resolved\" | \"rejected\";\n};\n\nexport const controllablePromise = <T>(): ControllablePromise<T> => {\n let promiseResolve: ((value: T) => void) | undefined;\n let promiseReject: ((reason?: unknown) => void) | undefined;\n\n const promiseRef = {\n status: \"pending\",\n } as ControllablePromise<T>;\n\n const promise = new Promise<T>((resolve, reject) => {\n promiseResolve = (value) => {\n promiseRef.status = \"resolved\";\n resolve(value);\n };\n promiseReject = (reason) => {\n promiseRef.status = \"rejected\";\n reject(reason);\n };\n });\n\n if (!promiseResolve || !promiseReject) {\n throw new Error(\"Illegal state: Promise not created\");\n }\n\n promiseRef.promise = promise;\n promiseRef.resolve = promiseResolve;\n promiseRef.reject = promiseReject;\n\n return promiseRef;\n};\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { parseUserMessage } from \"../../claude-code/functions/parseUserMessage\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport type { Session, SessionDetail } from \"../../types\";\nimport { decodeSessionId, encodeSessionId } from \"../functions/id\";\nimport { isRegularSessionFile } from \"../functions/isRegularSessionFile\";\nimport { VirtualConversationDatabase } from \"../infrastructure/VirtualConversationDatabase\";\nimport { SessionMetaService } from \"../services/SessionMetaService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const sessionMetaService = yield* SessionMetaService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n\n const getSession = (projectId: string, sessionId: string) =>\n Effect.gen(function* () {\n const sessionPath = decodeSessionId(projectId, sessionId);\n\n const virtualConversation =\n yield* virtualConversationDatabase.getSessionVirtualConversation(\n sessionId,\n );\n\n // Check if session file exists\n const exists = yield* fs.exists(sessionPath);\n const sessionDetail = yield* exists\n ? Effect.gen(function* () {\n // Read session file\n const content = yield* fs.readFileString(sessionPath);\n const allLines = content.split(\"\\n\").filter((line) => line.trim());\n\n const conversations = parseJsonl(allLines.join(\"\\n\"));\n\n // Get file stats\n const stat = yield* fs.stat(sessionPath);\n\n // Get session metadata\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n sessionId,\n );\n\n const mergedConversations = [\n ...conversations,\n ...(virtualConversation !== null\n ? virtualConversation.conversations\n : []),\n ];\n\n const conversationMap = new Map(\n mergedConversations.flatMap((c, index) => {\n if (\n c.type === \"user\" ||\n c.type === \"assistant\" ||\n c.type === \"system\"\n ) {\n return [[c.uuid, { conversation: c, index }] as const];\n } else {\n return [];\n }\n }),\n );\n\n const isBroken = mergedConversations.some((item, index) => {\n if (item.type !== \"summary\") return false;\n const leftMessage = conversationMap.get(item.leafUuid);\n if (leftMessage === undefined) return false;\n\n return index < leftMessage.index;\n });\n\n const sessionDetail: SessionDetail = {\n id: sessionId,\n jsonlFilePath: sessionPath,\n meta,\n conversations: isBroken ? conversations : mergedConversations,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n\n return sessionDetail;\n })\n : (() => {\n if (virtualConversation === null) {\n return Effect.succeed(null);\n }\n\n const lastConversation = virtualConversation.conversations\n .filter(\n (conversation) =>\n conversation.type === \"user\" ||\n conversation.type === \"assistant\" ||\n conversation.type === \"system\",\n )\n .at(-1);\n\n const virtualSession: SessionDetail = {\n id: sessionId,\n jsonlFilePath: `${decodeProjectId(projectId)}/${sessionId}.jsonl`,\n meta: {\n messageCount: 0,\n firstUserMessage: null,\n cost: {\n totalUsd: 0,\n breakdown: {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n },\n tokenUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n },\n },\n },\n conversations: virtualConversation.conversations,\n lastModifiedAt:\n lastConversation !== undefined\n ? new Date(lastConversation.timestamp)\n : new Date(),\n };\n\n return Effect.succeed(virtualSession);\n })();\n\n return {\n session: sessionDetail,\n };\n });\n\n const getSessions = (\n projectId: string,\n options?: {\n maxCount?: number;\n cursor?: string;\n },\n ) =>\n Effect.gen(function* () {\n const { maxCount = 20, cursor } = options ?? {};\n\n const claudeProjectPath = decodeProjectId(projectId);\n\n // Check if project directory exists\n const dirExists = yield* fs.exists(claudeProjectPath);\n if (!dirExists) {\n console.warn(`Project directory not found at ${claudeProjectPath}`);\n return { sessions: [] };\n }\n\n // Read directory entries with error handling\n const dirents = yield* Effect.tryPromise({\n try: () => fs.readDirectory(claudeProjectPath).pipe(Effect.runPromise),\n catch: (error) => {\n console.warn(\n `Failed to read sessions for project ${projectId}:`,\n error,\n );\n return new Error(\"Failed to read directory\");\n },\n }).pipe(Effect.catchAll(() => Effect.succeed([])));\n\n // Process session files (excluding agent-*.jsonl files)\n const sessionEffects = dirents.filter(isRegularSessionFile).map((entry) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(claudeProjectPath, entry);\n const sessionId = encodeSessionId(fullPath);\n\n // Get file stats with error handling\n const stat = yield* Effect.tryPromise(() =>\n fs.stat(fullPath).pipe(Effect.runPromise),\n ).pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (!stat) {\n return null;\n }\n\n return {\n id: sessionId,\n jsonlFilePath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n }),\n );\n\n // Execute all effects in parallel and filter out nulls\n const sessionsWithNulls = yield* Effect.all(sessionEffects, {\n concurrency: \"unbounded\",\n });\n const sessions = sessionsWithNulls\n .filter((s): s is NonNullable<typeof s> => s !== null)\n .sort(\n (a, b) => b.lastModifiedAt.getTime() - a.lastModifiedAt.getTime(),\n );\n\n const sessionMap = new Map(\n sessions.map((session) => [session.id, session] as const),\n );\n\n const index =\n cursor !== undefined\n ? sessions.findIndex((session) => session.id === cursor)\n : -1;\n\n if (index !== -1) {\n const sessionsToReturn = sessions.slice(\n index + 1,\n Math.min(index + 1 + maxCount, sessions.length),\n );\n\n const sessionsWithMeta = yield* Effect.all(\n sessionsToReturn.map((item) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n item.id,\n );\n return {\n ...item,\n meta,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return {\n sessions: sessionsWithMeta,\n };\n }\n\n // Get predict sessions\n const virtualConversations =\n yield* virtualConversationDatabase.getProjectVirtualConversations(\n projectId,\n );\n\n const virtualSessions = virtualConversations\n .filter(({ sessionId }) => !sessionMap.has(sessionId))\n .map(({ sessionId, conversations }): Session => {\n const first = conversations\n .filter((conversation) => conversation.type === \"user\")\n .at(0);\n const last = conversations\n .filter(\n (conversation) =>\n conversation.type === \"user\" ||\n conversation.type === \"assistant\" ||\n conversation.type === \"system\",\n )\n .at(-1);\n\n const firstUserText =\n first !== undefined\n ? typeof first.message.content === \"string\"\n ? first.message.content\n : (() => {\n const firstContent = first.message.content.at(0);\n if (firstContent === undefined) return null;\n if (typeof firstContent === \"string\") return firstContent;\n if (firstContent.type === \"text\") return firstContent.text;\n return null;\n })()\n : null;\n\n return {\n id: sessionId,\n jsonlFilePath: `${decodeProjectId(projectId)}/${sessionId}.jsonl`,\n lastModifiedAt:\n last !== undefined ? new Date(last.timestamp) : new Date(),\n meta: {\n messageCount: conversations.length,\n firstUserMessage: firstUserText\n ? parseUserMessage(firstUserText)\n : null,\n cost: {\n totalUsd: 0,\n breakdown: {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n },\n tokenUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n },\n },\n },\n };\n })\n .sort((a, b) => {\n return b.lastModifiedAt.getTime() - a.lastModifiedAt.getTime();\n });\n\n // Get sessions with metadata\n const sessionsToReturn = sessions.slice(\n 0,\n Math.min(maxCount, sessions.length),\n );\n const sessionsWithMeta: Session[] = yield* Effect.all(\n sessionsToReturn.map((item) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n item.id,\n );\n return {\n ...item,\n meta,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return {\n sessions: [...virtualSessions, ...sessionsWithMeta],\n };\n });\n\n return {\n getSession,\n getSessions,\n };\n});\n\nexport type ISessionRepository = InferEffect<typeof LayerImpl>;\n\nexport class SessionRepository extends Context.Tag(\"SessionRepository\")<\n SessionRepository,\n ISessionRepository\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { z } from \"zod\";\n\nconst regExp = /<(?<tag>[^>]+)>(?<content>\\s*[^<]*?\\s*)<\\/\\k<tag>>/g;\n\nconst matchSchema = z.object({\n tag: z.string(),\n content: z.string(),\n});\n\nexport const parsedUserMessageSchema = z.union([\n z.object({\n kind: z.literal(\"command\"),\n commandName: z.string(),\n commandArgs: z.string().optional(),\n commandMessage: z.string().optional(),\n }),\n z.object({\n kind: z.literal(\"local-command\"),\n stdout: z.string(),\n }),\n z.object({\n kind: z.literal(\"text\"),\n content: z.string(),\n }),\n]);\n\nexport type ParsedUserMessage = z.infer<typeof parsedUserMessageSchema>;\n\nexport const parseUserMessage = (content: string): ParsedUserMessage => {\n const matches = Array.from(content.matchAll(regExp))\n .map((match) => matchSchema.safeParse(match.groups))\n .filter((result) => result.success)\n .map((result) => result.data);\n\n if (matches.length === 0) {\n return {\n kind: \"text\",\n content,\n };\n }\n\n const commandName = matches.find(\n (match) => match.tag === \"command-name\",\n )?.content;\n const commandArgs = matches.find(\n (match) => match.tag === \"command-args\",\n )?.content;\n const commandMessage = matches.find(\n (match) => match.tag === \"command-message\",\n )?.content;\n const localCommandStdout = matches.find(\n (match) => match.tag === \"local-command-stdout\",\n )?.content;\n\n switch (true) {\n case commandName !== undefined:\n return {\n kind: \"command\",\n commandName,\n commandArgs,\n commandMessage,\n };\n case localCommandStdout !== undefined:\n return {\n kind: \"local-command\",\n stdout: localCommandStdout,\n };\n default:\n return {\n kind: \"text\",\n content,\n };\n }\n};\n", "import { basename, extname, resolve } from \"node:path\";\nimport { decodeProjectId } from \"../../project/functions/id\";\n\nexport const encodeSessionId = (jsonlFilePath: string) => {\n return basename(jsonlFilePath, extname(jsonlFilePath));\n};\n\nexport const decodeSessionId = (projectId: string, sessionId: string) => {\n const projectPath = decodeProjectId(projectId);\n return resolve(projectPath, `${sessionId}.jsonl`);\n};\n", "/**\n * Determines if a filename represents a regular session file.\n * Regular session files end with .jsonl but do NOT start with \"agent-\".\n *\n * @param filename - The filename to check (e.g., \"session-id.jsonl\", \"agent-abc123.jsonl\")\n * @returns true if the file is a regular session file, false otherwise\n */\nexport const isRegularSessionFile = (filename: string): boolean =>\n filename.endsWith(\".jsonl\") && !filename.startsWith(\"agent-\");\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { ErrorJsonl } from \"../../types\";\n\n/**\n * For interactively experience, handle sessions not already persisted to the filesystem.\n */\nexport class VirtualConversationDatabase extends Context.Tag(\n \"VirtualConversationDatabase\",\n)<\n VirtualConversationDatabase,\n {\n readonly getProjectVirtualConversations: (\n projectId: string,\n ) => Effect.Effect<\n {\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n }[]\n >;\n readonly getSessionVirtualConversation: (\n sessionId: string,\n ) => Effect.Effect<{\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n } | null>;\n readonly createVirtualConversation: (\n projectId: string,\n sessionId: string,\n conversations: readonly (Conversation | ErrorJsonl)[],\n ) => Effect.Effect<void>;\n readonly deleteVirtualConversations: (\n sessionId: string,\n ) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const storageRef = yield* Ref.make<\n {\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n }[]\n >([]);\n\n const getProjectVirtualConversations = (projectId: string) =>\n Effect.gen(function* () {\n const conversations = yield* Ref.get(storageRef);\n return conversations.filter(\n (conversation) => conversation.projectId === projectId,\n );\n });\n\n const getSessionVirtualConversation = (sessionId: string) =>\n Effect.gen(function* () {\n const conversations = yield* Ref.get(storageRef);\n return (\n conversations.find(\n (conversation) => conversation.sessionId === sessionId,\n ) ?? null\n );\n });\n\n const createVirtualConversation = (\n projectId: string,\n sessionId: string,\n createConversations: readonly (Conversation | ErrorJsonl)[],\n ) =>\n Effect.gen(function* () {\n yield* Ref.update(storageRef, (conversations) => {\n const existingRecord = conversations.find(\n (record) =>\n record.projectId === projectId &&\n record.sessionId === sessionId,\n );\n\n if (existingRecord === undefined) {\n return [\n ...conversations,\n {\n projectId,\n sessionId,\n conversations: [...createConversations],\n },\n ];\n }\n\n existingRecord.conversations.push(...createConversations);\n return conversations;\n });\n });\n\n const deleteVirtualConversations = (sessionId: string) =>\n Effect.gen(function* () {\n yield* Ref.update(storageRef, (conversations) => {\n return conversations.filter((c) => c.sessionId !== sessionId);\n });\n });\n\n return {\n getProjectVirtualConversations,\n getSessionVirtualConversation,\n createVirtualConversation,\n deleteVirtualConversations,\n };\n }),\n );\n}\n\nexport type IVirtualConversationDatabase = Context.Tag.Service<\n typeof VirtualConversationDatabase\n>;\n", "import { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport {\n FileCacheStorage,\n makeFileCacheStorageLayer,\n} from \"../../../lib/storage/FileCacheStorage\";\nimport { PersistentService } from \"../../../lib/storage/FileCacheStorage/PersistentService\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport {\n type ParsedUserMessage,\n parsedUserMessageSchema,\n} from \"../../claude-code/functions/parseUserMessage\";\nimport type { SessionMeta } from \"../../types\";\nimport {\n calculateTokenCost,\n type TokenUsage,\n} from \"../functions/calculateSessionCost\";\nimport { decodeSessionId } from \"../functions/id\";\nimport { extractFirstUserMessage } from \"../functions/isValidFirstMessage\";\n\nconst parsedUserMessageOrNullSchema = parsedUserMessageSchema.nullable();\n\nexport class SessionMetaService extends Context.Tag(\"SessionMetaService\")<\n SessionMetaService,\n {\n readonly getSessionMeta: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<SessionMeta, Error>;\n readonly invalidateSession: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const firstUserMessageCache =\n yield* FileCacheStorage<ParsedUserMessage | null>();\n const sessionMetaCacheRef = yield* Ref.make(\n new Map<string, SessionMeta>(),\n );\n\n const getFirstUserMessage = (\n jsonlFilePath: string,\n lines: string[],\n ): Effect.Effect<ParsedUserMessage | null, Error> =>\n Effect.gen(function* () {\n const cached = yield* firstUserMessageCache.get(jsonlFilePath);\n if (cached !== undefined) {\n return cached;\n }\n\n let firstUserMessage: ParsedUserMessage | null = null;\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\n\n if (conversation === undefined) {\n continue;\n }\n\n const maybeFirstUserMessage = extractFirstUserMessage(conversation);\n\n if (maybeFirstUserMessage === undefined) {\n continue;\n }\n\n firstUserMessage = maybeFirstUserMessage;\n\n break;\n }\n\n if (firstUserMessage !== null) {\n yield* firstUserMessageCache.set(jsonlFilePath, firstUserMessage);\n }\n\n return firstUserMessage;\n });\n\n const aggregateTokenUsageAndCost = (\n content: string,\n ): {\n totalUsage: TokenUsage;\n totalCost: ReturnType<typeof calculateTokenCost>;\n modelName: string;\n } => {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheCreationTokens = 0;\n let totalCacheReadTokens = 0;\n let totalInputTokensUsd = 0;\n let totalOutputTokensUsd = 0;\n let totalCacheCreationUsd = 0;\n let totalCacheReadUsd = 0;\n let lastModelName = \"claude-3.5-sonnet\"; // Default model\n\n const conversations = parseJsonl(content);\n for (const conversation of conversations) {\n if (conversation.type === \"assistant\") {\n const usage = conversation.message.usage;\n const modelName = conversation.message.model;\n\n // Calculate cost for this specific message\n const messageCost = calculateTokenCost(\n {\n input_tokens: usage.input_tokens,\n output_tokens: usage.output_tokens,\n cache_creation_input_tokens:\n usage.cache_creation_input_tokens ?? 0,\n cache_read_input_tokens: usage.cache_read_input_tokens ?? 0,\n },\n modelName,\n );\n\n // Accumulate token counts\n totalInputTokens += usage.input_tokens;\n totalOutputTokens += usage.output_tokens;\n totalCacheCreationTokens += usage.cache_creation_input_tokens ?? 0;\n totalCacheReadTokens += usage.cache_read_input_tokens ?? 0;\n\n // Accumulate costs\n totalInputTokensUsd += messageCost.breakdown.inputTokensUsd;\n totalOutputTokensUsd += messageCost.breakdown.outputTokensUsd;\n totalCacheCreationUsd += messageCost.breakdown.cacheCreationUsd;\n totalCacheReadUsd += messageCost.breakdown.cacheReadUsd;\n\n // Track the latest model name\n lastModelName = modelName;\n }\n }\n\n const totalCost: ReturnType<typeof calculateTokenCost> = {\n totalUsd:\n totalInputTokensUsd +\n totalOutputTokensUsd +\n totalCacheCreationUsd +\n totalCacheReadUsd,\n breakdown: {\n inputTokensUsd: totalInputTokensUsd,\n outputTokensUsd: totalOutputTokensUsd,\n cacheCreationUsd: totalCacheCreationUsd,\n cacheReadUsd: totalCacheReadUsd,\n },\n tokenUsage: {\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n cacheCreationTokens: totalCacheCreationTokens,\n cacheReadTokens: totalCacheReadTokens,\n },\n };\n\n const aggregatedUsage: TokenUsage = {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n cache_creation_input_tokens: totalCacheCreationTokens,\n cache_read_input_tokens: totalCacheReadTokens,\n };\n\n return {\n totalUsage: aggregatedUsage,\n totalCost,\n modelName: lastModelName,\n };\n };\n\n const getSessionMeta = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<SessionMeta, Error> =>\n Effect.gen(function* () {\n const metaCache = yield* Ref.get(sessionMetaCacheRef);\n const cached = metaCache.get(sessionId);\n if (cached !== undefined) {\n return cached;\n }\n\n const sessionPath = decodeSessionId(projectId, sessionId);\n const content = yield* fs.readFileString(sessionPath);\n const lines = content.split(\"\\n\");\n\n const firstUserMessage = yield* getFirstUserMessage(\n sessionPath,\n lines,\n );\n\n // Calculate cost information\n const { totalCost } = aggregateTokenUsageAndCost(content);\n\n const sessionMeta: SessionMeta = {\n messageCount: lines.length,\n firstUserMessage: firstUserMessage,\n cost: {\n totalUsd: totalCost.totalUsd,\n breakdown: totalCost.breakdown,\n tokenUsage: totalCost.tokenUsage,\n },\n };\n\n yield* Ref.update(sessionMetaCacheRef, (cache) => {\n cache.set(sessionId, sessionMeta);\n return cache;\n });\n\n return sessionMeta;\n });\n\n const invalidateSession = (\n _projectId: string,\n sessionId: string,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(sessionMetaCacheRef, (cache) => {\n cache.delete(sessionId);\n return cache;\n });\n });\n\n return {\n getSessionMeta,\n invalidateSession,\n };\n }),\n ).pipe(\n Layer.provide(\n makeFileCacheStorageLayer(\n \"first-user-message-cache\",\n parsedUserMessageOrNullSchema,\n ),\n ),\n Layer.provide(PersistentService.Live),\n );\n}\n\nexport type ISessionMetaService = Context.Tag.Service<\n typeof SessionMetaService\n>;\n", "/**\n * Anthropic Claude API Pricing Information\n * Last updated: 2025-11-13\n *\n * Prices are in USD per million tokens (MTok)\n * Source: https://www.anthropic.com/pricing\n */\n\nexport type ModelName =\n | \"claude-3.5-sonnet\"\n | \"claude-3-opus\"\n | \"claude-3-haiku\"\n | \"claude-instant-1.2\"\n | \"claude-2\";\n\nexport type TokenType = \"input\" | \"output\" | \"cache_creation\" | \"cache_read\";\n\nexport type ModelPricing = {\n readonly input: number;\n readonly output: number;\n readonly cache_creation: number;\n readonly cache_read: number;\n};\n\n/**\n * Pricing per million tokens (MTok) in USD\n */\nexport const MODEL_PRICING: Record<ModelName, ModelPricing> = {\n \"claude-3.5-sonnet\": {\n input: 3.0,\n output: 15.0,\n cache_creation: 3.75,\n cache_read: 0.3,\n },\n \"claude-3-opus\": {\n input: 15.0,\n output: 75.0,\n cache_creation: 18.75,\n cache_read: 1.5,\n },\n \"claude-3-haiku\": {\n input: 0.25,\n output: 1.25,\n cache_creation: 0.3,\n cache_read: 0.03,\n },\n \"claude-instant-1.2\": {\n input: 1.63,\n output: 5.51,\n cache_creation: 2.0375, // 1.63 * 1.25\n cache_read: 0.163, // 1.63 * 0.1\n },\n \"claude-2\": {\n input: 8.0,\n output: 24.0,\n cache_creation: 10.0, // 8.0 * 1.25\n cache_read: 0.8, // 8.0 * 0.1\n },\n} as const;\n\n/**\n * Default pricing for unknown models\n * Uses Claude 3.5 Sonnet pricing as a safe default\n */\nexport const DEFAULT_MODEL_PRICING: ModelPricing =\n MODEL_PRICING[\"claude-3.5-sonnet\"];\n", "import {\n DEFAULT_MODEL_PRICING,\n MODEL_PRICING,\n type ModelName,\n type ModelPricing,\n} from \"../constants/pricing\";\n\n/**\n * Token usage information extracted from assistant messages\n */\nexport type TokenUsage = {\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens: number | undefined;\n readonly cache_read_input_tokens: number | undefined;\n};\n\n/**\n * Cost breakdown by token type in USD\n */\nexport type CostBreakdown = {\n readonly inputTokensUsd: number;\n readonly outputTokensUsd: number;\n readonly cacheCreationUsd: number;\n readonly cacheReadUsd: number;\n};\n\n/**\n * Token usage summary\n */\nexport type TokenUsageSummary = {\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly cacheCreationTokens: number;\n readonly cacheReadTokens: number;\n};\n\n/**\n * Cost calculation result\n */\nexport type CostCalculationResult = {\n readonly totalUsd: number;\n readonly breakdown: CostBreakdown;\n readonly tokenUsage: TokenUsageSummary;\n};\n\n/**\n * Normalizes Claude API model names to standard model identifiers\n *\n * Examples:\n * - \"claude-sonnet-4-20250514\" -> \"claude-3.5-sonnet\"\n * - \"claude-3-5-sonnet-20240620\" -> \"claude-3.5-sonnet\"\n * - \"claude-3-opus-20240229\" -> \"claude-3-opus\"\n * - \"claude-3-haiku-20240307\" -> \"claude-3-haiku\"\n * - \"claude-instant-1.2\" -> \"claude-instant-1.2\"\n * - \"claude-2.1\" -> \"claude-2\"\n *\n * @param modelName Raw model name from API\n * @returns Normalized model name or default model name if unknown\n */\nexport function normalizeModelName(modelName: string): ModelName {\n const normalized = modelName.toLowerCase();\n\n // Claude 3.5 Sonnet patterns\n if (\n normalized.includes(\"sonnet-4\") ||\n normalized.includes(\"3-5-sonnet\") ||\n normalized.includes(\"3.5-sonnet\")\n ) {\n return \"claude-3.5-sonnet\";\n }\n\n // Claude 3 Opus patterns\n if (normalized.includes(\"3-opus\") || normalized.includes(\"opus-20\")) {\n return \"claude-3-opus\";\n }\n\n // Claude 3 Haiku patterns\n if (normalized.includes(\"3-haiku\") || normalized.includes(\"haiku-20\")) {\n return \"claude-3-haiku\";\n }\n\n // Claude Instant 1.2\n if (normalized.includes(\"instant-1.2\") || normalized.includes(\"instant-1\")) {\n return \"claude-instant-1.2\";\n }\n\n // Claude 2 patterns\n if (normalized.startsWith(\"claude-2\")) {\n return \"claude-2\";\n }\n\n // Unknown model - return default\n return \"claude-3.5-sonnet\";\n}\n\n/**\n * Gets pricing for a model, with fallback to default pricing\n */\nfunction getModelPricing(modelName: string): ModelPricing {\n const normalized = normalizeModelName(modelName);\n return MODEL_PRICING[normalized] ?? DEFAULT_MODEL_PRICING;\n}\n\n/**\n * Calculates the cost in USD for token usage\n *\n * @param usage Token usage information\n * @param modelName Model name (will be normalized)\n * @returns Cost calculation result with breakdown\n */\nexport function calculateTokenCost(\n usage: TokenUsage,\n modelName: string,\n): CostCalculationResult {\n const pricing = getModelPricing(modelName);\n\n // Convert tokens to millions for cost calculation\n const inputMTok = usage.input_tokens / 1_000_000;\n const outputMTok = usage.output_tokens / 1_000_000;\n const cacheCreationMTok =\n (usage.cache_creation_input_tokens ?? 0) / 1_000_000;\n const cacheReadMTok = (usage.cache_read_input_tokens ?? 0) / 1_000_000;\n\n // Calculate costs\n const inputTokensUsd = inputMTok * pricing.input;\n const outputTokensUsd = outputMTok * pricing.output;\n const cacheCreationUsd = cacheCreationMTok * pricing.cache_creation;\n const cacheReadUsd = cacheReadMTok * pricing.cache_read;\n\n const totalUsd =\n inputTokensUsd + outputTokensUsd + cacheCreationUsd + cacheReadUsd;\n\n return {\n totalUsd,\n breakdown: {\n inputTokensUsd,\n outputTokensUsd,\n cacheCreationUsd,\n cacheReadUsd,\n },\n tokenUsage: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheCreationTokens: usage.cache_creation_input_tokens ?? 0,\n cacheReadTokens: usage.cache_read_input_tokens ?? 0,\n },\n };\n}\n", "import type { ExtendedConversation } from \"../../types\";\n\nexport const extractFirstUserText = (\n conversation: ExtendedConversation,\n): string | null => {\n if (conversation.type !== \"user\") {\n return null;\n }\n\n const firstUserText =\n typeof conversation.message.content === \"string\"\n ? conversation.message.content\n : (() => {\n const firstContent = conversation.message.content.at(0);\n if (firstContent === undefined) return null;\n if (typeof firstContent === \"string\") return firstContent;\n if (firstContent.type === \"text\") return firstContent.text;\n return null;\n })();\n\n return firstUserText;\n};\n", "import {\n type ParsedUserMessage,\n parseUserMessage,\n} from \"../../claude-code/functions/parseUserMessage\";\nimport type { ExtendedConversation } from \"../../types\";\nimport { extractFirstUserText } from \"./extractFirstUserText\";\n\nconst ignoreCommands = [\n \"/clear\",\n \"/login\",\n \"/logout\",\n \"/exit\",\n \"/mcp\",\n \"/memory\",\n];\n\nexport const extractFirstUserMessage = (\n conversation: ExtendedConversation,\n): ParsedUserMessage | undefined => {\n if (conversation.type !== \"user\") {\n return undefined;\n }\n\n if (conversation.isSidechain === true) {\n return undefined;\n }\n\n const firstUserText = extractFirstUserText(conversation);\n\n if (firstUserText === null) {\n return undefined;\n }\n\n if (\n firstUserText ===\n \"Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.\"\n ) {\n return undefined;\n }\n\n if (firstUserText === \"Warmup\") {\n return undefined;\n }\n\n const command = parseUserMessage(firstUserText);\n if (command.kind === \"local-command\") {\n return undefined;\n }\n\n if (\n command.kind === \"command\" &&\n ignoreCommands.includes(command.commandName)\n ) {\n return undefined;\n }\n\n return command;\n};\n", "import type {\n SDKMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n DocumentBlockParam,\n ImageBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise\";\n\nexport type UserMessageInput = {\n text: string;\n images?: readonly ImageBlockParam[];\n documents?: readonly DocumentBlockParam[];\n};\n\nexport type OnMessage = (message: SDKMessage) => void | Promise<void>;\n\nexport type MessageGenerator = () => AsyncGenerator<\n SDKUserMessage,\n void,\n unknown\n>;\n\nexport const createMessageGenerator = (): {\n generateMessages: MessageGenerator;\n setNextMessage: (input: UserMessageInput) => void;\n setHooks: (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (\n input: UserMessageInput,\n ) => void | Promise<void>;\n }) => void;\n} => {\n let sendMessagePromise = controllablePromise<UserMessageInput>();\n let registeredHooks: {\n onNextMessageSet: ((input: UserMessageInput) => void | Promise<void>)[];\n onNewUserMessageResolved: ((\n input: UserMessageInput,\n ) => void | Promise<void>)[];\n } = {\n onNextMessageSet: [],\n onNewUserMessageResolved: [],\n };\n\n const createMessage = (input: UserMessageInput): SDKUserMessage => {\n const { images = [], documents = [] } = input;\n\n if (images.length === 0 && documents.length === 0) {\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: input.text,\n },\n parent_tool_use_id: null,\n } satisfies Omit<SDKUserMessage, \"session_id\"> as SDKUserMessage;\n }\n\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: input.text,\n },\n ...images,\n ...documents,\n ],\n },\n } as SDKUserMessage;\n };\n\n async function* generateMessages(): ReturnType<MessageGenerator> {\n sendMessagePromise = controllablePromise<UserMessageInput>();\n\n while (true) {\n const message = await sendMessagePromise.promise;\n sendMessagePromise = controllablePromise<UserMessageInput>();\n void Promise.allSettled(\n registeredHooks.onNewUserMessageResolved.map((hook) => hook(message)),\n );\n\n yield createMessage(message);\n }\n }\n\n const setNextMessage = (input: UserMessageInput) => {\n sendMessagePromise.resolve(input);\n void Promise.allSettled(\n registeredHooks.onNextMessageSet.map((hook) => hook(input)),\n );\n };\n\n const setHooks = (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (\n input: UserMessageInput,\n ) => void | Promise<void>;\n }) => {\n registeredHooks = {\n onNextMessageSet: [\n ...(hooks?.onNextMessageSet ? [hooks.onNextMessageSet] : []),\n ...registeredHooks.onNextMessageSet,\n ],\n onNewUserMessageResolved: [\n ...(hooks?.onNewUserMessageResolved\n ? [hooks.onNewUserMessageResolved]\n : []),\n ...registeredHooks.onNewUserMessageResolved,\n ],\n };\n };\n\n return {\n generateMessages,\n setNextMessage,\n setHooks,\n };\n};\n", "import type { SDKMessage as AgentSDKMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SDKMessage as ClaudeCodeSDKMessage } from \"@anthropic-ai/claude-code\";\n\nexport const fallbackSdkMessage = (\n message: AgentSDKMessage | ClaudeCodeSDKMessage,\n): AgentSDKMessage => {\n if (message.type === \"system\") {\n if (message.subtype === \"init\") {\n return {\n ...message,\n plugins: [],\n };\n }\n\n return message;\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n return {\n ...message,\n };\n }\n\n return {\n ...message,\n errors: [],\n };\n }\n\n return message;\n};\n", "import { Effect } from \"effect\";\nimport type { UserEntry } from \"../../../../lib/conversation-schema/entry/UserEntrySchema\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator\";\nimport type { InitMessageContext } from \"../types\";\nimport * as ClaudeCode from \"./ClaudeCode\";\nimport type * as CCTask from \"./ClaudeCodeTask\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\nexport type CCSessionProcessDef = {\n sessionProcessId: string;\n projectId: string;\n cwd: string;\n abortController: AbortController;\n setNextMessage: (input: UserMessageInput) => void;\n};\n\ntype CCSessionProcessStateBase = {\n def: CCSessionProcessDef;\n tasks: CCTask.ClaudeCodeTaskState[];\n};\n\nexport type CCSessionProcessPendingState = CCSessionProcessStateBase & {\n type: \"pending\" /* \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u307E\u3060\u89E3\u6C7A\u3055\u308C\u3066\u3044\u306A\u3044\u72B6\u614B */;\n sessionId?: undefined;\n currentTask: CCTask.PendingClaudeCodeTaskState;\n};\n\nexport type CCSessionProcessNotInitializedState = CCSessionProcessStateBase & {\n type: \"not_initialized\" /* \u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u89E3\u6C7A\u3055\u308C\u3066\u3044\u308B\u304C\u3001init \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u672A\u53D7\u4FE1 */;\n sessionId?: undefined;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n};\n\nexport type CCSessionProcessInitializedState = CCSessionProcessStateBase & {\n type: \"initialized\" /* init \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u53D7\u4FE1\u3057\u305F\u72B6\u614B */;\n sessionId: string;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessFileCreatedState = CCSessionProcessStateBase & {\n type: \"file_created\" /* \u30D5\u30A1\u30A4\u30EB\u304C\u4F5C\u6210\u3055\u308C\u305F\u72B6\u614B */;\n sessionId: string;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessPausedState = CCSessionProcessStateBase & {\n type: \"paused\" /* \u30BF\u30B9\u30AF\u304C\u5B8C\u4E86\u3057\u3001\u6B21\u306E\u30BF\u30B9\u30AF\u3092\u53D7\u3051\u4ED8\u3051\u53EF\u80FD */;\n sessionId: string;\n};\n\nexport type CCSessionProcessCompletedState = CCSessionProcessStateBase & {\n type: \"completed\" /* paused \u3042\u308B\u3044\u306F\u8D77\u52D5\u4E2D\u306E\u30BF\u30B9\u30AF\u304C\u4E2D\u65AD\u3055\u308C\u305F\u72B6\u614B\u3002\u518D\u958B\u4E0D\u53EF */;\n sessionId?: string | undefined;\n};\n\nexport type CCSessionProcessStatePublic =\n | CCSessionProcessInitializedState\n | CCSessionProcessFileCreatedState\n | CCSessionProcessPausedState;\n\nexport type CCSessionProcessState =\n | CCSessionProcessPendingState\n | CCSessionProcessNotInitializedState\n | CCSessionProcessStatePublic\n | CCSessionProcessCompletedState;\n\nexport const isPublic = (\n process: CCSessionProcessState,\n): process is CCSessionProcessStatePublic => {\n return (\n process.type === \"initialized\" ||\n process.type === \"file_created\" ||\n process.type === \"paused\"\n );\n};\n\nexport const getAliveTasks = (\n process: CCSessionProcessState,\n): CCTask.AliveClaudeCodeTaskState[] => {\n return process.tasks.filter(\n (task) => task.status === \"pending\" || task.status === \"running\",\n );\n};\n\nexport const createVirtualConversation = (\n process: CCSessionProcessState,\n ctx: {\n sessionId: string;\n userMessage: string;\n },\n) => {\n const timestamp = new Date().toISOString();\n\n return Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n\n const virtualConversation: UserEntry = {\n type: \"user\",\n message: {\n role: \"user\",\n content: ctx.userMessage,\n },\n isSidechain: false,\n userType: \"external\",\n cwd: process.def.cwd,\n sessionId: ctx.sessionId,\n version: config.claudeCodeVersion\n ? ClaudeCodeVersion.versionText(config.claudeCodeVersion)\n : \"unknown\",\n uuid: `vc__${ctx.sessionId}__${timestamp}`,\n timestamp,\n parentUuid: null,\n };\n\n return virtualConversation;\n });\n};\n", "import type { SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Data, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess\";\nimport type * as CCTask from \"../models/ClaudeCodeTask\";\nimport type { InitMessageContext } from \"../types\";\n\nclass SessionProcessNotFoundError extends Data.TaggedError(\n \"SessionProcessNotFoundError\",\n)<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessNotPausedError extends Data.TaggedError(\n \"SessionProcessNotPausedError\",\n)<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessAlreadyAliveError extends Data.TaggedError(\n \"SessionProcessAlreadyAliveError\",\n)<{\n sessionProcessId: string;\n aliveTaskId: string;\n aliveTaskSessionId?: string;\n}> {}\n\nclass IllegalStateChangeError extends Data.TaggedError(\n \"IllegalStateChangeError\",\n)<{\n from: CCSessionProcess.CCSessionProcessState[\"type\"];\n to: CCSessionProcess.CCSessionProcessState[\"type\"];\n}> {}\n\nclass TaskNotFoundError extends Data.TaggedError(\"TaskNotFoundError\")<{\n taskId: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const processesRef = yield* Ref.make<\n CCSessionProcess.CCSessionProcessState[]\n >([]);\n const eventBus = yield* EventBus;\n\n const startSessionProcess = (options: {\n sessionDef: CCSessionProcess.CCSessionProcessDef;\n taskDef: CCTask.NewClaudeCodeTaskDef | CCTask.ResumeClaudeCodeTaskDef;\n }) => {\n const { sessionDef, taskDef } = options;\n\n return Effect.gen(function* () {\n const task: CCTask.PendingClaudeCodeTaskState = {\n def: taskDef,\n status: \"pending\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessState = {\n def: sessionDef,\n type: \"pending\",\n tasks: [task],\n currentTask: task,\n };\n\n yield* Ref.update(processesRef, (processes) => [\n ...processes,\n newProcess,\n ]);\n return {\n sessionProcess: newProcess,\n task,\n };\n });\n };\n\n const continueSessionProcess = (options: {\n sessionProcessId: string;\n taskDef: CCTask.ContinueClaudeCodeTaskDef;\n }) => {\n const { sessionProcessId } = options;\n\n return Effect.gen(function* () {\n const process = yield* getSessionProcess(sessionProcessId);\n\n if (process.type !== \"paused\") {\n return yield* Effect.fail(\n new SessionProcessNotPausedError({\n sessionProcessId,\n }),\n );\n }\n\n const [firstAliveTask] = CCSessionProcess.getAliveTasks(process);\n if (firstAliveTask !== undefined) {\n return yield* Effect.fail(\n new SessionProcessAlreadyAliveError({\n sessionProcessId,\n aliveTaskId: firstAliveTask.def.taskId,\n aliveTaskSessionId:\n firstAliveTask.def.sessionId ?? firstAliveTask.sessionId,\n }),\n );\n }\n\n const newTask: CCTask.PendingClaudeCodeTaskState = {\n def: options.taskDef,\n status: \"pending\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessPendingState = {\n def: process.def,\n type: \"pending\",\n tasks: [...process.tasks, newTask],\n currentTask: newTask,\n };\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId ? newProcess : p,\n );\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n const getSessionProcess = (sessionProcessId: string) => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const result = processes.find(\n (p) => p.def.sessionProcessId === sessionProcessId,\n );\n if (result === undefined) {\n return yield* Effect.fail(\n new SessionProcessNotFoundError({ sessionProcessId }),\n );\n }\n return result;\n });\n };\n\n const getSessionProcesses = () => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n return processes;\n });\n };\n\n const getTask = (taskId: string) => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const result = processes\n .flatMap((p) => {\n const found = p.tasks.find((t) => t.def.taskId === taskId);\n if (found === undefined) {\n return [];\n }\n\n return [\n {\n sessionProcess: p,\n task: found,\n },\n ];\n })\n .at(0);\n\n if (result === undefined) {\n return yield* Effect.fail(new TaskNotFoundError({ taskId }));\n }\n\n return result;\n });\n };\n\n const dangerouslyChangeProcessState = <\n T extends CCSessionProcess.CCSessionProcessState,\n >(options: {\n sessionProcessId: string;\n nextState: T;\n }) => {\n const { sessionProcessId, nextState } = options;\n\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const targetProcess = processes.find(\n (p) => p.def.sessionProcessId === sessionProcessId,\n );\n const currentStatus = targetProcess?.type;\n\n const updatedProcesses = processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId ? nextState : p,\n );\n\n yield* Ref.set(processesRef, updatedProcesses);\n\n if (currentStatus !== nextState.type) {\n yield* eventBus.emit(\"sessionProcessChanged\", {\n processes: updatedProcesses\n .filter(CCSessionProcess.isPublic)\n .map((process) => ({\n id: process.def.sessionProcessId,\n projectId: process.def.projectId,\n sessionId: process.sessionId,\n status: process.type === \"paused\" ? \"paused\" : \"running\",\n })),\n changed: nextState,\n });\n }\n\n console.log(\n `sessionProcessStateChanged(${sessionProcessId}): ${targetProcess?.type} -> ${nextState.type}`,\n );\n\n return nextState;\n });\n };\n\n const changeTaskState = <T extends CCTask.ClaudeCodeTaskState>(options: {\n sessionProcessId: string;\n taskId: string;\n nextTask: T;\n }) => {\n const { sessionProcessId, taskId, nextTask } = options;\n\n return Effect.gen(function* () {\n const { task } = yield* getTask(taskId);\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId\n ? {\n ...p,\n tasks: p.tasks.map((t) =>\n t.def.taskId === task.def.taskId ? { ...nextTask } : t,\n ),\n }\n : p,\n );\n });\n\n const updated = yield* getTask(taskId);\n if (updated === undefined) {\n throw new Error(\"Unreachable: updatedProcess is undefined\");\n }\n\n return updated.task as T;\n });\n };\n\n const toNotInitializedState = (options: {\n sessionProcessId: string;\n rawUserMessage: string;\n }) => {\n const { sessionProcessId, rawUserMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"pending\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"not_initialized\",\n }),\n );\n }\n\n const newTask = yield* changeTaskState({\n sessionProcessId,\n taskId: currentProcess.currentTask.def.taskId,\n nextTask: {\n status: \"running\",\n def: currentProcess.currentTask.def,\n },\n });\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"not_initialized\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: newTask,\n rawUserMessage,\n },\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n const toInitializedState = (options: {\n sessionProcessId: string;\n initContext: InitMessageContext;\n }) => {\n const { sessionProcessId, initContext } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"not_initialized\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"initialized\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"initialized\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: currentProcess.currentTask,\n sessionId: initContext.initMessage.session_id,\n rawUserMessage: currentProcess.rawUserMessage,\n initContext: initContext,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toFileCreatedState = (options: { sessionProcessId: string }) => {\n const { sessionProcessId } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"initialized\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"file_created\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"file_created\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: currentProcess.currentTask,\n sessionId: currentProcess.sessionId,\n rawUserMessage: currentProcess.rawUserMessage,\n initContext: currentProcess.initContext,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toPausedState = (options: {\n sessionProcessId: string;\n resultMessage: SDKResultMessage;\n }) => {\n const { sessionProcessId, resultMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"file_created\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"paused\",\n }),\n );\n }\n\n const newTask = yield* changeTaskState({\n sessionProcessId,\n taskId: currentProcess.currentTask.def.taskId,\n nextTask: {\n status: \"completed\",\n def: currentProcess.currentTask.def,\n sessionId: resultMessage.session_id,\n },\n });\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"paused\",\n def: currentProcess.def,\n tasks: currentProcess.tasks.map((t) =>\n t.def.taskId === newTask.def.taskId ? newTask : t,\n ),\n sessionId: currentProcess.sessionId,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toCompletedState = (options: {\n sessionProcessId: string;\n error?: unknown;\n }) => {\n const { sessionProcessId, error } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n const currentTask =\n currentProcess.type === \"not_initialized\" ||\n currentProcess.type === \"initialized\" ||\n currentProcess.type === \"file_created\"\n ? currentProcess.currentTask\n : undefined;\n\n const newTask =\n currentTask !== undefined\n ? error !== undefined\n ? ({\n status: \"failed\",\n def: currentTask.def,\n error,\n } as const)\n : ({\n status: \"completed\",\n def: currentTask.def,\n sessionId: currentProcess.sessionId,\n } as const)\n : undefined;\n\n if (newTask !== undefined) {\n yield* changeTaskState({\n sessionProcessId,\n taskId: newTask.def.taskId,\n nextTask: newTask,\n });\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"completed\",\n def: currentProcess.def,\n tasks:\n newTask !== undefined\n ? currentProcess.tasks.map((t) =>\n t.def.taskId === newTask.def.taskId ? newTask : t,\n )\n : currentProcess.tasks,\n sessionId: currentProcess.sessionId,\n },\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n return {\n // session\n startSessionProcess,\n continueSessionProcess,\n toNotInitializedState,\n toInitializedState,\n toFileCreatedState,\n toPausedState,\n toCompletedState,\n dangerouslyChangeProcessState,\n getSessionProcesses,\n getSessionProcess,\n\n // task\n getTask,\n changeTaskState,\n };\n});\n\nexport type IClaudeCodeSessionProcessService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeSessionProcessService extends Context.Tag(\n \"ClaudeCodeSessionProcessService\",\n)<ClaudeCodeSessionProcessService, IClaudeCodeSessionProcessService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { SSEStreamingApi } from \"hono/streaming\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { adaptInternalEventToSSE } from \"../functions/adaptInternalEventToSSE\";\nimport { TypeSafeSSE } from \"../functions/typeSafeSSE\";\nimport { EventBus } from \"../services/EventBus\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration\";\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n\n const handleSSE = (rawStream: SSEStreamingApi) =>\n Effect.gen(function* () {\n const typeSafeSSE = yield* TypeSafeSSE;\n\n // Send connect event\n yield* typeSafeSSE.writeSSE(\"connect\", {\n timestamp: new Date().toISOString(),\n });\n\n const onHeartbeat = () => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"heartbeat\", {\n timestamp: new Date().toISOString(),\n }),\n );\n };\n\n const onSessionListChanged = (\n event: InternalEventDeclaration[\"sessionListChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionListChanged\", {\n projectId: event.projectId,\n }),\n );\n };\n\n const onSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionChanged\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onAgentSessionChanged = (\n event: InternalEventDeclaration[\"agentSessionChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"agentSessionChanged\", {\n projectId: event.projectId,\n agentSessionId: event.agentSessionId,\n }),\n );\n };\n\n const onSessionProcessChanged = (\n event: InternalEventDeclaration[\"sessionProcessChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionProcessChanged\", {\n processes: event.processes,\n }),\n );\n };\n\n const onPermissionRequested = (\n event: InternalEventDeclaration[\"permissionRequested\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionRequested\", {\n permissionRequest: event.permissionRequest,\n }),\n );\n };\n\n yield* eventBus.on(\"sessionListChanged\", onSessionListChanged);\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"agentSessionChanged\", onAgentSessionChanged);\n yield* eventBus.on(\"sessionProcessChanged\", onSessionProcessChanged);\n yield* eventBus.on(\"heartbeat\", onHeartbeat);\n yield* eventBus.on(\"permissionRequested\", onPermissionRequested);\n\n const { connectionPromise } = adaptInternalEventToSSE(rawStream, {\n timeout: 5 /* min */ * 60 /* sec */ * 1000,\n cleanUp: async () => {\n await Effect.runPromise(\n Effect.gen(function* () {\n yield* eventBus.off(\"sessionListChanged\", onSessionListChanged);\n yield* eventBus.off(\"sessionChanged\", onSessionChanged);\n yield* eventBus.off(\"agentSessionChanged\", onAgentSessionChanged);\n yield* eventBus.off(\n \"sessionProcessChanged\",\n onSessionProcessChanged,\n );\n yield* eventBus.off(\"heartbeat\", onHeartbeat);\n yield* eventBus.off(\"permissionRequested\", onPermissionRequested);\n }),\n );\n },\n });\n\n yield* Effect.promise(() => connectionPromise);\n });\n\n return {\n handleSSE,\n };\n});\n\nexport type ISSEController = InferEffect<typeof LayerImpl>;\nexport class SSEController extends Context.Tag(\"SSEController\")<\n SSEController,\n ISSEController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { SSEStreamingApi } from \"hono/streaming\";\n\nexport const adaptInternalEventToSSE = (\n rawStream: SSEStreamingApi,\n options?: {\n timeout?: number;\n cleanUp?: () => void | Promise<void>;\n },\n) => {\n const { timeout = 60 * 1000, cleanUp } = options ?? {};\n\n const abortController = new AbortController();\n let connectionResolve: (() => void) | undefined;\n const connectionPromise = new Promise<void>((resolve) => {\n connectionResolve = resolve;\n });\n\n const closeConnection = () => {\n connectionResolve?.();\n abortController.abort();\n cleanUp?.();\n };\n\n rawStream.onAbort(() => {\n closeConnection();\n });\n\n setTimeout(() => {\n closeConnection();\n }, timeout);\n\n return {\n connectionPromise,\n } as const;\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { SSEStreamingApi } from \"hono/streaming\";\nimport { ulid } from \"ulid\";\nimport type { SSEEventDeclaration } from \"../../../../types/sse\";\n\ninterface TypeSafeSSEService {\n readonly writeSSE: <EventName extends keyof SSEEventDeclaration>(\n event: EventName,\n data: SSEEventDeclaration[EventName],\n ) => Effect.Effect<void, Error>;\n}\n\nexport class TypeSafeSSE extends Context.Tag(\"TypeSafeSSE\")<\n TypeSafeSSE,\n TypeSafeSSEService\n>() {\n static make = (stream: SSEStreamingApi) =>\n Layer.succeed(this, {\n writeSSE: <EventName extends keyof SSEEventDeclaration>(\n event: EventName,\n data: SSEEventDeclaration[EventName],\n ): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: async () => {\n const id = ulid();\n await stream.writeSSE({\n event: event,\n id: id,\n data: JSON.stringify({\n kind: event,\n timestamp: new Date().toISOString(),\n ...data,\n }),\n });\n },\n catch: (error) => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n },\n }),\n } satisfies TypeSafeSSEService);\n}\n", "import { type FSWatcher, watch } from \"node:fs\";\nimport { Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { encodeProjectIdFromSessionFilePath } from \"../../project/functions/id\";\nimport { parseSessionFilePath } from \"../functions/parseSessionFilePath\";\nimport { EventBus } from \"./EventBus\";\n\ninterface FileWatcherServiceInterface {\n readonly startWatching: () => Effect.Effect<void>;\n readonly stop: () => Effect.Effect<void>;\n}\n\nexport class FileWatcherService extends Context.Tag(\"FileWatcherService\")<\n FileWatcherService,\n FileWatcherServiceInterface\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const eventBus = yield* EventBus;\n const context = yield* ApplicationContext;\n\n const isWatchingRef = yield* Ref.make(false);\n const watcherRef = yield* Ref.make<FSWatcher | null>(null);\n const projectWatchersRef = yield* Ref.make<Map<string, FSWatcher>>(\n new Map(),\n );\n const debounceTimersRef = yield* Ref.make<\n Map<string, ReturnType<typeof setTimeout>>\n >(new Map());\n\n const startWatching = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const isWatching = yield* Ref.get(isWatchingRef);\n if (isWatching) return;\n\n yield* Ref.set(isWatchingRef, true);\n\n yield* Effect.tryPromise({\n try: async () => {\n console.log(\n \"Starting file watcher on:\",\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n\n const watcher = watch(\n context.claudeCodePaths.claudeProjectsDirPath,\n { persistent: false, recursive: true },\n (_eventType, filename) => {\n if (!filename) return;\n\n const fileMatch = parseSessionFilePath(filename);\n if (fileMatch === null) return;\n\n // Build full path to get encoded projectId\n const fullPath = path.join(\n context.claudeCodePaths.claudeProjectsDirPath,\n filename,\n );\n const encodedProjectId =\n encodeProjectIdFromSessionFilePath(fullPath);\n\n // Determine debounce key based on file type\n const debounceKey =\n fileMatch.type === \"agent\"\n ? `${encodedProjectId}/agent-${fileMatch.agentSessionId}`\n : `${encodedProjectId}/${fileMatch.sessionId}`;\n\n Effect.runPromise(\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n const existingTimer = timers.get(debounceKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n const newTimer = setTimeout(() => {\n if (fileMatch.type === \"agent\") {\n // Agent session file changed\n Effect.runFork(\n eventBus.emit(\"agentSessionChanged\", {\n projectId: encodedProjectId,\n agentSessionId: fileMatch.agentSessionId,\n }),\n );\n } else {\n // Regular session file changed\n Effect.runFork(\n eventBus.emit(\"sessionChanged\", {\n projectId: encodedProjectId,\n sessionId: fileMatch.sessionId,\n }),\n );\n\n Effect.runFork(\n eventBus.emit(\"sessionListChanged\", {\n projectId: encodedProjectId,\n }),\n );\n }\n\n Effect.runPromise(\n Effect.gen(function* () {\n const currentTimers =\n yield* Ref.get(debounceTimersRef);\n currentTimers.delete(debounceKey);\n yield* Ref.set(debounceTimersRef, currentTimers);\n }),\n );\n }, 300);\n\n timers.set(debounceKey, newTimer);\n yield* Ref.set(debounceTimersRef, timers);\n }),\n );\n },\n );\n\n await Effect.runPromise(Ref.set(watcherRef, watcher));\n console.log(\"File watcher initialization completed\");\n },\n catch: (error) => {\n console.error(\"Failed to start file watching:\", error);\n return new Error(\n `Failed to start file watching: ${String(error)}`,\n );\n },\n }).pipe(\n // \u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u3066\u3082\u7D9A\u884C\u3059\u308B\n Effect.catchAll(() => Effect.void),\n );\n });\n\n const stop = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n for (const [, timer] of timers) {\n clearTimeout(timer);\n }\n yield* Ref.set(debounceTimersRef, new Map());\n\n const watcher = yield* Ref.get(watcherRef);\n if (watcher) {\n yield* Effect.sync(() => watcher.close());\n yield* Ref.set(watcherRef, null);\n }\n\n const projectWatchers = yield* Ref.get(projectWatchersRef);\n for (const [, projectWatcher] of projectWatchers) {\n yield* Effect.sync(() => projectWatcher.close());\n }\n yield* Ref.set(projectWatchersRef, new Map());\n yield* Ref.set(isWatchingRef, false);\n });\n\n return {\n startWatching,\n stop,\n } satisfies FileWatcherServiceInterface;\n }),\n );\n}\n", "import z from \"zod\";\n\nconst sessionFileRegExp = /(?<projectId>.*?)\\/(?<sessionId>.*?)\\.jsonl$/;\nconst agentFileRegExp =\n /(?<projectId>.*?)\\/agent-(?<agentSessionId>.*?)\\.jsonl$/;\n\nconst sessionFileGroupSchema = z.object({\n projectId: z.string(),\n sessionId: z.string(),\n});\n\nconst agentFileGroupSchema = z.object({\n projectId: z.string(),\n agentSessionId: z.string(),\n});\n\nexport type SessionFileMatch = {\n type: \"session\";\n projectId: string;\n sessionId: string;\n};\n\nexport type AgentFileMatch = {\n type: \"agent\";\n projectId: string;\n agentSessionId: string;\n};\n\nexport type FileMatch = SessionFileMatch | AgentFileMatch | null;\n\n/**\n * Parses a file path to determine if it's a regular session file or an agent session file.\n * Agent files take precedence in matching (checked first).\n *\n * @param filePath - The relative file path from the claude projects directory\n * @returns FileMatch object with type and extracted IDs, or null if not a recognized file\n */\nexport const parseSessionFilePath = (filePath: string): FileMatch => {\n // Check for agent file first (more specific pattern)\n const agentMatch = filePath.match(agentFileRegExp);\n const agentGroups = agentFileGroupSchema.safeParse(agentMatch?.groups);\n if (agentGroups.success) {\n return {\n type: \"agent\",\n projectId: agentGroups.data.projectId,\n agentSessionId: agentGroups.data.agentSessionId,\n };\n }\n\n // Check for regular session file\n const sessionMatch = filePath.match(sessionFileRegExp);\n const sessionGroups = sessionFileGroupSchema.safeParse(sessionMatch?.groups);\n if (sessionGroups.success) {\n return {\n type: \"session\",\n projectId: sessionGroups.data.projectId,\n sessionId: sessionGroups.data.sessionId,\n };\n }\n\n return null;\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodeService } from \"../../claude-code/services/ClaudeCodeService\";\nimport type { Flag } from \"../models/flag\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodeService = yield* ClaudeCodeService;\n\n const getFlags = () =>\n Effect.gen(function* () {\n const claudeCodeFeatures =\n yield* claudeCodeService.getAvailableFeatures();\n\n return {\n response: {\n flags: [\n {\n name: \"tool-approval\",\n enabled: claudeCodeFeatures.canUseTool,\n },\n {\n name: \"agent-sdk\",\n enabled: claudeCodeFeatures.agentSdk,\n },\n {\n name: \"sidechain-separation\",\n enabled: claudeCodeFeatures.sidechainSeparation,\n },\n ] satisfies Flag[],\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getFlags,\n };\n});\n\nexport type IFeatureFlagController = InferEffect<typeof LayerImpl>;\nexport class FeatureFlagController extends Context.Tag(\"FeatureFlagController\")<\n FeatureFlagController,\n IFeatureFlagController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { getDirectoryListing } from \"../functions/getDirectoryListing\";\nimport { getFileCompletion } from \"../functions/getFileCompletion\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n\n const getFileCompletionRoute = (options: {\n projectId: string;\n basePath: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, basePath } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n try {\n const result = yield* Effect.promise(() =>\n getFileCompletion(projectPath, basePath),\n );\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"File completion error:\", error);\n return {\n response: { error: \"Failed to get file completion\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n const getDirectoryListingRoute = (options: {\n currentPath?: string | undefined;\n showHidden?: boolean | undefined;\n }) =>\n Effect.promise(async () => {\n const { currentPath, showHidden = false } = options;\n\n const rootPath = \"/\";\n const defaultPath = homedir();\n\n try {\n const targetPath = currentPath ?? defaultPath;\n const relativePath = targetPath.startsWith(rootPath)\n ? targetPath.slice(rootPath.length)\n : targetPath;\n\n const result = await getDirectoryListing(\n rootPath,\n relativePath,\n showHidden,\n );\n\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"Directory listing error:\", error);\n return {\n response: { error: \"Failed to list directory\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n return {\n getFileCompletionRoute,\n getDirectoryListingRoute,\n };\n});\n\nexport type IFileSystemController = InferEffect<typeof LayerImpl>;\nexport class FileSystemController extends Context.Tag(\"FileSystemController\")<\n FileSystemController,\n IFileSystemController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport type DirectoryEntry = {\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n};\n\nexport type DirectoryListingResult = {\n entries: DirectoryEntry[];\n basePath: string;\n currentPath: string;\n};\n\nexport const getDirectoryListing = async (\n rootPath: string,\n basePath = \"/\",\n showHidden = false,\n): Promise<DirectoryListingResult> => {\n const normalizedBasePath =\n basePath === \"/\"\n ? \"\"\n : basePath.startsWith(\"/\")\n ? basePath.slice(1)\n : basePath;\n const targetPath = resolve(rootPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolve(rootPath))) {\n throw new Error(\"Invalid path: outside root directory\");\n }\n\n if (!existsSync(targetPath)) {\n return {\n entries: [],\n basePath: \"/\",\n currentPath: rootPath,\n };\n }\n\n try {\n const dirents = await readdir(targetPath, { withFileTypes: true });\n const entries: DirectoryEntry[] = [];\n\n if (normalizedBasePath !== \"\") {\n const parentPath = dirname(normalizedBasePath);\n entries.push({\n name: \"..\",\n type: \"directory\",\n path: parentPath === \".\" ? \"\" : parentPath,\n });\n }\n\n for (const dirent of dirents) {\n if (!showHidden && dirent.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = normalizedBasePath\n ? join(normalizedBasePath, dirent.name)\n : dirent.name;\n\n if (dirent.isDirectory()) {\n entries.push({\n name: dirent.name,\n type: \"directory\",\n path: entryPath,\n });\n } else if (dirent.isFile()) {\n entries.push({\n name: dirent.name,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\n entries.sort((a, b) => {\n if (a.name === \"..\") return -1;\n if (b.name === \"..\") return 1;\n if (a.type !== b.type) {\n return a.type === \"directory\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n entries,\n basePath: normalizedBasePath || \"/\",\n currentPath: targetPath,\n };\n } catch (error) {\n console.error(\"Error reading directory:\", error);\n return {\n entries: [],\n basePath: normalizedBasePath || \"/\",\n currentPath: targetPath,\n };\n }\n};\n", "import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nexport type FileCompletionEntry = {\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n};\n\nexport type FileCompletionResult = {\n entries: FileCompletionEntry[];\n basePath: string;\n projectPath: string;\n};\n\n/**\n * Get file and directory completions for a given project path\n * @param projectPath - The root project path\n * @param basePath - The relative path from project root (default: \"/\")\n * @returns File and directory entries at the specified path level\n */\nexport const getFileCompletion = async (\n projectPath: string,\n basePath = \"/\",\n): Promise<FileCompletionResult> => {\n // Normalize basePath to prevent directory traversal\n const normalizedBasePath = basePath.startsWith(\"/\")\n ? basePath.slice(1)\n : basePath;\n const targetPath = resolve(projectPath, normalizedBasePath);\n\n // Security check: ensure target path is within project directory\n if (!targetPath.startsWith(resolve(projectPath))) {\n throw new Error(\"Invalid path: outside project directory\");\n }\n\n // Check if the target path exists\n if (!existsSync(targetPath)) {\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n\n try {\n const dirents = await readdir(targetPath, { withFileTypes: true });\n const entries: FileCompletionEntry[] = [];\n\n // Process each directory entry\n for (const dirent of dirents) {\n // Skip hidden files and directories (starting with .)\n if (dirent.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = join(normalizedBasePath, dirent.name);\n\n if (dirent.isDirectory()) {\n entries.push({\n name: dirent.name,\n type: \"directory\",\n path: entryPath,\n });\n } else if (dirent.isFile()) {\n entries.push({\n name: dirent.name,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\n // Sort entries: directories first, then files, both alphabetically\n entries.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === \"directory\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n entries,\n basePath: normalizedBasePath,\n projectPath,\n };\n } catch (error) {\n console.error(\"Error reading directory:\", error);\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n};\n", "import { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { getDiff } from \"../functions/getDiff\";\nimport type { CommitErrorCode, PushErrorCode } from \"../schema\";\nimport { GitService } from \"../services/GitService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const gitService = yield* GitService;\n const projectRepository = yield* ProjectRepository;\n\n const getGitDiff = (options: {\n projectId: string;\n fromRef: string;\n toRef: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, fromRef, toRef } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n try {\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n const result = yield* Effect.promise(() =>\n getDiff(projectPath, fromRef, toRef),\n );\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"Get diff error:\", error);\n if (error instanceof Error) {\n return {\n response: { error: error.message },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n return {\n response: { error: \"Failed to get diff\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n const commitFiles = (options: {\n projectId: string;\n files: string[];\n message: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n console.log(\"[GitController.commitFiles] Project path is null\");\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n console.log(\"[GitController.commitFiles] Project path:\", projectPath);\n\n // Stage files\n console.log(\"[GitController.commitFiles] Staging files...\");\n const stageResult = yield* Effect.either(\n gitService.stageFiles(projectPath, files),\n );\n if (Either.isLeft(stageResult)) {\n console.log(\n \"[GitController.commitFiles] Stage failed:\",\n stageResult.left,\n );\n return {\n response: {\n success: false,\n error: \"Failed to stage files\",\n errorCode: \"GIT_COMMAND_ERROR\" as CommitErrorCode,\n details: stageResult.left.message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n console.log(\"[GitController.commitFiles] Stage succeeded\");\n\n // Commit\n console.log(\"[GitController.commitFiles] Committing...\");\n const commitResult = yield* Effect.either(\n gitService.commit(projectPath, message),\n );\n if (Either.isLeft(commitResult)) {\n console.log(\n \"[GitController.commitFiles] Commit failed:\",\n commitResult.left,\n );\n const error = commitResult.left;\n const errorMessage =\n \"_tag\" in error && error._tag === \"GitCommandError\"\n ? error.command\n : \"message\" in error\n ? String(error.message)\n : \"Unknown error\";\n const isHookFailure = errorMessage.includes(\"hook\");\n return {\n response: {\n success: false,\n error: isHookFailure ? \"Pre-commit hook failed\" : \"Commit failed\",\n errorCode: (isHookFailure\n ? \"HOOK_FAILED\"\n : \"GIT_COMMAND_ERROR\") as CommitErrorCode,\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\n \"[GitController.commitFiles] Commit succeeded, SHA:\",\n commitResult.right,\n );\n\n return {\n response: {\n success: true,\n commitSha: commitResult.right,\n filesCommitted: files.length,\n message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const pushCommits = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n console.log(\"[GitController.pushCommits] Request:\", { projectId });\n\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n console.log(\"[GitController.pushCommits] Project path is null\");\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n console.log(\"[GitController.pushCommits] Project path:\", projectPath);\n\n // Push\n console.log(\"[GitController.pushCommits] Pushing...\");\n const pushResult = yield* Effect.either(gitService.push(projectPath));\n\n if (Either.isLeft(pushResult)) {\n console.log(\n \"[GitController.pushCommits] Push failed:\",\n pushResult.left,\n );\n const error = pushResult.left;\n const errorMessage =\n \"_tag\" in error && error._tag === \"GitCommandError\"\n ? error.command\n : \"message\" in error\n ? String(error.message)\n : \"Unknown error\";\n\n const errorCode = parsePushError(errorMessage);\n return {\n response: {\n success: false,\n error: getPushErrorMessage(errorCode),\n errorCode,\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\"[GitController.pushCommits] Push succeeded\");\n\n return {\n response: {\n success: true,\n remote: \"origin\",\n branch: pushResult.right.branch,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const commitAndPush = (options: {\n projectId: string;\n files: string[];\n message: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n console.log(\"[GitController.commitAndPush] Request:\", {\n projectId,\n files,\n message,\n });\n\n // First, commit\n const commitResult = yield* commitFiles({ projectId, files, message });\n\n if (commitResult.status !== 200 || !commitResult.response.success) {\n console.log(\n \"[GitController.commitAndPush] Commit failed:\",\n commitResult,\n );\n return commitResult; // Return commit error\n }\n\n const commitSha = commitResult.response.commitSha;\n console.log(\n \"[GitController.commitAndPush] Commit succeeded, SHA:\",\n commitSha,\n );\n\n // Then, push\n const pushResult = yield* pushCommits({ projectId });\n\n if (pushResult.status !== 200 || !pushResult.response.success) {\n console.log(\n \"[GitController.commitAndPush] Push failed, partial failure:\",\n pushResult,\n );\n // Partial failure: commit succeeded, push failed\n return {\n response: {\n success: false,\n commitSucceeded: true,\n commitSha,\n error: pushResult.response.error,\n errorCode: pushResult.response.errorCode,\n details: pushResult.response.details,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\"[GitController.commitAndPush] Both operations succeeded\");\n\n // Full success\n return {\n response: {\n success: true,\n commitSha,\n filesCommitted: files.length,\n message,\n remote: pushResult.response.remote,\n branch: pushResult.response.branch,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getCurrentRevisions = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n // Get current branch\n const currentBranchResult = yield* Effect.either(\n gitService.getCurrentBranch(projectPath),\n );\n\n if (Either.isLeft(currentBranchResult)) {\n return {\n response: {\n success: false,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const currentBranch = currentBranchResult.right;\n\n // Find base branch\n const baseBranchResult = yield* Effect.either(\n gitService.findBaseBranch(projectPath, currentBranch),\n );\n\n // Get all branches to extract branch details\n const allBranchesResult = yield* Effect.either(\n gitService.getBranches(projectPath),\n );\n\n if (Either.isLeft(allBranchesResult)) {\n return {\n response: {\n success: false,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const allBranches = allBranchesResult.right.data;\n\n // Find current branch details\n const currentBranchDetails = allBranches.find(\n (branch) => branch.name === currentBranch,\n );\n\n // Find base branch details if exists\n let baseBranchDetails: (typeof allBranches)[number] | undefined;\n if (Either.isRight(baseBranchResult) && baseBranchResult.right !== null) {\n const baseBranchName = baseBranchResult.right.branch;\n baseBranchDetails = allBranches.find(\n (branch) => branch.name === baseBranchName,\n );\n }\n\n // Get commits if base branch exists\n let commits: Array<{\n sha: string;\n message: string;\n author: string;\n date: string;\n }> = [];\n\n if (Either.isRight(baseBranchResult) && baseBranchResult.right !== null) {\n const baseBranchHash = baseBranchResult.right.hash;\n const commitsResult = yield* Effect.either(\n gitService.getCommitsBetweenBranches(\n projectPath,\n baseBranchHash,\n \"HEAD\",\n ),\n );\n\n if (Either.isRight(commitsResult)) {\n commits = commitsResult.right.data;\n }\n }\n\n return {\n response: {\n success: true,\n data: {\n baseBranch: baseBranchDetails ?? null,\n currentBranch: currentBranchDetails ?? null,\n head: currentBranchDetails?.commit ?? null,\n commits,\n },\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getGitDiff,\n commitFiles,\n pushCommits,\n commitAndPush,\n getCurrentRevisions,\n };\n});\n\n// Helper functions for push error handling\nfunction parsePushError(stderr: string): PushErrorCode {\n if (stderr.includes(\"no upstream\") || stderr.includes(\"has no upstream\")) {\n return \"NO_UPSTREAM\";\n }\n if (\n stderr.includes(\"non-fast-forward\") ||\n stderr.includes(\"failed to push some refs\")\n ) {\n return \"NON_FAST_FORWARD\";\n }\n if (\n stderr.includes(\"Authentication failed\") ||\n stderr.includes(\"Permission denied\")\n ) {\n return \"AUTH_FAILED\";\n }\n if (stderr.includes(\"Could not resolve host\")) {\n return \"NETWORK_ERROR\";\n }\n if (stderr.includes(\"timeout\") || stderr.includes(\"timed out\")) {\n return \"TIMEOUT\";\n }\n return \"GIT_COMMAND_ERROR\";\n}\n\nfunction getPushErrorMessage(code: PushErrorCode): string {\n const messages: Record<PushErrorCode, string> = {\n NO_UPSTREAM:\n \"Branch has no upstream. Run: git push --set-upstream origin <branch>\",\n NON_FAST_FORWARD: \"Remote has diverged. Pull changes first before pushing.\",\n AUTH_FAILED:\n \"Authentication failed. Check your SSH keys or HTTPS credentials.\",\n NETWORK_ERROR: \"Network error. Check your internet connection.\",\n TIMEOUT:\n \"Push operation timed out after 60 seconds. Retry or check network.\",\n GIT_COMMAND_ERROR: \"Git command failed. Check details.\",\n PROJECT_NOT_FOUND: \"Project not found.\",\n NOT_A_REPOSITORY: \"Not a git repository.\",\n };\n return messages[code];\n}\n\nexport type IGitController = InferEffect<typeof LayerImpl>;\nexport class GitController extends Context.Tag(\"GitController\")<\n GitController,\n IGitController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport parseGitDiff, {\n type AnyChunk,\n type AnyFileChange,\n} from \"parse-git-diff\";\nimport {\n executeGitCommand,\n parseLines,\n stripAnsiColors,\n} from \"../functions/utils\";\nimport type {\n GitComparisonResult,\n GitDiff,\n GitDiffFile,\n GitDiffHunk,\n GitDiffLine,\n GitResult,\n} from \"../types\";\n\n/**\n * Convert parse-git-diff file change to GitDiffFile\n */\nfunction convertToGitDiffFile(\n fileChange: AnyFileChange,\n fileStats: Map<string, { additions: number; deletions: number }>,\n): GitDiffFile {\n let filePath: string;\n let status: GitDiffFile[\"status\"];\n let oldPath: string | undefined;\n\n switch (fileChange.type) {\n case \"AddedFile\":\n filePath = fileChange.path;\n status = \"added\";\n break;\n case \"DeletedFile\":\n filePath = fileChange.path;\n status = \"deleted\";\n break;\n case \"RenamedFile\":\n filePath = fileChange.pathAfter;\n oldPath = fileChange.pathBefore;\n status = \"renamed\";\n break;\n case \"ChangedFile\":\n filePath = fileChange.path;\n status = \"modified\";\n break;\n default:\n // Fallback for any unknown types\n filePath = \"\";\n status = \"modified\";\n }\n\n // Get stats from numstat\n const stats = fileStats.get(filePath) ||\n fileStats.get(oldPath || \"\") || { additions: 0, deletions: 0 };\n\n return {\n filePath,\n status,\n additions: stats.additions,\n deletions: stats.deletions,\n oldPath,\n };\n}\n\n/**\n * Convert parse-git-diff chunk to GitDiffHunk\n */\nfunction convertToGitDiffHunk(chunk: AnyChunk): GitDiffHunk {\n if (chunk.type !== \"Chunk\") {\n // For non-standard chunks, return empty hunk\n return {\n oldStart: 0,\n oldCount: 0,\n newStart: 0,\n newCount: 0,\n header: \"\",\n lines: [],\n };\n }\n\n const lines: GitDiffLine[] = [];\n\n for (const change of chunk.changes) {\n let line: GitDiffLine;\n\n switch (change.type) {\n case \"AddedLine\":\n line = {\n type: \"added\",\n content: change.content,\n newLineNumber: change.lineAfter,\n };\n break;\n case \"DeletedLine\":\n line = {\n type: \"deleted\",\n content: change.content,\n oldLineNumber: change.lineBefore,\n };\n break;\n case \"UnchangedLine\":\n line = {\n type: \"context\",\n content: change.content,\n oldLineNumber: change.lineBefore,\n newLineNumber: change.lineAfter,\n };\n break;\n case \"MessageLine\":\n // This is likely a hunk header or context line\n line = {\n type: \"context\",\n content: change.content,\n };\n break;\n default:\n // Fallback for unknown line types\n line = {\n type: \"context\",\n content: \"\",\n };\n }\n\n lines.push(line);\n }\n\n return {\n oldStart: chunk.fromFileRange.start,\n oldCount: chunk.fromFileRange.lines,\n newStart: chunk.toFileRange.start,\n newCount: chunk.toFileRange.lines,\n header: `@@ -${chunk.fromFileRange.start},${chunk.fromFileRange.lines} +${chunk.toFileRange.start},${chunk.toFileRange.lines} @@${chunk.context ? ` ${chunk.context}` : \"\"}`,\n lines,\n };\n}\n\nconst extractRef = (refText: string) => {\n const [group, ref] = refText.split(\":\");\n if (group === undefined || ref === undefined) {\n if (refText === \"HEAD\") {\n return \"HEAD\";\n }\n\n if (refText === \"working\") {\n return undefined;\n }\n\n throw new Error(`Invalid ref text: ${refText}`);\n }\n\n return ref;\n};\n\n/**\n * Get untracked files using git status\n */\nasync function getUntrackedFiles(cwd: string): Promise<GitResult<string[]>> {\n const statusResult = await executeGitCommand(\n [\"status\", \"--untracked-files=all\", \"--short\"],\n cwd,\n );\n\n if (!statusResult.success) {\n return statusResult;\n }\n\n try {\n const untrackedFiles = parseLines(statusResult.data)\n .map((line) => stripAnsiColors(line)) // Remove ANSI color codes first\n .filter((line) => line.startsWith(\"??\"))\n .map((line) => line.slice(3));\n\n return {\n success: true,\n data: untrackedFiles,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: \"PARSE_ERROR\",\n message: `Failed to parse status output: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n };\n }\n}\n\n/**\n * Create artificial diff for an untracked file (all lines as additions)\n */\nasync function createUntrackedFileDiff(\n cwd: string,\n filePath: string,\n): Promise<GitDiff | null> {\n try {\n const fullPath = resolve(cwd, filePath);\n const content = await readFile(fullPath, \"utf8\");\n const lines = content.split(\"\\n\");\n\n const diffLines: GitDiffLine[] = lines.map((line, index) => ({\n type: \"added\" as const,\n content: line,\n newLineNumber: index + 1,\n }));\n\n const file: GitDiffFile = {\n filePath,\n status: \"added\",\n additions: lines.length,\n deletions: 0,\n };\n\n const hunk: GitDiffHunk = {\n oldStart: 0,\n oldCount: 0,\n newStart: 1,\n newCount: lines.length,\n header: `@@ -0,0 +1,${lines.length} @@`,\n lines: diffLines,\n };\n\n return {\n file,\n hunks: [hunk],\n };\n } catch (error) {\n // Skip files that can't be read (e.g., binary files, permission errors)\n console.warn(`Failed to read untracked file ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Get Git diff between two references (branches, commits, tags)\n */\nexport const getDiff = async (\n cwd: string,\n fromRefText: string,\n toRefText: string,\n): Promise<GitResult<GitComparisonResult>> => {\n const fromRef = extractRef(fromRefText);\n const toRef = extractRef(toRefText);\n\n if (fromRef === toRef) {\n return {\n success: true,\n data: {\n diffs: [],\n files: [],\n summary: {\n totalFiles: 0,\n totalAdditions: 0,\n totalDeletions: 0,\n },\n },\n };\n }\n\n if (fromRef === undefined) {\n throw new Error(`Invalid fromRef: ${fromRefText}`);\n }\n\n const commandArgs = toRef === undefined ? [fromRef] : [fromRef, toRef];\n\n // Get diff with numstat for file statistics\n const numstatResult = await executeGitCommand(\n [\"diff\", \"--numstat\", ...commandArgs],\n cwd,\n );\n\n if (!numstatResult.success) {\n return numstatResult;\n }\n\n // Get diff with full content\n const diffResult = await executeGitCommand(\n [\"diff\", \"--unified=5\", ...commandArgs],\n cwd,\n );\n\n if (!diffResult.success) {\n return diffResult;\n }\n\n try {\n // Parse numstat output to get file statistics\n const fileStats = new Map<\n string,\n { additions: number; deletions: number }\n >();\n const numstatLines = parseLines(numstatResult.data);\n\n for (const line of numstatLines) {\n const parts = line.split(\"\\t\");\n if (parts.length >= 3 && parts[0] && parts[1] && parts[2]) {\n const additions = parts[0] === \"-\" ? 0 : parseInt(parts[0], 10);\n const deletions = parts[1] === \"-\" ? 0 : parseInt(parts[1], 10);\n const filePath = parts[2];\n fileStats.set(filePath, { additions, deletions });\n }\n }\n\n // Parse diff output using parse-git-diff\n const parsedDiff = parseGitDiff(diffResult.data);\n\n const files: GitDiffFile[] = [];\n const diffs: GitDiff[] = [];\n let totalAdditions = 0;\n let totalDeletions = 0;\n\n for (const fileChange of parsedDiff.files) {\n // Convert to GitDiffFile format\n const file = convertToGitDiffFile(fileChange, fileStats);\n files.push(file);\n\n // Convert chunks to hunks\n const hunks: GitDiffHunk[] = [];\n for (const chunk of fileChange.chunks) {\n const hunk = convertToGitDiffHunk(chunk);\n hunks.push(hunk);\n }\n\n diffs.push({\n file,\n hunks,\n });\n\n totalAdditions += file.additions;\n totalDeletions += file.deletions;\n }\n\n // Include untracked files when comparing to working directory\n if (toRef === undefined) {\n const untrackedResult = await getUntrackedFiles(cwd);\n if (untrackedResult.success) {\n for (const untrackedFile of untrackedResult.data) {\n const untrackedDiff = await createUntrackedFileDiff(\n cwd,\n untrackedFile,\n );\n if (untrackedDiff) {\n files.push(untrackedDiff.file);\n diffs.push(untrackedDiff);\n totalAdditions += untrackedDiff.file.additions;\n }\n }\n }\n }\n\n return {\n success: true,\n data: {\n files,\n diffs,\n summary: {\n totalFiles: files.length,\n totalAdditions,\n totalDeletions,\n },\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: \"PARSE_ERROR\",\n message: `Failed to parse diff: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n };\n }\n};\n\n/**\n * Compare between two branches (shorthand for getDiff)\n */\nexport async function compareBranches(\n cwd: string,\n baseBranch: string,\n targetBranch: string,\n): Promise<GitResult<GitComparisonResult>> {\n return getDiff(cwd, baseBranch, targetBranch);\n}\n", "import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { GitError, GitResult } from \"../types\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Execute a git command in the specified directory\n */\nexport async function executeGitCommand(\n args: string[],\n cwd: string,\n): Promise<GitResult<string>> {\n try {\n // Check if the directory exists\n if (!existsSync(cwd)) {\n return {\n success: false,\n error: {\n code: \"NOT_A_REPOSITORY\",\n message: `Directory does not exist: ${cwd}`,\n command: `git ${args.join(\" \")}`,\n },\n };\n }\n\n // Git will search parent directories for .git, so we don't need to check explicitly\n\n const { stdout } = await execFileAsync(\"git\", args, {\n cwd,\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n timeout: 30000, // 30 second timeout\n });\n\n return {\n success: true,\n data: stdout,\n };\n } catch (error: unknown) {\n const err = error as { code?: string; stderr?: string; message?: string };\n\n let errorCode: GitError[\"code\"] = \"COMMAND_FAILED\";\n let errorMessage = err.message || \"Unknown git command error\";\n\n if (err.stderr) {\n if (err.stderr.includes(\"not a git repository\")) {\n errorCode = \"NOT_A_REPOSITORY\";\n errorMessage = \"Not a git repository\";\n } else if (err.stderr.includes(\"unknown revision\")) {\n errorCode = \"BRANCH_NOT_FOUND\";\n errorMessage = \"Branch or commit not found\";\n }\n }\n\n return {\n success: false,\n error: {\n code: errorCode,\n message: errorMessage,\n command: `git ${args.join(\" \")}`,\n stderr: err.stderr,\n },\n };\n }\n}\n\n/**\n * Check if a directory is a git repository\n */\nexport function isGitRepository(cwd: string): boolean {\n return existsSync(cwd) && existsSync(resolve(cwd, \".git\"));\n}\n\n/**\n * Remove ANSI color codes from a string\n */\nexport function stripAnsiColors(text: string): string {\n // ANSI escape sequence pattern: \\x1B[...m\n // biome-ignore lint/suspicious/noControlCharactersInRegex: this is a valid regex\n return text.replace(/\\x1B\\[[0-9;]*m/g, \"\");\n}\n\n/**\n * Safely parse git command output that might be empty\n */\nexport function parseLines(output: string): string[] {\n return output\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n}\n\n/**\n * Parse git status porcelain output\n */\nexport function parseStatusLine(line: string): {\n status: string;\n filePath: string;\n oldPath?: string;\n} {\n const status = line.slice(0, 2);\n const filePath = line.slice(3);\n\n // Handle renamed files (R old -> new)\n if (status.startsWith(\"R\")) {\n const parts = filePath.split(\" -> \");\n return {\n status,\n filePath: parts[1] || filePath,\n oldPath: parts[0],\n };\n }\n\n return { status, filePath };\n}\n\n/**\n * Convert git status code to readable status\n */\nexport function getFileStatus(\n statusCode: string,\n): \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"copied\" {\n const firstChar = statusCode[0];\n\n switch (firstChar) {\n case \"A\":\n return \"added\";\n case \"M\":\n return \"modified\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n case \"C\":\n return \"copied\";\n default:\n return \"modified\";\n }\n}\n", "import { Command, FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Duration, Effect, Either, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EnvService } from \"../../platform/services/EnvService\";\nimport { parseGitBranchesOutput } from \"../functions/parseGitBranchesOutput\";\nimport { parseGitCommitsOutput } from \"../functions/parseGitCommitsOutput\";\n\nclass NotARepositoryError extends Data.TaggedError(\"NotARepositoryError\")<{\n cwd: string;\n}> {}\n\nclass GitCommandError extends Data.TaggedError(\"GitCommandError\")<{\n cwd: string;\n command: string;\n}> {}\n\nclass DetachedHeadError extends Data.TaggedError(\"DetachedHeadError\")<{\n cwd: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n const execGitCommand = (args: string[], cwd: string) =>\n Effect.gen(function* () {\n const absoluteCwd = path.resolve(cwd);\n\n if (!(yield* fs.exists(absoluteCwd))) {\n return yield* Effect.fail(\n new NotARepositoryError({ cwd: absoluteCwd }),\n );\n }\n\n // Git will search parent directories for .git, so we don't need to check explicitly\n\n const command = Command.make(\"git\", ...args).pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n );\n\n const result = yield* Effect.either(Command.string(command));\n\n if (Either.isLeft(result)) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git ${args.join(\" \")}`,\n }),\n );\n }\n\n return result.right;\n });\n\n const getBranches = (cwd: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand([\"branch\", \"-vv\", \"--all\"], cwd);\n return parseGitBranchesOutput(result);\n });\n\n const getCurrentBranch = (cwd: string) =>\n Effect.gen(function* () {\n const currentBranch = yield* execGitCommand(\n [\"branch\", \"--show-current\"],\n cwd,\n ).pipe(Effect.map((result) => result.trim()));\n\n if (currentBranch === \"\") {\n return yield* Effect.fail(new DetachedHeadError({ cwd }));\n }\n\n return currentBranch;\n });\n\n const branchExists = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n const result = yield* Effect.either(\n execGitCommand([\"branch\", \"--exists\", branchName], cwd),\n );\n\n if (Either.isLeft(result)) {\n return false;\n }\n\n return true;\n });\n\n const getCommits = (cwd: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\n \"log\",\n \"--oneline\",\n \"-n\",\n \"20\",\n \"--format=%H|%s|%an|%ad\",\n \"--date=iso\",\n ],\n cwd,\n );\n return parseGitCommitsOutput(result);\n });\n\n const stageFiles = (cwd: string, files: string[]) =>\n Effect.gen(function* () {\n if (files.length === 0) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd,\n command: \"git add (no files)\",\n }),\n );\n }\n\n const result = yield* execGitCommand([\"add\", ...files], cwd);\n return result;\n });\n\n const commit = (cwd: string, message: string) =>\n Effect.gen(function* () {\n const trimmedMessage = message.trim();\n if (trimmedMessage.length === 0) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd,\n command: \"git commit (empty message)\",\n }),\n );\n }\n\n console.log(\n \"[GitService.commit] Committing with message:\",\n trimmedMessage,\n \"in\",\n cwd,\n );\n const result = yield* execGitCommand(\n [\"commit\", \"-m\", trimmedMessage],\n cwd,\n );\n console.log(\"[GitService.commit] Commit result:\", result);\n\n // Parse commit SHA from output\n // Git commit output format: \"[branch SHA] commit message\"\n const shaMatch = result.match(/\\[.+\\s+([a-f0-9]+)\\]/);\n console.log(\"[GitService.commit] SHA match:\", shaMatch);\n if (shaMatch?.[1]) {\n console.log(\n \"[GitService.commit] Returning SHA from match:\",\n shaMatch[1],\n );\n return shaMatch[1];\n }\n\n // Fallback: Get SHA from git log\n console.log(\n \"[GitService.commit] No SHA match, falling back to rev-parse HEAD\",\n );\n const sha = yield* execGitCommand([\"rev-parse\", \"HEAD\"], cwd);\n console.log(\n \"[GitService.commit] Returning SHA from rev-parse:\",\n sha.trim(),\n );\n return sha.trim();\n });\n\n const push = (cwd: string) =>\n Effect.gen(function* () {\n const branch = yield* getCurrentBranch(cwd);\n\n const absoluteCwd = path.resolve(cwd);\n\n // Use Command.exitCode to check success, as git push writes to stderr even on success\n const command = Command.make(\"git\", \"push\", \"origin\", \"HEAD\").pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n );\n\n const exitCodeResult = yield* Effect.either(\n Command.exitCode(command).pipe(Effect.timeout(Duration.seconds(60))),\n );\n\n if (Either.isLeft(exitCodeResult)) {\n console.log(\"[GitService.push] Command failed or timeout\");\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: \"git push origin HEAD (timeout after 60s)\",\n }),\n );\n }\n\n const exitCode = exitCodeResult.right;\n console.log(\"[GitService.push] Exit code:\", exitCode);\n\n if (exitCode !== 0) {\n // Get stderr for error details\n const stderrLines = yield* Command.lines(\n Command.make(\"git\", \"push\", \"origin\", \"HEAD\").pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n Command.stderr(\"inherit\"),\n ),\n ).pipe(Effect.orElse(() => Effect.succeed([])));\n\n const stderr = Array.from(stderrLines).join(\"\\n\");\n console.log(\"[GitService.push] Failed with stderr:\", stderr);\n\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git push origin HEAD - ${stderr}`,\n }),\n );\n }\n\n console.log(\"[GitService.push] Push succeeded\");\n return { branch, output: \"success\" };\n });\n\n const getBranchHash = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand([\"rev-parse\", branchName], cwd).pipe(\n Effect.map((output) => output.trim().split(\"\\n\")[0] ?? null),\n );\n return result;\n });\n\n const getBranchNamesByCommitHash = (cwd: string, hash: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\"branch\", \"--contains\", hash, \"--format=%(refname:short)\"],\n cwd,\n );\n return result\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\");\n });\n\n const compareCommitHash = (\n cwd: string,\n targetHash: string,\n compareHash: string,\n ) =>\n Effect.gen(function* () {\n const aheadResult = yield* execGitCommand(\n [\"rev-list\", `${targetHash}..${compareHash}`],\n cwd,\n );\n const aheadCounts = aheadResult\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\").length;\n\n const behindResult = yield* execGitCommand(\n [\"rev-list\", `${compareHash}..${targetHash}`],\n cwd,\n );\n const behindCounts = behindResult\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\").length;\n\n if (aheadCounts === 0 && behindCounts === 0) {\n return \"un-related\" as const;\n }\n\n if (aheadCounts > 0) {\n return \"ahead\" as const;\n }\n\n if (behindCounts > 0) {\n return \"behind\" as const;\n }\n\n return \"un-related\" as const;\n });\n\n const getCommitsWithParent = (\n cwd: string,\n options: { offset: number; limit: number },\n ) =>\n Effect.gen(function* () {\n const { offset, limit } = options;\n const result = yield* execGitCommand(\n [\n \"log\",\n \"-n\",\n String(limit),\n \"--skip\",\n String(offset),\n \"--graph\",\n \"--pretty=format:%h %p\",\n ],\n cwd,\n );\n\n const lines = result\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\");\n\n const commits: Array<{ current: string; parent: string }> = [];\n\n for (const line of lines) {\n const match = /^\\* (?<current>.+) (?<parent>.+)$/.exec(line);\n if (match?.groups?.current && match.groups.parent) {\n commits.push({\n current: match.groups.current,\n parent: match.groups.parent,\n });\n }\n }\n\n return commits;\n });\n\n const findBaseBranch = (cwd: string, targetBranch: string) =>\n Effect.gen(function* () {\n let offset = 0;\n const limit = 20;\n\n while (offset < 100) {\n const commits = yield* getCommitsWithParent(cwd, { offset, limit });\n\n for (const commit of commits) {\n const branchNames = yield* getBranchNamesByCommitHash(\n cwd,\n commit.current,\n );\n\n if (!branchNames.includes(targetBranch)) {\n continue;\n }\n\n const otherBranchNames = branchNames.filter(\n (branchName) => branchName !== targetBranch,\n );\n\n if (otherBranchNames.length === 0) {\n continue;\n }\n\n for (const branchName of otherBranchNames) {\n const comparison = yield* compareCommitHash(\n cwd,\n targetBranch,\n branchName,\n );\n\n if (comparison === \"behind\") {\n return { branch: branchName, hash: commit.current };\n }\n }\n }\n\n offset += limit;\n }\n\n return null;\n });\n\n const getCommitsBetweenBranches = (\n cwd: string,\n baseBranch: string,\n targetBranch: string,\n ) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\n \"log\",\n `${baseBranch}..${targetBranch}`,\n \"--format=%H|%s|%an|%ad\",\n \"--date=iso\",\n ],\n cwd,\n );\n\n return parseGitCommitsOutput(result);\n });\n\n return {\n getBranches,\n getCurrentBranch,\n branchExists,\n getCommits,\n stageFiles,\n commit,\n push,\n getBranchHash,\n getBranchNamesByCommitHash,\n compareCommitHash,\n getCommitsWithParent,\n findBaseBranch,\n getCommitsBetweenBranches,\n };\n});\n\nexport type IGitService = InferEffect<typeof LayerImpl>;\n\nexport class GitService extends Context.Tag(\"GitService\")<\n GitService,\n IGitService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { GitBranch } from \"../types\";\nimport { parseLines } from \"./utils\";\n\n/**\n * Get all branches (local and remote) in the repository\n */\nexport const parseGitBranchesOutput = (output: string) => {\n const lines = parseLines(output);\n const branches: GitBranch[] = [];\n const seenBranches = new Set<string>();\n\n for (const line of lines) {\n // Parse branch line format: \" main abc1234 [origin/main: ahead 1] Commit message\"\n const match = line.match(\n /^(\\*?\\s*)([^\\s]+)\\s+([a-f0-9]+)(?:\\s+\\[([^\\]]+)\\])?\\s*(.*)/,\n );\n if (!match) continue;\n\n const [, prefix, name, commit, tracking] = match;\n if (!prefix || !name || !commit) continue;\n\n const current = prefix.includes(\"*\");\n\n // Skip remote tracking branches if we already have the local branch\n const cleanName = name.replace(\"remotes/origin/\", \"\");\n if (name.startsWith(\"remotes/origin/\") && seenBranches.has(cleanName)) {\n continue;\n }\n\n // Parse tracking information\n let remote: string | undefined;\n let ahead: number | undefined;\n let behind: number | undefined;\n\n if (tracking) {\n const remoteMatch = tracking.match(/^([^:]+)/);\n if (remoteMatch?.[1]) {\n remote = remoteMatch[1];\n }\n\n const aheadMatch = tracking.match(/ahead (\\d+)/);\n const behindMatch = tracking.match(/behind (\\d+)/);\n if (aheadMatch?.[1]) ahead = parseInt(aheadMatch[1], 10);\n if (behindMatch?.[1]) behind = parseInt(behindMatch[1], 10);\n }\n\n branches.push({\n name: cleanName,\n current,\n remote,\n commit,\n ahead,\n behind,\n });\n\n seenBranches.add(cleanName);\n }\n\n return {\n success: true,\n data: branches,\n };\n};\n", "import { parseLines } from \"../functions/utils\";\nimport type { GitCommit } from \"../types\";\n\n/**\n * Get the last 20 commits from the current branch\n */\nexport const parseGitCommitsOutput = (output: string) => {\n const lines = parseLines(output);\n const commits: GitCommit[] = [];\n\n for (const line of lines) {\n // Parse commit line format: \"sha|message|author|date\"\n const parts = line.split(\"|\");\n if (parts.length < 4) continue;\n\n const [sha, message, author, date] = parts;\n if (!sha || !message || !author || !date) continue;\n\n commits.push({\n sha: sha.trim(),\n message: message.trim(),\n author: author.trim(),\n date: date.trim(),\n });\n }\n\n return {\n success: true,\n data: commits,\n };\n};\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { computeClaudeProjectFilePath } from \"../../claude-code/functions/computeClaudeProjectFilePath\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { encodeProjectId } from \"../functions/id\";\nimport { ProjectRepository } from \"../infrastructure/ProjectRepository\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const userConfigService = yield* UserConfigService;\n const sessionRepository = yield* SessionRepository;\n const context = yield* ApplicationContext;\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getProjects = () =>\n Effect.gen(function* () {\n const { projects } = yield* projectRepository.getProjects();\n return {\n status: 200,\n response: { projects },\n } as const satisfies ControllerResponse;\n });\n\n const getProject = (options: { projectId: string; cursor?: string }) =>\n Effect.gen(function* () {\n const { projectId, cursor } = options;\n\n const userConfig = yield* userConfigService.getUserConfig();\n\n const { project } = yield* projectRepository.getProject(projectId);\n const { sessions } = yield* sessionRepository.getSessions(projectId, {\n cursor,\n });\n\n let filteredSessions = sessions;\n\n // Filter sessions based on hideNoUserMessageSession setting\n if (userConfig.hideNoUserMessageSession) {\n filteredSessions = filteredSessions.filter((session) => {\n return session.meta.firstUserMessage !== null;\n });\n }\n\n // Unify sessions with same title if unifySameTitleSession is enabled\n if (userConfig.unifySameTitleSession) {\n const sessionMap = new Map<string, (typeof filteredSessions)[0]>();\n\n for (const session of filteredSessions) {\n // Generate title for comparison\n const title =\n session.meta.firstUserMessage !== null\n ? (() => {\n const cmd = session.meta.firstUserMessage;\n switch (cmd.kind) {\n case \"command\":\n return cmd.commandArgs === undefined\n ? cmd.commandName\n : `${cmd.commandName} ${cmd.commandArgs}`;\n case \"local-command\":\n return cmd.stdout;\n case \"text\":\n return cmd.content;\n default:\n return session.id;\n }\n })()\n : session.id;\n\n const existingSession = sessionMap.get(title);\n if (existingSession) {\n // Keep the session with the latest modification date\n if (session.lastModifiedAt && existingSession.lastModifiedAt) {\n if (session.lastModifiedAt > existingSession.lastModifiedAt) {\n sessionMap.set(title, session);\n }\n } else if (\n session.lastModifiedAt &&\n !existingSession.lastModifiedAt\n ) {\n sessionMap.set(title, session);\n }\n // If no modification dates, keep the existing one\n } else {\n sessionMap.set(title, session);\n }\n }\n\n filteredSessions = Array.from(sessionMap.values());\n }\n\n const hasMore = sessions.length >= 20;\n return {\n status: 200,\n response: {\n project,\n sessions: filteredSessions,\n nextCursor: hasMore ? sessions.at(-1)?.id : undefined,\n },\n } as const satisfies ControllerResponse;\n });\n\n const getProjectLatestSession = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n const { sessions } = yield* sessionRepository.getSessions(projectId, {\n maxCount: 1,\n });\n\n return {\n status: 200,\n response: {\n latestSession: sessions[0] ?? null,\n },\n } as const satisfies ControllerResponse;\n });\n\n const createProject = (options: { projectPath: string }) =>\n Effect.gen(function* () {\n const { projectPath } = options;\n\n // No project validation needed - startTask will create a new project\n // if it doesn't exist when running /init command\n const claudeProjectFilePath = yield* computeClaudeProjectFilePath({\n projectPath,\n claudeProjectsDirPath: context.claudeCodePaths.claudeProjectsDirPath,\n });\n const projectId = encodeProjectId(claudeProjectFilePath);\n const userConfig = yield* userConfigService.getUserConfig();\n\n // Check if CLAUDE.md exists in the project directory\n const claudeMdPath = path.join(projectPath, \"CLAUDE.md\");\n const claudeMdExists = yield* fileSystem.exists(claudeMdPath);\n\n const result = yield* claudeCodeLifeCycleService.startTask({\n baseSession: {\n cwd: projectPath,\n projectId,\n sessionId: undefined,\n },\n userConfig,\n input: {\n text: claudeMdExists ? \"describe this project\" : \"/init\",\n },\n });\n\n const { sessionId } = yield* result.yieldSessionFileCreated();\n\n return {\n status: 201,\n response: {\n projectId,\n sessionId,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getProjects,\n getProject,\n getProjectLatestSession,\n createProject,\n };\n});\n\nexport type IProjectController = InferEffect<typeof LayerImpl>;\nexport class ProjectController extends Context.Tag(\"ProjectController\")<\n ProjectController,\n IProjectController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Path } from \"@effect/platform\";\nimport { Effect } from \"effect\";\n\nexport const computeClaudeProjectFilePath = (options: {\n projectPath: string;\n claudeProjectsDirPath: string;\n}) =>\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const { projectPath, claudeProjectsDirPath } = options;\n\n return path.join(\n claudeProjectsDirPath,\n projectPath.replace(/\\/$/, \"\").replace(/\\//g, \"-\"),\n );\n });\n", "import { homedir } from \"node:os\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { type SchedulerConfig, schedulerConfigSchema } from \"./schema\";\n\nclass ConfigFileNotFoundError extends Data.TaggedError(\n \"ConfigFileNotFoundError\",\n)<{\n readonly path: string;\n}> {}\n\nclass ConfigParseError extends Data.TaggedError(\"ConfigParseError\")<{\n readonly path: string;\n readonly cause: unknown;\n}> {}\n\nconst CONFIG_DIR = \"scheduler\";\nconst CONFIG_FILE = \"schedules.json\";\n\n// Service to provide base directory (for testing)\nexport class SchedulerConfigBaseDir extends Context.Tag(\n \"SchedulerConfigBaseDir\",\n)<SchedulerConfigBaseDir, string>() {\n static Live = Layer.succeed(this, `${homedir()}/.claude-code-viewer`);\n}\n\nexport const getConfigPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const baseDir = yield* SchedulerConfigBaseDir;\n return path.join(baseDir, CONFIG_DIR, CONFIG_FILE);\n});\n\nexport const readConfig = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const configPath = yield* getConfigPath;\n\n const exists = yield* fs.exists(configPath);\n if (!exists) {\n return yield* Effect.fail(\n new ConfigFileNotFoundError({ path: configPath }),\n );\n }\n\n const content = yield* fs.readFileString(configPath);\n\n const jsonResult = yield* Effect.try({\n try: () => JSON.parse(content),\n catch: (error) =>\n new ConfigParseError({\n path: configPath,\n cause: error,\n }),\n });\n\n const parsed = schedulerConfigSchema.safeParse(jsonResult);\n\n if (!parsed.success) {\n return yield* Effect.fail(\n new ConfigParseError({\n path: configPath,\n cause: parsed.error,\n }),\n );\n }\n\n return parsed.data;\n});\n\nexport const writeConfig = (config: SchedulerConfig) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const configPath = yield* getConfigPath;\n const configDir = path.dirname(configPath);\n\n yield* fs.makeDirectory(configDir, { recursive: true });\n\n const content = JSON.stringify(config, null, 2);\n yield* fs.writeFileString(configPath, content);\n });\n\nexport const initializeConfig = Effect.gen(function* () {\n const result = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n Effect.gen(function* () {\n const initialConfig: SchedulerConfig = { jobs: [] };\n yield* writeConfig(initialConfig);\n return initialConfig;\n }),\n ConfigParseError: () =>\n Effect.gen(function* () {\n const initialConfig: SchedulerConfig = { jobs: [] };\n yield* writeConfig(initialConfig);\n return initialConfig;\n }),\n }),\n );\n\n return result;\n});\n", "import { z } from \"zod\";\n\n// Concurrency policy (for cron jobs only)\nexport const concurrencyPolicySchema = z.enum([\"skip\", \"run\"]);\n\n// Schedule type discriminated union\nexport const cronScheduleSchema = z.object({\n type: z.literal(\"cron\"),\n expression: z.string(),\n concurrencyPolicy: concurrencyPolicySchema,\n});\n\nexport const reservedScheduleSchema = z.object({\n type: z.literal(\"reserved\"),\n reservedExecutionTime: z.iso.datetime(),\n});\n\nexport const scheduleSchema = z.discriminatedUnion(\"type\", [\n cronScheduleSchema,\n reservedScheduleSchema,\n]);\n\n// Message configuration\nexport const messageConfigSchema = z.object({\n content: z.string(),\n projectId: z.string(),\n baseSessionId: z.string().nullable(),\n});\n\n// Job status\nexport const jobStatusSchema = z.enum([\"success\", \"failed\"]);\n\n// Scheduler job\nexport const schedulerJobSchema = z.object({\n id: z.string(),\n name: z.string(),\n schedule: scheduleSchema,\n message: messageConfigSchema,\n enabled: z.boolean(),\n createdAt: z.string().datetime(),\n lastRunAt: z.string().datetime().nullable(),\n lastRunStatus: jobStatusSchema.nullable(),\n});\n\n// Config file schema\nexport const schedulerConfigSchema = z.object({\n jobs: z.array(schedulerJobSchema),\n});\n\n// Type exports\nexport type CronSchedule = z.infer<typeof cronScheduleSchema>;\nexport type ReservedSchedule = z.infer<typeof reservedScheduleSchema>;\nexport type Schedule = z.infer<typeof scheduleSchema>;\nexport type MessageConfig = z.infer<typeof messageConfigSchema>;\nexport type JobStatus = z.infer<typeof jobStatusSchema>;\nexport type ConcurrencyPolicy = z.infer<typeof concurrencyPolicySchema>;\nexport type SchedulerJob = z.infer<typeof schedulerJobSchema>;\nexport type SchedulerConfig = z.infer<typeof schedulerConfigSchema>;\n\n// New job creation schema (without runtime fields)\nexport const newSchedulerJobSchema = schedulerJobSchema\n .omit({\n id: true,\n createdAt: true,\n lastRunAt: true,\n lastRunStatus: true,\n })\n .extend({\n enabled: z.boolean().default(true),\n });\n\nexport type NewSchedulerJob = z.infer<typeof newSchedulerJobSchema>;\n\n// Job update schema (partial fields)\nexport const updateSchedulerJobSchema = schedulerJobSchema.partial().pick({\n name: true,\n schedule: true,\n message: true,\n enabled: true,\n});\n\nexport type UpdateSchedulerJob = z.infer<typeof updateSchedulerJobSchema>;\n", "import {\n Context,\n Cron,\n Data,\n Duration,\n Effect,\n Fiber,\n Layer,\n Ref,\n Schedule,\n} from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { initializeConfig, readConfig, writeConfig } from \"../config\";\nimport type {\n NewSchedulerJob,\n SchedulerConfig,\n SchedulerJob,\n UpdateSchedulerJob,\n} from \"../schema\";\nimport { calculateReservedDelay, executeJob } from \"./Job\";\n\nclass SchedulerJobNotFoundError extends Data.TaggedError(\n \"SchedulerJobNotFoundError\",\n)<{\n readonly jobId: string;\n}> {}\n\nclass InvalidCronExpressionError extends Data.TaggedError(\n \"InvalidCronExpressionError\",\n)<{\n readonly expression: string;\n readonly cause: unknown;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const fibersRef = yield* Ref.make<\n Map<string, Fiber.RuntimeFiber<unknown, unknown>>\n >(new Map());\n const runningJobsRef = yield* Ref.make<Set<string>>(new Set());\n\n const startJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const now = new Date();\n\n if (job.schedule.type === \"cron\") {\n const cronResult = Cron.parse(job.schedule.expression);\n\n if (cronResult._tag === \"Left\") {\n return yield* Effect.fail(\n new InvalidCronExpressionError({\n expression: job.schedule.expression,\n cause: cronResult.left,\n }),\n );\n }\n\n const cronSchedule = Schedule.cron(cronResult.right);\n\n // Wait for the next cron time before starting the repeat loop\n // This prevents immediate execution on job creation/update\n const fiber = yield* Effect.gen(function* () {\n // Get the next scheduled time\n const nextTime = Cron.next(cronResult.right, new Date());\n const nextDelay = Math.max(0, nextTime.getTime() - Date.now());\n\n // Wait until the next scheduled time\n yield* Effect.sleep(Duration.millis(nextDelay));\n\n // Then repeat on the cron schedule\n yield* Effect.repeat(runJobWithConcurrencyControl(job), cronSchedule);\n }).pipe(Effect.forkDaemon);\n\n yield* Ref.update(fibersRef, (fibers) =>\n new Map(fibers).set(job.id, fiber),\n );\n } else if (job.schedule.type === \"reserved\") {\n // For reserved jobs, skip scheduling if already executed\n if (job.lastRunStatus !== null) {\n return;\n }\n\n const delay = calculateReservedDelay(job, now);\n const delayDuration = Duration.millis(delay);\n\n const fiber = yield* Effect.delay(\n runJobWithConcurrencyControl(job),\n delayDuration,\n ).pipe(Effect.forkDaemon);\n\n yield* Ref.update(fibersRef, (fibers) =>\n new Map(fibers).set(job.id, fiber),\n );\n }\n });\n\n const runJobWithConcurrencyControl = (job: SchedulerJob) =>\n Effect.gen(function* () {\n // Check concurrency policy (only for cron jobs)\n if (\n job.schedule.type === \"cron\" &&\n job.schedule.concurrencyPolicy === \"skip\"\n ) {\n const runningJobs = yield* Ref.get(runningJobsRef);\n if (runningJobs.has(job.id)) {\n return;\n }\n }\n\n yield* Ref.update(runningJobsRef, (jobs) => new Set(jobs).add(job.id));\n\n // For reserved jobs, delete after execution without updating status\n if (job.schedule.type === \"reserved\") {\n const result = yield* executeJob(job).pipe(\n Effect.matchEffect({\n onSuccess: () => Effect.void,\n onFailure: () => Effect.void,\n }),\n );\n yield* Ref.update(runningJobsRef, (jobs) => {\n const newJobs = new Set(jobs);\n newJobs.delete(job.id);\n return newJobs;\n });\n\n // Delete reserved job after execution (skip fiber stop, just delete from config)\n yield* deleteJobFromConfig(job.id).pipe(\n Effect.catchAll((error) => {\n console.error(\n `[Scheduler] Failed to delete reserved job ${job.id}:`,\n error,\n );\n return Effect.void;\n }),\n );\n\n return result;\n }\n\n // For non-reserved jobs, update status\n const result = yield* executeJob(job).pipe(\n Effect.matchEffect({\n onSuccess: () =>\n updateJobStatus(job.id, \"success\", new Date().toISOString()),\n onFailure: () =>\n updateJobStatus(job.id, \"failed\", new Date().toISOString()),\n }),\n );\n\n yield* Ref.update(runningJobsRef, (jobs) => {\n const newJobs = new Set(jobs);\n newJobs.delete(job.id);\n return newJobs;\n });\n\n return result;\n });\n\n const updateJobStatus = (\n jobId: string,\n status: \"success\" | \"failed\",\n runAt: string,\n ) =>\n Effect.gen(function* () {\n const config = yield* readConfig;\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return;\n }\n\n const updatedJob: SchedulerJob = {\n ...job,\n lastRunAt: runAt,\n lastRunStatus: status,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.map((j) => (j.id === jobId ? updatedJob : j)),\n };\n\n yield* writeConfig(updatedConfig);\n });\n\n const stopJob = (jobId: string) =>\n Effect.gen(function* () {\n const fibers = yield* Ref.get(fibersRef);\n const fiber = fibers.get(jobId);\n\n if (fiber !== undefined) {\n yield* Fiber.interrupt(fiber);\n yield* Ref.update(fibersRef, (fibers) => {\n const newFibers = new Map(fibers);\n newFibers.delete(jobId);\n return newFibers;\n });\n }\n });\n\n const startScheduler = Effect.gen(function* () {\n yield* initializeConfig;\n const config = yield* readConfig;\n\n for (const job of config.jobs) {\n if (job.enabled) {\n yield* startJob(job);\n }\n }\n });\n\n const stopScheduler = Effect.gen(function* () {\n const fibers = yield* Ref.get(fibersRef);\n\n for (const fiber of fibers.values()) {\n yield* Fiber.interrupt(fiber);\n }\n\n yield* Ref.set(fibersRef, new Map());\n });\n\n const getJobs = () =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n return config.jobs;\n });\n\n const addJob = (newJob: NewSchedulerJob) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job: SchedulerJob = {\n ...newJob,\n id: ulid(),\n createdAt: new Date().toISOString(),\n lastRunAt: null,\n lastRunStatus: null,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: [...config.jobs, job],\n };\n\n yield* writeConfig(updatedConfig);\n\n if (job.enabled) {\n yield* startJob(job);\n }\n\n return job;\n });\n\n const updateJob = (jobId: string, updates: UpdateSchedulerJob) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n yield* stopJob(jobId);\n\n const updatedJob: SchedulerJob = {\n ...job,\n ...updates,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.map((j) => (j.id === jobId ? updatedJob : j)),\n };\n\n yield* writeConfig(updatedConfig);\n\n if (updatedJob.enabled) {\n yield* startJob(updatedJob);\n }\n\n return updatedJob;\n });\n\n const deleteJobFromConfig = (jobId: string) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.filter((j) => j.id !== jobId),\n };\n\n yield* writeConfig(updatedConfig);\n });\n\n const deleteJob = (jobId: string) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n yield* stopJob(jobId);\n yield* deleteJobFromConfig(jobId);\n });\n\n return {\n startScheduler,\n stopScheduler,\n getJobs,\n addJob,\n updateJob,\n deleteJob,\n };\n});\n\nexport type ISchedulerService = InferEffect<typeof LayerImpl>;\n\nexport class SchedulerService extends Context.Tag(\"SchedulerService\")<\n SchedulerService,\n ISchedulerService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Effect } from \"effect\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport type { SchedulerJob } from \"../schema\";\n\nexport const executeJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n const userConfigService = yield* UserConfigService;\n\n const { message } = job;\n const { project } = yield* projectRepository.getProject(message.projectId);\n const userConfig = yield* userConfigService.getUserConfig();\n\n if (project.meta.projectPath === null) {\n return yield* Effect.fail(\n new Error(`Project path not found for projectId: ${message.projectId}`),\n );\n }\n\n yield* lifeCycleService.startTask({\n baseSession: {\n cwd: project.meta.projectPath,\n projectId: message.projectId,\n sessionId: message.baseSessionId ?? undefined,\n },\n userConfig,\n input: {\n text: message.content,\n },\n });\n });\n\nexport const shouldExecuteJob = (job: SchedulerJob, now: Date): boolean => {\n if (!job.enabled) {\n return false;\n }\n\n if (job.schedule.type === \"cron\") {\n return true;\n }\n\n if (job.schedule.type === \"reserved\") {\n // Reserved jobs are one-time, skip if already executed\n if (job.lastRunStatus !== null) {\n return false;\n }\n\n const scheduledTime = new Date(job.schedule.reservedExecutionTime);\n return now >= scheduledTime;\n }\n\n return true;\n};\n\nexport const calculateReservedDelay = (\n job: SchedulerJob,\n now: Date,\n): number => {\n if (job.schedule.type !== \"reserved\") {\n throw new Error(\"Job schedule type must be reserved\");\n }\n\n const scheduledTime = new Date(job.schedule.reservedExecutionTime);\n const delay = scheduledTime.getTime() - now.getTime();\n\n return Math.max(0, delay);\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SchedulerService } from \"../domain/Scheduler\";\nimport type { NewSchedulerJob, UpdateSchedulerJob } from \"../schema\";\n\nconst LayerImpl = Effect.gen(function* () {\n const schedulerService = yield* SchedulerService;\n\n const getJobs = () =>\n Effect.gen(function* () {\n const jobs = yield* schedulerService.getJobs();\n return {\n response: jobs,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const addJob = (options: { job: NewSchedulerJob }) =>\n Effect.gen(function* () {\n const { job } = options;\n const result = yield* schedulerService.addJob(job);\n return {\n response: result,\n status: 201,\n } as const satisfies ControllerResponse;\n });\n\n const updateJob = (options: { id: string; job: UpdateSchedulerJob }) =>\n Effect.gen(function* () {\n const { id, job } = options;\n const result = yield* schedulerService\n .updateJob(id, job)\n .pipe(\n Effect.catchTag(\"SchedulerJobNotFoundError\", () =>\n Effect.succeed(null),\n ),\n );\n\n if (result === null) {\n return {\n response: { error: \"Job not found\" },\n status: 404,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const deleteJob = (options: { id: string }) =>\n Effect.gen(function* () {\n const { id } = options;\n const result = yield* schedulerService.deleteJob(id).pipe(\n Effect.catchTag(\"SchedulerJobNotFoundError\", () =>\n Effect.succeed(false),\n ),\n Effect.map(() => true),\n );\n\n if (!result) {\n return {\n response: { error: \"Job not found\" },\n status: 404,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getJobs,\n addJob,\n updateJob,\n deleteJob,\n };\n});\n\nexport type ISchedulerController = InferEffect<typeof LayerImpl>;\n\nexport class SchedulerController extends Context.Tag(\"SchedulerController\")<\n SchedulerController,\n ISchedulerController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SearchService } from \"../services/SearchService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const searchService = yield* SearchService;\n\n const search = (options: {\n query: string;\n limit?: number;\n projectId?: string;\n }) =>\n Effect.gen(function* () {\n const { query, limit, projectId } = options;\n\n if (query.trim().length < 2) {\n return {\n status: 400,\n response: {\n error: \"Query must contain at least 2 non-whitespace characters\",\n },\n } as const satisfies ControllerResponse;\n }\n\n const { results } = yield* searchService.search(\n query.trim(),\n limit,\n projectId,\n );\n\n return {\n status: 200,\n response: { results },\n } as const satisfies ControllerResponse;\n });\n\n return {\n search,\n };\n});\n\nexport type ISearchController = InferEffect<typeof LayerImpl>;\nexport class SearchController extends Context.Tag(\"SearchController\")<\n SearchController,\n ISearchController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport MiniSearch from \"minisearch\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { encodeProjectId } from \"../../project/functions/id\";\nimport { encodeSessionId } from \"../../session/functions/id\";\nimport { isRegularSessionFile } from \"../../session/functions/isRegularSessionFile\";\nimport { extractSearchableText } from \"../functions/extractSearchableText\";\n\nexport type SearchResult = {\n projectId: string;\n projectName: string;\n sessionId: string;\n conversationIndex: number;\n type: \"user\" | \"assistant\";\n snippet: string;\n timestamp: string;\n score: number;\n};\n\ntype SearchDocument = {\n id: string;\n projectId: string;\n projectName: string;\n sessionId: string;\n conversationIndex: number;\n type: \"user\" | \"assistant\";\n text: string;\n timestamp: string;\n};\n\ntype IndexCache = {\n index: MiniSearch<SearchDocument>;\n documents: Map<string, SearchDocument>;\n builtAt: number;\n};\n\nconst INDEX_TTL_MS = 60_000; // Cache index for 1 minute\nconst MAX_TEXT_LENGTH = 2000; // Limit indexed text to reduce memory\nconst MAX_ASSISTANT_TEXT_LENGTH = 500; // Assistant responses less important\n\nconst createMiniSearchIndex = () =>\n new MiniSearch<SearchDocument>({\n fields: [\"text\"],\n storeFields: [\"id\"],\n searchOptions: {\n fuzzy: 0.2,\n prefix: true,\n boost: { text: 1 },\n },\n });\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const context = yield* ApplicationContext;\n const indexCacheRef = yield* Ref.make<IndexCache | null>(null);\n\n const buildIndex = () =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = context.claudeCodePaths;\n\n const dirExists = yield* fs.exists(claudeProjectsDirPath);\n if (!dirExists) {\n return { index: createMiniSearchIndex(), documents: new Map() };\n }\n\n const projectEntries = yield* fs.readDirectory(claudeProjectsDirPath);\n const miniSearch = createMiniSearchIndex();\n\n const documentEffects = projectEntries.map((projectEntry) =>\n Effect.gen(function* () {\n const projectPath = path.resolve(claudeProjectsDirPath, projectEntry);\n const stat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (stat?.type !== \"Directory\") {\n return [];\n }\n\n const projectId = encodeProjectId(projectPath);\n const projectName = path.basename(projectPath);\n\n const sessionEntries = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([])));\n\n const sessionFiles = sessionEntries.filter(isRegularSessionFile);\n\n const sessionDocuments = yield* Effect.all(\n sessionFiles.map((sessionFile) =>\n Effect.gen(function* () {\n const sessionPath = path.resolve(projectPath, sessionFile);\n const sessionId = encodeSessionId(sessionPath);\n\n const content = yield* fs\n .readFileString(sessionPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (!content) return [];\n\n const conversations = parseJsonl(content);\n const documents: SearchDocument[] = [];\n\n for (let i = 0; i < conversations.length; i++) {\n const conversation = conversations[i];\n if (conversation === undefined) continue;\n if (\n conversation.type !== \"user\" &&\n conversation.type !== \"assistant\"\n ) {\n continue;\n }\n\n let text = extractSearchableText(conversation);\n if (!text || text.length < 3) continue;\n\n // Truncate text to reduce memory usage\n // User prompts get more space as they're more relevant\n const maxLen =\n conversation.type === \"user\"\n ? MAX_TEXT_LENGTH\n : MAX_ASSISTANT_TEXT_LENGTH;\n if (text.length > maxLen) {\n text = text.slice(0, maxLen);\n }\n\n documents.push({\n id: `${sessionId}:${i}`,\n projectId,\n projectName,\n sessionId,\n conversationIndex: i,\n type: conversation.type,\n text,\n timestamp:\n \"timestamp\" in conversation ? conversation.timestamp : \"\",\n });\n }\n\n return documents;\n }),\n ),\n { concurrency: 20 },\n );\n\n return sessionDocuments.flat();\n }),\n );\n\n const allDocuments = yield* Effect.all(documentEffects, {\n concurrency: 10,\n });\n const flatDocuments = allDocuments.flat();\n\n miniSearch.addAll(flatDocuments);\n\n const documentsMap = new Map<string, SearchDocument>();\n for (const doc of flatDocuments) {\n documentsMap.set(doc.id, doc);\n }\n\n return { index: miniSearch, documents: documentsMap };\n });\n\n const getIndex = () =>\n Effect.gen(function* () {\n const cached = yield* Ref.get(indexCacheRef);\n const now = Date.now();\n\n if (cached && now - cached.builtAt < INDEX_TTL_MS) {\n return { index: cached.index, documents: cached.documents };\n }\n\n const { index, documents } = yield* buildIndex();\n yield* Ref.set(indexCacheRef, { index, documents, builtAt: now });\n return { index, documents };\n });\n\n const search = (query: string, limit = 20, projectId?: string) =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = context.claudeCodePaths;\n\n const dirExists = yield* fs.exists(claudeProjectsDirPath);\n if (!dirExists) {\n return { results: [] as SearchResult[] };\n }\n\n const { index: miniSearch, documents } = yield* getIndex();\n\n const searchResults = miniSearch.search(query).slice(0, limit * 2); // fetch extra to account for filtering\n\n const results: SearchResult[] = [];\n for (const result of searchResults) {\n if (results.length >= limit) break;\n\n const doc = documents.get(String(result.id));\n if (!doc) continue;\n\n // Filter by projectId if provided\n if (projectId && doc.projectId !== projectId) continue;\n\n // Minor boost for user messages (your prompts)\n const score = doc.type === \"user\" ? result.score * 1.2 : result.score;\n\n const snippetLength = 150;\n const text = doc.text;\n const queryLower = query.toLowerCase();\n const textLower = text.toLowerCase();\n const matchIndex = textLower.indexOf(queryLower);\n\n let snippet: string;\n if (matchIndex !== -1) {\n const start = Math.max(0, matchIndex - 50);\n const end = Math.min(text.length, start + snippetLength);\n snippet =\n (start > 0 ? \"...\" : \"\") +\n text.slice(start, end) +\n (end < text.length ? \"...\" : \"\");\n } else {\n snippet =\n text.slice(0, snippetLength) +\n (text.length > snippetLength ? \"...\" : \"\");\n }\n\n results.push({\n projectId: doc.projectId,\n projectName: doc.projectName,\n sessionId: doc.sessionId,\n conversationIndex: doc.conversationIndex,\n type: doc.type,\n snippet,\n timestamp: doc.timestamp,\n score,\n });\n }\n\n return { results };\n });\n\n const invalidateIndex = () => Ref.set(indexCacheRef, null);\n\n return {\n search,\n invalidateIndex,\n };\n});\n\nexport type ISearchService = InferEffect<typeof LayerImpl>;\nexport class SearchService extends Context.Tag(\"SearchService\")<\n SearchService,\n ISearchService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { ExtendedConversation } from \"../../types\";\n\n/**\n * Extracts searchable text from a conversation entry.\n * Returns the user prompt or assistant response text.\n */\nexport const extractSearchableText = (\n conversation: ExtendedConversation,\n): string | null => {\n if (conversation.type === \"x-error\") {\n return null;\n }\n\n if (conversation.type === \"user\") {\n return extractUserText(conversation);\n }\n\n if (conversation.type === \"assistant\") {\n return extractAssistantText(conversation);\n }\n\n return null;\n};\n\nconst extractUserText = (\n entry: Extract<Conversation, { type: \"user\" }>,\n): string => {\n const content = entry.message.content;\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((item) => {\n if (typeof item === \"string\") return item;\n if (\"text\" in item && typeof item.text === \"string\") return item.text;\n return \"\";\n })\n .filter(Boolean)\n .join(\" \");\n};\n\nconst extractAssistantText = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n): string => {\n return entry.message.content\n .filter((item): item is { type: \"text\"; text: string } => {\n return item.type === \"text\" && \"text\" in item;\n })\n .map((item) => item.text)\n .join(\" \");\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { generateSessionHtml } from \"../services/ExportService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const sessionRepository = yield* SessionRepository;\n\n const getSession = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(\n projectId,\n sessionId,\n );\n\n return {\n status: 200,\n response: { session },\n } as const satisfies ControllerResponse;\n });\n\n const exportSessionHtml = (options: {\n projectId: string;\n sessionId: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(\n projectId,\n sessionId,\n );\n\n if (session === null) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n const html = yield* generateSessionHtml(session, projectId);\n\n return {\n status: 200,\n response: { html },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSession,\n exportSessionHtml,\n };\n});\n\nexport type ISessionController = InferEffect<typeof LayerImpl>;\nexport class SessionController extends Context.Tag(\"SessionController\")<\n SessionController,\n ISessionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Effect } from \"effect\";\nimport type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { SessionDetail } from \"../../types\";\n\n/**\n * Escapes HTML special characters to prevent XSS\n */\nconst escapeHtml = (text: string): string => {\n const map: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n };\n return text.replace(/[&<>\"']/g, (char) => map[char] ?? char);\n};\n\n/**\n * Formats JSON with proper newlines instead of escaped \\n characters\n */\nconst formatJsonWithNewlines = (obj: unknown): string => {\n const jsonString = JSON.stringify(obj, null, 2);\n\n // Replace escaped newlines, tabs, and carriage returns with actual characters\n return jsonString\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\r/g, \"\\r\");\n};\n\n/**\n * Formats timestamp to readable date string\n * Timestamps in the schema are stored as ISO 8601 strings\n */\nconst formatTimestamp = (timestamp: number | string): string => {\n const date = new Date(timestamp);\n return date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n};\n\n/**\n * Renders markdown content to HTML (simplified version)\n */\nconst renderMarkdown = (content: string): string => {\n let html = escapeHtml(content);\n\n // Code blocks\n html = html.replace(\n /```(\\w+)?\\n([\\s\\S]*?)```/g,\n (_match, lang, code) => `\n <div class=\"code-block\">\n ${lang ? `<div class=\"code-header\"><span class=\"code-lang\">${escapeHtml(lang.toUpperCase())}</span></div>` : \"\"}\n <pre><code class=\"language-${escapeHtml(lang || \"text\")}\">${code.trim()}</code></pre>\n </div>\n `,\n );\n\n // Inline code\n html = html.replace(/`([^`]+)`/g, '<code class=\"inline-code\">$1</code>');\n\n // Bold\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n\n // Italic\n html = html.replace(/\\*(.+?)\\*/g, \"<em>$1</em>\");\n\n // Headers\n html = html.replace(/^### (.+)$/gm, '<h3 class=\"markdown-h3\">$1</h3>');\n html = html.replace(/^## (.+)$/gm, '<h2 class=\"markdown-h2\">$1</h2>');\n html = html.replace(/^# (.+)$/gm, '<h1 class=\"markdown-h1\">$1</h1>');\n\n // Links\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n\n // Paragraphs\n html = html\n .split(\"\\n\\n\")\n .map((para) => {\n if (\n para.startsWith(\"<h\") ||\n para.startsWith(\"<div\") ||\n para.startsWith(\"<pre\") ||\n para.trim() === \"\"\n ) {\n return para;\n }\n return `<p class=\"markdown-p\">${para.replace(/\\n/g, \"<br>\")}</p>`;\n })\n .join(\"\\n\");\n\n return html;\n};\n\n/**\n * Renders a user message entry\n */\nconst renderUserEntry = (\n entry: Extract<Conversation, { type: \"user\" }>,\n): string => {\n const contentArray = Array.isArray(entry.message.content)\n ? entry.message.content\n : [entry.message.content];\n\n const contentHtml = contentArray\n .map((msg) => {\n if (typeof msg === \"string\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg)}</div>`;\n }\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n if (msg.type === \"image\") {\n return `<img src=\"data:${msg.source.media_type};base64,${msg.source.data}\" alt=\"User uploaded image\" class=\"message-image\" />`;\n }\n if (msg.type === \"document\") {\n return `<div class=\"document-content\"><strong>Document:</strong> ${escapeHtml(msg.source.media_type)}</div>`;\n }\n if (msg.type === \"tool_result\") {\n // Skip tool results in user messages - they're shown in assistant message context\n return \"\";\n }\n return \"\";\n })\n .join(\"\");\n\n // Skip rendering if there's no actual user content (only tool results)\n if (!contentHtml.trim()) {\n return \"\";\n }\n\n return `\n <div class=\"conversation-entry user-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">User</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders an assistant message entry\n */\nconst renderAssistantEntry = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n): string => {\n const contentHtml = entry.message.content\n .map((msg) => {\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n\n if (msg.type === \"thinking\") {\n const charCount = msg.thinking.length;\n return `\n <div class=\"thinking-block collapsible\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 2v1m0 18v1m9-10h1M2 12H1m17.66-7.66l.71.71M3.63 20.37l.71.71m0-14.14l-.71.71m17.02 12.73l-.71.71M12 7a5 5 0 0 1 5 5 5 5 0 0 1-1.47 3.53c-.6.6-.94 1.42-.94 2.27V18a1 1 0 0 1-1 1h-3a1 1 0 0 1-1-1v-.2c0-.85-.34-1.67-.94-2.27A5 5 0 0 1 7 12a5 5 0 0 1 5-5Z\"/>\n </svg>\n <span class=\"thinking-title\">Thinking</span>\n <span class=\"expand-hint\">(${charCount} characters \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"thinking-content collapsible-content\">\n <pre class=\"thinking-text\">${escapeHtml(msg.thinking)}</pre>\n </div>\n </div>\n `;\n }\n\n if (msg.type === \"tool_use\") {\n const inputKeys = Object.keys(msg.input).length;\n return `\n <div class=\"tool-use-block collapsible\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/>\n </svg>\n <span class=\"tool-name\">${escapeHtml(msg.name)}</span>\n <span class=\"expand-hint\">(${inputKeys} parameter${inputKeys !== 1 ? \"s\" : \"\"} \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"tool-use-content collapsible-content\">\n <div class=\"tool-id\"><strong>Tool ID:</strong> <code>${escapeHtml(msg.id)}</code></div>\n <div class=\"tool-input\">\n <strong>Input Parameters:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"conversation-entry assistant-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">Assistant</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders a system message entry\n */\nconst renderSystemEntry = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n return `\n <div class=\"conversation-entry system-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">System</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n <div class=\"system-message\">${escapeHtml(entry.content)}</div>\n </div>\n </div>\n `;\n};\n\n/**\n * Groups consecutive assistant messages together\n */\nconst groupConsecutiveAssistantMessages = (\n conversations: SessionDetail[\"conversations\"],\n): Array<{\n type: \"grouped\" | \"single\";\n entries: Array<\n Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>\n >;\n}> => {\n const grouped: Array<{\n type: \"grouped\" | \"single\";\n entries: Array<\n Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>\n >;\n }> = [];\n\n let currentGroup: Array<Extract<Conversation, { type: \"assistant\" }>> = [];\n\n for (const conv of conversations) {\n if (conv.type === \"assistant\") {\n // Add all consecutive assistant messages to the group\n currentGroup.push(conv);\n } else if (conv.type === \"user\" || conv.type === \"system\") {\n // End the current group when we hit a non-assistant message\n if (currentGroup.length > 0) {\n grouped.push({\n type: currentGroup.length > 1 ? \"grouped\" : \"single\",\n entries: currentGroup,\n });\n currentGroup = [];\n }\n grouped.push({ type: \"single\", entries: [conv] });\n }\n }\n\n // Don't forget the last group\n if (currentGroup.length > 0) {\n grouped.push({\n type: currentGroup.length > 1 ? \"grouped\" : \"single\",\n entries: currentGroup,\n });\n }\n\n return grouped;\n};\n\n/**\n * Renders a group of consecutive assistant tool calls\n */\nconst renderGroupedAssistantEntries = (\n entries: Array<Extract<Conversation, { type: \"assistant\" }>>,\n): string => {\n const allContent = entries.flatMap((entry) => entry.message.content);\n const firstEntry = entries[0];\n\n if (!firstEntry) {\n return \"\";\n }\n\n const contentHtml = allContent\n .map((msg) => {\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n\n if (msg.type === \"thinking\") {\n const charCount = msg.thinking.length;\n return `\n <div class=\"thinking-block collapsible\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 2v1m0 18v1m9-10h1M2 12H1m17.66-7.66l.71.71M3.63 20.37l.71.71m0-14.14l-.71.71m17.02 12.73l-.71.71M12 7a5 5 0 0 1 5 5 5 5 0 0 1-1.47 3.53c-.6.6-.94 1.42-.94 2.27V18a1 1 0 0 1-1 1h-3a1 1 0 0 1-1-1v-.2c0-.85-.34-1.67-.94-2.27A5 5 0 0 1 7 12a5 5 0 0 1 5-5Z\"/>\n </svg>\n <span class=\"thinking-title\">Thinking</span>\n <span class=\"expand-hint\">(${charCount} characters \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"thinking-content collapsible-content\">\n <pre class=\"thinking-text\">${escapeHtml(msg.thinking)}</pre>\n </div>\n </div>\n `;\n }\n\n if (msg.type === \"tool_use\") {\n const inputKeys = Object.keys(msg.input).length;\n return `\n <div class=\"tool-use-block collapsible\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/>\n </svg>\n <span class=\"tool-name\">${escapeHtml(msg.name)}</span>\n <span class=\"expand-hint\">(${inputKeys} parameter${inputKeys !== 1 ? \"s\" : \"\"} \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"tool-use-content collapsible-content\">\n <div class=\"tool-id\"><strong>Tool ID:</strong> <code>${escapeHtml(msg.id)}</code></div>\n <div class=\"tool-input\">\n <strong>Input Parameters:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"conversation-entry assistant-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">Assistant</span>\n <span class=\"entry-timestamp\">${formatTimestamp(firstEntry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Generates the full HTML document for a session export\n */\nexport const generateSessionHtml = (\n session: SessionDetail,\n projectId: string,\n): Effect.Effect<string> =>\n Effect.gen(function* () {\n const grouped = groupConsecutiveAssistantMessages(session.conversations);\n\n const conversationsHtml = grouped\n .map((group) => {\n if (group.type === \"grouped\") {\n return renderGroupedAssistantEntries(\n group.entries as Array<\n Extract<Conversation, { type: \"assistant\" }>\n >,\n );\n }\n\n const conv = group.entries[0];\n if (!conv) {\n return \"\";\n }\n\n if (conv.type === \"user\") {\n return renderUserEntry(conv);\n }\n if (conv.type === \"assistant\") {\n return renderAssistantEntry(conv);\n }\n if (conv.type === \"system\") {\n return renderSystemEntry(conv);\n }\n return \"\";\n })\n .filter((html) => html !== \"\")\n .join(\"\\n\");\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Claude Code Session - ${escapeHtml(session.id)}</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n :root {\n --background: 0 0% 100%;\n --foreground: 0 0% 3.9%;\n --muted: 0 0% 96.1%;\n --muted-foreground: 0 0% 45.1%;\n --border: 0 0% 89.8%;\n --primary: 0 0% 9%;\n --blue-50: 214 100% 97%;\n --blue-200: 213 97% 87%;\n --blue-600: 217 91% 60%;\n --blue-800: 217 91% 35%;\n }\n\n body {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: hsl(var(--foreground));\n background: hsl(var(--background));\n padding: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n }\n\n .header {\n border-bottom: 1px solid hsl(var(--border));\n padding-bottom: 2rem;\n margin-bottom: 2rem;\n }\n\n .header h1 {\n font-size: 2rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .header .metadata {\n color: hsl(var(--muted-foreground));\n font-size: 0.875rem;\n }\n\n .conversation-list {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n\n .conversation-entry {\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .entry-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n font-weight: 500;\n border-bottom: 1px solid;\n }\n\n .entry-timestamp {\n color: hsl(var(--muted-foreground));\n font-size: 0.75rem;\n }\n\n .entry-content {\n padding: 1.5rem;\n }\n\n /* User entry styles */\n .user-entry {\n background: hsl(var(--muted) / 0.3);\n border: 1px solid hsl(var(--border));\n }\n\n .user-entry .entry-header {\n background: hsl(var(--muted) / 0.5);\n border-bottom-color: hsl(var(--border));\n }\n\n /* Assistant entry styles */\n .assistant-entry {\n background: hsl(var(--background));\n border: 1px solid hsl(var(--border));\n }\n\n .assistant-entry .entry-header {\n background: hsl(var(--muted) / 0.3);\n border-bottom-color: hsl(var(--border));\n }\n\n /* System entry styles */\n .system-entry {\n background: hsl(var(--muted) / 0.2);\n border: 1px dashed hsl(var(--border));\n }\n\n .system-entry .entry-header {\n background: hsl(var(--muted) / 0.4);\n border-bottom-color: hsl(var(--border));\n }\n\n .system-message {\n font-family: monospace;\n font-size: 0.875rem;\n color: hsl(var(--muted-foreground));\n }\n\n /* Markdown styles */\n .markdown-content {\n width: 100%;\n margin: 1rem 0.25rem;\n }\n\n .markdown-h1 {\n font-size: 1.875rem;\n font-weight: 700;\n margin-bottom: 1.5rem;\n margin-top: 2rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid hsl(var(--border));\n }\n\n .markdown-h2 {\n font-size: 1.5rem;\n font-weight: 600;\n margin-bottom: 1rem;\n margin-top: 2rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n }\n\n .markdown-h3 {\n font-size: 1.25rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n margin-top: 1.5rem;\n }\n\n .markdown-p {\n margin-bottom: 1rem;\n line-height: 1.75;\n word-break: break-all;\n }\n\n .inline-code {\n background: hsl(var(--muted) / 0.7);\n padding: 0.25rem 0.5rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-family: monospace;\n border: 1px solid hsl(var(--border));\n }\n\n .code-block {\n position: relative;\n margin: 1.5rem 0;\n }\n\n .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: hsl(var(--muted) / 0.3);\n padding: 0.5rem 1rem;\n border-bottom: 1px solid hsl(var(--border));\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n border: 1px solid hsl(var(--border));\n border-bottom: none;\n }\n\n .code-lang {\n font-size: 0.75rem;\n font-weight: 500;\n color: hsl(var(--muted-foreground));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .code-block pre {\n margin: 0;\n padding: 1rem;\n background: hsl(var(--muted) / 0.2);\n border: 1px solid hsl(var(--border));\n border-top: none;\n border-bottom-left-radius: 0.5rem;\n border-bottom-right-radius: 0.5rem;\n overflow-x: auto;\n }\n\n .code-block code {\n font-family: 'Monaco', 'Courier New', monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n /* Thinking block styles */\n .thinking-block {\n background: hsl(var(--muted) / 0.5);\n border: 2px dashed hsl(var(--border));\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .thinking-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: hsl(var(--muted) / 0.3);\n transition: background 0.2s;\n }\n\n .thinking-header:hover {\n background: hsl(var(--muted) / 0.5);\n }\n\n .icon-lightbulb {\n color: hsl(var(--muted-foreground));\n flex-shrink: 0;\n }\n\n .thinking-title {\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .expand-hint {\n font-size: 0.75rem;\n color: hsl(var(--muted-foreground));\n font-weight: normal;\n margin-left: 0.5rem;\n }\n\n .collapsible:not(.collapsed) .expand-hint {\n display: none;\n }\n\n .icon-chevron {\n margin-left: auto;\n color: hsl(var(--muted-foreground));\n transition: transform 0.2s;\n }\n\n .collapsible.collapsed .icon-chevron {\n transform: rotate(-90deg);\n }\n\n .thinking-content {\n padding: 0.5rem 1rem;\n }\n\n .collapsible-content {\n max-height: 1000px;\n overflow: hidden;\n transition: max-height 0.3s ease-out, opacity 0.2s ease-out;\n }\n\n .collapsible.collapsed .collapsible-content {\n max-height: 0;\n opacity: 0;\n }\n\n .thinking-text {\n font-size: 0.875rem;\n color: hsl(var(--muted-foreground));\n font-family: monospace;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n /* Tool use block styles */\n .tool-use-block {\n border: 1px solid hsl(var(--blue-200));\n background: hsl(var(--blue-50) / 0.5);\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .tool-use-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n cursor: pointer;\n background: hsl(var(--blue-50) / 0.3);\n transition: background 0.2s;\n }\n\n .tool-use-header:hover {\n background: hsl(var(--blue-50) / 0.6);\n }\n\n .icon-wrench {\n color: hsl(var(--blue-600));\n flex-shrink: 0;\n }\n\n .tool-name {\n font-size: 0.875rem;\n font-weight: 500;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tool-use-content {\n padding: 0.75rem 1rem;\n border-top: 1px solid hsl(var(--blue-200));\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .tool-id {\n font-size: 0.75rem;\n }\n\n .tool-id code {\n background: hsl(var(--background) / 0.5);\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid hsl(var(--blue-200));\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .tool-input {\n font-size: 0.75rem;\n }\n\n .json-input {\n background: hsl(var(--background));\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n padding: 0.75rem;\n margin-top: 0.5rem;\n overflow-x: auto;\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-all;\n overflow-wrap: break-word;\n }\n\n .message-image {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1rem 0;\n }\n\n strong {\n font-weight: 600;\n }\n\n em {\n font-style: italic;\n }\n\n a {\n color: hsl(var(--primary));\n text-decoration: underline;\n text-decoration-color: hsl(var(--primary) / 0.3);\n text-underline-offset: 4px;\n transition: text-decoration-color 0.2s;\n }\n\n a:hover {\n text-decoration-color: hsl(var(--primary) / 0.6);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n }\n\n .toggle-all-button {\n padding: 0.5rem 1rem;\n background: hsl(var(--primary));\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .toggle-all-button:hover {\n opacity: 0.9;\n }\n\n .toggle-all-button:active {\n opacity: 0.8;\n }\n\n .footer {\n margin-top: 4rem;\n padding-top: 2rem;\n border-top: 1px solid hsl(var(--border));\n text-align: center;\n color: hsl(var(--muted-foreground));\n font-size: 0.875rem;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <div class=\"header-top\">\n <h1>Claude Code Session Export</h1>\n <button id=\"toggle-all-btn\" class=\"toggle-all-button\">Collapse All</button>\n </div>\n <div class=\"metadata\">\n <div><strong>Session ID:</strong> ${escapeHtml(session.id)}</div>\n <div><strong>Project ID:</strong> ${escapeHtml(projectId)}</div>\n <div><strong>Exported:</strong> ${formatTimestamp(Date.now())}</div>\n <div><strong>Total Conversations:</strong> ${session.conversations.length}</div>\n </div>\n </div>\n\n <div class=\"conversation-list\">\n ${conversationsHtml}\n </div>\n\n <div class=\"footer\">\n <p>Exported from Claude Code Viewer</p>\n </div>\n\n <script>\n // Add click handlers for collapsible blocks\n document.addEventListener('DOMContentLoaded', function() {\n const triggers = document.querySelectorAll('.collapsible-trigger');\n const toggleAllBtn = document.getElementById('toggle-all-btn');\n let allExpanded = true; // Start as expanded since blocks are expanded by default\n\n // Individual collapsible click handlers\n triggers.forEach(function(trigger) {\n trigger.addEventListener('click', function() {\n const collapsible = this.closest('.collapsible');\n if (collapsible) {\n collapsible.classList.toggle('collapsed');\n }\n });\n });\n\n // Toggle all button\n if (toggleAllBtn) {\n toggleAllBtn.addEventListener('click', function() {\n const collapsibles = document.querySelectorAll('.collapsible');\n\n if (allExpanded) {\n // Collapse all\n collapsibles.forEach(function(collapsible) {\n collapsible.classList.add('collapsed');\n });\n toggleAllBtn.textContent = 'Expand All';\n allExpanded = false;\n } else {\n // Expand all\n collapsibles.forEach(function(collapsible) {\n collapsible.classList.remove('collapsed');\n });\n toggleAllBtn.textContent = 'Collapse All';\n allExpanded = true;\n }\n });\n }\n });\n </script>\n</body>\n</html>`;\n\n return html;\n });\n", "import { Hono } from \"hono\";\nimport type { UserConfig } from \"../lib/config/config\";\n\nexport type HonoContext = {\n Variables: {\n userConfig: UserConfig;\n };\n};\n\nexport const honoApp = new Hono<HonoContext>();\n\nexport type HonoAppType = typeof honoApp;\n", "import { Context, Effect, Layer, Ref, Schedule } from \"effect\";\nimport { EventBus } from \"../core/events/services/EventBus\";\nimport { FileWatcherService } from \"../core/events/services/fileWatcher\";\nimport type { InternalEventDeclaration } from \"../core/events/types/InternalEventDeclaration\";\nimport { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository\";\nimport { ProjectMetaService } from \"../core/project/services/ProjectMetaService\";\nimport { SessionRepository } from \"../core/session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"../core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionMetaService } from \"../core/session/services/SessionMetaService\";\n\ninterface InitializeServiceInterface {\n readonly startInitialization: () => Effect.Effect<void>;\n readonly stopCleanup: () => Effect.Effect<void>;\n}\n\nexport class InitializeService extends Context.Tag(\"InitializeService\")<\n InitializeService,\n InitializeServiceInterface\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const fileWatcher = yield* FileWatcherService;\n const projectRepository = yield* ProjectRepository;\n const sessionRepository = yield* SessionRepository;\n const projectMetaService = yield* ProjectMetaService;\n const sessionMetaService = yield* SessionMetaService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n\n // \u72B6\u614B\u7BA1\u7406\u7528\u306E Ref\n const listenersRef = yield* Ref.make<{\n sessionProcessChanged?:\n | ((event: InternalEventDeclaration[\"sessionProcessChanged\"]) => void)\n | null;\n sessionChanged?:\n | ((event: InternalEventDeclaration[\"sessionChanged\"]) => void)\n | null;\n }>({});\n\n const startInitialization = (): Effect.Effect<void> => {\n return Effect.gen(function* () {\n // \u30D5\u30A1\u30A4\u30EB\u30A6\u30A9\u30C3\u30C1\u30E3\u30FC\u3092\u958B\u59CB\n yield* fileWatcher.startWatching();\n\n // \u30CF\u30FC\u30C8\u30D3\u30FC\u30C8\u3092\u5B9A\u671F\u7684\u306B\u9001\u4FE1\n const daemon = Effect.repeat(\n eventBus.emit(\"heartbeat\", {}),\n Schedule.fixed(\"10 seconds\"),\n );\n\n console.log(\"start heartbeat\");\n yield* Effect.forkDaemon(daemon);\n console.log(\"after starting heartbeat fork\");\n\n // sessionChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) => {\n Effect.runFork(\n projectMetaService.invalidateProject(event.projectId),\n );\n\n Effect.runFork(\n sessionMetaService.invalidateSession(\n event.projectId,\n event.sessionId,\n ),\n );\n };\n\n const onSessionProcessChanged = (\n event: InternalEventDeclaration[\"sessionProcessChanged\"],\n ) => {\n if (\n (event.changed.type === \"completed\" ||\n event.changed.type === \"paused\") &&\n event.changed.sessionId !== undefined\n ) {\n Effect.runFork(\n virtualConversationDatabase.deleteVirtualConversations(\n event.changed.sessionId,\n ),\n );\n return;\n }\n };\n\n yield* Ref.set(listenersRef, {\n sessionChanged: onSessionChanged,\n sessionProcessChanged: onSessionProcessChanged,\n });\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"sessionProcessChanged\", onSessionProcessChanged);\n\n yield* Effect.gen(function* () {\n console.log(\"Initializing projects cache\");\n const { projects } = yield* projectRepository.getProjects();\n console.log(`${projects.length} projects cache initialized`);\n\n console.log(\"Initializing sessions cache\");\n const results = yield* Effect.all(\n projects.map((project) =>\n sessionRepository.getSessions(project.id),\n ),\n { concurrency: \"unbounded\" },\n );\n const totalSessions = results.reduce(\n (s, { sessions }) => s + sessions.length,\n 0,\n );\n console.log(`${totalSessions} sessions cache initialized`);\n }).pipe(\n Effect.catchAll(() => Effect.void),\n Effect.withSpan(\"initialize-cache\"),\n );\n }).pipe(Effect.withSpan(\"start-initialization\")) as Effect.Effect<void>;\n };\n\n const stopCleanup = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listeners = yield* Ref.get(listenersRef);\n if (listeners.sessionChanged) {\n yield* eventBus.off(\"sessionChanged\", listeners.sessionChanged);\n }\n\n if (listeners.sessionProcessChanged) {\n yield* eventBus.off(\n \"sessionProcessChanged\",\n listeners.sessionProcessChanged,\n );\n }\n\n yield* Ref.set(listenersRef, {});\n yield* fileWatcher.stop();\n });\n\n return {\n startInitialization,\n stopCleanup,\n } satisfies InitializeServiceInterface;\n }),\n );\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport { EnvService } from \"../../core/platform/services/EnvService\";\nimport type { InferEffect } from \"../../lib/effect/types\";\nimport type { HonoContext } from \"../app\";\n\n// Session token is a simple hash of the password\nconst generateSessionToken = (password: string | undefined): string => {\n if (!password) return \"\";\n return Buffer.from(`ccv-session:${password}`).toString(\"base64\");\n};\n\n// Routes that don't require authentication\nconst PUBLIC_API_ROUTES = [\n \"/api/auth/login\",\n \"/api/auth/check\",\n \"/api/auth/logout\",\n \"/api/config\", // Allow config access for theme/locale loading\n \"/api/version\",\n];\n\nconst LayerImpl = Effect.gen(function* () {\n const envService = yield* EnvService;\n\n const anthPassword = yield* envService.getEnv(\n \"CLAUDE_CODE_VIEWER_AUTH_PASSWORD\",\n ) ?? undefined;\n const authEnabled = anthPassword !== undefined;\n\n const validSessionToken = generateSessionToken(anthPassword);\n\n const authMiddleware = createMiddleware<HonoContext>(async (c, next) => {\n // Skip auth for public routes\n if (PUBLIC_API_ROUTES.includes(c.req.path)) {\n return next();\n }\n\n // Skip auth for non-API routes (let frontend handle auth state)\n if (!c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n // Skip auth check if authentication is not enabled\n if (!authEnabled) {\n return next();\n }\n\n const sessionToken = getCookie(c, \"ccv-session\");\n\n if (!sessionToken || sessionToken !== validSessionToken) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n await next();\n });\n\n return {\n authEnabled,\n anthPassword,\n validSessionToken,\n authMiddleware,\n };\n});\n\nexport type IAuthMiddleware = InferEffect<typeof LayerImpl>;\nexport class AuthMiddleware extends Context.Tag(\"AuthMiddleware\")<\n AuthMiddleware,\n IAuthMiddleware\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { CommandExecutor, FileSystem, Path } from \"@effect/platform\";\nimport { zValidator } from \"@hono/zod-validator\";\nimport { Effect, Runtime } from \"effect\";\nimport { deleteCookie, getCookie, setCookie } from \"hono/cookie\";\nimport { streamSSE } from \"hono/streaming\";\nimport prexit from \"prexit\";\nimport { z } from \"zod\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { AgentSessionController } from \"../core/agent-session/presentation/AgentSessionController\";\nimport { ClaudeCodeController } from \"../core/claude-code/presentation/ClaudeCodeController\";\nimport { ClaudeCodePermissionController } from \"../core/claude-code/presentation/ClaudeCodePermissionController\";\nimport { ClaudeCodeSessionProcessController } from \"../core/claude-code/presentation/ClaudeCodeSessionProcessController\";\nimport { userMessageInputSchema } from \"../core/claude-code/schema\";\nimport { ClaudeCodeLifeCycleService } from \"../core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport { TypeSafeSSE } from \"../core/events/functions/typeSafeSSE\";\nimport { SSEController } from \"../core/events/presentation/SSEController\";\nimport { FeatureFlagController } from \"../core/feature-flag/presentation/FeatureFlagController\";\nimport { FileSystemController } from \"../core/file-system/presentation/FileSystemController\";\nimport { GitController } from \"../core/git/presentation/GitController\";\nimport { CommitRequestSchema, PushRequestSchema } from \"../core/git/schema\";\nimport { EnvService } from \"../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../core/platform/services/UserConfigService\";\nimport type { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"../core/project/presentation/ProjectController\";\nimport type { SchedulerConfigBaseDir } from \"../core/scheduler/config\";\nimport { SchedulerController } from \"../core/scheduler/presentation/SchedulerController\";\nimport {\n newSchedulerJobSchema,\n updateSchedulerJobSchema,\n} from \"../core/scheduler/schema\";\nimport { SearchController } from \"../core/search/presentation/SearchController\";\nimport type { VirtualConversationDatabase } from \"../core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionController } from \"../core/session/presentation/SessionController\";\nimport type { SessionMetaService } from \"../core/session/services/SessionMetaService\";\nimport { userConfigSchema } from \"../lib/config/config\";\nimport { effectToResponse } from \"../lib/effect/toEffectResponse\";\nimport type { HonoAppType } from \"./app\";\nimport { InitializeService } from \"./initialize\";\nimport { AuthMiddleware } from \"./middleware/auth.middleware\";\nimport { configMiddleware } from \"./middleware/config.middleware\";\n\nexport const routes = (app: HonoAppType) =>\n Effect.gen(function* () {\n // controllers\n const projectController = yield* ProjectController;\n const sessionController = yield* SessionController;\n const agentSessionController = yield* AgentSessionController;\n const gitController = yield* GitController;\n const claudeCodeSessionProcessController =\n yield* ClaudeCodeSessionProcessController;\n const claudeCodePermissionController =\n yield* ClaudeCodePermissionController;\n const sseController = yield* SSEController;\n const fileSystemController = yield* FileSystemController;\n const claudeCodeController = yield* ClaudeCodeController;\n const schedulerController = yield* SchedulerController;\n const featureFlagController = yield* FeatureFlagController;\n const searchController = yield* SearchController;\n\n // services\n const envService = yield* EnvService;\n const userConfigService = yield* UserConfigService;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const initializeService = yield* InitializeService;\n\n // middleware\n const { authMiddleware, validSessionToken, authEnabled, anthPassword } =\n yield* AuthMiddleware;\n\n const runtime = yield* Effect.runtime<\n | EnvService\n | SessionMetaService\n | VirtualConversationDatabase\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor.CommandExecutor\n | UserConfigService\n | ClaudeCodeLifeCycleService\n | ProjectRepository\n | SchedulerConfigBaseDir\n >();\n\n if ((yield* envService.getEnv(\"NEXT_PHASE\")) !== \"phase-production-build\") {\n yield* initializeService.startInitialization();\n\n prexit(async () => {\n await Runtime.runPromise(runtime)(initializeService.stopCleanup());\n });\n }\n\n return (\n app\n // middleware\n .use(configMiddleware)\n .use(authMiddleware)\n .use(async (c, next) => {\n await Effect.runPromise(\n userConfigService.setUserConfig({\n ...c.get(\"userConfig\"),\n }),\n );\n\n await next();\n })\n\n // auth routes\n .post(\n \"/api/auth/login\",\n zValidator(\"json\", z.object({ password: z.string() })),\n async (c) => {\n const { password } = c.req.valid(\"json\");\n\n // Check if auth is configured\n if (!authEnabled) {\n return c.json(\n {\n error:\n \"Authentication not configured. Set CLAUDE_CODE_VIEWER_AUTH_PASSWORD environment variable.\",\n },\n 500,\n );\n }\n\n if (password !== anthPassword) {\n return c.json({ error: \"Invalid password\" }, 401);\n }\n\n setCookie(c, \"ccv-session\", validSessionToken, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: \"Lax\",\n path: \"/\",\n maxAge: 60 * 60 * 24 * 7, // 7 days\n });\n\n return c.json({ success: true });\n },\n )\n\n .post(\"/api/auth/logout\", async (c) => {\n deleteCookie(c, \"ccv-session\", { path: \"/\" });\n return c.json({ success: true });\n })\n\n .get(\"/api/auth/check\", async (c) => {\n const sessionToken = getCookie(c, \"ccv-session\");\n const isAuthenticated = authEnabled\n ? sessionToken === validSessionToken\n : true;\n return c.json({ authenticated: isAuthenticated, authEnabled });\n })\n\n // routes\n .get(\"/api/config\", async (c) => {\n return c.json({\n config: c.get(\"userConfig\"),\n });\n })\n\n .put(\"/api/config\", zValidator(\"json\", userConfigSchema), async (c) => {\n const { ...config } = c.req.valid(\"json\");\n\n setCookie(c, \"ccv-config\", JSON.stringify(config));\n\n return c.json({\n config,\n });\n })\n\n .get(\"/api/version\", async (c) => {\n return c.json({\n version: packageJson.version,\n });\n })\n\n /**\n * ProjectController Routes\n */\n\n .get(\"/api/projects\", async (c) => {\n const response = await effectToResponse(\n c,\n projectController.getProjects(),\n );\n return response;\n })\n\n .get(\n \"/api/projects/:projectId\",\n zValidator(\"query\", z.object({ cursor: z.string().optional() })),\n async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .getProject({\n ...c.req.param(),\n ...c.req.valid(\"query\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects\",\n zValidator(\n \"json\",\n z.object({\n projectPath: z.string().min(1, \"Project path is required\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .createProject({\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .get(\"/api/projects/:projectId/latest-session\", async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .getProjectLatestSession({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * SessionController Routes\n */\n\n .get(\"/api/projects/:projectId/sessions/:sessionId\", async (c) => {\n const response = await effectToResponse(\n c,\n sessionController\n .getSession({ ...c.req.param() })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\n \"/api/projects/:projectId/sessions/:sessionId/export\",\n async (c) => {\n const response = await effectToResponse(\n c,\n sessionController\n .exportSessionHtml({ ...c.req.param() })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .get(\"/api/projects/:projectId/agent-sessions/:agentId\", async (c) => {\n const { projectId, agentId } = c.req.param();\n\n const response = await effectToResponse(\n c,\n agentSessionController\n .getAgentSession({\n projectId,\n agentId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * GitController Routes\n */\n\n .get(\"/api/projects/:projectId/git/current-revisions\", async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .getCurrentRevisions({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .post(\n \"/api/projects/:projectId/git/diff\",\n zValidator(\n \"json\",\n z.object({\n fromRef: z.string().min(1, \"fromRef is required\"),\n toRef: z.string().min(1, \"toRef is required\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .getGitDiff({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/commit\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .commitFiles({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/push\",\n zValidator(\"json\", PushRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .pushCommits({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/commit-and-push\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .commitAndPush({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n /**\n * ClaudeCodeController Routes\n */\n\n .get(\"/api/projects/:projectId/claude-commands\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getClaudeCommands({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/projects/:projectId/mcp/list\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getMcpListRoute({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/cc/meta\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getClaudeCodeMeta()\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/cc/features\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getAvailableFeatures()\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * ClaudeCodeSessionProcessController Routes\n */\n\n .get(\"/api/cc/session-processes\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.getSessionProcesses(),\n );\n return response;\n })\n\n // new or resume\n .post(\n \"/api/cc/session-processes\",\n zValidator(\n \"json\",\n z.object({\n projectId: z.string(),\n input: userMessageInputSchema,\n baseSessionId: z.string().optional(),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.createSessionProcess(\n c.req.valid(\"json\"),\n ),\n );\n return response;\n },\n )\n\n // continue\n .post(\n \"/api/cc/session-processes/:sessionProcessId/continue\",\n zValidator(\n \"json\",\n z.object({\n projectId: z.string(),\n input: userMessageInputSchema,\n baseSessionId: z.string(),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController\n .continueSessionProcess({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/cc/session-processes/:sessionProcessId/abort\",\n zValidator(\"json\", z.object({ projectId: z.string() })),\n async (c) => {\n const { sessionProcessId } = c.req.param();\n void Effect.runFork(\n claudeCodeLifeCycleService.abortTask(sessionProcessId),\n );\n return c.json({ message: \"Task aborted\" });\n },\n )\n\n /**\n * ClaudeCodePermissionController Routes\n */\n\n .post(\n \"/api/cc/permission-response\",\n zValidator(\n \"json\",\n z.object({\n permissionRequestId: z.string(),\n decision: z.enum([\"allow\", \"deny\"]),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodePermissionController.permissionResponse({\n permissionResponse: c.req.valid(\"json\"),\n }),\n );\n return response;\n },\n )\n\n /**\n * SSEController Routes\n */\n\n .get(\"/api/sse\", async (c) => {\n return streamSSE(\n c,\n async (rawStream) => {\n await Runtime.runPromise(runtime)(\n sseController\n .handleSSE(rawStream)\n .pipe(Effect.provide(TypeSafeSSE.make(rawStream))),\n );\n },\n async (err) => {\n console.error(\"Streaming error:\", err);\n },\n );\n })\n\n /**\n * SchedulerController Routes\n */\n\n .get(\"/api/scheduler/jobs\", async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController.getJobs().pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .post(\n \"/api/scheduler/jobs\",\n zValidator(\"json\", newSchedulerJobSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .addJob({\n job: c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .patch(\n \"/api/scheduler/jobs/:id\",\n zValidator(\"json\", updateSchedulerJobSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .updateJob({\n id: c.req.param(\"id\"),\n job: c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .delete(\"/api/scheduler/jobs/:id\", async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .deleteJob({\n id: c.req.param(\"id\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * FileSystemController Routes\n */\n\n .get(\n \"/api/fs/file-completion\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n basePath: z.string().optional().default(\"/api/\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n fileSystemController.getFileCompletionRoute({\n ...c.req.valid(\"query\"),\n }),\n );\n\n return response;\n },\n )\n\n .get(\n \"/api/fs/directory-browser\",\n zValidator(\n \"query\",\n z.object({\n currentPath: z.string().optional(),\n showHidden: z\n .string()\n .optional()\n .transform((val) => val === \"true\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n fileSystemController.getDirectoryListingRoute({\n ...c.req.valid(\"query\"),\n }),\n );\n return response;\n },\n )\n\n /**\n * SearchController Routes\n */\n .get(\n \"/api/search\",\n zValidator(\n \"query\",\n z.object({\n q: z.string().min(2),\n limit: z\n .string()\n .optional()\n .transform((val) => (val ? parseInt(val, 10) : undefined)),\n projectId: z.string().optional(),\n }),\n ),\n async (c) => {\n const { q, limit, projectId } = c.req.valid(\"query\");\n const response = await effectToResponse(\n c,\n searchController\n .search({ query: q, limit, projectId })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n /**\n * FeatureFlagController Routes\n */\n .get(\"/api/flags\", async (c) => {\n const response = await effectToResponse(\n c,\n featureFlagController.getFlags().pipe(Effect.provide(runtime)),\n );\n\n return response;\n })\n );\n });\n\nexport type RouteType = ReturnType<typeof routes> extends Effect.Effect<\n infer A,\n unknown,\n unknown\n>\n ? A\n : never;\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.4.11\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/d-kimuson/claude-code-viewer.git\"\n },\n \"homepage\": \"https://github.com/d-kimuson/claude-code-viewer\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"bin\": {\n \"claude-code-viewer\": \"./dist/main.js\"\n },\n \"scripts\": {\n \"dev\": \"run-p 'dev:*'\",\n \"dev:frontend\": \"vite\",\n \"dev:backend\": \"NODE_ENV=development tsx watch src/server/main.ts --env-file-if-exists=.env.local\",\n \"start\": \"node dist/index.js\",\n \"build\": \"./scripts/build.sh\",\n \"build:frontend\": \"vite build\",\n \"build:backend\": \"esbuild src/server/main.ts --format=esm --bundle --packages=external --sourcemap --platform=node --outfile=dist/main.js\",\n \"lint\": \"run-s 'lint:*'\",\n \"lint:biome-format\": \"biome format .\",\n \"lint:biome-lint\": \"biome check .\",\n \"fix\": \"run-s 'fix:*'\",\n \"fix:biome-format\": \"biome format --write .\",\n \"fix:biome-lint\": \"biome check --write --unsafe .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest --run\",\n \"test:watch\": \"vitest\",\n \"e2e\": \"./scripts/e2e/exec_e2e.sh\",\n \"e2e:start-server\": \"./scripts/e2e/start_server.sh\",\n \"e2e:capture-snapshots\": \"./scripts/e2e/capture_snapshots.sh\",\n \"lingui:extract\": \"lingui extract --clean && node ./scripts/lingui-sort.js\",\n \"lingui:compile\": \"lingui compile --typescript\",\n \"prepare\": \"lefthook install\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.1.30\",\n \"@anthropic-ai/claude-code\": \"2.0.24\",\n \"@anthropic-ai/sdk\": \"0.67.0\",\n \"@effect/cluster\": \"0.55.0\",\n \"@effect/experimental\": \"0.57.11\",\n \"@effect/platform\": \"0.93.6\",\n \"@effect/platform-node\": \"0.103.0\",\n \"@effect/rpc\": \"0.72.2\",\n \"@effect/sql\": \"0.48.6\",\n \"@effect/workflow\": \"0.15.1\",\n \"@hono/node-server\": \"1.19.5\",\n \"@hono/zod-validator\": \"0.7.4\",\n \"@lingui/core\": \"5.5.1\",\n \"@lingui/react\": \"5.5.1\",\n \"@radix-ui/react-avatar\": \"1.1.10\",\n \"@radix-ui/react-checkbox\": \"1.3.3\",\n \"@radix-ui/react-collapsible\": \"1.1.12\",\n \"@radix-ui/react-dialog\": \"1.1.15\",\n \"@radix-ui/react-hover-card\": \"1.1.15\",\n \"@radix-ui/react-popover\": \"1.1.15\",\n \"@radix-ui/react-select\": \"2.2.6\",\n \"@radix-ui/react-slot\": \"1.2.3\",\n \"@radix-ui/react-tabs\": \"1.1.13\",\n \"@radix-ui/react-tooltip\": \"1.2.8\",\n \"@tailwindcss/vite\": \"4.1.16\",\n \"@tanstack/react-devtools\": \"0.7.8\",\n \"@tanstack/react-query\": \"5.90.5\",\n \"@tanstack/react-router\": \"1.133.32\",\n \"@tanstack/react-router-devtools\": \"1.133.32\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"date-fns\": \"4.1.0\",\n \"effect\": \"3.19.9\",\n \"es-toolkit\": \"1.41.0\",\n \"hono\": \"4.10.3\",\n \"jotai\": \"2.15.0\",\n \"lucide-react\": \"0.548.0\",\n \"minisearch\": \"7.2.0\",\n \"parse-git-diff\": \"0.0.19\",\n \"prexit\": \"2.3.0\",\n \"react\": \"19.2.0\",\n \"react-dom\": \"19.2.0\",\n \"react-error-boundary\": \"6.0.0\",\n \"react-helmet-async\": \"2.0.5\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"15.6.6\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.3.1\",\n \"ulid\": \"3.0.1\",\n \"zod\": \"4.1.13\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.1\",\n \"@effect/language-service\": \"0.60.0\",\n \"@lingui/cli\": \"5.5.1\",\n \"@lingui/conf\": \"5.5.1\",\n \"@lingui/format-json\": \"5.5.1\",\n \"@lingui/loader\": \"5.5.1\",\n \"@lingui/vite-plugin\": \"5.5.1\",\n \"@tailwindcss/postcss\": \"4.1.16\",\n \"@tanstack/router-plugin\": \"1.133.32\",\n \"@tsconfig/strictest\": \"2.0.6\",\n \"@types/node\": \"24.9.1\",\n \"@types/react\": \"19.2.2\",\n \"@types/react-dom\": \"19.2.2\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@vitejs/plugin-react-swc\": \"4.2.0\",\n \"dotenv\": \"17.2.3\",\n \"esbuild\": \"0.25.11\",\n \"lefthook\": \"2.0.8\",\n \"npm-run-all2\": \"8.0.4\",\n \"playwright\": \"1.56.1\",\n \"release-it\": \"19.0.5\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.1.16\",\n \"tsx\": \"4.20.6\",\n \"tw-animate-css\": \"1.4.0\",\n \"typescript\": \"5.9.3\",\n \"vite\": \"7.1.12\",\n \"vitest\": \"4.0.3\"\n },\n \"packageManager\": \"pnpm@10.18.3+sha512.bbd16e6d7286fd7e01f6b3c0b3c932cda2965c06a908328f74663f10a9aea51f1129eea615134bf992831b009eabe167ecb7008b597f40ff9bc75946aadfb08d\"\n}\n", "import { z } from \"zod\";\n\nexport const mediaTypeSchema = z.enum([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport type MediaType = z.infer<typeof mediaTypeSchema>;\n\n/**\n * Schema for image block parameter\n */\nconst imageBlockSchema = z.object({\n type: z.literal(\"image\"),\n source: z.object({\n type: z.literal(\"base64\"),\n media_type: mediaTypeSchema,\n data: z.string(),\n }),\n});\n\nexport type ImageBlockParam = z.infer<typeof imageBlockSchema>;\n\n/**\n * Schema for document block parameter\n */\nconst documentBlockSchema = z.object({\n type: z.literal(\"document\"),\n source: z.union([\n z.object({\n type: z.literal(\"text\"),\n media_type: z.enum([\"text/plain\"]),\n data: z.string(),\n }),\n z.object({\n type: z.literal(\"base64\"),\n media_type: z.enum([\"application/pdf\"]),\n data: z.string(),\n }),\n ]),\n});\n\nexport type DocumentBlockParam = z.infer<typeof documentBlockSchema>;\n\n/**\n * Schema for user message input with optional images and documents\n */\nexport const userMessageInputSchema = z.object({\n text: z.string().min(1),\n images: z.array(imageBlockSchema).optional(),\n documents: z.array(documentBlockSchema).optional(),\n});\n\nexport type UserMessageInputSchema = z.infer<typeof userMessageInputSchema>;\n", "import { z } from \"zod\";\n\n// Request Schemas\n\nexport const CommitRequestSchema = z.object({\n projectId: z.string().min(1),\n files: z.array(z.string().min(1)).min(1),\n message: z.string().trim().min(1),\n});\n\nexport const PushRequestSchema = z.object({\n projectId: z.string().min(1),\n});\n\nexport const CommitAndPushRequestSchema = CommitRequestSchema;\n\n// Response Schemas - Commit\n\nexport const CommitResultSuccessSchema = z.object({\n success: z.literal(true),\n commitSha: z.string().length(40),\n filesCommitted: z.number().int().positive(),\n message: z.string(),\n});\n\nexport const CommitResultErrorSchema = z.object({\n success: z.literal(false),\n error: z.string(),\n errorCode: z.enum([\n \"EMPTY_MESSAGE\",\n \"NO_FILES\",\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"HOOK_FAILED\",\n \"GIT_COMMAND_ERROR\",\n ]),\n details: z.string().optional(),\n});\n\nexport const CommitResultSchema = z.discriminatedUnion(\"success\", [\n CommitResultSuccessSchema,\n CommitResultErrorSchema,\n]);\n\n// Response Schemas - Push\n\nexport const PushResultSuccessSchema = z.object({\n success: z.literal(true),\n remote: z.string(),\n branch: z.string(),\n objectsPushed: z.number().int().optional(),\n});\n\nexport const PushResultErrorSchema = z.object({\n success: z.literal(false),\n error: z.string(),\n errorCode: z.enum([\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"NO_UPSTREAM\",\n \"NON_FAST_FORWARD\",\n \"AUTH_FAILED\",\n \"NETWORK_ERROR\",\n \"TIMEOUT\",\n \"GIT_COMMAND_ERROR\",\n ]),\n details: z.string().optional(),\n});\n\nexport const PushResultSchema = z.discriminatedUnion(\"success\", [\n PushResultSuccessSchema,\n PushResultErrorSchema,\n]);\n\n// Response Schemas - Commit and Push\n\nexport const CommitAndPushResultSuccessSchema = z.object({\n success: z.literal(true),\n commitSha: z.string().length(40),\n filesCommitted: z.number().int().positive(),\n message: z.string(),\n remote: z.string(),\n branch: z.string(),\n});\n\nexport const CommitAndPushResultErrorSchema = z.object({\n success: z.literal(false),\n commitSucceeded: z.boolean(),\n commitSha: z.string().length(40).optional(),\n error: z.string(),\n errorCode: z.enum([\n \"EMPTY_MESSAGE\",\n \"NO_FILES\",\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"HOOK_FAILED\",\n \"GIT_COMMAND_ERROR\",\n \"NO_UPSTREAM\",\n \"NON_FAST_FORWARD\",\n \"AUTH_FAILED\",\n \"NETWORK_ERROR\",\n \"TIMEOUT\",\n ]),\n details: z.string().optional(),\n});\n\nexport const CommitAndPushResultSchema = z.discriminatedUnion(\"success\", [\n CommitAndPushResultSuccessSchema,\n CommitAndPushResultErrorSchema,\n]);\n\n// Type Exports\n\nexport type CommitRequest = z.infer<typeof CommitRequestSchema>;\nexport type PushRequest = z.infer<typeof PushRequestSchema>;\nexport type CommitAndPushRequest = z.infer<typeof CommitAndPushRequestSchema>;\n\nexport type CommitResultSuccess = z.infer<typeof CommitResultSuccessSchema>;\nexport type CommitResultError = z.infer<typeof CommitResultErrorSchema>;\nexport type CommitResult = z.infer<typeof CommitResultSchema>;\n\nexport type PushResultSuccess = z.infer<typeof PushResultSuccessSchema>;\nexport type PushResultError = z.infer<typeof PushResultErrorSchema>;\nexport type PushResult = z.infer<typeof PushResultSchema>;\n\nexport type CommitAndPushResultSuccess = z.infer<\n typeof CommitAndPushResultSuccessSchema\n>;\nexport type CommitAndPushResultError = z.infer<\n typeof CommitAndPushResultErrorSchema\n>;\nexport type CommitAndPushResult = z.infer<typeof CommitAndPushResultSchema>;\n\nexport type CommitErrorCode = CommitResultError[\"errorCode\"];\nexport type PushErrorCode = PushResultError[\"errorCode\"];\n", "import z from \"zod\";\nimport { localeSchema } from \"../../../lib/i18n/schema\";\n\nexport const userConfigSchema = z.object({\n hideNoUserMessageSession: z.boolean().optional().default(true),\n unifySameTitleSession: z.boolean().optional().default(false),\n enterKeyBehavior: z\n .enum([\"shift-enter-send\", \"enter-send\", \"command-enter-send\"])\n .optional()\n .default(\"shift-enter-send\"),\n permissionMode: z\n .enum([\"acceptEdits\", \"bypassPermissions\", \"default\", \"plan\"])\n .optional()\n .default(\"default\"),\n locale: localeSchema.optional().default(\"en\"),\n theme: z.enum([\"light\", \"dark\", \"system\"]).optional().default(\"system\"),\n});\n\nexport const defaultUserConfig = userConfigSchema.parse({});\n\nexport type UserConfig = z.infer<typeof userConfigSchema>;\n", "import z from \"zod\";\n\nexport const localeSchema = z.enum([\"ja\", \"en\", \"zh_CN\"]);\nexport type SupportedLocale = z.infer<typeof localeSchema>;\n", "import { Effect } from \"effect\";\nimport type { Context, Input } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { HonoContext } from \"../../hono/app\";\n\nexport type ControllerResponse = {\n status: ContentfulStatusCode;\n response: object;\n};\n\ndeclare const dummyCtx: Context<HonoContext, string, Input>;\nconst dummyJson = <S extends ContentfulStatusCode, T extends object>(\n s: S,\n t: T,\n) => dummyCtx.json(t, s);\ntype ResponseType<\n S extends ContentfulStatusCode,\n T extends object,\n> = ReturnType<typeof dummyJson<S, T>>;\n\nexport const effectToResponse = async <\n const P extends string,\n const I extends Input,\n const CR extends ControllerResponse,\n const E,\n Ret = CR extends infer I\n ? I extends { status: infer S; response: infer T }\n ? S extends ContentfulStatusCode\n ? T extends object\n ? ResponseType<S, T>\n : never\n : never\n : never\n : never,\n>(\n ctx: Context<HonoContext, P, I>,\n effect: Effect.Effect<CR, E, never>,\n) => {\n const result = await Effect.runPromise(effect);\n const result2 = ctx.json(result.response, result.status);\n\n return result2 as Ret;\n};\n", "import { getCookie, setCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport {\n DEFAULT_LOCALE,\n detectLocaleFromAcceptLanguage,\n} from \"../../../lib/i18n/localeDetection\";\nimport { defaultUserConfig, type UserConfig } from \"../../lib/config/config\";\nimport { parseUserConfig } from \"../../lib/config/parseUserConfig\";\nimport type { HonoContext } from \"../app\";\n\nexport const configMiddleware = createMiddleware<HonoContext>(\n async (c, next) => {\n const cookie = getCookie(c, \"ccv-config\");\n const parsed = parseUserConfig(cookie);\n\n if (cookie === undefined) {\n const preferredLocale =\n detectLocaleFromAcceptLanguage(c.req.header(\"accept-language\")) ??\n DEFAULT_LOCALE;\n\n setCookie(\n c,\n \"ccv-config\",\n JSON.stringify({\n ...defaultUserConfig,\n locale: preferredLocale,\n } satisfies UserConfig),\n );\n }\n\n c.set(\"userConfig\", parsed);\n\n await next();\n },\n);\n", "import { userConfigSchema } from \"./config\";\n\nexport const parseUserConfig = (configJson: string | undefined) => {\n const parsed = (() => {\n try {\n return userConfigSchema.parse(JSON.parse(configJson ?? \"{}\"));\n } catch {\n return userConfigSchema.parse({});\n }\n })();\n\n return parsed;\n};\n", "import { NodeContext } from \"@effect/platform-node\";\nimport { Layer } from \"effect\";\nimport { EventBus } from \"../../core/events/services/EventBus\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext\";\nimport { EnvService } from \"../../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService\";\n\nexport const platformLayer = Layer.mergeAll(\n ApplicationContext.Live,\n UserConfigService.Live,\n EventBus.Live,\n EnvService.Live,\n).pipe(Layer.provide(EnvService.Live), Layer.provide(NodeContext.layer));\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readFile", "resolve", "NodeContext", "Effect", "Layer", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "Layer", "Context", "Effect", "Layer", "z", "LayerImpl", "Effect", "Context", "Layer", "LayerImpl", "Effect", "Path", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "z", "Context", "Effect", "Layer", "Ref", "FileSystem", "Path", "Context", "Effect", "Layer", "z", "homedir", "z", "LayerImpl", "Effect", "Path", "FileSystem", "Context", "Layer", "Context", "Layer", "Effect", "Ref", "z", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "Option", "Context", "Layer", "FileSystem", "Path", "Effect", "z", "Context", "Data", "Effect", "Layer", "Path", "Effect", "Effect", "Path", "options", "canUseTool", "Data", "LayerImpl", "Effect", "getAvailableFeatures", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "getAvailableFeatures", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Ref", "Context", "Layer", "LayerImpl", "Effect", "permissionResponse", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "LayerImpl", "Effect", "Ref", "Context", "Layer", "Context", "Effect", "Layer", "Runtime", "ulid", "resolve", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "z", "resolve", "resolve", "Context", "Effect", "Layer", "Ref", "createVirtualConversation", "FileSystem", "Context", "Effect", "Layer", "Ref", "Context", "Layer", "Effect", "FileSystem", "Ref", "LayerImpl", "Effect", "FileSystem", "Path", "sessionDetail", "Option", "sessionsToReturn", "sessionsWithMeta", "Context", "Layer", "Effect", "process", "Effect", "Context", "Data", "Effect", "Layer", "Ref", "Data", "LayerImpl", "Effect", "Ref", "process", "Context", "Layer", "LayerImpl", "Effect", "ulid", "input", "Runtime", "process", "Context", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "resolve", "Context", "Effect", "Layer", "ulid", "LayerImpl", "Effect", "Context", "Layer", "Path", "Context", "Effect", "Layer", "Ref", "z", "Context", "Layer", "Effect", "Path", "Ref", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "homedir", "Context", "Effect", "Layer", "dirname", "resolve", "existsSync", "readdir", "join", "resolve", "LayerImpl", "Effect", "homedir", "Context", "Layer", "Context", "Effect", "Either", "Layer", "resolve", "existsSync", "existsSync", "resolve", "Command", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "Data", "LayerImpl", "Effect", "FileSystem", "Path", "Command", "commit", "Context", "Layer", "LayerImpl", "Effect", "Either", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "LayerImpl", "Effect", "FileSystem", "Path", "Context", "Layer", "homedir", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "z", "Data", "Context", "Layer", "homedir", "Effect", "Path", "FileSystem", "Context", "Data", "Duration", "Effect", "Layer", "Ref", "ulid", "Effect", "Effect", "Data", "LayerImpl", "Effect", "Ref", "Duration", "result", "fibers", "ulid", "Context", "Layer", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "query", "Context", "Layer", "LayerImpl", "Effect", "query", "Context", "Layer", "Context", "Effect", "Layer", "Effect", "html", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "Ref", "Schedule", "Context", "Layer", "Effect", "Ref", "Schedule", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Effect", "Runtime", "getCookie", "setCookie", "z", "z", "z", "z", "z", "z", "z", "Effect", "Effect", "getCookie", "createMiddleware", "createMiddleware", "getCookie", "Effect", "Runtime", "z", "setCookie", "getCookie", "Layer", "Layer", "resolve", "readFile", "Effect", "NodeContext"]
|
|
3
|
+
"sources": ["../src/server/main.ts", "../src/server/core/agent-session/index.ts", "../src/server/core/agent-session/infrastructure/AgentSessionRepository.ts", "../src/lib/conversation-schema/index.ts", "../src/lib/conversation-schema/entry/AssistantEntrySchema.ts", "../src/lib/conversation-schema/message/AssistantMessageSchema.ts", "../src/lib/conversation-schema/content/TextContentSchema.ts", "../src/lib/conversation-schema/content/ThinkingContentSchema.ts", "../src/lib/conversation-schema/content/ToolResultContentSchema.ts", "../src/lib/conversation-schema/content/ImageContentSchema.ts", "../src/lib/conversation-schema/content/ToolUseContentSchema.ts", "../src/lib/conversation-schema/entry/BaseEntrySchema.ts", "../src/lib/conversation-schema/entry/FileHIstorySnapshotEntrySchema.ts", "../src/lib/conversation-schema/entry/QueueOperationEntrySchema.ts", "../src/lib/conversation-schema/content/DocumentContentSchema.ts", "../src/lib/conversation-schema/entry/SummaryEntrySchema.ts", "../src/lib/conversation-schema/entry/SystemEntrySchema.ts", "../src/lib/conversation-schema/entry/UserEntrySchema.ts", "../src/lib/conversation-schema/message/UserMessageSchema.ts", "../src/server/core/claude-code/functions/parseJsonl.ts", "../src/server/core/project/functions/id.ts", "../src/server/core/agent-session/presentation/AgentSessionController.ts", "../src/server/core/claude-code/presentation/ClaudeCodeController.ts", "../src/server/core/platform/services/ApplicationContext.ts", "../src/server/core/platform/services/EnvService.ts", "../src/server/core/platform/schema.ts", "../src/server/core/project/infrastructure/ProjectRepository.ts", "../src/server/core/project/services/ProjectMetaService.ts", "../src/server/lib/storage/FileCacheStorage/index.ts", "../src/server/lib/storage/FileCacheStorage/PersistentService.ts", "../src/server/lib/config/paths.ts", "../src/server/core/claude-code/functions/scanCommandFiles.ts", "../src/server/core/claude-code/models/ClaudeCodeVersion.ts", "../src/server/core/claude-code/services/ClaudeCodeService.ts", "../src/server/core/claude-code/functions/parseMcpListOutput.ts", "../src/server/core/claude-code/models/ClaudeCode.ts", "../src/server/core/claude-code/presentation/ClaudeCodePermissionController.ts", "../src/server/core/claude-code/services/ClaudeCodePermissionService.ts", "../src/server/core/events/services/EventBus.ts", "../src/server/core/claude-code/presentation/ClaudeCodeSessionProcessController.ts", "../src/server/core/platform/services/UserConfigService.ts", "../src/lib/i18n/localeDetection.ts", "../src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts", "../src/lib/controllablePromise.ts", "../src/server/core/session/infrastructure/SessionRepository.ts", "../src/server/core/claude-code/functions/parseUserMessage.ts", "../src/server/core/session/functions/id.ts", "../src/server/core/session/functions/isRegularSessionFile.ts", "../src/server/core/session/infrastructure/VirtualConversationDatabase.ts", "../src/server/core/session/services/SessionMetaService.ts", "../src/server/core/session/constants/pricing.ts", "../src/server/core/session/functions/calculateSessionCost.ts", "../src/server/core/session/functions/aggregateTokenUsageAndCost.ts", "../src/server/core/session/functions/getAgentSessionFilesForSession.ts", "../src/server/core/session/functions/extractFirstUserText.ts", "../src/server/core/session/functions/isValidFirstMessage.ts", "../src/server/core/claude-code/functions/createMessageGenerator.ts", "../src/server/core/claude-code/functions/fallbackSdkMessage.ts", "../src/server/core/claude-code/models/CCSessionProcess.ts", "../src/server/core/claude-code/services/ClaudeCodeSessionProcessService.ts", "../src/server/core/events/presentation/SSEController.ts", "../src/server/core/events/functions/adaptInternalEventToSSE.ts", "../src/server/core/events/functions/typeSafeSSE.ts", "../src/server/core/events/services/fileWatcher.ts", "../src/server/core/events/functions/parseSessionFilePath.ts", "../src/server/core/feature-flag/presentation/FeatureFlagController.ts", "../src/server/core/file-system/presentation/FileSystemController.ts", "../src/server/core/file-system/functions/getDirectoryListing.ts", "../src/server/core/file-system/functions/getFileCompletion.ts", "../src/server/core/git/presentation/GitController.ts", "../src/server/core/git/functions/getDiff.ts", "../src/server/core/git/functions/utils.ts", "../src/server/core/git/services/GitService.ts", "../src/server/core/git/functions/parseGitBranchesOutput.ts", "../src/server/core/git/functions/parseGitCommitsOutput.ts", "../src/server/core/project/presentation/ProjectController.ts", "../src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts", "../src/server/core/scheduler/config.ts", "../src/server/core/scheduler/schema.ts", "../src/server/core/scheduler/domain/Scheduler.ts", "../src/server/core/scheduler/domain/Job.ts", "../src/server/core/scheduler/presentation/SchedulerController.ts", "../src/server/core/search/presentation/SearchController.ts", "../src/server/core/search/services/SearchService.ts", "../src/server/core/search/functions/extractSearchableText.ts", "../src/server/core/session/presentation/SessionController.ts", "../src/server/core/session/services/ExportService.ts", "../src/server/hono/app.ts", "../src/server/hono/initialize.ts", "../src/server/hono/middleware/auth.middleware.ts", "../src/server/hono/route.ts", "../package.json", "../src/server/core/claude-code/schema.ts", "../src/server/core/git/schema.ts", "../src/server/lib/config/config.ts", "../src/lib/i18n/schema.ts", "../src/server/lib/effect/toEffectResponse.ts", "../src/server/hono/middleware/config.middleware.ts", "../src/server/lib/config/parseUserConfig.ts", "../src/server/lib/effect/layers.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { NodeContext } from \"@effect/platform-node\";\nimport { serve } from \"@hono/node-server\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { Effect } from \"effect\";\nimport { AgentSessionLayer } from \"./core/agent-session\";\nimport { AgentSessionController } from \"./core/agent-session/presentation/AgentSessionController\";\nimport { ClaudeCodeController } from \"./core/claude-code/presentation/ClaudeCodeController\";\nimport { ClaudeCodePermissionController } from \"./core/claude-code/presentation/ClaudeCodePermissionController\";\nimport { ClaudeCodeSessionProcessController } from \"./core/claude-code/presentation/ClaudeCodeSessionProcessController\";\nimport { ClaudeCodeLifeCycleService } from \"./core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ClaudeCodePermissionService } from \"./core/claude-code/services/ClaudeCodePermissionService\";\nimport { ClaudeCodeService } from \"./core/claude-code/services/ClaudeCodeService\";\nimport { ClaudeCodeSessionProcessService } from \"./core/claude-code/services/ClaudeCodeSessionProcessService\";\nimport { SSEController } from \"./core/events/presentation/SSEController\";\nimport { FileWatcherService } from \"./core/events/services/fileWatcher\";\nimport { FeatureFlagController } from \"./core/feature-flag/presentation/FeatureFlagController\";\nimport { FileSystemController } from \"./core/file-system/presentation/FileSystemController\";\nimport { GitController } from \"./core/git/presentation/GitController\";\nimport { GitService } from \"./core/git/services/GitService\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService\";\nimport { SchedulerConfigBaseDir } from \"./core/scheduler/config\";\nimport { SchedulerService } from \"./core/scheduler/domain/Scheduler\";\nimport { SchedulerController } from \"./core/scheduler/presentation/SchedulerController\";\nimport { SearchController } from \"./core/search/presentation/SearchController\";\nimport { SearchService } from \"./core/search/services/SearchService\";\nimport { SessionRepository } from \"./core/session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"./core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionController } from \"./core/session/presentation/SessionController\";\nimport { SessionMetaService } from \"./core/session/services/SessionMetaService\";\nimport { honoApp } from \"./hono/app\";\nimport { InitializeService } from \"./hono/initialize\";\nimport { AuthMiddleware } from \"./hono/middleware/auth.middleware\";\nimport { routes } from \"./hono/route\";\nimport { platformLayer } from \"./lib/effect/layers\";\n\n// biome-ignore lint/style/noProcessEnv: allow only here\nconst isDevelopment = process.env.NODE_ENV === \"development\";\n\nif (!isDevelopment) {\n const staticPath = resolve(import.meta.dirname, \"static\");\n console.log(\"Serving static files from \", staticPath);\n\n honoApp.use(\n \"/assets/*\",\n serveStatic({\n root: staticPath,\n }),\n );\n\n honoApp.use(\"*\", async (c, next) => {\n if (c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n const html = await readFile(resolve(staticPath, \"index.html\"), \"utf-8\");\n return c.html(html);\n });\n}\n\nconst program = routes(honoApp)\n // \u4F9D\u5B58\u306E\u6D45\u3044\u9806\u306B\u30B3\u30F3\u30C6\u30CA\u306B pipe \u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\n .pipe(\n /** Presentation */\n Effect.provide(ProjectController.Live),\n Effect.provide(SessionController.Live),\n Effect.provide(AgentSessionController.Live),\n Effect.provide(GitController.Live),\n Effect.provide(ClaudeCodeController.Live),\n Effect.provide(ClaudeCodeSessionProcessController.Live),\n Effect.provide(ClaudeCodePermissionController.Live),\n Effect.provide(FileSystemController.Live),\n Effect.provide(SSEController.Live),\n Effect.provide(SchedulerController.Live),\n Effect.provide(FeatureFlagController.Live),\n Effect.provide(SearchController.Live),\n )\n .pipe(\n /** Application */\n Effect.provide(InitializeService.Live),\n Effect.provide(FileWatcherService.Live),\n Effect.provide(AuthMiddleware.Live),\n )\n .pipe(\n /** Domain */\n Effect.provide(ClaudeCodeLifeCycleService.Live),\n Effect.provide(ClaudeCodePermissionService.Live),\n Effect.provide(ClaudeCodeSessionProcessService.Live),\n Effect.provide(ClaudeCodeService.Live),\n Effect.provide(GitService.Live),\n Effect.provide(SchedulerService.Live),\n Effect.provide(SchedulerConfigBaseDir.Live),\n Effect.provide(SearchService.Live),\n )\n .pipe(\n /** Infrastructure */\n Effect.provide(ProjectRepository.Live),\n Effect.provide(SessionRepository.Live),\n Effect.provide(ProjectMetaService.Live),\n Effect.provide(SessionMetaService.Live),\n Effect.provide(VirtualConversationDatabase.Live),\n Effect.provide(AgentSessionLayer),\n )\n .pipe(\n /** Platform */\n Effect.provide(platformLayer),\n Effect.provide(NodeContext.layer),\n );\n\nawait Effect.runPromise(program);\n\nconst port = isDevelopment\n ? // biome-ignore lint/style/noProcessEnv: allow only here\n (process.env.DEV_BE_PORT ?? \"3401\")\n : // biome-ignore lint/style/noProcessEnv: allow only here\n (process.env.PORT ?? \"3000\");\n\nserve(\n {\n fetch: honoApp.fetch,\n port: parseInt(port, 10),\n },\n (info) => {\n console.log(`Server is running on http://localhost:${info.port}`);\n },\n);\n", "import { Layer } from \"effect\";\nimport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository\";\n\nexport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository\";\nexport { AgentSessionController } from \"./presentation/AgentSessionController\";\n\n// Layer composition for dependency injection\n// Note: AgentSessionMappingService is no longer used since agentId-based lookup\n// replaced the session-id x prompt mapping approach\nexport const AgentSessionLayer = Layer.mergeAll(AgentSessionRepository.Live);\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport type { ExtendedConversation } from \"../../types\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n /**\n * Get agent session conversations by agentId.\n * Directly reads agent-${agentId}.jsonl file from project directory.\n * Returns null if file does not exist.\n */\n const getAgentSessionByAgentId = (\n projectId: string,\n agentId: string,\n ): Effect.Effect<ExtendedConversation[] | null, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n const agentFilePath = path.resolve(projectPath, `agent-${agentId}.jsonl`);\n\n // Check if file exists\n const exists = yield* fs.exists(agentFilePath);\n if (!exists) {\n return null;\n }\n\n const content = yield* fs.readFileString(agentFilePath);\n const conversations = parseJsonl(content);\n return conversations;\n });\n\n return {\n getAgentSessionByAgentId,\n };\n});\n\nexport class AgentSessionRepository extends Context.Tag(\n \"AgentSessionRepository\",\n)<\n AgentSessionRepository,\n {\n readonly getAgentSessionByAgentId: (\n projectId: string,\n agentId: string,\n ) => Effect.Effect<ExtendedConversation[] | null, Error>;\n }\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n\nexport type IAgentSessionRepository = Context.Tag.Service<\n typeof AgentSessionRepository\n>;\n", "import { z } from \"zod\";\nimport {\n type AssistantEntry,\n AssistantEntrySchema,\n} from \"./entry/AssistantEntrySchema\";\nimport { FileHistorySnapshotEntrySchema } from \"./entry/FileHIstorySnapshotEntrySchema\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema\";\nimport { type UserEntry, UserEntrySchema } from \"./entry/UserEntrySchema\";\n\nexport const ConversationSchema = z.union([\n UserEntrySchema,\n AssistantEntrySchema,\n SummaryEntrySchema,\n SystemEntrySchema,\n FileHistorySnapshotEntrySchema,\n QueueOperationEntrySchema,\n]);\n\nexport type Conversation = z.infer<typeof ConversationSchema>;\nexport type SidechainConversation = UserEntry | AssistantEntry | SystemEntry;\n", "import { z } from \"zod\";\nimport { AssistantMessageSchema } from \"../message/AssistantMessageSchema\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const AssistantEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"assistant\"),\n\n // required\n message: AssistantMessageSchema,\n\n // optional\n requestId: z.string().optional(),\n isApiErrorMessage: z.boolean().optional(),\n});\n\nexport type AssistantEntry = z.infer<typeof AssistantEntrySchema>;\n", "import { z } from \"zod\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ThinkingContentSchema } from \"../content/ThinkingContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\nimport { ToolUseContentSchema } from \"../content/ToolUseContentSchema\";\n\nconst AssistantMessageContentSchema = z.union([\n ThinkingContentSchema,\n TextContentSchema,\n ToolUseContentSchema,\n ToolResultContentSchema,\n]);\n\nexport type AssistantMessageContent = z.infer<\n typeof AssistantMessageContentSchema\n>;\n\nexport const AssistantMessageSchema = z.object({\n id: z.string(),\n container: z.null().optional(),\n type: z.literal(\"message\"),\n role: z.literal(\"assistant\"),\n model: z.string(),\n content: z.array(AssistantMessageContentSchema),\n stop_reason: z.string().nullable(),\n stop_sequence: z.string().nullable(),\n usage: z.object({\n input_tokens: z.number(),\n cache_creation_input_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n cache_creation: z\n .object({\n ephemeral_5m_input_tokens: z.number(),\n ephemeral_1h_input_tokens: z.number(),\n })\n .optional(),\n output_tokens: z.number(),\n service_tier: z.string().nullable().optional(),\n server_tool_use: z\n .object({\n web_search_requests: z.number(),\n })\n .optional(),\n }),\n});\n", "import { z } from \"zod\";\n\nexport const TextContentSchema = z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n});\n", "import { z } from \"zod\";\n\nexport const ThinkingContentSchema = z.object({\n type: z.literal(\"thinking\"),\n thinking: z.string(),\n signature: z.string().optional(),\n});\n", "import { z } from \"zod\";\nimport { ImageContentSchema } from \"./ImageContentSchema\";\nimport { TextContentSchema } from \"./TextContentSchema\";\n\nexport const ToolResultContentSchema = z.object({\n type: z.literal(\"tool_result\"),\n tool_use_id: z.string(),\n content: z.union([\n z.string(),\n z.array(z.union([TextContentSchema, ImageContentSchema])),\n ]),\n is_error: z.boolean().optional(),\n});\n\nexport type ToolResultContent = z.infer<typeof ToolResultContentSchema>;\n", "import { z } from \"zod\";\n\nexport const ImageContentSchema = z.object({\n type: z.literal(\"image\"),\n source: z.object({\n type: z.literal(\"base64\"),\n data: z.string(),\n media_type: z.enum([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]),\n }),\n});\n", "import { z } from \"zod\";\n\nexport const ToolUseContentSchema = z.object({\n type: z.literal(\"tool_use\"),\n id: z.string(),\n name: z.string(),\n input: z.record(z.string(), z.unknown()),\n});\n", "import { z } from \"zod\";\n\nexport const BaseEntrySchema = z.object({\n // required\n isSidechain: z.boolean(),\n userType: z.enum([\"external\"]),\n cwd: z.string(),\n sessionId: z.string(),\n version: z.string(),\n uuid: z.uuid(),\n timestamp: z.string(),\n\n // nullable\n parentUuid: z.uuid().nullable(),\n\n // optional\n isMeta: z.boolean().optional(),\n toolUseResult: z.unknown().optional(), // \u30B9\u30AD\u30FC\u30DE\u304C\u30C4\u30FC\u30EB\u3054\u3068\u306B\u7570\u306A\u308A\u3059\u304E\u308B\u3057\u5229\u7528\u3082\u3057\u306A\u305D\u3046\u306A\u306E\u3067 unknown\n gitBranch: z.string().optional(),\n isCompactSummary: z.boolean().optional(),\n});\n", "import { z } from \"zod\";\n\nexport const FileHistorySnapshotEntrySchema = z.object({\n // discriminator\n type: z.literal(\"file-history-snapshot\"),\n\n // required\n messageId: z.string(),\n snapshot: z.object({\n messageId: z.string(),\n trackedFileBackups: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n }),\n isSnapshotUpdate: z.boolean(),\n});\n\nexport type FileHistorySnapshotEntry = z.infer<\n typeof FileHistorySnapshotEntrySchema\n>;\n", "import { z } from \"zod\";\nimport { DocumentContentSchema } from \"../content/DocumentContentSchema\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\n\nconst QueueOperationContentSchema = z.union([\n z.string(),\n TextContentSchema,\n ToolResultContentSchema,\n ImageContentSchema,\n DocumentContentSchema,\n]);\n\nexport const QueueOperationEntrySchema = z.union([\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"enqueue\"),\n content: z.union([\n z.string(),\n z.array(z.union([z.string(), QueueOperationContentSchema])),\n ]),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"dequeue\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n]);\n\nexport type QueueOperationEntry = z.infer<typeof QueueOperationEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const DocumentContentSchema = z.object({\n type: z.literal(\"document\"),\n source: z.union([\n z.object({\n media_type: z.literal(\"text/plain\"),\n type: z.literal(\"text\"),\n data: z.string(),\n }),\n z.object({\n media_type: z.enum([\"application/pdf\"]),\n type: z.literal(\"base64\"),\n data: z.string(),\n }),\n ]),\n});\n", "import { z } from \"zod\";\n\nexport const SummaryEntrySchema = z.object({\n type: z.literal(\"summary\"),\n summary: z.string(),\n leafUuid: z.string().uuid(),\n});\n\nexport type SummaryEntry = z.infer<typeof SummaryEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const SystemEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"system\"),\n\n // required\n content: z.string(),\n toolUseID: z.string(),\n level: z.enum([\"info\"]),\n});\n\nexport type SystemEntry = z.infer<typeof SystemEntrySchema>;\n", "import { z } from \"zod\";\nimport { UserMessageSchema } from \"../message/UserMessageSchema\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const UserEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"user\"),\n\n // required\n message: UserMessageSchema,\n});\n\nexport type UserEntry = z.infer<typeof UserEntrySchema>;\n", "import { z } from \"zod\";\nimport { DocumentContentSchema } from \"../content/DocumentContentSchema\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema\";\nimport { TextContentSchema } from \"../content/TextContentSchema\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema\";\n\nconst UserMessageContentSchema = z.union([\n z.string(),\n TextContentSchema,\n ToolResultContentSchema,\n ImageContentSchema,\n DocumentContentSchema,\n]);\n\nexport type UserMessageContent = z.infer<typeof UserMessageContentSchema>;\n\nexport const UserMessageSchema = z.object({\n role: z.literal(\"user\"),\n content: z.union([\n z.string(),\n z.array(z.union([z.string(), UserMessageContentSchema])),\n ]),\n});\n", "import { ConversationSchema } from \"../../../../lib/conversation-schema\";\nimport type { ErrorJsonl, ExtendedConversation } from \"../../types\";\n\nexport const parseJsonl = (content: string): ExtendedConversation[] => {\n const lines = content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n\n return lines.map((line, index) => {\n const parsed = ConversationSchema.safeParse(JSON.parse(line));\n if (!parsed.success) {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n return parsed.data;\n });\n};\n", "import { dirname } from \"node:path\";\n\nexport const encodeProjectId = (fullPath: string) => {\n return Buffer.from(fullPath).toString(\"base64url\");\n};\n\nexport const decodeProjectId = (id: string) => {\n return Buffer.from(id, \"base64url\").toString(\"utf-8\");\n};\n\nexport const encodeProjectIdFromSessionFilePath = (sessionFilePath: string) => {\n return encodeProjectId(dirname(sessionFilePath));\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { AgentSessionRepository } from \"../infrastructure/AgentSessionRepository\";\n\nconst LayerImpl = Effect.gen(function* () {\n const repository = yield* AgentSessionRepository;\n\n /**\n * Get agent session by agentId.\n * Directly reads agent-${agentId}.jsonl file without mapping service.\n */\n const getAgentSession = (params: { projectId: string; agentId: string }) =>\n Effect.gen(function* () {\n const { projectId, agentId } = params;\n\n // Read conversations directly using agentId\n const conversations = yield* repository.getAgentSessionByAgentId(\n projectId,\n agentId,\n );\n\n if (conversations === null) {\n return {\n status: 200,\n response: {\n agentSessionId: null,\n conversations: [],\n },\n } as const satisfies ControllerResponse;\n }\n\n return {\n status: 200,\n response: {\n agentSessionId: agentId,\n conversations,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getAgentSession,\n };\n});\n\nexport type IAgentSessionController = InferEffect<typeof LayerImpl>;\n\nexport class AgentSessionController extends Context.Tag(\n \"AgentSessionController\",\n)<AgentSessionController, IAgentSessionController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { scanCommandFilesRecursively } from \"../functions/scanCommandFiles\";\nimport * as ClaudeCodeVersion from \"../models/ClaudeCodeVersion\";\nimport { ClaudeCodeService } from \"../services/ClaudeCodeService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeService = yield* ClaudeCodeService;\n const context = yield* ApplicationContext;\n // FileSystem and Path are required by scanCommandFilesRecursively\n yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getClaudeCommands = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n const globalCommands: string[] = yield* scanCommandFilesRecursively(\n context.claudeCodePaths.claudeCommandsDirPath,\n );\n\n const projectCommands: string[] =\n project.meta.projectPath === null\n ? []\n : yield* scanCommandFilesRecursively(\n path.resolve(project.meta.projectPath, \".claude\", \"commands\"),\n );\n\n return {\n response: {\n globalCommands: globalCommands,\n projectCommands: projectCommands,\n defaultCommands: [\"init\", \"compact\", \"security-review\", \"review\"],\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getMcpListRoute = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n const servers = yield* claudeCodeService.getMcpList(projectId);\n return {\n response: { servers },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getClaudeCodeMeta = () =>\n Effect.gen(function* () {\n const config = yield* claudeCodeService.getClaudeCodeMeta();\n return {\n response: {\n executablePath: config.claudeCodeExecutablePath,\n version: config.claudeCodeVersion\n ? ClaudeCodeVersion.versionText(config.claudeCodeVersion)\n : null,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getAvailableFeatures = () =>\n Effect.gen(function* () {\n const features = yield* claudeCodeService.getAvailableFeatures();\n const featuresList = Object.entries(features).flatMap(([key, value]) => {\n return [\n {\n name: key as keyof typeof features,\n enabled: value,\n },\n ];\n });\n\n return {\n response: { features: featuresList },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getClaudeCommands,\n getMcpListRoute,\n getClaudeCodeMeta,\n getAvailableFeatures,\n };\n});\n\nexport type IClaudeCodeController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodeController extends Context.Tag(\"ClaudeCodeController\")<\n ClaudeCodeController,\n IClaudeCodeController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { Path } from \"@effect/platform\";\nimport { Effect, Context as EffectContext, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EnvService } from \"./EnvService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n const globalClaudeDirectoryPath = yield* envService\n .getEnv(\"GLOBAL_CLAUDE_DIR\")\n .pipe(\n Effect.map((envVar) =>\n envVar === undefined\n ? path.resolve(homedir(), \".claude\")\n : path.resolve(envVar),\n ),\n );\n\n const claudeCodePaths = {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(globalClaudeDirectoryPath, \"commands\"),\n claudeProjectsDirPath: path.resolve(globalClaudeDirectoryPath, \"projects\"),\n } as const satisfies {\n globalClaudeDirectoryPath: string;\n claudeCommandsDirPath: string;\n claudeProjectsDirPath: string;\n };\n\n return {\n claudeCodePaths,\n };\n});\n\nexport type IApplicationContext = InferEffect<typeof LayerImpl>;\nexport class ApplicationContext extends EffectContext.Tag(\"ApplicationContext\")<\n ApplicationContext,\n IApplicationContext\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { type EnvSchema, envSchema } from \"../schema\";\n\nconst LayerImpl = Effect.gen(function* () {\n const envRef = yield* Ref.make<EnvSchema | undefined>(undefined);\n\n const parseEnv = () => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n const parsed = envSchema.safeParse(process.env);\n if (!parsed.success) {\n console.error(parsed.error);\n throw new Error(`Invalid environment variables: ${parsed.error.message}`);\n }\n\n return parsed.data;\n };\n\n const getEnv = <Key extends keyof EnvSchema>(\n key: Key,\n ): Effect.Effect<EnvSchema[Key]> => {\n return Effect.gen(function* () {\n yield* Ref.update(envRef, (existingEnv) => {\n if (existingEnv === undefined) {\n return parseEnv();\n }\n return existingEnv;\n });\n\n const env = yield* Ref.get(envRef);\n if (env === undefined) {\n throw new Error(\n \"Unexpected error: Environment variables are not loaded\",\n );\n }\n\n return env[key];\n });\n };\n\n return {\n getEnv,\n };\n});\n\nexport type IEnvService = InferEffect<typeof LayerImpl>;\n\nexport class EnvService extends Context.Tag(\"EnvService\")<\n EnvService,\n IEnvService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { z } from \"zod\";\n\nexport const envSchema = z.object({\n NODE_ENV: z\n .enum([\"development\", \"production\", \"test\"])\n .optional()\n .default(\"development\"),\n GLOBAL_CLAUDE_DIR: z.string().optional(),\n NEXT_PHASE: z.string().optional(),\n PORT: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((val) => parseInt(val, 10)),\n PATH: z.string().optional(),\n CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH: z.string().optional(),\n CLAUDE_CODE_VIEWER_AUTH_PASSWORD: z.string().optional(),\n});\n\nexport type EnvSchema = z.infer<typeof envSchema>;\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport type { Project } from \"../../types\";\nimport { decodeProjectId, encodeProjectId } from \"../functions/id\";\nimport { ProjectMetaService } from \"../services/ProjectMetaService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectMetaService = yield* ProjectMetaService;\n const context = yield* ApplicationContext;\n\n const getProject = (projectId: string) =>\n Effect.gen(function* () {\n const fullPath = decodeProjectId(projectId);\n\n // Check if project directory exists\n const exists = yield* fs.exists(fullPath);\n if (!exists) {\n return yield* Effect.fail(new Error(\"Project not found\"));\n }\n\n // Get file stats\n const stat = yield* fs.stat(fullPath);\n\n // Get project metadata\n const meta = yield* projectMetaService.getProjectMeta(projectId);\n\n return {\n project: {\n id: projectId,\n claudeProjectPath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n meta,\n },\n };\n });\n\n const getProjects = () =>\n Effect.gen(function* () {\n // Check if the claude projects directory exists\n const dirExists = yield* fs.exists(\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n if (!dirExists) {\n console.warn(\n `Claude projects directory not found at ${context.claudeCodePaths.claudeProjectsDirPath}`,\n );\n return { projects: [] };\n }\n\n // Read directory entries\n const entries = yield* fs.readDirectory(\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n\n // Filter directories and map to Project objects\n const projectEffects = entries.map((entry) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(\n context.claudeCodePaths.claudeProjectsDirPath,\n entry,\n );\n\n // Check if it's a directory\n const stat = yield* Effect.tryPromise(() =>\n fs.stat(fullPath).pipe(Effect.runPromise),\n ).pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (!stat || stat.type !== \"Directory\") {\n return null;\n }\n\n const id = encodeProjectId(fullPath);\n const meta = yield* projectMetaService.getProjectMeta(id);\n\n return {\n id,\n claudeProjectPath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n meta,\n } satisfies Project;\n }),\n );\n\n // Execute all effects in parallel and filter out nulls\n const projectsWithNulls = yield* Effect.all(projectEffects, {\n concurrency: \"unbounded\",\n });\n const projects = projectsWithNulls.filter(\n (p): p is Project => p !== null,\n );\n\n // Sort by last modified date (newest first)\n const sortedProjects = projects.sort((a, b) => {\n return (\n (b.lastModifiedAt ? b.lastModifiedAt.getTime() : 0) -\n (a.lastModifiedAt ? a.lastModifiedAt.getTime() : 0)\n );\n });\n\n return { projects: sortedProjects };\n });\n\n return {\n getProject,\n getProjects,\n };\n});\n\nexport type IProjectRepository = InferEffect<typeof LayerImpl>;\nexport class ProjectRepository extends Context.Tag(\"ProjectRepository\")<\n ProjectRepository,\n IProjectRepository\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option, Ref } from \"effect\";\nimport { z } from \"zod\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport {\n FileCacheStorage,\n makeFileCacheStorageLayer,\n} from \"../../../lib/storage/FileCacheStorage\";\nimport { PersistentService } from \"../../../lib/storage/FileCacheStorage/PersistentService\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport type { ProjectMeta } from \"../../types\";\nimport { decodeProjectId } from \"../functions/id\";\n\nconst ProjectPathSchema = z.string().nullable();\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectPathCache = yield* FileCacheStorage<string | null>();\n const projectMetaCacheRef = yield* Ref.make(new Map<string, ProjectMeta>());\n\n const extractProjectPathFromJsonl = (\n filePath: string,\n ): Effect.Effect<string | null, Error> =>\n Effect.gen(function* () {\n const cached = yield* projectPathCache.get(filePath);\n if (cached !== undefined) {\n return cached;\n }\n\n const content = yield* fs.readFileString(filePath);\n const lines = content.split(\"\\n\");\n\n let cwd: string | null = null;\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\n\n if (\n conversation === undefined ||\n conversation.type === \"summary\" ||\n conversation.type === \"x-error\" ||\n conversation.type === \"file-history-snapshot\" ||\n conversation.type === \"queue-operation\"\n ) {\n continue;\n }\n\n cwd = conversation.cwd;\n break;\n }\n\n if (cwd !== null) {\n yield* projectPathCache.set(filePath, cwd);\n }\n\n return cwd;\n });\n\n const getProjectMeta = (\n projectId: string,\n ): Effect.Effect<ProjectMeta, Error> =>\n Effect.gen(function* () {\n const metaCache = yield* Ref.get(projectMetaCacheRef);\n const cached = metaCache.get(projectId);\n if (cached !== undefined) {\n return cached;\n }\n\n const claudeProjectPath = decodeProjectId(projectId);\n\n const dirents = yield* fs.readDirectory(claudeProjectPath);\n const fileEntries = yield* Effect.all(\n dirents\n .filter((name) => name.endsWith(\".jsonl\"))\n .map((name) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(claudeProjectPath, name);\n const stat = yield* fs.stat(fullPath);\n const mtime = Option.getOrElse(stat.mtime, () => new Date(0));\n return {\n fullPath,\n mtime,\n } as const;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n const files = fileEntries.sort((a, b) => {\n return a.mtime.getTime() - b.mtime.getTime();\n });\n\n let projectPath: string | null = null;\n\n for (const file of files) {\n projectPath = yield* extractProjectPathFromJsonl(file.fullPath);\n\n if (projectPath === null) {\n continue;\n }\n\n break;\n }\n\n const projectMeta: ProjectMeta = {\n projectName: projectPath ? path.basename(projectPath) : null,\n projectPath,\n sessionCount: files.length,\n };\n\n yield* Ref.update(projectMetaCacheRef, (cache) => {\n cache.set(projectId, projectMeta);\n return cache;\n });\n\n return projectMeta;\n });\n\n const invalidateProject = (projectId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(projectMetaCacheRef, (cache) => {\n cache.delete(projectId);\n return cache;\n });\n });\n\n return {\n getProjectMeta,\n invalidateProject,\n };\n});\n\nexport type IProjectMetaService = InferEffect<typeof LayerImpl>;\n\nexport class ProjectMetaService extends Context.Tag(\"ProjectMetaService\")<\n ProjectMetaService,\n IProjectMetaService\n>() {\n static Live = Layer.effect(this, LayerImpl).pipe(\n Layer.provide(\n makeFileCacheStorageLayer(\"project-path-cache\", ProjectPathSchema),\n ),\n Layer.provide(PersistentService.Live),\n );\n}\n", "import type { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref, Runtime } from \"effect\";\nimport type { z } from \"zod\";\nimport { PersistentService } from \"./PersistentService\";\n\nexport interface FileCacheStorageService<T> {\n readonly get: (key: string) => Effect.Effect<T | undefined>;\n readonly set: (key: string, value: T) => Effect.Effect<void>;\n readonly invalidate: (key: string) => Effect.Effect<void>;\n readonly getAll: () => Effect.Effect<Map<string, T>>;\n}\n\nexport const FileCacheStorage = <T>() =>\n Context.GenericTag<FileCacheStorageService<T>>(\"FileCacheStorage\");\n\nexport const makeFileCacheStorageLayer = <T>(\n storageKey: string,\n schema: z.ZodType<T>,\n) =>\n Layer.effect(\n FileCacheStorage<T>(),\n Effect.gen(function* () {\n const persistentService = yield* PersistentService;\n\n const runtime = yield* Effect.runtime<FileSystem.FileSystem>();\n\n const storageRef = yield* Effect.gen(function* () {\n const persistedData = yield* persistentService.load(storageKey);\n\n const initialMap = new Map<string, T>();\n for (const [key, value] of persistedData) {\n const parsed = schema.safeParse(value);\n if (parsed.success) {\n initialMap.set(key, parsed.data);\n }\n }\n\n return yield* Ref.make(initialMap);\n });\n\n const syncToFile = (entries: readonly [string, T][]) => {\n Runtime.runFork(runtime)(persistentService.save(storageKey, entries));\n };\n\n return {\n get: (key: string) =>\n Effect.gen(function* () {\n const storage = yield* Ref.get(storageRef);\n return storage.get(key);\n }),\n\n set: (key: string, value: T) =>\n Effect.gen(function* () {\n const before = yield* Ref.get(storageRef);\n const beforeString = JSON.stringify(Array.from(before.entries()));\n\n yield* Ref.update(storageRef, (map) => {\n map.set(key, value);\n return map;\n });\n\n const after = yield* Ref.get(storageRef);\n const afterString = JSON.stringify(Array.from(after.entries()));\n\n if (beforeString !== afterString) {\n syncToFile(Array.from(after.entries()));\n }\n }),\n\n invalidate: (key: string) =>\n Effect.gen(function* () {\n const before = yield* Ref.get(storageRef);\n\n if (!before.has(key)) {\n return;\n }\n\n yield* Ref.update(storageRef, (map) => {\n map.delete(key);\n return map;\n });\n\n const after = yield* Ref.get(storageRef);\n syncToFile(Array.from(after.entries()));\n }),\n\n getAll: () =>\n Effect.gen(function* () {\n const storage = yield* Ref.get(storageRef);\n return new Map(storage);\n }),\n };\n }),\n );\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { z } from \"zod\";\nimport { claudeCodeViewerCacheDirPath } from \"../../config/paths\";\nimport type { InferEffect } from \"../../effect/types\";\n\nconst saveSchema = z.array(z.tuple([z.string(), z.unknown()]));\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n\n const getCacheFilePath = (key: string) =>\n path.resolve(claudeCodeViewerCacheDirPath, `${key}.json`);\n\n const load = (key: string) => {\n const cacheFilePath = getCacheFilePath(key);\n\n return Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(claudeCodeViewerCacheDirPath))) {\n yield* fs.makeDirectory(claudeCodeViewerCacheDirPath, {\n recursive: true,\n });\n }\n\n if (!(yield* fs.exists(cacheFilePath))) {\n yield* fs.writeFileString(cacheFilePath, \"[]\");\n } else {\n const content = yield* fs.readFileString(cacheFilePath);\n const parsed = (() => {\n try {\n return saveSchema.parse(JSON.parse(content));\n } catch (error) {\n console.error(`Cache file parse error: ${error}`);\n return undefined;\n }\n })();\n\n if (parsed === undefined || parsed.length === 0) {\n console.error(`Cache file removed: ${cacheFilePath}`);\n yield* fs.writeFileString(cacheFilePath, \"[]\");\n } else {\n return parsed;\n }\n }\n\n return [];\n });\n };\n\n const save = (key: string, entries: readonly [string, unknown][]) => {\n const cacheFilePath = getCacheFilePath(key);\n\n return Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n yield* fs.writeFileString(cacheFilePath, JSON.stringify(entries));\n });\n };\n\n return {\n load,\n save,\n };\n});\n\nexport type IPersistentService = InferEffect<typeof LayerImpl>;\n\nexport class PersistentService extends Context.Tag(\"PersistentService\")<\n PersistentService,\n IPersistentService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport const claudeCodeViewerCacheDirPath = resolve(\n homedir(),\n \".claude-code-viewer\",\n \"cache\",\n);\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\n\n/**\n * Convert file path to command name by creating a colon-separated path\n * relative to the base directory.\n *\n * @param filePath - Absolute path to the .md file\n * @param baseDir - Base directory path (commands directory)\n * @returns Command name (e.g., \"frontend:impl\" for \"baseDir/frontend/impl.md\")\n *\n * @example\n * pathToCommandName(\"/base/commands/impl.md\", \"/base/commands\") // => \"impl\"\n * pathToCommandName(\"/base/commands/frontend/impl.md\", \"/base/commands\") // => \"frontend:impl\"\n */\nexport const pathToCommandName = (\n filePath: string,\n baseDir: string,\n): string => {\n // Normalize base directory by removing trailing slash\n const normalizedBaseDir = baseDir.endsWith(\"/\")\n ? baseDir.slice(0, -1)\n : baseDir;\n\n // Get relative path from base directory\n const relativePath = filePath.startsWith(normalizedBaseDir)\n ? filePath.slice(normalizedBaseDir.length + 1)\n : filePath;\n\n // Remove .md extension and convert path separators to colons\n return relativePath.replace(/\\.md$/, \"\").replace(/\\//g, \":\");\n};\n\n/**\n * Recursively scan a directory for .md files and return them as command names.\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Directory path to scan\n * @returns Array of command names (e.g., [\"impl\", \"frontend:impl\"])\n *\n * @example\n * // For directory structure:\n * // commands/\n * // impl.md\n * // frontend/\n * // impl.md\n * scanCommandFilesRecursively(\"/path/to/commands\")\n * // => [\"impl\", \"frontend:impl\"]\n */\nexport const scanCommandFilesRecursively = (\n dirPath: string,\n): Effect.Effect<string[], never, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n // Helper function to recursively scan directories\n const scanDirectory = (\n currentPath: string,\n ): Effect.Effect<\n string[],\n PlatformError,\n FileSystem.FileSystem | Path.Path\n > =>\n Effect.gen(function* () {\n // Check if directory exists\n const exists = yield* fs.exists(currentPath);\n if (!exists) {\n return [];\n }\n\n // Read directory contents\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each item\n const results = yield* Effect.forEach(\n items,\n (item) =>\n Effect.gen(function* () {\n // Skip hidden files and directories\n if (item.startsWith(\".\")) {\n return [];\n }\n\n const itemPath = path.join(currentPath, item);\n const info = yield* fs.stat(itemPath);\n\n if (info.type === \"Directory\") {\n // Recursively scan subdirectory\n return yield* scanDirectory(itemPath);\n }\n if (info.type === \"File\" && item.endsWith(\".md\")) {\n // Convert file path to command name\n return [pathToCommandName(itemPath, dirPath)];\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Flatten the results array\n return results.flat();\n });\n\n // Wrap in match to handle errors gracefully\n return yield* scanDirectory(dirPath).pipe(\n Effect.match({\n onSuccess: (items) => items,\n onFailure: () => [],\n }),\n );\n });\n", "import { z } from \"zod\";\n\nconst versionRegex = /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/;\nconst versionSchema = z\n .object({\n major: z.string().transform((value) => Number.parseInt(value, 10)),\n minor: z.string().transform((value) => Number.parseInt(value, 10)),\n patch: z.string().transform((value) => Number.parseInt(value, 10)),\n })\n .refine((data) =>\n [data.major, data.minor, data.patch].every((value) => !Number.isNaN(value)),\n );\n\nexport type ClaudeCodeVersion = z.infer<typeof versionSchema>;\n\nexport const fromCLIString = (\n versionOutput: string,\n): ClaudeCodeVersion | null => {\n const groups = versionOutput.trim().match(versionRegex)?.groups;\n\n if (groups === undefined) {\n return null;\n }\n\n const parsed = versionSchema.safeParse(groups);\n if (!parsed.success) {\n return null;\n }\n\n return parsed.data;\n};\n\nexport const versionText = (version: ClaudeCodeVersion) =>\n `${version.major}.${version.minor}.${version.patch}`;\n\nexport const equals = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n a.major === b.major && a.minor === b.minor && a.patch === b.patch;\n\nexport const greaterThan = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n a.major > b.major ||\n (a.major === b.major &&\n (a.minor > b.minor || (a.minor === b.minor && a.patch > b.patch)));\n\nexport const greaterThanOrEqual = (\n a: ClaudeCodeVersion,\n b: ClaudeCodeVersion,\n) => equals(a, b) || greaterThan(a, b);\n", "import { Context, Data, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { parseMcpListOutput } from \"../functions/parseMcpListOutput\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\n\nclass ProjectPathNotFoundError extends Data.TaggedError(\n \"ProjectPathNotFoundError\",\n)<{\n projectId: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n\n const getClaudeCodeMeta = () =>\n Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n return config;\n });\n\n const getAvailableFeatures = () =>\n Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n const features = ClaudeCode.getAvailableFeatures(\n config.claudeCodeVersion,\n );\n return features;\n });\n\n const getMcpList = (projectId: string) =>\n Effect.gen(function* () {\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n return yield* Effect.fail(new ProjectPathNotFoundError({ projectId }));\n }\n\n const output = yield* ClaudeCode.getMcpListOutput(\n project.meta.projectPath,\n );\n return parseMcpListOutput(output);\n });\n\n return {\n getClaudeCodeMeta,\n getMcpList,\n getAvailableFeatures,\n };\n});\n\nexport type IClaudeCodeService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeService extends Context.Tag(\"ClaudeCodeService\")<\n ClaudeCodeService,\n IClaudeCodeService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export interface McpServer {\n name: string;\n command: string;\n}\n\nexport const parseMcpListOutput = (output: string) => {\n const servers: McpServer[] = [];\n const lines = output.trim().split(\"\\n\");\n\n for (const line of lines) {\n // Skip header lines and status indicators\n if (line.includes(\"Checking MCP server health\") || line.trim() === \"\") {\n continue;\n }\n\n // Parse lines like \"context7: npx -y @upstash/context7-mcp@latest - \u2713 Connected\"\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const name = line.substring(0, colonIndex).trim();\n const rest = line.substring(colonIndex + 1).trim();\n\n // Remove status indicators (\u2713 Connected, \u2717 Failed, etc.)\n const command = rest.replace(/\\s*-\\s*[\u2713\u2717].*$/, \"\").trim();\n\n if (name && command) {\n servers.push({ name, command });\n }\n }\n }\n\n return servers;\n};\n", "import { query as agentSdkQuery } from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n type CanUseTool,\n query as claudeCodeQuery,\n} from \"@anthropic-ai/claude-code\";\nimport { Command, Path } from \"@effect/platform\";\nimport { Data, Effect } from \"effect\";\nimport { uniq } from \"es-toolkit\";\nimport { EnvService } from \"../../platform/services/EnvService\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\ntype AgentSdkQuery = typeof agentSdkQuery;\ntype AgentSdkPrompt = Parameters<AgentSdkQuery>[0][\"prompt\"];\ntype AgentSdkQueryOptions = NonNullable<\n Parameters<AgentSdkQuery>[0][\"options\"]\n>;\n\nconst npxCacheRegExp = /_npx[/\\\\].*node_modules[\\\\/]\\.bin/;\nconst localNodeModulesBinRegExp = new RegExp(\n `${process.cwd()}/node_modules/.bin`,\n);\n\nexport const claudeCodePathPriority = (path: string): number => {\n if (npxCacheRegExp.test(path)) {\n return 0;\n }\n\n if (localNodeModulesBinRegExp.test(path)) {\n return 1;\n }\n\n return 2;\n};\n\nclass ClaudeCodePathNotFoundError extends Data.TaggedError(\n \"ClaudeCodePathNotFoundError\",\n)<{\n message: string;\n}> {}\n\nconst resolveClaudeCodePath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n // Environment variable (highest priority)\n const specifiedExecutablePath = yield* envService.getEnv(\n \"CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH\",\n );\n if (specifiedExecutablePath !== undefined) {\n return path.resolve(specifiedExecutablePath);\n }\n\n // System PATH lookup\n const claudePaths = yield* Command.string(\n Command.make(\"which\", \"-a\", \"claude\").pipe(Command.runInShell(true)),\n ).pipe(\n Effect.map(\n (output) =>\n output\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\") ?? [],\n ),\n Effect.map((paths) =>\n uniq(paths).toSorted((a, b) => {\n const aPriority = claudeCodePathPriority(a);\n const bPriority = claudeCodePathPriority(b);\n\n if (aPriority < bPriority) {\n return 1;\n }\n if (aPriority > bPriority) {\n return -1;\n }\n\n return 0;\n }),\n ),\n Effect.catchAll(() => Effect.succeed<string[]>([])),\n );\n\n const resolvedClaudePath = claudePaths.at(0);\n\n if (resolvedClaudePath === undefined) {\n return yield* Effect.fail(\n new ClaudeCodePathNotFoundError({\n message: \"Claude Code CLI not found in any location\",\n }),\n );\n }\n\n return resolvedClaudePath;\n});\n\nexport const Config = Effect.gen(function* () {\n const claudeCodeExecutablePath = yield* resolveClaudeCodePath;\n\n const claudeCodeVersion = ClaudeCodeVersion.fromCLIString(\n yield* Command.string(Command.make(claudeCodeExecutablePath, \"--version\")),\n );\n\n return {\n claudeCodeExecutablePath,\n claudeCodeVersion,\n };\n});\n\nexport const getMcpListOutput = (projectCwd: string) =>\n Effect.gen(function* () {\n const { claudeCodeExecutablePath } = yield* Config;\n const output = yield* Command.string(\n Command.make(\n \"cd\",\n projectCwd,\n \"&&\",\n claudeCodeExecutablePath,\n \"mcp\",\n \"list\",\n ).pipe(Command.runInShell(true)),\n );\n return output;\n });\n\nexport const getAvailableFeatures = (\n claudeCodeVersion: ClaudeCodeVersion.ClaudeCodeVersion | null,\n) => ({\n canUseTool:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 82,\n })\n : false,\n uuidOnSDKMessage:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 86,\n })\n : false,\n agentSdk:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 1,\n minor: 0,\n patch: 125, // ClaudeCodeAgentSDK is available since v1.0.125\n })\n : false,\n sidechainSeparation:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 0,\n patch: 28, // Sidechain conversations stored in agent-*.jsonl since v2.0.28\n })\n : false,\n});\n\nexport const query = (\n prompt: AgentSdkPrompt,\n options: AgentSdkQueryOptions,\n) => {\n const { canUseTool, permissionMode, ...baseOptions } = options;\n\n return Effect.gen(function* () {\n const { claudeCodeExecutablePath, claudeCodeVersion } = yield* Config;\n const availableFeatures = getAvailableFeatures(claudeCodeVersion);\n\n const options: AgentSdkQueryOptions = {\n pathToClaudeCodeExecutable: claudeCodeExecutablePath,\n ...baseOptions,\n ...(availableFeatures.canUseTool\n ? { canUseTool, permissionMode }\n : {\n permissionMode: \"bypassPermissions\",\n }),\n };\n\n if (availableFeatures.agentSdk) {\n return agentSdkQuery({\n prompt,\n options: {\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: [\"user\", \"project\", \"local\"],\n ...options,\n },\n });\n }\n\n const fallbackCanUseTool = (() => {\n const canUseTool = options.canUseTool;\n if (canUseTool === undefined) {\n return undefined;\n }\n\n const fn: CanUseTool = async (toolName, input, canUseToolOptions) => {\n const response = await canUseTool(toolName, input, {\n signal: canUseToolOptions.signal,\n suggestions: canUseToolOptions.suggestions,\n toolUseID: undefined as unknown as string,\n });\n return response;\n };\n\n return fn;\n })();\n\n return claudeCodeQuery({\n prompt,\n options: {\n ...options,\n canUseTool: fallbackCanUseTool,\n },\n });\n });\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PermissionResponse } from \"../../../../types/permissions\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodePermissionService } from \"../services/ClaudeCodePermissionService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodePermissionService = yield* ClaudeCodePermissionService;\n\n const permissionResponse = (options: {\n permissionResponse: PermissionResponse;\n }) =>\n Effect.sync(() => {\n const { permissionResponse } = options;\n\n Effect.runFork(\n claudeCodePermissionService.respondToPermissionRequest(\n permissionResponse,\n ),\n );\n\n return {\n status: 200,\n response: {\n message: \"Permission response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n permissionResponse,\n };\n});\n\nexport type IClaudeCodePermissionController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodePermissionController extends Context.Tag(\n \"ClaudeCodePermissionController\",\n)<ClaudeCodePermissionController, IClaudeCodePermissionController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { CanUseTool } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type {\n PermissionRequest,\n PermissionResponse,\n} from \"../../../../types/permissions\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingPermissionRequestsRef = yield* Ref.make<\n Map<string, PermissionRequest>\n >(new Map());\n const permissionResponsesRef = yield* Ref.make<\n Map<string, PermissionResponse>\n >(new Map());\n const eventBus = yield* EventBus;\n\n const waitPermissionResponse = (\n request: PermissionRequest,\n options: { timeoutMs: number },\n ) =>\n Effect.gen(function* () {\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n requests.set(request.id, request);\n return requests;\n });\n\n yield* eventBus.emit(\"permissionRequested\", {\n permissionRequest: request,\n });\n\n let passedMs = 0;\n let response: PermissionResponse | null = null;\n while (passedMs < options.timeoutMs) {\n const responses = yield* Ref.get(permissionResponsesRef);\n response = responses.get(request.id) ?? null;\n if (response !== null) {\n break;\n }\n\n yield* Effect.sleep(1000);\n passedMs += 1000;\n }\n\n return response;\n });\n\n const createCanUseToolRelatedOptions = (options: {\n taskId: string;\n userConfig: UserConfig;\n sessionId?: string;\n }) => {\n const { taskId, userConfig, sessionId } = options;\n\n return Effect.gen(function* () {\n const claudeCodeConfig = yield* ClaudeCode.Config;\n\n if (\n !ClaudeCode.getAvailableFeatures(claudeCodeConfig.claudeCodeVersion)\n .canUseTool\n ) {\n return {\n permissionMode: \"bypassPermissions\",\n } as const;\n }\n\n const canUseTool: CanUseTool = async (toolName, toolInput, _options) => {\n if (userConfig.permissionMode !== \"default\") {\n // Convert Claude Code permission modes to canUseTool behaviors\n if (\n userConfig.permissionMode === \"bypassPermissions\" ||\n userConfig.permissionMode === \"acceptEdits\"\n ) {\n return {\n behavior: \"allow\" as const,\n updatedInput: toolInput,\n };\n } else {\n // plan mode should deny actual tool execution\n return {\n behavior: \"deny\" as const,\n message: \"Tool execution is disabled in plan mode\",\n };\n }\n }\n\n const permissionRequest: PermissionRequest = {\n id: ulid(),\n taskId,\n sessionId,\n toolName,\n toolInput,\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(\n waitPermissionResponse(permissionRequest, { timeoutMs: 60000 }),\n );\n\n if (response === null) {\n return {\n behavior: \"deny\" as const,\n message: \"Permission request timed out\",\n };\n }\n\n if (response.decision === \"allow\") {\n return {\n behavior: \"allow\" as const,\n updatedInput: toolInput,\n };\n } else {\n return {\n behavior: \"deny\" as const,\n message: \"Permission denied by user\",\n };\n }\n };\n\n return {\n canUseTool,\n permissionMode: userConfig.permissionMode,\n } as const;\n });\n };\n\n const respondToPermissionRequest = (\n response: PermissionResponse,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(permissionResponsesRef, (responses) => {\n responses.set(response.permissionRequestId, response);\n return responses;\n });\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n requests.delete(response.permissionRequestId);\n return requests;\n });\n });\n\n return {\n createCanUseToolRelatedOptions,\n respondToPermissionRequest,\n };\n});\n\nexport type IClaudeCodePermissionService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodePermissionService extends Context.Tag(\n \"ClaudeCodePermissionService\",\n)<ClaudeCodePermissionService, IClaudeCodePermissionService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration\";\n\ntype Listener<T> = (data: T) => void | Promise<void>;\n\nconst layerImpl = Effect.gen(function* () {\n const listenersMap = new Map<\n keyof InternalEventDeclaration,\n Set<Listener<unknown>>\n >();\n\n const getListeners = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n ): Set<Listener<InternalEventDeclaration[EventName]>> => {\n if (!listenersMap.has(event)) {\n listenersMap.set(event, new Set());\n }\n return listenersMap.get(event) as Set<\n Listener<InternalEventDeclaration[EventName]>\n >;\n };\n\n const emit = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n data: InternalEventDeclaration[EventName],\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listeners = getListeners(event);\n\n void Promise.allSettled(\n Array.from(listeners).map(async (listener) => {\n await listener(data);\n }),\n );\n });\n\n const on = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n listener: Listener<InternalEventDeclaration[EventName]>,\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n listeners.add(listener);\n });\n\n const off = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n listener: Listener<InternalEventDeclaration[EventName]>,\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n listeners.delete(listener);\n });\n\n return {\n emit,\n on,\n off,\n } as const;\n});\n\nexport type IEventBus = InferEffect<typeof layerImpl>;\n\nexport class EventBus extends Context.Tag(\"EventBus\")<EventBus, IEventBus>() {\n static Live = Layer.effect(this, layerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PublicSessionProcess } from \"../../../../types/session-process\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator\";\nimport { ClaudeCodeLifeCycleService } from \"../services/ClaudeCodeLifeCycleService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const userConfigService = yield* UserConfigService;\n\n const getSessionProcesses = () =>\n Effect.gen(function* () {\n const publicSessionProcesses =\n yield* claudeCodeLifeCycleService.getPublicSessionProcesses();\n\n return {\n response: {\n processes: publicSessionProcesses.map(\n (p): PublicSessionProcess => ({\n id: p.def.sessionProcessId,\n projectId: p.def.projectId,\n sessionId: p.sessionId,\n status: p.type === \"paused\" ? \"paused\" : \"running\",\n }),\n ),\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const createSessionProcess = (options: {\n projectId: string;\n input: UserMessageInput;\n baseSessionId?: string | undefined;\n }) =>\n Effect.gen(function* () {\n const { projectId, input, baseSessionId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n const userConfig = yield* userConfigService.getUserConfig();\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400 as const,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.startTask({\n baseSession: {\n cwd: project.meta.projectPath,\n projectId,\n sessionId: baseSessionId,\n },\n userConfig,\n input,\n });\n\n const { sessionId } = yield* result.yieldSessionInitialized();\n\n return {\n status: 201 as const,\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId,\n sessionId,\n },\n },\n } as const satisfies ControllerResponse;\n });\n\n const continueSessionProcess = (options: {\n projectId: string;\n input: UserMessageInput;\n baseSessionId: string;\n sessionProcessId: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, input, baseSessionId, sessionProcessId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.continueTask({\n sessionProcessId,\n input,\n baseSessionId,\n });\n\n return {\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId: result.sessionProcess.def.projectId,\n sessionId: baseSessionId,\n },\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSessionProcesses,\n createSessionProcess,\n continueSessionProcess,\n };\n});\n\nexport type IClaudeCodeSessionProcessController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodeSessionProcessController extends Context.Tag(\n \"ClaudeCodeSessionProcessController\",\n)<ClaudeCodeSessionProcessController, IClaudeCodeSessionProcessController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport { DEFAULT_LOCALE } from \"../../../../lib/i18n/localeDetection\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\n\nconst LayerImpl = Effect.gen(function* () {\n const configRef = yield* Ref.make<UserConfig>({\n hideNoUserMessageSession: true,\n unifySameTitleSession: false,\n enterKeyBehavior: \"shift-enter-send\",\n permissionMode: \"default\",\n locale: DEFAULT_LOCALE,\n theme: \"system\",\n });\n\n const setUserConfig = (newConfig: UserConfig) =>\n Effect.gen(function* () {\n yield* Ref.update(configRef, () => newConfig);\n });\n\n const getUserConfig = () =>\n Effect.gen(function* () {\n const config = yield* Ref.get(configRef);\n return config;\n });\n\n return {\n getUserConfig,\n setUserConfig,\n };\n});\n\nexport type IUserConfigService = InferEffect<typeof LayerImpl>;\nexport class UserConfigService extends Context.Tag(\"UserConfigService\")<\n UserConfigService,\n IUserConfigService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { SupportedLocale } from \"./schema\";\n\nexport const DEFAULT_LOCALE: SupportedLocale = \"en\";\n\nconst normalizeTag = (tag?: string): SupportedLocale | undefined => {\n if (!tag) {\n return undefined;\n }\n\n const normalized = tag.trim().toLowerCase().replaceAll(\"_\", \"-\");\n if (normalized.length === 0 || normalized === \"*\") {\n return undefined;\n }\n\n if (normalized.startsWith(\"zh\")) {\n return \"zh_CN\";\n }\n\n if (normalized.startsWith(\"ja\") || normalized.startsWith(\"jp\")) {\n return \"ja\";\n }\n\n if (normalized.startsWith(\"en\")) {\n return \"en\";\n }\n\n return undefined;\n};\n\nexport const detectLocaleFromAcceptLanguage = (\n header: string | undefined,\n): SupportedLocale | undefined => {\n if (!header) {\n return undefined;\n }\n\n const preferences = header\n // Convert the raw Accept-Language header (e.g. \"en-US;q=0.8, fr\")\n // into a list of { tag, quality, index } entries that we can sort.\n .split(\",\")\n .map((part, index) => {\n const [rawTag, ...params] = part.trim().split(\";\");\n const qParam = params\n .map((param) => param.trim())\n .find((param) => param.startsWith(\"q=\"));\n const quality = qParam ? Number.parseFloat(qParam.slice(2)) : 1;\n\n return {\n tag: rawTag,\n quality: Number.isNaN(quality) ? 1 : quality,\n index,\n };\n })\n // Example result for \"en-US;q=0.8, fr\":\n // [{ tag: \"en-US\", quality: 0.8, index: 0 }, { tag: \"fr\", quality: 1, index: 1 }]\n .filter((item) => Boolean(item.tag))\n .sort((a, b) => {\n if (b.quality !== a.quality) {\n return b.quality - a.quality;\n }\n return a.index - b.index;\n });\n\n for (const preference of preferences) {\n const locale = normalizeTag(preference.tag);\n if (locale) {\n return locale;\n }\n }\n\n return undefined;\n};\n\ntype NavigatorLike = Pick<Navigator, \"language\" | \"languages\">;\n\nexport const detectLocaleFromNavigator = (\n nav?: NavigatorLike,\n): SupportedLocale | undefined => {\n if (!nav) {\n return undefined;\n }\n\n let languages: readonly string[];\n if (nav.languages && nav.languages.length > 0) {\n languages = nav.languages;\n } else if (nav.language) {\n languages = [nav.language];\n } else {\n languages = [];\n }\n\n for (const language of languages) {\n const locale = normalizeTag(language);\n if (locale) {\n return locale;\n }\n }\n\n return undefined;\n};\n\nexport const resolvePreferredLocale = (\n options: { acceptLanguageHeader?: string; navigator?: NavigatorLike } = {},\n): SupportedLocale => {\n return (\n detectLocaleFromAcceptLanguage(options.acceptLanguageHeader) ||\n detectLocaleFromNavigator(options.navigator) ||\n DEFAULT_LOCALE\n );\n};\n", "import type {\n SDKMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { FileSystem, Path } from \"@effect/platform\";\nimport type { CommandExecutor } from \"@effect/platform/CommandExecutor\";\nimport { Context, Effect, Layer, Runtime } from \"effect\";\nimport { ulid } from \"ulid\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise\";\nimport type { UserConfig } from \"../../../lib/config/config\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport type { EnvService } from \"../../platform/services/EnvService\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"../../session/infrastructure/VirtualConversationDatabase\";\nimport type { SessionMetaService } from \"../../session/services/SessionMetaService\";\nimport {\n createMessageGenerator,\n type UserMessageInput,\n} from \"../functions/createMessageGenerator\";\nimport { fallbackSdkMessage } from \"../functions/fallbackSdkMessage\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\nimport { ClaudeCodePermissionService } from \"./ClaudeCodePermissionService\";\nimport { ClaudeCodeSessionProcessService } from \"./ClaudeCodeSessionProcessService\";\n\nexport type MessageGenerator = () => AsyncGenerator<\n SDKUserMessage,\n void,\n unknown\n>;\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBusService = yield* EventBus;\n const sessionRepository = yield* SessionRepository;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n const permissionService = yield* ClaudeCodePermissionService;\n\n const runtime = yield* Effect.runtime<\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor\n | VirtualConversationDatabase\n | SessionMetaService\n | ClaudeCodePermissionService\n | EnvService\n >();\n\n const continueTask = (options: {\n sessionProcessId: string;\n baseSessionId: string;\n input: UserMessageInput;\n }) => {\n const { sessionProcessId, baseSessionId, input } = options;\n\n return Effect.gen(function* () {\n const { sessionProcess, task } =\n yield* sessionProcessService.continueSessionProcess({\n sessionProcessId,\n taskDef: {\n type: \"continue\",\n sessionId: baseSessionId,\n baseSessionId: baseSessionId,\n taskId: ulid(),\n },\n });\n\n const virtualConversation =\n yield* CCSessionProcess.createVirtualConversation(sessionProcess, {\n sessionId: baseSessionId,\n userMessage: input.text,\n });\n\n yield* virtualConversationDatabase.createVirtualConversation(\n sessionProcess.def.projectId,\n baseSessionId,\n [virtualConversation],\n );\n\n sessionProcess.def.setNextMessage(input);\n return {\n sessionProcess,\n task,\n };\n });\n };\n\n const startTask = (options: {\n userConfig: UserConfig;\n baseSession: {\n cwd: string;\n projectId: string;\n sessionId?: string;\n };\n input: UserMessageInput;\n }) => {\n const { baseSession, input, userConfig } = options;\n\n return Effect.gen(function* () {\n const {\n generateMessages,\n setNextMessage,\n setHooks: setMessageGeneratorHooks,\n } = createMessageGenerator();\n\n const { sessionProcess, task } =\n yield* sessionProcessService.startSessionProcess({\n sessionDef: {\n projectId: baseSession.projectId,\n cwd: baseSession.cwd,\n abortController: new AbortController(),\n setNextMessage,\n sessionProcessId: ulid(),\n },\n taskDef:\n baseSession.sessionId === undefined\n ? {\n type: \"new\",\n taskId: ulid(),\n }\n : {\n type: \"resume\",\n taskId: ulid(),\n sessionId: undefined,\n baseSessionId: baseSession.sessionId,\n },\n });\n\n const sessionInitializedPromise = controllablePromise<{\n sessionId: string;\n }>();\n const sessionFileCreatedPromise = controllablePromise<{\n sessionId: string;\n }>();\n\n setMessageGeneratorHooks({\n onNewUserMessageResolved: async (input) => {\n Effect.runFork(\n sessionProcessService.toNotInitializedState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n rawUserMessage: input.text,\n }),\n );\n },\n });\n\n const handleMessage = (message: SDKMessage) =>\n Effect.gen(function* () {\n const processState = yield* sessionProcessService.getSessionProcess(\n sessionProcess.def.sessionProcessId,\n );\n\n if (processState.type === \"completed\") {\n return \"break\" as const;\n }\n\n if (processState.type === \"paused\") {\n // rule: paused \u306F not_initialized \u306B\u66F4\u65B0\u3055\u308C\u3066\u304B\u3089\u304F\u308B\u60F3\u5B9A\n yield* Effect.die(\n new Error(\"Illegal state: paused is not expected\"),\n );\n }\n\n if (\n message.type === \"system\" &&\n message.subtype === \"init\" &&\n processState.type === \"not_initialized\"\n ) {\n yield* sessionProcessService.toInitializedState({\n sessionProcessId: processState.def.sessionProcessId,\n initContext: {\n initMessage: message,\n },\n });\n\n // Virtual Conversation Creation\n const virtualConversation =\n yield* CCSessionProcess.createVirtualConversation(processState, {\n sessionId: message.session_id,\n userMessage: processState.rawUserMessage,\n });\n\n if (processState.currentTask.def.type === \"new\") {\n // \u672B\u5C3E\u306B\u8FFD\u52A0\u3059\u308B\u3060\u3051\u3067 OK\n yield* virtualConversationDatabase.createVirtualConversation(\n baseSession.projectId,\n message.session_id,\n [virtualConversation],\n );\n } else if (processState.currentTask.def.type === \"resume\") {\n const existingSession = yield* sessionRepository.getSession(\n processState.def.projectId,\n processState.currentTask.def.baseSessionId,\n );\n\n const copiedConversations =\n existingSession.session === null\n ? []\n : existingSession.session.conversations;\n\n yield* virtualConversationDatabase.createVirtualConversation(\n processState.def.projectId,\n message.session_id,\n [...copiedConversations, virtualConversation],\n );\n } else {\n // do nothing\n }\n\n sessionInitializedPromise.resolve({\n sessionId: message.session_id,\n });\n\n yield* eventBusService.emit(\"sessionListChanged\", {\n projectId: processState.def.projectId,\n });\n\n yield* eventBusService.emit(\"sessionChanged\", {\n projectId: processState.def.projectId,\n sessionId: message.session_id,\n });\n\n return \"continue\" as const;\n }\n\n if (\n message.type === \"assistant\" &&\n processState.type === \"initialized\"\n ) {\n yield* sessionProcessService.toFileCreatedState({\n sessionProcessId: processState.def.sessionProcessId,\n });\n\n sessionFileCreatedPromise.resolve({\n sessionId: message.session_id,\n });\n\n yield* virtualConversationDatabase.deleteVirtualConversations(\n message.session_id,\n );\n }\n\n if (\n message.type === \"result\" &&\n processState.type === \"file_created\"\n ) {\n yield* sessionProcessService.toPausedState({\n sessionProcessId: processState.def.sessionProcessId,\n resultMessage: message,\n });\n\n yield* eventBusService.emit(\"sessionChanged\", {\n projectId: processState.def.projectId,\n sessionId: message.session_id,\n });\n\n return \"continue\" as const;\n }\n\n return \"continue\" as const;\n });\n\n const handleSessionProcessDaemon = async () => {\n const messageIter = await Runtime.runPromise(runtime)(\n Effect.gen(function* () {\n const permissionOptions =\n yield* permissionService.createCanUseToolRelatedOptions({\n taskId: task.def.taskId,\n userConfig,\n sessionId: task.def.baseSessionId,\n });\n\n return yield* ClaudeCode.query(generateMessages(), {\n resume: task.def.baseSessionId,\n cwd: sessionProcess.def.cwd,\n abortController: sessionProcess.def.abortController,\n ...permissionOptions,\n });\n }),\n );\n\n setNextMessage(input);\n\n try {\n for await (const message of messageIter) {\n const fallbackMessage = fallbackSdkMessage(message);\n\n const result = await Runtime.runPromise(runtime)(\n handleMessage(fallbackMessage),\n ).catch((error) => {\n // iter \u81EA\u4F53\u304C\u843D\u3061\u3066\u306A\u3051\u308C\u3070\u7D99\u7D9A\u3057\u305F\u3044\u306E\u3067\u63E1\u308A\u3064\u3076\u3059\n Effect.runFork(\n sessionProcessService.changeTaskState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n taskId: task.def.taskId,\n nextTask: {\n status: \"failed\",\n def: task.def,\n error: error,\n },\n }),\n );\n\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n\n return \"continue\" as const;\n });\n\n if (result === \"break\") {\n break;\n } else {\n }\n }\n } catch (error) {\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n\n await Effect.runPromise(\n sessionProcessService.changeTaskState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n taskId: task.def.taskId,\n nextTask: {\n status: \"failed\",\n def: task.def,\n error: error,\n },\n }),\n );\n }\n };\n\n const daemonPromise = handleSessionProcessDaemon()\n .catch((error) => {\n console.error(\"Error occur in task daemon process\", error);\n if (sessionInitializedPromise.status === \"pending\") {\n sessionInitializedPromise.reject(error);\n }\n if (sessionFileCreatedPromise.status === \"pending\") {\n sessionFileCreatedPromise.reject(error);\n }\n throw error;\n })\n .finally(() => {\n Effect.runFork(\n Effect.gen(function* () {\n const currentProcess =\n yield* sessionProcessService.getSessionProcess(\n sessionProcess.def.sessionProcessId,\n );\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n });\n }),\n );\n });\n\n return {\n sessionProcess,\n task,\n daemonPromise,\n awaitSessionInitialized: async () =>\n await sessionInitializedPromise.promise,\n awaitSessionFileCreated: async () =>\n await sessionFileCreatedPromise.promise,\n yieldSessionInitialized: () =>\n Effect.promise(() => sessionInitializedPromise.promise),\n yieldSessionFileCreated: () =>\n Effect.promise(() => sessionFileCreatedPromise.promise),\n };\n });\n };\n\n const getPublicSessionProcesses = () =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n return processes.filter((process) => CCSessionProcess.isPublic(process));\n });\n\n const abortTask = (sessionProcessId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const currentProcess =\n yield* sessionProcessService.getSessionProcess(sessionProcessId);\n\n currentProcess.def.abortController.abort();\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n });\n });\n\n const abortAllTasks = () =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n\n for (const process of processes) {\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: process.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n });\n }\n });\n\n return {\n continueTask,\n startTask,\n abortTask,\n abortAllTasks,\n getPublicSessionProcesses,\n };\n});\n\nexport type IClaudeCodeLifeCycleService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeLifeCycleService extends Context.Tag(\n \"ClaudeCodeLifeCycleService\",\n)<ClaudeCodeLifeCycleService, IClaudeCodeLifeCycleService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export type ControllablePromise<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n status: \"pending\" | \"resolved\" | \"rejected\";\n};\n\nexport const controllablePromise = <T>(): ControllablePromise<T> => {\n let promiseResolve: ((value: T) => void) | undefined;\n let promiseReject: ((reason?: unknown) => void) | undefined;\n\n const promiseRef = {\n status: \"pending\",\n } as ControllablePromise<T>;\n\n const promise = new Promise<T>((resolve, reject) => {\n promiseResolve = (value) => {\n promiseRef.status = \"resolved\";\n resolve(value);\n };\n promiseReject = (reason) => {\n promiseRef.status = \"rejected\";\n reject(reason);\n };\n });\n\n if (!promiseResolve || !promiseReject) {\n throw new Error(\"Illegal state: Promise not created\");\n }\n\n promiseRef.promise = promise;\n promiseRef.resolve = promiseResolve;\n promiseRef.reject = promiseReject;\n\n return promiseRef;\n};\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { parseUserMessage } from \"../../claude-code/functions/parseUserMessage\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport type { Session, SessionDetail } from \"../../types\";\nimport { decodeSessionId, encodeSessionId } from \"../functions/id\";\nimport { isRegularSessionFile } from \"../functions/isRegularSessionFile\";\nimport { VirtualConversationDatabase } from \"../infrastructure/VirtualConversationDatabase\";\nimport { SessionMetaService } from \"../services/SessionMetaService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const sessionMetaService = yield* SessionMetaService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n\n const getSession = (projectId: string, sessionId: string) =>\n Effect.gen(function* () {\n const sessionPath = decodeSessionId(projectId, sessionId);\n\n const virtualConversation =\n yield* virtualConversationDatabase.getSessionVirtualConversation(\n sessionId,\n );\n\n // Check if session file exists\n const exists = yield* fs.exists(sessionPath);\n const sessionDetail = yield* exists\n ? Effect.gen(function* () {\n // Read session file\n const content = yield* fs.readFileString(sessionPath);\n const allLines = content.split(\"\\n\").filter((line) => line.trim());\n\n const conversations = parseJsonl(allLines.join(\"\\n\"));\n\n // Get file stats\n const stat = yield* fs.stat(sessionPath);\n\n // Get session metadata\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n sessionId,\n );\n\n const mergedConversations = [\n ...conversations,\n ...(virtualConversation !== null\n ? virtualConversation.conversations\n : []),\n ];\n\n const conversationMap = new Map(\n mergedConversations.flatMap((c, index) => {\n if (\n c.type === \"user\" ||\n c.type === \"assistant\" ||\n c.type === \"system\"\n ) {\n return [[c.uuid, { conversation: c, index }] as const];\n } else {\n return [];\n }\n }),\n );\n\n const isBroken = mergedConversations.some((item, index) => {\n if (item.type !== \"summary\") return false;\n const leftMessage = conversationMap.get(item.leafUuid);\n if (leftMessage === undefined) return false;\n\n return index < leftMessage.index;\n });\n\n const sessionDetail: SessionDetail = {\n id: sessionId,\n jsonlFilePath: sessionPath,\n meta,\n conversations: isBroken ? conversations : mergedConversations,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n\n return sessionDetail;\n })\n : (() => {\n if (virtualConversation === null) {\n return Effect.succeed(null);\n }\n\n const lastConversation = virtualConversation.conversations\n .filter(\n (conversation) =>\n conversation.type === \"user\" ||\n conversation.type === \"assistant\" ||\n conversation.type === \"system\",\n )\n .at(-1);\n\n const virtualSession: SessionDetail = {\n id: sessionId,\n jsonlFilePath: `${decodeProjectId(projectId)}/${sessionId}.jsonl`,\n meta: {\n messageCount: 0,\n firstUserMessage: null,\n cost: {\n totalUsd: 0,\n breakdown: {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n },\n tokenUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n },\n },\n },\n conversations: virtualConversation.conversations,\n lastModifiedAt:\n lastConversation !== undefined\n ? new Date(lastConversation.timestamp)\n : new Date(),\n };\n\n return Effect.succeed(virtualSession);\n })();\n\n return {\n session: sessionDetail,\n };\n });\n\n const getSessions = (\n projectId: string,\n options?: {\n maxCount?: number;\n cursor?: string;\n },\n ) =>\n Effect.gen(function* () {\n const { maxCount = 20, cursor } = options ?? {};\n\n const claudeProjectPath = decodeProjectId(projectId);\n\n // Check if project directory exists\n const dirExists = yield* fs.exists(claudeProjectPath);\n if (!dirExists) {\n console.warn(`Project directory not found at ${claudeProjectPath}`);\n return { sessions: [] };\n }\n\n // Read directory entries with error handling\n const dirents = yield* Effect.tryPromise({\n try: () => fs.readDirectory(claudeProjectPath).pipe(Effect.runPromise),\n catch: (error) => {\n console.warn(\n `Failed to read sessions for project ${projectId}:`,\n error,\n );\n return new Error(\"Failed to read directory\");\n },\n }).pipe(Effect.catchAll(() => Effect.succeed([])));\n\n // Process session files (excluding agent-*.jsonl files)\n const sessionEffects = dirents.filter(isRegularSessionFile).map((entry) =>\n Effect.gen(function* () {\n const fullPath = path.resolve(claudeProjectPath, entry);\n const sessionId = encodeSessionId(fullPath);\n\n // Get file stats with error handling\n const stat = yield* Effect.tryPromise(() =>\n fs.stat(fullPath).pipe(Effect.runPromise),\n ).pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (!stat) {\n return null;\n }\n\n return {\n id: sessionId,\n jsonlFilePath: fullPath,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n }),\n );\n\n // Execute all effects in parallel and filter out nulls\n const sessionsWithNulls = yield* Effect.all(sessionEffects, {\n concurrency: \"unbounded\",\n });\n const sessions = sessionsWithNulls\n .filter((s): s is NonNullable<typeof s> => s !== null)\n .sort(\n (a, b) => b.lastModifiedAt.getTime() - a.lastModifiedAt.getTime(),\n );\n\n const sessionMap = new Map(\n sessions.map((session) => [session.id, session] as const),\n );\n\n const index =\n cursor !== undefined\n ? sessions.findIndex((session) => session.id === cursor)\n : -1;\n\n if (index !== -1) {\n const sessionsToReturn = sessions.slice(\n index + 1,\n Math.min(index + 1 + maxCount, sessions.length),\n );\n\n const sessionsWithMeta = yield* Effect.all(\n sessionsToReturn.map((item) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n item.id,\n );\n return {\n ...item,\n meta,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return {\n sessions: sessionsWithMeta,\n };\n }\n\n // Get predict sessions\n const virtualConversations =\n yield* virtualConversationDatabase.getProjectVirtualConversations(\n projectId,\n );\n\n const virtualSessions = virtualConversations\n .filter(({ sessionId }) => !sessionMap.has(sessionId))\n .map(({ sessionId, conversations }): Session => {\n const first = conversations\n .filter((conversation) => conversation.type === \"user\")\n .at(0);\n const last = conversations\n .filter(\n (conversation) =>\n conversation.type === \"user\" ||\n conversation.type === \"assistant\" ||\n conversation.type === \"system\",\n )\n .at(-1);\n\n const firstUserText =\n first !== undefined\n ? typeof first.message.content === \"string\"\n ? first.message.content\n : (() => {\n const firstContent = first.message.content.at(0);\n if (firstContent === undefined) return null;\n if (typeof firstContent === \"string\") return firstContent;\n if (firstContent.type === \"text\") return firstContent.text;\n return null;\n })()\n : null;\n\n return {\n id: sessionId,\n jsonlFilePath: `${decodeProjectId(projectId)}/${sessionId}.jsonl`,\n lastModifiedAt:\n last !== undefined ? new Date(last.timestamp) : new Date(),\n meta: {\n messageCount: conversations.length,\n firstUserMessage: firstUserText\n ? parseUserMessage(firstUserText)\n : null,\n cost: {\n totalUsd: 0,\n breakdown: {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n },\n tokenUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n },\n },\n },\n };\n })\n .sort((a, b) => {\n return b.lastModifiedAt.getTime() - a.lastModifiedAt.getTime();\n });\n\n // Get sessions with metadata\n const sessionsToReturn = sessions.slice(\n 0,\n Math.min(maxCount, sessions.length),\n );\n const sessionsWithMeta: Session[] = yield* Effect.all(\n sessionsToReturn.map((item) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(\n projectId,\n item.id,\n );\n return {\n ...item,\n meta,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return {\n sessions: [...virtualSessions, ...sessionsWithMeta],\n };\n });\n\n return {\n getSession,\n getSessions,\n };\n});\n\nexport type ISessionRepository = InferEffect<typeof LayerImpl>;\n\nexport class SessionRepository extends Context.Tag(\"SessionRepository\")<\n SessionRepository,\n ISessionRepository\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { z } from \"zod\";\n\nconst regExp = /<(?<tag>[^>]+)>(?<content>\\s*[^<]*?\\s*)<\\/\\k<tag>>/g;\n\nconst matchSchema = z.object({\n tag: z.string(),\n content: z.string(),\n});\n\nexport const parsedUserMessageSchema = z.union([\n z.object({\n kind: z.literal(\"command\"),\n commandName: z.string(),\n commandArgs: z.string().optional(),\n commandMessage: z.string().optional(),\n }),\n z.object({\n kind: z.literal(\"local-command\"),\n stdout: z.string(),\n }),\n z.object({\n kind: z.literal(\"text\"),\n content: z.string(),\n }),\n]);\n\nexport type ParsedUserMessage = z.infer<typeof parsedUserMessageSchema>;\n\nexport const parseUserMessage = (content: string): ParsedUserMessage => {\n const matches = Array.from(content.matchAll(regExp))\n .map((match) => matchSchema.safeParse(match.groups))\n .filter((result) => result.success)\n .map((result) => result.data);\n\n if (matches.length === 0) {\n return {\n kind: \"text\",\n content,\n };\n }\n\n const commandName = matches.find(\n (match) => match.tag === \"command-name\",\n )?.content;\n const commandArgs = matches.find(\n (match) => match.tag === \"command-args\",\n )?.content;\n const commandMessage = matches.find(\n (match) => match.tag === \"command-message\",\n )?.content;\n const localCommandStdout = matches.find(\n (match) => match.tag === \"local-command-stdout\",\n )?.content;\n\n switch (true) {\n case commandName !== undefined:\n return {\n kind: \"command\",\n commandName,\n commandArgs,\n commandMessage,\n };\n case localCommandStdout !== undefined:\n return {\n kind: \"local-command\",\n stdout: localCommandStdout,\n };\n default:\n return {\n kind: \"text\",\n content,\n };\n }\n};\n", "import { basename, extname, resolve } from \"node:path\";\nimport { decodeProjectId } from \"../../project/functions/id\";\n\nexport const encodeSessionId = (jsonlFilePath: string) => {\n return basename(jsonlFilePath, extname(jsonlFilePath));\n};\n\nexport const decodeSessionId = (projectId: string, sessionId: string) => {\n const projectPath = decodeProjectId(projectId);\n return resolve(projectPath, `${sessionId}.jsonl`);\n};\n", "/**\n * Determines if a filename represents a regular session file.\n * Regular session files end with .jsonl but do NOT start with \"agent-\".\n *\n * @param filename - The filename to check (e.g., \"session-id.jsonl\", \"agent-abc123.jsonl\")\n * @returns true if the file is a regular session file, false otherwise\n */\nexport const isRegularSessionFile = (filename: string): boolean =>\n filename.endsWith(\".jsonl\") && !filename.startsWith(\"agent-\");\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { ErrorJsonl } from \"../../types\";\n\n/**\n * For interactively experience, handle sessions not already persisted to the filesystem.\n */\nexport class VirtualConversationDatabase extends Context.Tag(\n \"VirtualConversationDatabase\",\n)<\n VirtualConversationDatabase,\n {\n readonly getProjectVirtualConversations: (\n projectId: string,\n ) => Effect.Effect<\n {\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n }[]\n >;\n readonly getSessionVirtualConversation: (\n sessionId: string,\n ) => Effect.Effect<{\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n } | null>;\n readonly createVirtualConversation: (\n projectId: string,\n sessionId: string,\n conversations: readonly (Conversation | ErrorJsonl)[],\n ) => Effect.Effect<void>;\n readonly deleteVirtualConversations: (\n sessionId: string,\n ) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const storageRef = yield* Ref.make<\n {\n projectId: string;\n sessionId: string;\n conversations: (Conversation | ErrorJsonl)[];\n }[]\n >([]);\n\n const getProjectVirtualConversations = (projectId: string) =>\n Effect.gen(function* () {\n const conversations = yield* Ref.get(storageRef);\n return conversations.filter(\n (conversation) => conversation.projectId === projectId,\n );\n });\n\n const getSessionVirtualConversation = (sessionId: string) =>\n Effect.gen(function* () {\n const conversations = yield* Ref.get(storageRef);\n return (\n conversations.find(\n (conversation) => conversation.sessionId === sessionId,\n ) ?? null\n );\n });\n\n const createVirtualConversation = (\n projectId: string,\n sessionId: string,\n createConversations: readonly (Conversation | ErrorJsonl)[],\n ) =>\n Effect.gen(function* () {\n yield* Ref.update(storageRef, (conversations) => {\n const existingRecord = conversations.find(\n (record) =>\n record.projectId === projectId &&\n record.sessionId === sessionId,\n );\n\n if (existingRecord === undefined) {\n return [\n ...conversations,\n {\n projectId,\n sessionId,\n conversations: [...createConversations],\n },\n ];\n }\n\n existingRecord.conversations.push(...createConversations);\n return conversations;\n });\n });\n\n const deleteVirtualConversations = (sessionId: string) =>\n Effect.gen(function* () {\n yield* Ref.update(storageRef, (conversations) => {\n return conversations.filter((c) => c.sessionId !== sessionId);\n });\n });\n\n return {\n getProjectVirtualConversations,\n getSessionVirtualConversation,\n createVirtualConversation,\n deleteVirtualConversations,\n };\n }),\n );\n}\n\nexport type IVirtualConversationDatabase = Context.Tag.Service<\n typeof VirtualConversationDatabase\n>;\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport {\n FileCacheStorage,\n makeFileCacheStorageLayer,\n} from \"../../../lib/storage/FileCacheStorage\";\nimport { PersistentService } from \"../../../lib/storage/FileCacheStorage/PersistentService\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport {\n type ParsedUserMessage,\n parsedUserMessageSchema,\n} from \"../../claude-code/functions/parseUserMessage\";\nimport type { SessionMeta } from \"../../types\";\nimport { aggregateTokenUsageAndCost } from \"../functions/aggregateTokenUsageAndCost\";\nimport { getAgentSessionFilesForSession } from \"../functions/getAgentSessionFilesForSession\";\nimport { decodeSessionId } from \"../functions/id\";\nimport { extractFirstUserMessage } from \"../functions/isValidFirstMessage\";\n\nconst parsedUserMessageOrNullSchema = parsedUserMessageSchema.nullable();\n\nexport class SessionMetaService extends Context.Tag(\"SessionMetaService\")<\n SessionMetaService,\n {\n readonly getSessionMeta: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<SessionMeta, Error>;\n readonly invalidateSession: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const firstUserMessageCache =\n yield* FileCacheStorage<ParsedUserMessage | null>();\n const sessionMetaCacheRef = yield* Ref.make(\n new Map<string, SessionMeta>(),\n );\n\n const getFirstUserMessage = (\n jsonlFilePath: string,\n lines: string[],\n ): Effect.Effect<ParsedUserMessage | null, Error> =>\n Effect.gen(function* () {\n const cached = yield* firstUserMessageCache.get(jsonlFilePath);\n if (cached !== undefined) {\n return cached;\n }\n\n let firstUserMessage: ParsedUserMessage | null = null;\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\n\n if (conversation === undefined) {\n continue;\n }\n\n const maybeFirstUserMessage = extractFirstUserMessage(conversation);\n\n if (maybeFirstUserMessage === undefined) {\n continue;\n }\n\n firstUserMessage = maybeFirstUserMessage;\n\n break;\n }\n\n if (firstUserMessage !== null) {\n yield* firstUserMessageCache.set(jsonlFilePath, firstUserMessage);\n }\n\n return firstUserMessage;\n });\n\n const getSessionMeta = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<SessionMeta, Error> =>\n Effect.gen(function* () {\n const metaCache = yield* Ref.get(sessionMetaCacheRef);\n const cached = metaCache.get(sessionId);\n if (cached !== undefined) {\n return cached;\n }\n\n const sessionPath = decodeSessionId(projectId, sessionId);\n const content = yield* fs.readFileString(sessionPath);\n const lines = content.split(\"\\n\");\n\n const firstUserMessage = yield* getFirstUserMessage(\n sessionPath,\n lines,\n );\n\n // Get project directory from session path\n const projectPath = path.dirname(sessionPath);\n\n // Parse first line to extract actual sessionId\n const firstLine = lines[0];\n let actualSessionId: string | undefined;\n if (firstLine && firstLine.trim() !== \"\") {\n try {\n const firstLineData = JSON.parse(firstLine);\n if (\n typeof firstLineData === \"object\" &&\n firstLineData !== null &&\n \"sessionId\" in firstLineData &&\n typeof firstLineData.sessionId === \"string\"\n ) {\n actualSessionId = firstLineData.sessionId;\n }\n } catch {\n // Invalid JSON, skip sessionId extraction\n }\n }\n\n // Discover agent session files that belong to this session\n const agentFilePaths =\n actualSessionId !== undefined\n ? yield* getAgentSessionFilesForSession(\n projectPath,\n actualSessionId,\n ).pipe(\n Effect.provide(Layer.succeed(FileSystem.FileSystem, fs)),\n Effect.provide(Layer.succeed(Path.Path, path)),\n )\n : [];\n\n // Read contents of all agent files\n const agentContents: string[] = [];\n for (const agentPath of agentFilePaths) {\n const agentContent = yield* fs\n .readFileString(agentPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\"))); // Skip files that fail to read\n if (agentContent !== \"\") {\n agentContents.push(agentContent);\n }\n }\n\n // Calculate cost information including agent sessions\n const fileContents = [content, ...agentContents];\n const { totalCost } = aggregateTokenUsageAndCost(fileContents);\n\n const sessionMeta: SessionMeta = {\n messageCount: lines.length,\n firstUserMessage: firstUserMessage,\n cost: {\n totalUsd: totalCost.totalUsd,\n breakdown: totalCost.breakdown,\n tokenUsage: totalCost.tokenUsage,\n },\n };\n\n yield* Ref.update(sessionMetaCacheRef, (cache) => {\n cache.set(sessionId, sessionMeta);\n return cache;\n });\n\n return sessionMeta;\n });\n\n const invalidateSession = (\n _projectId: string,\n sessionId: string,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* Ref.update(sessionMetaCacheRef, (cache) => {\n cache.delete(sessionId);\n return cache;\n });\n });\n\n return {\n getSessionMeta,\n invalidateSession,\n };\n }),\n ).pipe(\n Layer.provide(\n makeFileCacheStorageLayer(\n \"first-user-message-cache\",\n parsedUserMessageOrNullSchema,\n ),\n ),\n Layer.provide(PersistentService.Live),\n );\n}\n\nexport type ISessionMetaService = Context.Tag.Service<\n typeof SessionMetaService\n>;\n", "/**\n * Anthropic Claude API Pricing Information\n * Last updated: 2025-11-13\n *\n * Prices are in USD per million tokens (MTok)\n * Source: https://www.anthropic.com/pricing\n */\n\nexport type ModelName =\n | \"claude-3.5-sonnet\"\n | \"claude-3-opus\"\n | \"claude-3-haiku\"\n | \"claude-instant-1.2\"\n | \"claude-2\";\n\nexport type TokenType = \"input\" | \"output\" | \"cache_creation\" | \"cache_read\";\n\nexport type ModelPricing = {\n readonly input: number;\n readonly output: number;\n readonly cache_creation: number;\n readonly cache_read: number;\n};\n\n/**\n * Pricing per million tokens (MTok) in USD\n */\nexport const MODEL_PRICING: Record<ModelName, ModelPricing> = {\n \"claude-3.5-sonnet\": {\n input: 3.0,\n output: 15.0,\n cache_creation: 3.75,\n cache_read: 0.3,\n },\n \"claude-3-opus\": {\n input: 15.0,\n output: 75.0,\n cache_creation: 18.75,\n cache_read: 1.5,\n },\n \"claude-3-haiku\": {\n input: 0.25,\n output: 1.25,\n cache_creation: 0.3,\n cache_read: 0.03,\n },\n \"claude-instant-1.2\": {\n input: 1.63,\n output: 5.51,\n cache_creation: 2.0375, // 1.63 * 1.25\n cache_read: 0.163, // 1.63 * 0.1\n },\n \"claude-2\": {\n input: 8.0,\n output: 24.0,\n cache_creation: 10.0, // 8.0 * 1.25\n cache_read: 0.8, // 8.0 * 0.1\n },\n} as const;\n\n/**\n * Default pricing for unknown models\n * Uses Claude 3.5 Sonnet pricing as a safe default\n */\nexport const DEFAULT_MODEL_PRICING: ModelPricing =\n MODEL_PRICING[\"claude-3.5-sonnet\"];\n", "import {\n DEFAULT_MODEL_PRICING,\n MODEL_PRICING,\n type ModelName,\n type ModelPricing,\n} from \"../constants/pricing\";\n\n/**\n * Token usage information extracted from assistant messages\n */\nexport type TokenUsage = {\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens: number | undefined;\n readonly cache_read_input_tokens: number | undefined;\n};\n\n/**\n * Cost breakdown by token type in USD\n */\nexport type CostBreakdown = {\n readonly inputTokensUsd: number;\n readonly outputTokensUsd: number;\n readonly cacheCreationUsd: number;\n readonly cacheReadUsd: number;\n};\n\n/**\n * Token usage summary\n */\nexport type TokenUsageSummary = {\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly cacheCreationTokens: number;\n readonly cacheReadTokens: number;\n};\n\n/**\n * Cost calculation result\n */\nexport type CostCalculationResult = {\n readonly totalUsd: number;\n readonly breakdown: CostBreakdown;\n readonly tokenUsage: TokenUsageSummary;\n};\n\n/**\n * Normalizes Claude API model names to standard model identifiers\n *\n * Examples:\n * - \"claude-sonnet-4-20250514\" -> \"claude-3.5-sonnet\"\n * - \"claude-3-5-sonnet-20240620\" -> \"claude-3.5-sonnet\"\n * - \"claude-3-opus-20240229\" -> \"claude-3-opus\"\n * - \"claude-3-haiku-20240307\" -> \"claude-3-haiku\"\n * - \"claude-instant-1.2\" -> \"claude-instant-1.2\"\n * - \"claude-2.1\" -> \"claude-2\"\n *\n * @param modelName Raw model name from API\n * @returns Normalized model name or default model name if unknown\n */\nexport function normalizeModelName(modelName: string): ModelName {\n const normalized = modelName.toLowerCase();\n\n // Claude 3.5 Sonnet patterns\n if (\n normalized.includes(\"sonnet-4\") ||\n normalized.includes(\"3-5-sonnet\") ||\n normalized.includes(\"3.5-sonnet\")\n ) {\n return \"claude-3.5-sonnet\";\n }\n\n // Claude 3 Opus patterns\n if (normalized.includes(\"3-opus\") || normalized.includes(\"opus-20\")) {\n return \"claude-3-opus\";\n }\n\n // Claude 3 Haiku patterns\n if (normalized.includes(\"3-haiku\") || normalized.includes(\"haiku-20\")) {\n return \"claude-3-haiku\";\n }\n\n // Claude Instant 1.2\n if (normalized.includes(\"instant-1.2\") || normalized.includes(\"instant-1\")) {\n return \"claude-instant-1.2\";\n }\n\n // Claude 2 patterns\n if (normalized.startsWith(\"claude-2\")) {\n return \"claude-2\";\n }\n\n // Unknown model - return default\n return \"claude-3.5-sonnet\";\n}\n\n/**\n * Gets pricing for a model, with fallback to default pricing\n */\nfunction getModelPricing(modelName: string): ModelPricing {\n const normalized = normalizeModelName(modelName);\n return MODEL_PRICING[normalized] ?? DEFAULT_MODEL_PRICING;\n}\n\n/**\n * Calculates the cost in USD for token usage\n *\n * @param usage Token usage information\n * @param modelName Model name (will be normalized)\n * @returns Cost calculation result with breakdown\n */\nexport function calculateTokenCost(\n usage: TokenUsage,\n modelName: string,\n): CostCalculationResult {\n const pricing = getModelPricing(modelName);\n\n // Convert tokens to millions for cost calculation\n const inputMTok = usage.input_tokens / 1_000_000;\n const outputMTok = usage.output_tokens / 1_000_000;\n const cacheCreationMTok =\n (usage.cache_creation_input_tokens ?? 0) / 1_000_000;\n const cacheReadMTok = (usage.cache_read_input_tokens ?? 0) / 1_000_000;\n\n // Calculate costs\n const inputTokensUsd = inputMTok * pricing.input;\n const outputTokensUsd = outputMTok * pricing.output;\n const cacheCreationUsd = cacheCreationMTok * pricing.cache_creation;\n const cacheReadUsd = cacheReadMTok * pricing.cache_read;\n\n const totalUsd =\n inputTokensUsd + outputTokensUsd + cacheCreationUsd + cacheReadUsd;\n\n return {\n totalUsd,\n breakdown: {\n inputTokensUsd,\n outputTokensUsd,\n cacheCreationUsd,\n cacheReadUsd,\n },\n tokenUsage: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheCreationTokens: usage.cache_creation_input_tokens ?? 0,\n cacheReadTokens: usage.cache_read_input_tokens ?? 0,\n },\n };\n}\n", "import { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { calculateTokenCost, type TokenUsage } from \"./calculateSessionCost\";\n\n/**\n * Aggregates token usage and cost from multiple file contents.\n *\n * This function processes conversation logs from one or more files (main session + agent sessions),\n * extracts token usage from assistant messages, and calculates the total cost across all files.\n *\n * @param fileContents - Array of JSONL file contents to process\n * @returns Aggregated token usage, total cost, and the last model name used\n *\n * @example\n * ```typescript\n * const result = aggregateTokenUsageAndCost([\n * mainSessionContent,\n * agentSession1Content,\n * agentSession2Content\n * ]);\n *\n * console.log(result.totalCost.totalUsd); // Total cost across all sessions\n * console.log(result.totalUsage.input_tokens); // Total input tokens\n * ```\n */\nexport const aggregateTokenUsageAndCost = (\n fileContents: string[],\n): {\n totalUsage: TokenUsage;\n totalCost: ReturnType<typeof calculateTokenCost>;\n modelName: string;\n} => {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheCreationTokens = 0;\n let totalCacheReadTokens = 0;\n let totalInputTokensUsd = 0;\n let totalOutputTokensUsd = 0;\n let totalCacheCreationUsd = 0;\n let totalCacheReadUsd = 0;\n let lastModelName = \"claude-3.5-sonnet\"; // Default model\n\n // Process each file content\n for (const content of fileContents) {\n const conversations = parseJsonl(content);\n\n for (const conversation of conversations) {\n if (conversation.type === \"assistant\") {\n const usage = conversation.message.usage;\n const modelName = conversation.message.model;\n\n // Calculate cost for this specific message\n const messageCost = calculateTokenCost(\n {\n input_tokens: usage.input_tokens,\n output_tokens: usage.output_tokens,\n cache_creation_input_tokens: usage.cache_creation_input_tokens ?? 0,\n cache_read_input_tokens: usage.cache_read_input_tokens ?? 0,\n },\n modelName,\n );\n\n // Accumulate token counts\n totalInputTokens += usage.input_tokens;\n totalOutputTokens += usage.output_tokens;\n totalCacheCreationTokens += usage.cache_creation_input_tokens ?? 0;\n totalCacheReadTokens += usage.cache_read_input_tokens ?? 0;\n\n // Accumulate costs\n totalInputTokensUsd += messageCost.breakdown.inputTokensUsd;\n totalOutputTokensUsd += messageCost.breakdown.outputTokensUsd;\n totalCacheCreationUsd += messageCost.breakdown.cacheCreationUsd;\n totalCacheReadUsd += messageCost.breakdown.cacheReadUsd;\n\n // Track the latest model name\n lastModelName = modelName;\n }\n }\n }\n\n const totalCost: ReturnType<typeof calculateTokenCost> = {\n totalUsd:\n totalInputTokensUsd +\n totalOutputTokensUsd +\n totalCacheCreationUsd +\n totalCacheReadUsd,\n breakdown: {\n inputTokensUsd: totalInputTokensUsd,\n outputTokensUsd: totalOutputTokensUsd,\n cacheCreationUsd: totalCacheCreationUsd,\n cacheReadUsd: totalCacheReadUsd,\n },\n tokenUsage: {\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n cacheCreationTokens: totalCacheCreationTokens,\n cacheReadTokens: totalCacheReadTokens,\n },\n };\n\n const aggregatedUsage: TokenUsage = {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n cache_creation_input_tokens: totalCacheCreationTokens,\n cache_read_input_tokens: totalCacheReadTokens,\n };\n\n return {\n totalUsage: aggregatedUsage,\n totalCost,\n modelName: lastModelName,\n };\n};\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\n\n/**\n * Discovers agent session files for a given sessionId.\n *\n * Agent session files follow the pattern `agent-*.jsonl` and contain\n * conversations where `isSidechain: true`. This function scans the project\n * directory to find all agent files that belong to the specified session.\n *\n * @param projectPath - Absolute path to the project directory\n * @param sessionId - The session ID to match against\n * @returns Effect that yields an array of absolute paths to matching agent files\n *\n * @example\n * ```typescript\n * const agentFiles = await Effect.runPromise(\n * getAgentSessionFilesForSession(\"/path/to/project\", \"session-123\")\n * .pipe(Effect.provide(FileSystem.layer))\n * );\n * // Returns: [\"/path/to/project/agent-hash-1.jsonl\", \"/path/to/project/agent-hash-2.jsonl\"]\n * ```\n */\nexport const getAgentSessionFilesForSession = (\n projectPath: string,\n sessionId: string,\n): Effect.Effect<string[], PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n // Read all files in the project directory\n const entries = yield* fs.readDirectory(projectPath);\n\n // Filter for agent files (agent-*.jsonl)\n const agentFiles = entries.filter(\n (filename) =>\n filename.startsWith(\"agent-\") && filename.endsWith(\".jsonl\"),\n );\n\n // Check each agent file to see if it matches the sessionId\n const matchingFilePaths: string[] = [];\n\n for (const agentFile of agentFiles) {\n const filePath = path.join(projectPath, agentFile);\n\n // Try to read the file and check sessionId\n // If read fails or sessionId doesn't match, skip this file\n const maybeMatches = yield* Effect.gen(function* () {\n const content = yield* fs.readFileString(filePath);\n\n // Parse the first line to get sessionId\n const firstLine = content.split(\"\\n\")[0];\n if (!firstLine || firstLine.trim() === \"\") {\n return false;\n }\n\n // Try to parse the first line as JSON\n try {\n const firstLineData = JSON.parse(firstLine);\n\n // Check if sessionId matches\n if (\n typeof firstLineData === \"object\" &&\n firstLineData !== null &&\n \"sessionId\" in firstLineData &&\n firstLineData.sessionId === sessionId\n ) {\n return true;\n }\n } catch {\n // Invalid JSON, skip this file\n return false;\n }\n\n return false;\n }).pipe(\n Effect.catchAll(() => Effect.succeed(false)), // On any error, skip this file\n );\n\n if (maybeMatches) {\n matchingFilePaths.push(filePath);\n }\n }\n\n return matchingFilePaths;\n });\n", "import type { ExtendedConversation } from \"../../types\";\n\nexport const extractFirstUserText = (\n conversation: ExtendedConversation,\n): string | null => {\n if (conversation.type !== \"user\") {\n return null;\n }\n\n const firstUserText =\n typeof conversation.message.content === \"string\"\n ? conversation.message.content\n : (() => {\n const firstContent = conversation.message.content.at(0);\n if (firstContent === undefined) return null;\n if (typeof firstContent === \"string\") return firstContent;\n if (firstContent.type === \"text\") return firstContent.text;\n return null;\n })();\n\n return firstUserText;\n};\n", "import {\n type ParsedUserMessage,\n parseUserMessage,\n} from \"../../claude-code/functions/parseUserMessage\";\nimport type { ExtendedConversation } from \"../../types\";\nimport { extractFirstUserText } from \"./extractFirstUserText\";\n\nconst ignoreCommands = [\n \"/clear\",\n \"/login\",\n \"/logout\",\n \"/exit\",\n \"/mcp\",\n \"/memory\",\n];\n\nexport const extractFirstUserMessage = (\n conversation: ExtendedConversation,\n): ParsedUserMessage | undefined => {\n if (conversation.type !== \"user\") {\n return undefined;\n }\n\n if (conversation.isSidechain === true) {\n return undefined;\n }\n\n const firstUserText = extractFirstUserText(conversation);\n\n if (firstUserText === null) {\n return undefined;\n }\n\n if (\n firstUserText ===\n \"Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.\"\n ) {\n return undefined;\n }\n\n if (firstUserText === \"Warmup\") {\n return undefined;\n }\n\n const command = parseUserMessage(firstUserText);\n if (command.kind === \"local-command\") {\n return undefined;\n }\n\n if (\n command.kind === \"command\" &&\n ignoreCommands.includes(command.commandName)\n ) {\n return undefined;\n }\n\n return command;\n};\n", "import type {\n SDKMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n DocumentBlockParam,\n ImageBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise\";\n\nexport type UserMessageInput = {\n text: string;\n images?: readonly ImageBlockParam[];\n documents?: readonly DocumentBlockParam[];\n};\n\nexport type OnMessage = (message: SDKMessage) => void | Promise<void>;\n\nexport type MessageGenerator = () => AsyncGenerator<\n SDKUserMessage,\n void,\n unknown\n>;\n\nexport const createMessageGenerator = (): {\n generateMessages: MessageGenerator;\n setNextMessage: (input: UserMessageInput) => void;\n setHooks: (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (\n input: UserMessageInput,\n ) => void | Promise<void>;\n }) => void;\n} => {\n let sendMessagePromise = controllablePromise<UserMessageInput>();\n let registeredHooks: {\n onNextMessageSet: ((input: UserMessageInput) => void | Promise<void>)[];\n onNewUserMessageResolved: ((\n input: UserMessageInput,\n ) => void | Promise<void>)[];\n } = {\n onNextMessageSet: [],\n onNewUserMessageResolved: [],\n };\n\n const createMessage = (input: UserMessageInput): SDKUserMessage => {\n const { images = [], documents = [] } = input;\n\n if (images.length === 0 && documents.length === 0) {\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: input.text,\n },\n parent_tool_use_id: null,\n } satisfies Omit<SDKUserMessage, \"session_id\"> as SDKUserMessage;\n }\n\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: input.text,\n },\n ...images,\n ...documents,\n ],\n },\n } as SDKUserMessage;\n };\n\n async function* generateMessages(): ReturnType<MessageGenerator> {\n sendMessagePromise = controllablePromise<UserMessageInput>();\n\n while (true) {\n const message = await sendMessagePromise.promise;\n sendMessagePromise = controllablePromise<UserMessageInput>();\n void Promise.allSettled(\n registeredHooks.onNewUserMessageResolved.map((hook) => hook(message)),\n );\n\n yield createMessage(message);\n }\n }\n\n const setNextMessage = (input: UserMessageInput) => {\n sendMessagePromise.resolve(input);\n void Promise.allSettled(\n registeredHooks.onNextMessageSet.map((hook) => hook(input)),\n );\n };\n\n const setHooks = (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (\n input: UserMessageInput,\n ) => void | Promise<void>;\n }) => {\n registeredHooks = {\n onNextMessageSet: [\n ...(hooks?.onNextMessageSet ? [hooks.onNextMessageSet] : []),\n ...registeredHooks.onNextMessageSet,\n ],\n onNewUserMessageResolved: [\n ...(hooks?.onNewUserMessageResolved\n ? [hooks.onNewUserMessageResolved]\n : []),\n ...registeredHooks.onNewUserMessageResolved,\n ],\n };\n };\n\n return {\n generateMessages,\n setNextMessage,\n setHooks,\n };\n};\n", "import type { SDKMessage as AgentSDKMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SDKMessage as ClaudeCodeSDKMessage } from \"@anthropic-ai/claude-code\";\n\nexport const fallbackSdkMessage = (\n message: AgentSDKMessage | ClaudeCodeSDKMessage,\n): AgentSDKMessage => {\n if (message.type === \"system\") {\n if (message.subtype === \"init\") {\n return {\n ...message,\n plugins: [],\n };\n }\n\n return message;\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n return {\n ...message,\n };\n }\n\n return {\n ...message,\n errors: [],\n };\n }\n\n return message;\n};\n", "import { Effect } from \"effect\";\nimport type { UserEntry } from \"../../../../lib/conversation-schema/entry/UserEntrySchema\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator\";\nimport type { InitMessageContext } from \"../types\";\nimport * as ClaudeCode from \"./ClaudeCode\";\nimport type * as CCTask from \"./ClaudeCodeTask\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\nexport type CCSessionProcessDef = {\n sessionProcessId: string;\n projectId: string;\n cwd: string;\n abortController: AbortController;\n setNextMessage: (input: UserMessageInput) => void;\n};\n\ntype CCSessionProcessStateBase = {\n def: CCSessionProcessDef;\n tasks: CCTask.ClaudeCodeTaskState[];\n};\n\nexport type CCSessionProcessPendingState = CCSessionProcessStateBase & {\n type: \"pending\" /* \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u307E\u3060\u89E3\u6C7A\u3055\u308C\u3066\u3044\u306A\u3044\u72B6\u614B */;\n sessionId?: undefined;\n currentTask: CCTask.PendingClaudeCodeTaskState;\n};\n\nexport type CCSessionProcessNotInitializedState = CCSessionProcessStateBase & {\n type: \"not_initialized\" /* \u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u89E3\u6C7A\u3055\u308C\u3066\u3044\u308B\u304C\u3001init \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u672A\u53D7\u4FE1 */;\n sessionId?: undefined;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n};\n\nexport type CCSessionProcessInitializedState = CCSessionProcessStateBase & {\n type: \"initialized\" /* init \u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u53D7\u4FE1\u3057\u305F\u72B6\u614B */;\n sessionId: string;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessFileCreatedState = CCSessionProcessStateBase & {\n type: \"file_created\" /* \u30D5\u30A1\u30A4\u30EB\u304C\u4F5C\u6210\u3055\u308C\u305F\u72B6\u614B */;\n sessionId: string;\n currentTask: CCTask.RunningClaudeCodeTaskState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessPausedState = CCSessionProcessStateBase & {\n type: \"paused\" /* \u30BF\u30B9\u30AF\u304C\u5B8C\u4E86\u3057\u3001\u6B21\u306E\u30BF\u30B9\u30AF\u3092\u53D7\u3051\u4ED8\u3051\u53EF\u80FD */;\n sessionId: string;\n};\n\nexport type CCSessionProcessCompletedState = CCSessionProcessStateBase & {\n type: \"completed\" /* paused \u3042\u308B\u3044\u306F\u8D77\u52D5\u4E2D\u306E\u30BF\u30B9\u30AF\u304C\u4E2D\u65AD\u3055\u308C\u305F\u72B6\u614B\u3002\u518D\u958B\u4E0D\u53EF */;\n sessionId?: string | undefined;\n};\n\nexport type CCSessionProcessStatePublic =\n | CCSessionProcessInitializedState\n | CCSessionProcessFileCreatedState\n | CCSessionProcessPausedState;\n\nexport type CCSessionProcessState =\n | CCSessionProcessPendingState\n | CCSessionProcessNotInitializedState\n | CCSessionProcessStatePublic\n | CCSessionProcessCompletedState;\n\nexport const isPublic = (\n process: CCSessionProcessState,\n): process is CCSessionProcessStatePublic => {\n return (\n process.type === \"initialized\" ||\n process.type === \"file_created\" ||\n process.type === \"paused\"\n );\n};\n\nexport const getAliveTasks = (\n process: CCSessionProcessState,\n): CCTask.AliveClaudeCodeTaskState[] => {\n return process.tasks.filter(\n (task) => task.status === \"pending\" || task.status === \"running\",\n );\n};\n\nexport const createVirtualConversation = (\n process: CCSessionProcessState,\n ctx: {\n sessionId: string;\n userMessage: string;\n },\n) => {\n const timestamp = new Date().toISOString();\n\n return Effect.gen(function* () {\n const config = yield* ClaudeCode.Config;\n\n const virtualConversation: UserEntry = {\n type: \"user\",\n message: {\n role: \"user\",\n content: ctx.userMessage,\n },\n isSidechain: false,\n userType: \"external\",\n cwd: process.def.cwd,\n sessionId: ctx.sessionId,\n version: config.claudeCodeVersion\n ? ClaudeCodeVersion.versionText(config.claudeCodeVersion)\n : \"unknown\",\n uuid: `vc__${ctx.sessionId}__${timestamp}`,\n timestamp,\n parentUuid: null,\n };\n\n return virtualConversation;\n });\n};\n", "import type { SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Data, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess\";\nimport type * as CCTask from \"../models/ClaudeCodeTask\";\nimport type { InitMessageContext } from \"../types\";\n\nclass SessionProcessNotFoundError extends Data.TaggedError(\n \"SessionProcessNotFoundError\",\n)<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessNotPausedError extends Data.TaggedError(\n \"SessionProcessNotPausedError\",\n)<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessAlreadyAliveError extends Data.TaggedError(\n \"SessionProcessAlreadyAliveError\",\n)<{\n sessionProcessId: string;\n aliveTaskId: string;\n aliveTaskSessionId?: string;\n}> {}\n\nclass IllegalStateChangeError extends Data.TaggedError(\n \"IllegalStateChangeError\",\n)<{\n from: CCSessionProcess.CCSessionProcessState[\"type\"];\n to: CCSessionProcess.CCSessionProcessState[\"type\"];\n}> {}\n\nclass TaskNotFoundError extends Data.TaggedError(\"TaskNotFoundError\")<{\n taskId: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const processesRef = yield* Ref.make<\n CCSessionProcess.CCSessionProcessState[]\n >([]);\n const eventBus = yield* EventBus;\n\n const startSessionProcess = (options: {\n sessionDef: CCSessionProcess.CCSessionProcessDef;\n taskDef: CCTask.NewClaudeCodeTaskDef | CCTask.ResumeClaudeCodeTaskDef;\n }) => {\n const { sessionDef, taskDef } = options;\n\n return Effect.gen(function* () {\n const task: CCTask.PendingClaudeCodeTaskState = {\n def: taskDef,\n status: \"pending\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessState = {\n def: sessionDef,\n type: \"pending\",\n tasks: [task],\n currentTask: task,\n };\n\n yield* Ref.update(processesRef, (processes) => [\n ...processes,\n newProcess,\n ]);\n return {\n sessionProcess: newProcess,\n task,\n };\n });\n };\n\n const continueSessionProcess = (options: {\n sessionProcessId: string;\n taskDef: CCTask.ContinueClaudeCodeTaskDef;\n }) => {\n const { sessionProcessId } = options;\n\n return Effect.gen(function* () {\n const process = yield* getSessionProcess(sessionProcessId);\n\n if (process.type !== \"paused\") {\n return yield* Effect.fail(\n new SessionProcessNotPausedError({\n sessionProcessId,\n }),\n );\n }\n\n const [firstAliveTask] = CCSessionProcess.getAliveTasks(process);\n if (firstAliveTask !== undefined) {\n return yield* Effect.fail(\n new SessionProcessAlreadyAliveError({\n sessionProcessId,\n aliveTaskId: firstAliveTask.def.taskId,\n aliveTaskSessionId:\n firstAliveTask.def.sessionId ?? firstAliveTask.sessionId,\n }),\n );\n }\n\n const newTask: CCTask.PendingClaudeCodeTaskState = {\n def: options.taskDef,\n status: \"pending\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessPendingState = {\n def: process.def,\n type: \"pending\",\n tasks: [...process.tasks, newTask],\n currentTask: newTask,\n };\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId ? newProcess : p,\n );\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n const getSessionProcess = (sessionProcessId: string) => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const result = processes.find(\n (p) => p.def.sessionProcessId === sessionProcessId,\n );\n if (result === undefined) {\n return yield* Effect.fail(\n new SessionProcessNotFoundError({ sessionProcessId }),\n );\n }\n return result;\n });\n };\n\n const getSessionProcesses = () => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n return processes;\n });\n };\n\n const getTask = (taskId: string) => {\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const result = processes\n .flatMap((p) => {\n const found = p.tasks.find((t) => t.def.taskId === taskId);\n if (found === undefined) {\n return [];\n }\n\n return [\n {\n sessionProcess: p,\n task: found,\n },\n ];\n })\n .at(0);\n\n if (result === undefined) {\n return yield* Effect.fail(new TaskNotFoundError({ taskId }));\n }\n\n return result;\n });\n };\n\n const dangerouslyChangeProcessState = <\n T extends CCSessionProcess.CCSessionProcessState,\n >(options: {\n sessionProcessId: string;\n nextState: T;\n }) => {\n const { sessionProcessId, nextState } = options;\n\n return Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const targetProcess = processes.find(\n (p) => p.def.sessionProcessId === sessionProcessId,\n );\n const currentStatus = targetProcess?.type;\n\n const updatedProcesses = processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId ? nextState : p,\n );\n\n yield* Ref.set(processesRef, updatedProcesses);\n\n if (currentStatus !== nextState.type) {\n yield* eventBus.emit(\"sessionProcessChanged\", {\n processes: updatedProcesses\n .filter(CCSessionProcess.isPublic)\n .map((process) => ({\n id: process.def.sessionProcessId,\n projectId: process.def.projectId,\n sessionId: process.sessionId,\n status: process.type === \"paused\" ? \"paused\" : \"running\",\n })),\n changed: nextState,\n });\n }\n\n console.log(\n `sessionProcessStateChanged(${sessionProcessId}): ${targetProcess?.type} -> ${nextState.type}`,\n );\n\n return nextState;\n });\n };\n\n const changeTaskState = <T extends CCTask.ClaudeCodeTaskState>(options: {\n sessionProcessId: string;\n taskId: string;\n nextTask: T;\n }) => {\n const { sessionProcessId, taskId, nextTask } = options;\n\n return Effect.gen(function* () {\n const { task } = yield* getTask(taskId);\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) =>\n p.def.sessionProcessId === sessionProcessId\n ? {\n ...p,\n tasks: p.tasks.map((t) =>\n t.def.taskId === task.def.taskId ? { ...nextTask } : t,\n ),\n }\n : p,\n );\n });\n\n const updated = yield* getTask(taskId);\n if (updated === undefined) {\n throw new Error(\"Unreachable: updatedProcess is undefined\");\n }\n\n return updated.task as T;\n });\n };\n\n const toNotInitializedState = (options: {\n sessionProcessId: string;\n rawUserMessage: string;\n }) => {\n const { sessionProcessId, rawUserMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"pending\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"not_initialized\",\n }),\n );\n }\n\n const newTask = yield* changeTaskState({\n sessionProcessId,\n taskId: currentProcess.currentTask.def.taskId,\n nextTask: {\n status: \"running\",\n def: currentProcess.currentTask.def,\n },\n });\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"not_initialized\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: newTask,\n rawUserMessage,\n },\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n const toInitializedState = (options: {\n sessionProcessId: string;\n initContext: InitMessageContext;\n }) => {\n const { sessionProcessId, initContext } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"not_initialized\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"initialized\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"initialized\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: currentProcess.currentTask,\n sessionId: initContext.initMessage.session_id,\n rawUserMessage: currentProcess.rawUserMessage,\n initContext: initContext,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toFileCreatedState = (options: { sessionProcessId: string }) => {\n const { sessionProcessId } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"initialized\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"file_created\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"file_created\",\n def: currentProcess.def,\n tasks: currentProcess.tasks,\n currentTask: currentProcess.currentTask,\n sessionId: currentProcess.sessionId,\n rawUserMessage: currentProcess.rawUserMessage,\n initContext: currentProcess.initContext,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toPausedState = (options: {\n sessionProcessId: string;\n resultMessage: SDKResultMessage;\n }) => {\n const { sessionProcessId, resultMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"file_created\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"paused\",\n }),\n );\n }\n\n const newTask = yield* changeTaskState({\n sessionProcessId,\n taskId: currentProcess.currentTask.def.taskId,\n nextTask: {\n status: \"completed\",\n def: currentProcess.currentTask.def,\n sessionId: resultMessage.session_id,\n },\n });\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"paused\",\n def: currentProcess.def,\n tasks: currentProcess.tasks.map((t) =>\n t.def.taskId === newTask.def.taskId ? newTask : t,\n ),\n sessionId: currentProcess.sessionId,\n },\n });\n\n return {\n sessionProcess: newProcess,\n };\n });\n };\n\n const toCompletedState = (options: {\n sessionProcessId: string;\n error?: unknown;\n }) => {\n const { sessionProcessId, error } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n const currentTask =\n currentProcess.type === \"not_initialized\" ||\n currentProcess.type === \"initialized\" ||\n currentProcess.type === \"file_created\"\n ? currentProcess.currentTask\n : undefined;\n\n const newTask =\n currentTask !== undefined\n ? error !== undefined\n ? ({\n status: \"failed\",\n def: currentTask.def,\n error,\n } as const)\n : ({\n status: \"completed\",\n def: currentTask.def,\n sessionId: currentProcess.sessionId,\n } as const)\n : undefined;\n\n if (newTask !== undefined) {\n yield* changeTaskState({\n sessionProcessId,\n taskId: newTask.def.taskId,\n nextTask: newTask,\n });\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n type: \"completed\",\n def: currentProcess.def,\n tasks:\n newTask !== undefined\n ? currentProcess.tasks.map((t) =>\n t.def.taskId === newTask.def.taskId ? newTask : t,\n )\n : currentProcess.tasks,\n sessionId: currentProcess.sessionId,\n },\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n return {\n // session\n startSessionProcess,\n continueSessionProcess,\n toNotInitializedState,\n toInitializedState,\n toFileCreatedState,\n toPausedState,\n toCompletedState,\n dangerouslyChangeProcessState,\n getSessionProcesses,\n getSessionProcess,\n\n // task\n getTask,\n changeTaskState,\n };\n});\n\nexport type IClaudeCodeSessionProcessService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodeSessionProcessService extends Context.Tag(\n \"ClaudeCodeSessionProcessService\",\n)<ClaudeCodeSessionProcessService, IClaudeCodeSessionProcessService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { SSEStreamingApi } from \"hono/streaming\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { adaptInternalEventToSSE } from \"../functions/adaptInternalEventToSSE\";\nimport { TypeSafeSSE } from \"../functions/typeSafeSSE\";\nimport { EventBus } from \"../services/EventBus\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration\";\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n\n const handleSSE = (rawStream: SSEStreamingApi) =>\n Effect.gen(function* () {\n const typeSafeSSE = yield* TypeSafeSSE;\n\n // Send connect event\n yield* typeSafeSSE.writeSSE(\"connect\", {\n timestamp: new Date().toISOString(),\n });\n\n const onHeartbeat = () => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"heartbeat\", {\n timestamp: new Date().toISOString(),\n }),\n );\n };\n\n const onSessionListChanged = (\n event: InternalEventDeclaration[\"sessionListChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionListChanged\", {\n projectId: event.projectId,\n }),\n );\n };\n\n const onSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionChanged\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onAgentSessionChanged = (\n event: InternalEventDeclaration[\"agentSessionChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"agentSessionChanged\", {\n projectId: event.projectId,\n agentSessionId: event.agentSessionId,\n }),\n );\n };\n\n const onSessionProcessChanged = (\n event: InternalEventDeclaration[\"sessionProcessChanged\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionProcessChanged\", {\n processes: event.processes,\n }),\n );\n };\n\n const onPermissionRequested = (\n event: InternalEventDeclaration[\"permissionRequested\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionRequested\", {\n permissionRequest: event.permissionRequest,\n }),\n );\n };\n\n yield* eventBus.on(\"sessionListChanged\", onSessionListChanged);\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"agentSessionChanged\", onAgentSessionChanged);\n yield* eventBus.on(\"sessionProcessChanged\", onSessionProcessChanged);\n yield* eventBus.on(\"heartbeat\", onHeartbeat);\n yield* eventBus.on(\"permissionRequested\", onPermissionRequested);\n\n const { connectionPromise } = adaptInternalEventToSSE(rawStream, {\n timeout: 5 /* min */ * 60 /* sec */ * 1000,\n cleanUp: async () => {\n await Effect.runPromise(\n Effect.gen(function* () {\n yield* eventBus.off(\"sessionListChanged\", onSessionListChanged);\n yield* eventBus.off(\"sessionChanged\", onSessionChanged);\n yield* eventBus.off(\"agentSessionChanged\", onAgentSessionChanged);\n yield* eventBus.off(\n \"sessionProcessChanged\",\n onSessionProcessChanged,\n );\n yield* eventBus.off(\"heartbeat\", onHeartbeat);\n yield* eventBus.off(\"permissionRequested\", onPermissionRequested);\n }),\n );\n },\n });\n\n yield* Effect.promise(() => connectionPromise);\n });\n\n return {\n handleSSE,\n };\n});\n\nexport type ISSEController = InferEffect<typeof LayerImpl>;\nexport class SSEController extends Context.Tag(\"SSEController\")<\n SSEController,\n ISSEController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { SSEStreamingApi } from \"hono/streaming\";\n\nexport const adaptInternalEventToSSE = (\n rawStream: SSEStreamingApi,\n options?: {\n timeout?: number;\n cleanUp?: () => void | Promise<void>;\n },\n) => {\n const { timeout = 60 * 1000, cleanUp } = options ?? {};\n\n const abortController = new AbortController();\n let connectionResolve: (() => void) | undefined;\n const connectionPromise = new Promise<void>((resolve) => {\n connectionResolve = resolve;\n });\n\n const closeConnection = () => {\n connectionResolve?.();\n abortController.abort();\n cleanUp?.();\n };\n\n rawStream.onAbort(() => {\n closeConnection();\n });\n\n setTimeout(() => {\n closeConnection();\n }, timeout);\n\n return {\n connectionPromise,\n } as const;\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { SSEStreamingApi } from \"hono/streaming\";\nimport { ulid } from \"ulid\";\nimport type { SSEEventDeclaration } from \"../../../../types/sse\";\n\ninterface TypeSafeSSEService {\n readonly writeSSE: <EventName extends keyof SSEEventDeclaration>(\n event: EventName,\n data: SSEEventDeclaration[EventName],\n ) => Effect.Effect<void, Error>;\n}\n\nexport class TypeSafeSSE extends Context.Tag(\"TypeSafeSSE\")<\n TypeSafeSSE,\n TypeSafeSSEService\n>() {\n static make = (stream: SSEStreamingApi) =>\n Layer.succeed(this, {\n writeSSE: <EventName extends keyof SSEEventDeclaration>(\n event: EventName,\n data: SSEEventDeclaration[EventName],\n ): Effect.Effect<void, Error> =>\n Effect.tryPromise({\n try: async () => {\n const id = ulid();\n await stream.writeSSE({\n event: event,\n id: id,\n data: JSON.stringify({\n kind: event,\n timestamp: new Date().toISOString(),\n ...data,\n }),\n });\n },\n catch: (error) => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n },\n }),\n } satisfies TypeSafeSSEService);\n}\n", "import { type FSWatcher, watch } from \"node:fs\";\nimport { Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { encodeProjectIdFromSessionFilePath } from \"../../project/functions/id\";\nimport { parseSessionFilePath } from \"../functions/parseSessionFilePath\";\nimport { EventBus } from \"./EventBus\";\n\ninterface FileWatcherServiceInterface {\n readonly startWatching: () => Effect.Effect<void>;\n readonly stop: () => Effect.Effect<void>;\n}\n\nexport class FileWatcherService extends Context.Tag(\"FileWatcherService\")<\n FileWatcherService,\n FileWatcherServiceInterface\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const eventBus = yield* EventBus;\n const context = yield* ApplicationContext;\n\n const isWatchingRef = yield* Ref.make(false);\n const watcherRef = yield* Ref.make<FSWatcher | null>(null);\n const projectWatchersRef = yield* Ref.make<Map<string, FSWatcher>>(\n new Map(),\n );\n const debounceTimersRef = yield* Ref.make<\n Map<string, ReturnType<typeof setTimeout>>\n >(new Map());\n\n const startWatching = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const isWatching = yield* Ref.get(isWatchingRef);\n if (isWatching) return;\n\n yield* Ref.set(isWatchingRef, true);\n\n yield* Effect.tryPromise({\n try: async () => {\n console.log(\n \"Starting file watcher on:\",\n context.claudeCodePaths.claudeProjectsDirPath,\n );\n\n const watcher = watch(\n context.claudeCodePaths.claudeProjectsDirPath,\n { persistent: false, recursive: true },\n (_eventType, filename) => {\n if (!filename) return;\n\n const fileMatch = parseSessionFilePath(filename);\n if (fileMatch === null) return;\n\n // Build full path to get encoded projectId\n const fullPath = path.join(\n context.claudeCodePaths.claudeProjectsDirPath,\n filename,\n );\n const encodedProjectId =\n encodeProjectIdFromSessionFilePath(fullPath);\n\n // Determine debounce key based on file type\n const debounceKey =\n fileMatch.type === \"agent\"\n ? `${encodedProjectId}/agent-${fileMatch.agentSessionId}`\n : `${encodedProjectId}/${fileMatch.sessionId}`;\n\n Effect.runPromise(\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n const existingTimer = timers.get(debounceKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n const newTimer = setTimeout(() => {\n if (fileMatch.type === \"agent\") {\n // Agent session file changed\n Effect.runFork(\n eventBus.emit(\"agentSessionChanged\", {\n projectId: encodedProjectId,\n agentSessionId: fileMatch.agentSessionId,\n }),\n );\n } else {\n // Regular session file changed\n Effect.runFork(\n eventBus.emit(\"sessionChanged\", {\n projectId: encodedProjectId,\n sessionId: fileMatch.sessionId,\n }),\n );\n\n Effect.runFork(\n eventBus.emit(\"sessionListChanged\", {\n projectId: encodedProjectId,\n }),\n );\n }\n\n Effect.runPromise(\n Effect.gen(function* () {\n const currentTimers =\n yield* Ref.get(debounceTimersRef);\n currentTimers.delete(debounceKey);\n yield* Ref.set(debounceTimersRef, currentTimers);\n }),\n );\n }, 300);\n\n timers.set(debounceKey, newTimer);\n yield* Ref.set(debounceTimersRef, timers);\n }),\n );\n },\n );\n\n await Effect.runPromise(Ref.set(watcherRef, watcher));\n console.log(\"File watcher initialization completed\");\n },\n catch: (error) => {\n console.error(\"Failed to start file watching:\", error);\n return new Error(\n `Failed to start file watching: ${String(error)}`,\n );\n },\n }).pipe(\n // \u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u3066\u3082\u7D9A\u884C\u3059\u308B\n Effect.catchAll(() => Effect.void),\n );\n });\n\n const stop = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n for (const [, timer] of timers) {\n clearTimeout(timer);\n }\n yield* Ref.set(debounceTimersRef, new Map());\n\n const watcher = yield* Ref.get(watcherRef);\n if (watcher) {\n yield* Effect.sync(() => watcher.close());\n yield* Ref.set(watcherRef, null);\n }\n\n const projectWatchers = yield* Ref.get(projectWatchersRef);\n for (const [, projectWatcher] of projectWatchers) {\n yield* Effect.sync(() => projectWatcher.close());\n }\n yield* Ref.set(projectWatchersRef, new Map());\n yield* Ref.set(isWatchingRef, false);\n });\n\n return {\n startWatching,\n stop,\n } satisfies FileWatcherServiceInterface;\n }),\n );\n}\n", "import z from \"zod\";\n\nconst sessionFileRegExp = /(?<projectId>.*?)\\/(?<sessionId>.*?)\\.jsonl$/;\nconst agentFileRegExp =\n /(?<projectId>.*?)\\/agent-(?<agentSessionId>.*?)\\.jsonl$/;\n\nconst sessionFileGroupSchema = z.object({\n projectId: z.string(),\n sessionId: z.string(),\n});\n\nconst agentFileGroupSchema = z.object({\n projectId: z.string(),\n agentSessionId: z.string(),\n});\n\nexport type SessionFileMatch = {\n type: \"session\";\n projectId: string;\n sessionId: string;\n};\n\nexport type AgentFileMatch = {\n type: \"agent\";\n projectId: string;\n agentSessionId: string;\n};\n\nexport type FileMatch = SessionFileMatch | AgentFileMatch | null;\n\n/**\n * Parses a file path to determine if it's a regular session file or an agent session file.\n * Agent files take precedence in matching (checked first).\n *\n * @param filePath - The relative file path from the claude projects directory\n * @returns FileMatch object with type and extracted IDs, or null if not a recognized file\n */\nexport const parseSessionFilePath = (filePath: string): FileMatch => {\n // Check for agent file first (more specific pattern)\n const agentMatch = filePath.match(agentFileRegExp);\n const agentGroups = agentFileGroupSchema.safeParse(agentMatch?.groups);\n if (agentGroups.success) {\n return {\n type: \"agent\",\n projectId: agentGroups.data.projectId,\n agentSessionId: agentGroups.data.agentSessionId,\n };\n }\n\n // Check for regular session file\n const sessionMatch = filePath.match(sessionFileRegExp);\n const sessionGroups = sessionFileGroupSchema.safeParse(sessionMatch?.groups);\n if (sessionGroups.success) {\n return {\n type: \"session\",\n projectId: sessionGroups.data.projectId,\n sessionId: sessionGroups.data.sessionId,\n };\n }\n\n return null;\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodeService } from \"../../claude-code/services/ClaudeCodeService\";\nimport type { Flag } from \"../models/flag\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodeService = yield* ClaudeCodeService;\n\n const getFlags = () =>\n Effect.gen(function* () {\n const claudeCodeFeatures =\n yield* claudeCodeService.getAvailableFeatures();\n\n return {\n response: {\n flags: [\n {\n name: \"tool-approval\",\n enabled: claudeCodeFeatures.canUseTool,\n },\n {\n name: \"agent-sdk\",\n enabled: claudeCodeFeatures.agentSdk,\n },\n {\n name: \"sidechain-separation\",\n enabled: claudeCodeFeatures.sidechainSeparation,\n },\n ] satisfies Flag[],\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getFlags,\n };\n});\n\nexport type IFeatureFlagController = InferEffect<typeof LayerImpl>;\nexport class FeatureFlagController extends Context.Tag(\"FeatureFlagController\")<\n FeatureFlagController,\n IFeatureFlagController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { homedir } from \"node:os\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { getDirectoryListing } from \"../functions/getDirectoryListing\";\nimport { getFileCompletion } from \"../functions/getFileCompletion\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n\n const getFileCompletionRoute = (options: {\n projectId: string;\n basePath: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, basePath } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n try {\n const result = yield* Effect.promise(() =>\n getFileCompletion(projectPath, basePath),\n );\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"File completion error:\", error);\n return {\n response: { error: \"Failed to get file completion\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n const getDirectoryListingRoute = (options: {\n currentPath?: string | undefined;\n showHidden?: boolean | undefined;\n }) =>\n Effect.promise(async () => {\n const { currentPath, showHidden = false } = options;\n\n const rootPath = \"/\";\n const defaultPath = homedir();\n\n try {\n const targetPath = currentPath ?? defaultPath;\n const relativePath = targetPath.startsWith(rootPath)\n ? targetPath.slice(rootPath.length)\n : targetPath;\n\n const result = await getDirectoryListing(\n rootPath,\n relativePath,\n showHidden,\n );\n\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"Directory listing error:\", error);\n return {\n response: { error: \"Failed to list directory\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n return {\n getFileCompletionRoute,\n getDirectoryListingRoute,\n };\n});\n\nexport type IFileSystemController = InferEffect<typeof LayerImpl>;\nexport class FileSystemController extends Context.Tag(\"FileSystemController\")<\n FileSystemController,\n IFileSystemController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport type DirectoryEntry = {\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n};\n\nexport type DirectoryListingResult = {\n entries: DirectoryEntry[];\n basePath: string;\n currentPath: string;\n};\n\nexport const getDirectoryListing = async (\n rootPath: string,\n basePath = \"/\",\n showHidden = false,\n): Promise<DirectoryListingResult> => {\n const normalizedBasePath =\n basePath === \"/\"\n ? \"\"\n : basePath.startsWith(\"/\")\n ? basePath.slice(1)\n : basePath;\n const targetPath = resolve(rootPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolve(rootPath))) {\n throw new Error(\"Invalid path: outside root directory\");\n }\n\n if (!existsSync(targetPath)) {\n return {\n entries: [],\n basePath: \"/\",\n currentPath: rootPath,\n };\n }\n\n try {\n const dirents = await readdir(targetPath, { withFileTypes: true });\n const entries: DirectoryEntry[] = [];\n\n if (normalizedBasePath !== \"\") {\n const parentPath = dirname(normalizedBasePath);\n entries.push({\n name: \"..\",\n type: \"directory\",\n path: parentPath === \".\" ? \"\" : parentPath,\n });\n }\n\n for (const dirent of dirents) {\n if (!showHidden && dirent.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = normalizedBasePath\n ? join(normalizedBasePath, dirent.name)\n : dirent.name;\n\n if (dirent.isDirectory()) {\n entries.push({\n name: dirent.name,\n type: \"directory\",\n path: entryPath,\n });\n } else if (dirent.isFile()) {\n entries.push({\n name: dirent.name,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\n entries.sort((a, b) => {\n if (a.name === \"..\") return -1;\n if (b.name === \"..\") return 1;\n if (a.type !== b.type) {\n return a.type === \"directory\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n entries,\n basePath: normalizedBasePath || \"/\",\n currentPath: targetPath,\n };\n } catch (error) {\n console.error(\"Error reading directory:\", error);\n return {\n entries: [],\n basePath: normalizedBasePath || \"/\",\n currentPath: targetPath,\n };\n }\n};\n", "import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nexport type FileCompletionEntry = {\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n};\n\nexport type FileCompletionResult = {\n entries: FileCompletionEntry[];\n basePath: string;\n projectPath: string;\n};\n\n/**\n * Get file and directory completions for a given project path\n * @param projectPath - The root project path\n * @param basePath - The relative path from project root (default: \"/\")\n * @returns File and directory entries at the specified path level\n */\nexport const getFileCompletion = async (\n projectPath: string,\n basePath = \"/\",\n): Promise<FileCompletionResult> => {\n // Normalize basePath to prevent directory traversal\n const normalizedBasePath = basePath.startsWith(\"/\")\n ? basePath.slice(1)\n : basePath;\n const targetPath = resolve(projectPath, normalizedBasePath);\n\n // Security check: ensure target path is within project directory\n if (!targetPath.startsWith(resolve(projectPath))) {\n throw new Error(\"Invalid path: outside project directory\");\n }\n\n // Check if the target path exists\n if (!existsSync(targetPath)) {\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n\n try {\n const dirents = await readdir(targetPath, { withFileTypes: true });\n const entries: FileCompletionEntry[] = [];\n\n // Process each directory entry\n for (const dirent of dirents) {\n // Skip hidden files and directories (starting with .)\n if (dirent.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = join(normalizedBasePath, dirent.name);\n\n if (dirent.isDirectory()) {\n entries.push({\n name: dirent.name,\n type: \"directory\",\n path: entryPath,\n });\n } else if (dirent.isFile()) {\n entries.push({\n name: dirent.name,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\n // Sort entries: directories first, then files, both alphabetically\n entries.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === \"directory\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n entries,\n basePath: normalizedBasePath,\n projectPath,\n };\n } catch (error) {\n console.error(\"Error reading directory:\", error);\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n};\n", "import { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { getDiff } from \"../functions/getDiff\";\nimport type { CommitErrorCode, PushErrorCode } from \"../schema\";\nimport { GitService } from \"../services/GitService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const gitService = yield* GitService;\n const projectRepository = yield* ProjectRepository;\n\n const getGitDiff = (options: {\n projectId: string;\n fromRef: string;\n toRef: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, fromRef, toRef } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n try {\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n const result = yield* Effect.promise(() =>\n getDiff(projectPath, fromRef, toRef),\n );\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n } catch (error) {\n console.error(\"Get diff error:\", error);\n if (error instanceof Error) {\n return {\n response: { error: error.message },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n return {\n response: { error: \"Failed to get diff\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n });\n\n const commitFiles = (options: {\n projectId: string;\n files: string[];\n message: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n console.log(\"[GitController.commitFiles] Project path is null\");\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n console.log(\"[GitController.commitFiles] Project path:\", projectPath);\n\n // Stage files\n console.log(\"[GitController.commitFiles] Staging files...\");\n const stageResult = yield* Effect.either(\n gitService.stageFiles(projectPath, files),\n );\n if (Either.isLeft(stageResult)) {\n console.log(\n \"[GitController.commitFiles] Stage failed:\",\n stageResult.left,\n );\n return {\n response: {\n success: false,\n error: \"Failed to stage files\",\n errorCode: \"GIT_COMMAND_ERROR\" as CommitErrorCode,\n details: stageResult.left.message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n console.log(\"[GitController.commitFiles] Stage succeeded\");\n\n // Commit\n console.log(\"[GitController.commitFiles] Committing...\");\n const commitResult = yield* Effect.either(\n gitService.commit(projectPath, message),\n );\n if (Either.isLeft(commitResult)) {\n console.log(\n \"[GitController.commitFiles] Commit failed:\",\n commitResult.left,\n );\n const error = commitResult.left;\n const errorMessage =\n \"_tag\" in error && error._tag === \"GitCommandError\"\n ? error.command\n : \"message\" in error\n ? String(error.message)\n : \"Unknown error\";\n const isHookFailure = errorMessage.includes(\"hook\");\n return {\n response: {\n success: false,\n error: isHookFailure ? \"Pre-commit hook failed\" : \"Commit failed\",\n errorCode: (isHookFailure\n ? \"HOOK_FAILED\"\n : \"GIT_COMMAND_ERROR\") as CommitErrorCode,\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\n \"[GitController.commitFiles] Commit succeeded, SHA:\",\n commitResult.right,\n );\n\n return {\n response: {\n success: true,\n commitSha: commitResult.right,\n filesCommitted: files.length,\n message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const pushCommits = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n console.log(\"[GitController.pushCommits] Request:\", { projectId });\n\n const { project } = yield* projectRepository.getProject(projectId);\n if (project.meta.projectPath === null) {\n console.log(\"[GitController.pushCommits] Project path is null\");\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n console.log(\"[GitController.pushCommits] Project path:\", projectPath);\n\n // Push\n console.log(\"[GitController.pushCommits] Pushing...\");\n const pushResult = yield* Effect.either(gitService.push(projectPath));\n\n if (Either.isLeft(pushResult)) {\n console.log(\n \"[GitController.pushCommits] Push failed:\",\n pushResult.left,\n );\n const error = pushResult.left;\n const errorMessage =\n \"_tag\" in error && error._tag === \"GitCommandError\"\n ? error.command\n : \"message\" in error\n ? String(error.message)\n : \"Unknown error\";\n\n const errorCode = parsePushError(errorMessage);\n return {\n response: {\n success: false,\n error: getPushErrorMessage(errorCode),\n errorCode,\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\"[GitController.pushCommits] Push succeeded\");\n\n return {\n response: {\n success: true,\n remote: \"origin\",\n branch: pushResult.right.branch,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const commitAndPush = (options: {\n projectId: string;\n files: string[];\n message: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n console.log(\"[GitController.commitAndPush] Request:\", {\n projectId,\n files,\n message,\n });\n\n // First, commit\n const commitResult = yield* commitFiles({ projectId, files, message });\n\n if (commitResult.status !== 200 || !commitResult.response.success) {\n console.log(\n \"[GitController.commitAndPush] Commit failed:\",\n commitResult,\n );\n return commitResult; // Return commit error\n }\n\n const commitSha = commitResult.response.commitSha;\n console.log(\n \"[GitController.commitAndPush] Commit succeeded, SHA:\",\n commitSha,\n );\n\n // Then, push\n const pushResult = yield* pushCommits({ projectId });\n\n if (pushResult.status !== 200 || !pushResult.response.success) {\n console.log(\n \"[GitController.commitAndPush] Push failed, partial failure:\",\n pushResult,\n );\n // Partial failure: commit succeeded, push failed\n return {\n response: {\n success: false,\n commitSucceeded: true,\n commitSha,\n error: pushResult.response.error,\n errorCode: pushResult.response.errorCode,\n details: pushResult.response.details,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n console.log(\"[GitController.commitAndPush] Both operations succeeded\");\n\n // Full success\n return {\n response: {\n success: true,\n commitSha,\n filesCommitted: files.length,\n message,\n remote: pushResult.response.remote,\n branch: pushResult.response.branch,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getCurrentRevisions = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n // Get current branch\n const currentBranchResult = yield* Effect.either(\n gitService.getCurrentBranch(projectPath),\n );\n\n if (Either.isLeft(currentBranchResult)) {\n return {\n response: {\n success: false,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const currentBranch = currentBranchResult.right;\n\n // Find base branch\n const baseBranchResult = yield* Effect.either(\n gitService.findBaseBranch(projectPath, currentBranch),\n );\n\n // Get all branches to extract branch details\n const allBranchesResult = yield* Effect.either(\n gitService.getBranches(projectPath),\n );\n\n if (Either.isLeft(allBranchesResult)) {\n return {\n response: {\n success: false,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const allBranches = allBranchesResult.right.data;\n\n // Find current branch details\n const currentBranchDetails = allBranches.find(\n (branch) => branch.name === currentBranch,\n );\n\n // Find base branch details if exists\n let baseBranchDetails: (typeof allBranches)[number] | undefined;\n if (Either.isRight(baseBranchResult) && baseBranchResult.right !== null) {\n const baseBranchName = baseBranchResult.right.branch;\n baseBranchDetails = allBranches.find(\n (branch) => branch.name === baseBranchName,\n );\n }\n\n // Get commits if base branch exists\n let commits: Array<{\n sha: string;\n message: string;\n author: string;\n date: string;\n }> = [];\n\n if (Either.isRight(baseBranchResult) && baseBranchResult.right !== null) {\n const baseBranchHash = baseBranchResult.right.hash;\n const commitsResult = yield* Effect.either(\n gitService.getCommitsBetweenBranches(\n projectPath,\n baseBranchHash,\n \"HEAD\",\n ),\n );\n\n if (Either.isRight(commitsResult)) {\n commits = commitsResult.right.data;\n }\n }\n\n return {\n response: {\n success: true,\n data: {\n baseBranch: baseBranchDetails ?? null,\n currentBranch: currentBranchDetails ?? null,\n head: currentBranchDetails?.commit ?? null,\n commits,\n },\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getGitDiff,\n commitFiles,\n pushCommits,\n commitAndPush,\n getCurrentRevisions,\n };\n});\n\n// Helper functions for push error handling\nfunction parsePushError(stderr: string): PushErrorCode {\n if (stderr.includes(\"no upstream\") || stderr.includes(\"has no upstream\")) {\n return \"NO_UPSTREAM\";\n }\n if (\n stderr.includes(\"non-fast-forward\") ||\n stderr.includes(\"failed to push some refs\")\n ) {\n return \"NON_FAST_FORWARD\";\n }\n if (\n stderr.includes(\"Authentication failed\") ||\n stderr.includes(\"Permission denied\")\n ) {\n return \"AUTH_FAILED\";\n }\n if (stderr.includes(\"Could not resolve host\")) {\n return \"NETWORK_ERROR\";\n }\n if (stderr.includes(\"timeout\") || stderr.includes(\"timed out\")) {\n return \"TIMEOUT\";\n }\n return \"GIT_COMMAND_ERROR\";\n}\n\nfunction getPushErrorMessage(code: PushErrorCode): string {\n const messages: Record<PushErrorCode, string> = {\n NO_UPSTREAM:\n \"Branch has no upstream. Run: git push --set-upstream origin <branch>\",\n NON_FAST_FORWARD: \"Remote has diverged. Pull changes first before pushing.\",\n AUTH_FAILED:\n \"Authentication failed. Check your SSH keys or HTTPS credentials.\",\n NETWORK_ERROR: \"Network error. Check your internet connection.\",\n TIMEOUT:\n \"Push operation timed out after 60 seconds. Retry or check network.\",\n GIT_COMMAND_ERROR: \"Git command failed. Check details.\",\n PROJECT_NOT_FOUND: \"Project not found.\",\n NOT_A_REPOSITORY: \"Not a git repository.\",\n };\n return messages[code];\n}\n\nexport type IGitController = InferEffect<typeof LayerImpl>;\nexport class GitController extends Context.Tag(\"GitController\")<\n GitController,\n IGitController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport parseGitDiff, {\n type AnyChunk,\n type AnyFileChange,\n} from \"parse-git-diff\";\nimport {\n executeGitCommand,\n parseLines,\n stripAnsiColors,\n} from \"../functions/utils\";\nimport type {\n GitComparisonResult,\n GitDiff,\n GitDiffFile,\n GitDiffHunk,\n GitDiffLine,\n GitResult,\n} from \"../types\";\n\n/**\n * Convert parse-git-diff file change to GitDiffFile\n */\nfunction convertToGitDiffFile(\n fileChange: AnyFileChange,\n fileStats: Map<string, { additions: number; deletions: number }>,\n): GitDiffFile {\n let filePath: string;\n let status: GitDiffFile[\"status\"];\n let oldPath: string | undefined;\n\n switch (fileChange.type) {\n case \"AddedFile\":\n filePath = fileChange.path;\n status = \"added\";\n break;\n case \"DeletedFile\":\n filePath = fileChange.path;\n status = \"deleted\";\n break;\n case \"RenamedFile\":\n filePath = fileChange.pathAfter;\n oldPath = fileChange.pathBefore;\n status = \"renamed\";\n break;\n case \"ChangedFile\":\n filePath = fileChange.path;\n status = \"modified\";\n break;\n default:\n // Fallback for any unknown types\n filePath = \"\";\n status = \"modified\";\n }\n\n // Get stats from numstat\n const stats = fileStats.get(filePath) ||\n fileStats.get(oldPath || \"\") || { additions: 0, deletions: 0 };\n\n return {\n filePath,\n status,\n additions: stats.additions,\n deletions: stats.deletions,\n oldPath,\n };\n}\n\n/**\n * Convert parse-git-diff chunk to GitDiffHunk\n */\nfunction convertToGitDiffHunk(chunk: AnyChunk): GitDiffHunk {\n if (chunk.type !== \"Chunk\") {\n // For non-standard chunks, return empty hunk\n return {\n oldStart: 0,\n oldCount: 0,\n newStart: 0,\n newCount: 0,\n header: \"\",\n lines: [],\n };\n }\n\n const lines: GitDiffLine[] = [];\n\n for (const change of chunk.changes) {\n let line: GitDiffLine;\n\n switch (change.type) {\n case \"AddedLine\":\n line = {\n type: \"added\",\n content: change.content,\n newLineNumber: change.lineAfter,\n };\n break;\n case \"DeletedLine\":\n line = {\n type: \"deleted\",\n content: change.content,\n oldLineNumber: change.lineBefore,\n };\n break;\n case \"UnchangedLine\":\n line = {\n type: \"context\",\n content: change.content,\n oldLineNumber: change.lineBefore,\n newLineNumber: change.lineAfter,\n };\n break;\n case \"MessageLine\":\n // This is likely a hunk header or context line\n line = {\n type: \"context\",\n content: change.content,\n };\n break;\n default:\n // Fallback for unknown line types\n line = {\n type: \"context\",\n content: \"\",\n };\n }\n\n lines.push(line);\n }\n\n return {\n oldStart: chunk.fromFileRange.start,\n oldCount: chunk.fromFileRange.lines,\n newStart: chunk.toFileRange.start,\n newCount: chunk.toFileRange.lines,\n header: `@@ -${chunk.fromFileRange.start},${chunk.fromFileRange.lines} +${chunk.toFileRange.start},${chunk.toFileRange.lines} @@${chunk.context ? ` ${chunk.context}` : \"\"}`,\n lines,\n };\n}\n\nconst extractRef = (refText: string) => {\n const [group, ref] = refText.split(\":\");\n if (group === undefined || ref === undefined) {\n if (refText === \"HEAD\") {\n return \"HEAD\";\n }\n\n if (refText === \"working\") {\n return undefined;\n }\n\n throw new Error(`Invalid ref text: ${refText}`);\n }\n\n return ref;\n};\n\n/**\n * Get untracked files using git status\n */\nasync function getUntrackedFiles(cwd: string): Promise<GitResult<string[]>> {\n const statusResult = await executeGitCommand(\n [\"status\", \"--untracked-files=all\", \"--short\"],\n cwd,\n );\n\n if (!statusResult.success) {\n return statusResult;\n }\n\n try {\n const untrackedFiles = parseLines(statusResult.data)\n .map((line) => stripAnsiColors(line)) // Remove ANSI color codes first\n .filter((line) => line.startsWith(\"??\"))\n .map((line) => line.slice(3));\n\n return {\n success: true,\n data: untrackedFiles,\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: \"PARSE_ERROR\",\n message: `Failed to parse status output: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n };\n }\n}\n\n/**\n * Create artificial diff for an untracked file (all lines as additions)\n */\nasync function createUntrackedFileDiff(\n cwd: string,\n filePath: string,\n): Promise<GitDiff | null> {\n try {\n const fullPath = resolve(cwd, filePath);\n const content = await readFile(fullPath, \"utf8\");\n const lines = content.split(\"\\n\");\n\n const diffLines: GitDiffLine[] = lines.map((line, index) => ({\n type: \"added\" as const,\n content: line,\n newLineNumber: index + 1,\n }));\n\n const file: GitDiffFile = {\n filePath,\n status: \"added\",\n additions: lines.length,\n deletions: 0,\n };\n\n const hunk: GitDiffHunk = {\n oldStart: 0,\n oldCount: 0,\n newStart: 1,\n newCount: lines.length,\n header: `@@ -0,0 +1,${lines.length} @@`,\n lines: diffLines,\n };\n\n return {\n file,\n hunks: [hunk],\n };\n } catch (error) {\n // Skip files that can't be read (e.g., binary files, permission errors)\n console.warn(`Failed to read untracked file ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Get Git diff between two references (branches, commits, tags)\n */\nexport const getDiff = async (\n cwd: string,\n fromRefText: string,\n toRefText: string,\n): Promise<GitResult<GitComparisonResult>> => {\n const fromRef = extractRef(fromRefText);\n const toRef = extractRef(toRefText);\n\n if (fromRef === toRef) {\n return {\n success: true,\n data: {\n diffs: [],\n files: [],\n summary: {\n totalFiles: 0,\n totalAdditions: 0,\n totalDeletions: 0,\n },\n },\n };\n }\n\n if (fromRef === undefined) {\n throw new Error(`Invalid fromRef: ${fromRefText}`);\n }\n\n const commandArgs = toRef === undefined ? [fromRef] : [fromRef, toRef];\n\n // Get diff with numstat for file statistics\n const numstatResult = await executeGitCommand(\n [\"diff\", \"--numstat\", ...commandArgs],\n cwd,\n );\n\n if (!numstatResult.success) {\n return numstatResult;\n }\n\n // Get diff with full content\n const diffResult = await executeGitCommand(\n [\"diff\", \"--unified=5\", ...commandArgs],\n cwd,\n );\n\n if (!diffResult.success) {\n return diffResult;\n }\n\n try {\n // Parse numstat output to get file statistics\n const fileStats = new Map<\n string,\n { additions: number; deletions: number }\n >();\n const numstatLines = parseLines(numstatResult.data);\n\n for (const line of numstatLines) {\n const parts = line.split(\"\\t\");\n if (parts.length >= 3 && parts[0] && parts[1] && parts[2]) {\n const additions = parts[0] === \"-\" ? 0 : parseInt(parts[0], 10);\n const deletions = parts[1] === \"-\" ? 0 : parseInt(parts[1], 10);\n const filePath = parts[2];\n fileStats.set(filePath, { additions, deletions });\n }\n }\n\n // Parse diff output using parse-git-diff\n const parsedDiff = parseGitDiff(diffResult.data);\n\n const files: GitDiffFile[] = [];\n const diffs: GitDiff[] = [];\n let totalAdditions = 0;\n let totalDeletions = 0;\n\n for (const fileChange of parsedDiff.files) {\n // Convert to GitDiffFile format\n const file = convertToGitDiffFile(fileChange, fileStats);\n files.push(file);\n\n // Convert chunks to hunks\n const hunks: GitDiffHunk[] = [];\n for (const chunk of fileChange.chunks) {\n const hunk = convertToGitDiffHunk(chunk);\n hunks.push(hunk);\n }\n\n diffs.push({\n file,\n hunks,\n });\n\n totalAdditions += file.additions;\n totalDeletions += file.deletions;\n }\n\n // Include untracked files when comparing to working directory\n if (toRef === undefined) {\n const untrackedResult = await getUntrackedFiles(cwd);\n if (untrackedResult.success) {\n for (const untrackedFile of untrackedResult.data) {\n const untrackedDiff = await createUntrackedFileDiff(\n cwd,\n untrackedFile,\n );\n if (untrackedDiff) {\n files.push(untrackedDiff.file);\n diffs.push(untrackedDiff);\n totalAdditions += untrackedDiff.file.additions;\n }\n }\n }\n }\n\n return {\n success: true,\n data: {\n files,\n diffs,\n summary: {\n totalFiles: files.length,\n totalAdditions,\n totalDeletions,\n },\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: \"PARSE_ERROR\",\n message: `Failed to parse diff: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n };\n }\n};\n\n/**\n * Compare between two branches (shorthand for getDiff)\n */\nexport async function compareBranches(\n cwd: string,\n baseBranch: string,\n targetBranch: string,\n): Promise<GitResult<GitComparisonResult>> {\n return getDiff(cwd, baseBranch, targetBranch);\n}\n", "import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { GitError, GitResult } from \"../types\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Execute a git command in the specified directory\n */\nexport async function executeGitCommand(\n args: string[],\n cwd: string,\n): Promise<GitResult<string>> {\n try {\n // Check if the directory exists\n if (!existsSync(cwd)) {\n return {\n success: false,\n error: {\n code: \"NOT_A_REPOSITORY\",\n message: `Directory does not exist: ${cwd}`,\n command: `git ${args.join(\" \")}`,\n },\n };\n }\n\n // Git will search parent directories for .git, so we don't need to check explicitly\n\n const { stdout } = await execFileAsync(\"git\", args, {\n cwd,\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n timeout: 30000, // 30 second timeout\n });\n\n return {\n success: true,\n data: stdout,\n };\n } catch (error: unknown) {\n const err = error as { code?: string; stderr?: string; message?: string };\n\n let errorCode: GitError[\"code\"] = \"COMMAND_FAILED\";\n let errorMessage = err.message || \"Unknown git command error\";\n\n if (err.stderr) {\n if (err.stderr.includes(\"not a git repository\")) {\n errorCode = \"NOT_A_REPOSITORY\";\n errorMessage = \"Not a git repository\";\n } else if (err.stderr.includes(\"unknown revision\")) {\n errorCode = \"BRANCH_NOT_FOUND\";\n errorMessage = \"Branch or commit not found\";\n }\n }\n\n return {\n success: false,\n error: {\n code: errorCode,\n message: errorMessage,\n command: `git ${args.join(\" \")}`,\n stderr: err.stderr,\n },\n };\n }\n}\n\n/**\n * Check if a directory is a git repository\n */\nexport function isGitRepository(cwd: string): boolean {\n return existsSync(cwd) && existsSync(resolve(cwd, \".git\"));\n}\n\n/**\n * Remove ANSI color codes from a string\n */\nexport function stripAnsiColors(text: string): string {\n // ANSI escape sequence pattern: \\x1B[...m\n // biome-ignore lint/suspicious/noControlCharactersInRegex: this is a valid regex\n return text.replace(/\\x1B\\[[0-9;]*m/g, \"\");\n}\n\n/**\n * Safely parse git command output that might be empty\n */\nexport function parseLines(output: string): string[] {\n return output\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n}\n\n/**\n * Parse git status porcelain output\n */\nexport function parseStatusLine(line: string): {\n status: string;\n filePath: string;\n oldPath?: string;\n} {\n const status = line.slice(0, 2);\n const filePath = line.slice(3);\n\n // Handle renamed files (R old -> new)\n if (status.startsWith(\"R\")) {\n const parts = filePath.split(\" -> \");\n return {\n status,\n filePath: parts[1] || filePath,\n oldPath: parts[0],\n };\n }\n\n return { status, filePath };\n}\n\n/**\n * Convert git status code to readable status\n */\nexport function getFileStatus(\n statusCode: string,\n): \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"copied\" {\n const firstChar = statusCode[0];\n\n switch (firstChar) {\n case \"A\":\n return \"added\";\n case \"M\":\n return \"modified\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n case \"C\":\n return \"copied\";\n default:\n return \"modified\";\n }\n}\n", "import { Command, FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Duration, Effect, Either, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { EnvService } from \"../../platform/services/EnvService\";\nimport { parseGitBranchesOutput } from \"../functions/parseGitBranchesOutput\";\nimport { parseGitCommitsOutput } from \"../functions/parseGitCommitsOutput\";\n\nclass NotARepositoryError extends Data.TaggedError(\"NotARepositoryError\")<{\n cwd: string;\n}> {}\n\nclass GitCommandError extends Data.TaggedError(\"GitCommandError\")<{\n cwd: string;\n command: string;\n}> {}\n\nclass DetachedHeadError extends Data.TaggedError(\"DetachedHeadError\")<{\n cwd: string;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const envService = yield* EnvService;\n\n const execGitCommand = (args: string[], cwd: string) =>\n Effect.gen(function* () {\n const absoluteCwd = path.resolve(cwd);\n\n if (!(yield* fs.exists(absoluteCwd))) {\n return yield* Effect.fail(\n new NotARepositoryError({ cwd: absoluteCwd }),\n );\n }\n\n // Git will search parent directories for .git, so we don't need to check explicitly\n\n const command = Command.make(\"git\", ...args).pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n );\n\n const result = yield* Effect.either(Command.string(command));\n\n if (Either.isLeft(result)) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git ${args.join(\" \")}`,\n }),\n );\n }\n\n return result.right;\n });\n\n const getBranches = (cwd: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand([\"branch\", \"-vv\", \"--all\"], cwd);\n return parseGitBranchesOutput(result);\n });\n\n const getCurrentBranch = (cwd: string) =>\n Effect.gen(function* () {\n const currentBranch = yield* execGitCommand(\n [\"branch\", \"--show-current\"],\n cwd,\n ).pipe(Effect.map((result) => result.trim()));\n\n if (currentBranch === \"\") {\n return yield* Effect.fail(new DetachedHeadError({ cwd }));\n }\n\n return currentBranch;\n });\n\n const branchExists = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n const result = yield* Effect.either(\n execGitCommand([\"branch\", \"--exists\", branchName], cwd),\n );\n\n if (Either.isLeft(result)) {\n return false;\n }\n\n return true;\n });\n\n const getCommits = (cwd: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\n \"log\",\n \"--oneline\",\n \"-n\",\n \"20\",\n \"--format=%H|%s|%an|%ad\",\n \"--date=iso\",\n ],\n cwd,\n );\n return parseGitCommitsOutput(result);\n });\n\n const stageFiles = (cwd: string, files: string[]) =>\n Effect.gen(function* () {\n if (files.length === 0) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd,\n command: \"git add (no files)\",\n }),\n );\n }\n\n const result = yield* execGitCommand([\"add\", ...files], cwd);\n return result;\n });\n\n const commit = (cwd: string, message: string) =>\n Effect.gen(function* () {\n const trimmedMessage = message.trim();\n if (trimmedMessage.length === 0) {\n return yield* Effect.fail(\n new GitCommandError({\n cwd,\n command: \"git commit (empty message)\",\n }),\n );\n }\n\n console.log(\n \"[GitService.commit] Committing with message:\",\n trimmedMessage,\n \"in\",\n cwd,\n );\n const result = yield* execGitCommand(\n [\"commit\", \"-m\", trimmedMessage],\n cwd,\n );\n console.log(\"[GitService.commit] Commit result:\", result);\n\n // Parse commit SHA from output\n // Git commit output format: \"[branch SHA] commit message\"\n const shaMatch = result.match(/\\[.+\\s+([a-f0-9]+)\\]/);\n console.log(\"[GitService.commit] SHA match:\", shaMatch);\n if (shaMatch?.[1]) {\n console.log(\n \"[GitService.commit] Returning SHA from match:\",\n shaMatch[1],\n );\n return shaMatch[1];\n }\n\n // Fallback: Get SHA from git log\n console.log(\n \"[GitService.commit] No SHA match, falling back to rev-parse HEAD\",\n );\n const sha = yield* execGitCommand([\"rev-parse\", \"HEAD\"], cwd);\n console.log(\n \"[GitService.commit] Returning SHA from rev-parse:\",\n sha.trim(),\n );\n return sha.trim();\n });\n\n const push = (cwd: string) =>\n Effect.gen(function* () {\n const branch = yield* getCurrentBranch(cwd);\n\n const absoluteCwd = path.resolve(cwd);\n\n // Use Command.exitCode to check success, as git push writes to stderr even on success\n const command = Command.make(\"git\", \"push\", \"origin\", \"HEAD\").pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n );\n\n const exitCodeResult = yield* Effect.either(\n Command.exitCode(command).pipe(Effect.timeout(Duration.seconds(60))),\n );\n\n if (Either.isLeft(exitCodeResult)) {\n console.log(\"[GitService.push] Command failed or timeout\");\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: \"git push origin HEAD (timeout after 60s)\",\n }),\n );\n }\n\n const exitCode = exitCodeResult.right;\n console.log(\"[GitService.push] Exit code:\", exitCode);\n\n if (exitCode !== 0) {\n // Get stderr for error details\n const stderrLines = yield* Command.lines(\n Command.make(\"git\", \"push\", \"origin\", \"HEAD\").pipe(\n Command.workingDirectory(absoluteCwd),\n Command.env({\n PATH: yield* envService.getEnv(\"PATH\"),\n }),\n Command.stderr(\"inherit\"),\n ),\n ).pipe(Effect.orElse(() => Effect.succeed([])));\n\n const stderr = Array.from(stderrLines).join(\"\\n\");\n console.log(\"[GitService.push] Failed with stderr:\", stderr);\n\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git push origin HEAD - ${stderr}`,\n }),\n );\n }\n\n console.log(\"[GitService.push] Push succeeded\");\n return { branch, output: \"success\" };\n });\n\n const getBranchHash = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand([\"rev-parse\", branchName], cwd).pipe(\n Effect.map((output) => output.trim().split(\"\\n\")[0] ?? null),\n );\n return result;\n });\n\n const getBranchNamesByCommitHash = (cwd: string, hash: string) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\"branch\", \"--contains\", hash, \"--format=%(refname:short)\"],\n cwd,\n );\n return result\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\");\n });\n\n const compareCommitHash = (\n cwd: string,\n targetHash: string,\n compareHash: string,\n ) =>\n Effect.gen(function* () {\n const aheadResult = yield* execGitCommand(\n [\"rev-list\", `${targetHash}..${compareHash}`],\n cwd,\n );\n const aheadCounts = aheadResult\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\").length;\n\n const behindResult = yield* execGitCommand(\n [\"rev-list\", `${compareHash}..${targetHash}`],\n cwd,\n );\n const behindCounts = behindResult\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\").length;\n\n if (aheadCounts === 0 && behindCounts === 0) {\n return \"un-related\" as const;\n }\n\n if (aheadCounts > 0) {\n return \"ahead\" as const;\n }\n\n if (behindCounts > 0) {\n return \"behind\" as const;\n }\n\n return \"un-related\" as const;\n });\n\n const getCommitsWithParent = (\n cwd: string,\n options: { offset: number; limit: number },\n ) =>\n Effect.gen(function* () {\n const { offset, limit } = options;\n const result = yield* execGitCommand(\n [\n \"log\",\n \"-n\",\n String(limit),\n \"--skip\",\n String(offset),\n \"--graph\",\n \"--pretty=format:%h %p\",\n ],\n cwd,\n );\n\n const lines = result\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\");\n\n const commits: Array<{ current: string; parent: string }> = [];\n\n for (const line of lines) {\n const match = /^\\* (?<current>.+) (?<parent>.+)$/.exec(line);\n if (match?.groups?.current && match.groups.parent) {\n commits.push({\n current: match.groups.current,\n parent: match.groups.parent,\n });\n }\n }\n\n return commits;\n });\n\n const findBaseBranch = (cwd: string, targetBranch: string) =>\n Effect.gen(function* () {\n let offset = 0;\n const limit = 20;\n\n while (offset < 100) {\n const commits = yield* getCommitsWithParent(cwd, { offset, limit });\n\n for (const commit of commits) {\n const branchNames = yield* getBranchNamesByCommitHash(\n cwd,\n commit.current,\n );\n\n if (!branchNames.includes(targetBranch)) {\n continue;\n }\n\n const otherBranchNames = branchNames.filter(\n (branchName) => branchName !== targetBranch,\n );\n\n if (otherBranchNames.length === 0) {\n continue;\n }\n\n for (const branchName of otherBranchNames) {\n const comparison = yield* compareCommitHash(\n cwd,\n targetBranch,\n branchName,\n );\n\n if (comparison === \"behind\") {\n return { branch: branchName, hash: commit.current };\n }\n }\n }\n\n offset += limit;\n }\n\n return null;\n });\n\n const getCommitsBetweenBranches = (\n cwd: string,\n baseBranch: string,\n targetBranch: string,\n ) =>\n Effect.gen(function* () {\n const result = yield* execGitCommand(\n [\n \"log\",\n `${baseBranch}..${targetBranch}`,\n \"--format=%H|%s|%an|%ad\",\n \"--date=iso\",\n ],\n cwd,\n );\n\n return parseGitCommitsOutput(result);\n });\n\n return {\n getBranches,\n getCurrentBranch,\n branchExists,\n getCommits,\n stageFiles,\n commit,\n push,\n getBranchHash,\n getBranchNamesByCommitHash,\n compareCommitHash,\n getCommitsWithParent,\n findBaseBranch,\n getCommitsBetweenBranches,\n };\n});\n\nexport type IGitService = InferEffect<typeof LayerImpl>;\n\nexport class GitService extends Context.Tag(\"GitService\")<\n GitService,\n IGitService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { GitBranch } from \"../types\";\nimport { parseLines } from \"./utils\";\n\n/**\n * Get all branches (local and remote) in the repository\n */\nexport const parseGitBranchesOutput = (output: string) => {\n const lines = parseLines(output);\n const branches: GitBranch[] = [];\n const seenBranches = new Set<string>();\n\n for (const line of lines) {\n // Parse branch line format: \" main abc1234 [origin/main: ahead 1] Commit message\"\n const match = line.match(\n /^(\\*?\\s*)([^\\s]+)\\s+([a-f0-9]+)(?:\\s+\\[([^\\]]+)\\])?\\s*(.*)/,\n );\n if (!match) continue;\n\n const [, prefix, name, commit, tracking] = match;\n if (!prefix || !name || !commit) continue;\n\n const current = prefix.includes(\"*\");\n\n // Skip remote tracking branches if we already have the local branch\n const cleanName = name.replace(\"remotes/origin/\", \"\");\n if (name.startsWith(\"remotes/origin/\") && seenBranches.has(cleanName)) {\n continue;\n }\n\n // Parse tracking information\n let remote: string | undefined;\n let ahead: number | undefined;\n let behind: number | undefined;\n\n if (tracking) {\n const remoteMatch = tracking.match(/^([^:]+)/);\n if (remoteMatch?.[1]) {\n remote = remoteMatch[1];\n }\n\n const aheadMatch = tracking.match(/ahead (\\d+)/);\n const behindMatch = tracking.match(/behind (\\d+)/);\n if (aheadMatch?.[1]) ahead = parseInt(aheadMatch[1], 10);\n if (behindMatch?.[1]) behind = parseInt(behindMatch[1], 10);\n }\n\n branches.push({\n name: cleanName,\n current,\n remote,\n commit,\n ahead,\n behind,\n });\n\n seenBranches.add(cleanName);\n }\n\n return {\n success: true,\n data: branches,\n };\n};\n", "import { parseLines } from \"../functions/utils\";\nimport type { GitCommit } from \"../types\";\n\n/**\n * Get the last 20 commits from the current branch\n */\nexport const parseGitCommitsOutput = (output: string) => {\n const lines = parseLines(output);\n const commits: GitCommit[] = [];\n\n for (const line of lines) {\n // Parse commit line format: \"sha|message|author|date\"\n const parts = line.split(\"|\");\n if (parts.length < 4) continue;\n\n const [sha, message, author, date] = parts;\n if (!sha || !message || !author || !date) continue;\n\n commits.push({\n sha: sha.trim(),\n message: message.trim(),\n author: author.trim(),\n date: date.trim(),\n });\n }\n\n return {\n success: true,\n data: commits,\n };\n};\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { computeClaudeProjectFilePath } from \"../../claude-code/functions/computeClaudeProjectFilePath\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { encodeProjectId } from \"../functions/id\";\nimport { ProjectRepository } from \"../infrastructure/ProjectRepository\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const userConfigService = yield* UserConfigService;\n const sessionRepository = yield* SessionRepository;\n const context = yield* ApplicationContext;\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getProjects = () =>\n Effect.gen(function* () {\n const { projects } = yield* projectRepository.getProjects();\n return {\n status: 200,\n response: { projects },\n } as const satisfies ControllerResponse;\n });\n\n const getProject = (options: { projectId: string; cursor?: string }) =>\n Effect.gen(function* () {\n const { projectId, cursor } = options;\n\n const userConfig = yield* userConfigService.getUserConfig();\n\n const { project } = yield* projectRepository.getProject(projectId);\n const { sessions } = yield* sessionRepository.getSessions(projectId, {\n cursor,\n });\n\n let filteredSessions = sessions;\n\n // Filter sessions based on hideNoUserMessageSession setting\n if (userConfig.hideNoUserMessageSession) {\n filteredSessions = filteredSessions.filter((session) => {\n return session.meta.firstUserMessage !== null;\n });\n }\n\n // Unify sessions with same title if unifySameTitleSession is enabled\n if (userConfig.unifySameTitleSession) {\n const sessionMap = new Map<string, (typeof filteredSessions)[0]>();\n\n for (const session of filteredSessions) {\n // Generate title for comparison\n const title =\n session.meta.firstUserMessage !== null\n ? (() => {\n const cmd = session.meta.firstUserMessage;\n switch (cmd.kind) {\n case \"command\":\n return cmd.commandArgs === undefined\n ? cmd.commandName\n : `${cmd.commandName} ${cmd.commandArgs}`;\n case \"local-command\":\n return cmd.stdout;\n case \"text\":\n return cmd.content;\n default:\n return session.id;\n }\n })()\n : session.id;\n\n const existingSession = sessionMap.get(title);\n if (existingSession) {\n // Keep the session with the latest modification date\n if (session.lastModifiedAt && existingSession.lastModifiedAt) {\n if (session.lastModifiedAt > existingSession.lastModifiedAt) {\n sessionMap.set(title, session);\n }\n } else if (\n session.lastModifiedAt &&\n !existingSession.lastModifiedAt\n ) {\n sessionMap.set(title, session);\n }\n // If no modification dates, keep the existing one\n } else {\n sessionMap.set(title, session);\n }\n }\n\n filteredSessions = Array.from(sessionMap.values());\n }\n\n const hasMore = sessions.length >= 20;\n return {\n status: 200,\n response: {\n project,\n sessions: filteredSessions,\n nextCursor: hasMore ? sessions.at(-1)?.id : undefined,\n },\n } as const satisfies ControllerResponse;\n });\n\n const getProjectLatestSession = (options: { projectId: string }) =>\n Effect.gen(function* () {\n const { projectId } = options;\n const { sessions } = yield* sessionRepository.getSessions(projectId, {\n maxCount: 1,\n });\n\n return {\n status: 200,\n response: {\n latestSession: sessions[0] ?? null,\n },\n } as const satisfies ControllerResponse;\n });\n\n const createProject = (options: { projectPath: string }) =>\n Effect.gen(function* () {\n const { projectPath } = options;\n\n // No project validation needed - startTask will create a new project\n // if it doesn't exist when running /init command\n const claudeProjectFilePath = yield* computeClaudeProjectFilePath({\n projectPath,\n claudeProjectsDirPath: context.claudeCodePaths.claudeProjectsDirPath,\n });\n const projectId = encodeProjectId(claudeProjectFilePath);\n const userConfig = yield* userConfigService.getUserConfig();\n\n // Check if CLAUDE.md exists in the project directory\n const claudeMdPath = path.join(projectPath, \"CLAUDE.md\");\n const claudeMdExists = yield* fileSystem.exists(claudeMdPath);\n\n const result = yield* claudeCodeLifeCycleService.startTask({\n baseSession: {\n cwd: projectPath,\n projectId,\n sessionId: undefined,\n },\n userConfig,\n input: {\n text: claudeMdExists ? \"describe this project\" : \"/init\",\n },\n });\n\n const { sessionId } = yield* result.yieldSessionFileCreated();\n\n return {\n status: 201,\n response: {\n projectId,\n sessionId,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getProjects,\n getProject,\n getProjectLatestSession,\n createProject,\n };\n});\n\nexport type IProjectController = InferEffect<typeof LayerImpl>;\nexport class ProjectController extends Context.Tag(\"ProjectController\")<\n ProjectController,\n IProjectController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Path } from \"@effect/platform\";\nimport { Effect } from \"effect\";\n\nexport const computeClaudeProjectFilePath = (options: {\n projectPath: string;\n claudeProjectsDirPath: string;\n}) =>\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const { projectPath, claudeProjectsDirPath } = options;\n\n return path.join(\n claudeProjectsDirPath,\n projectPath.replace(/\\/$/, \"\").replace(/\\//g, \"-\"),\n );\n });\n", "import { homedir } from \"node:os\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { type SchedulerConfig, schedulerConfigSchema } from \"./schema\";\n\nclass ConfigFileNotFoundError extends Data.TaggedError(\n \"ConfigFileNotFoundError\",\n)<{\n readonly path: string;\n}> {}\n\nclass ConfigParseError extends Data.TaggedError(\"ConfigParseError\")<{\n readonly path: string;\n readonly cause: unknown;\n}> {}\n\nconst CONFIG_DIR = \"scheduler\";\nconst CONFIG_FILE = \"schedules.json\";\n\n// Service to provide base directory (for testing)\nexport class SchedulerConfigBaseDir extends Context.Tag(\n \"SchedulerConfigBaseDir\",\n)<SchedulerConfigBaseDir, string>() {\n static Live = Layer.succeed(this, `${homedir()}/.claude-code-viewer`);\n}\n\nexport const getConfigPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const baseDir = yield* SchedulerConfigBaseDir;\n return path.join(baseDir, CONFIG_DIR, CONFIG_FILE);\n});\n\nexport const readConfig = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const configPath = yield* getConfigPath;\n\n const exists = yield* fs.exists(configPath);\n if (!exists) {\n return yield* Effect.fail(\n new ConfigFileNotFoundError({ path: configPath }),\n );\n }\n\n const content = yield* fs.readFileString(configPath);\n\n const jsonResult = yield* Effect.try({\n try: () => JSON.parse(content),\n catch: (error) =>\n new ConfigParseError({\n path: configPath,\n cause: error,\n }),\n });\n\n const parsed = schedulerConfigSchema.safeParse(jsonResult);\n\n if (!parsed.success) {\n return yield* Effect.fail(\n new ConfigParseError({\n path: configPath,\n cause: parsed.error,\n }),\n );\n }\n\n return parsed.data;\n});\n\nexport const writeConfig = (config: SchedulerConfig) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const configPath = yield* getConfigPath;\n const configDir = path.dirname(configPath);\n\n yield* fs.makeDirectory(configDir, { recursive: true });\n\n const content = JSON.stringify(config, null, 2);\n yield* fs.writeFileString(configPath, content);\n });\n\nexport const initializeConfig = Effect.gen(function* () {\n const result = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n Effect.gen(function* () {\n const initialConfig: SchedulerConfig = { jobs: [] };\n yield* writeConfig(initialConfig);\n return initialConfig;\n }),\n ConfigParseError: () =>\n Effect.gen(function* () {\n const initialConfig: SchedulerConfig = { jobs: [] };\n yield* writeConfig(initialConfig);\n return initialConfig;\n }),\n }),\n );\n\n return result;\n});\n", "import { z } from \"zod\";\n\n// Concurrency policy (for cron jobs only)\nexport const concurrencyPolicySchema = z.enum([\"skip\", \"run\"]);\n\n// Schedule type discriminated union\nexport const cronScheduleSchema = z.object({\n type: z.literal(\"cron\"),\n expression: z.string(),\n concurrencyPolicy: concurrencyPolicySchema,\n});\n\nexport const reservedScheduleSchema = z.object({\n type: z.literal(\"reserved\"),\n reservedExecutionTime: z.iso.datetime(),\n});\n\nexport const scheduleSchema = z.discriminatedUnion(\"type\", [\n cronScheduleSchema,\n reservedScheduleSchema,\n]);\n\n// Message configuration\nexport const messageConfigSchema = z.object({\n content: z.string(),\n projectId: z.string(),\n baseSessionId: z.string().nullable(),\n});\n\n// Job status\nexport const jobStatusSchema = z.enum([\"success\", \"failed\"]);\n\n// Scheduler job\nexport const schedulerJobSchema = z.object({\n id: z.string(),\n name: z.string(),\n schedule: scheduleSchema,\n message: messageConfigSchema,\n enabled: z.boolean(),\n createdAt: z.string().datetime(),\n lastRunAt: z.string().datetime().nullable(),\n lastRunStatus: jobStatusSchema.nullable(),\n});\n\n// Config file schema\nexport const schedulerConfigSchema = z.object({\n jobs: z.array(schedulerJobSchema),\n});\n\n// Type exports\nexport type CronSchedule = z.infer<typeof cronScheduleSchema>;\nexport type ReservedSchedule = z.infer<typeof reservedScheduleSchema>;\nexport type Schedule = z.infer<typeof scheduleSchema>;\nexport type MessageConfig = z.infer<typeof messageConfigSchema>;\nexport type JobStatus = z.infer<typeof jobStatusSchema>;\nexport type ConcurrencyPolicy = z.infer<typeof concurrencyPolicySchema>;\nexport type SchedulerJob = z.infer<typeof schedulerJobSchema>;\nexport type SchedulerConfig = z.infer<typeof schedulerConfigSchema>;\n\n// New job creation schema (without runtime fields)\nexport const newSchedulerJobSchema = schedulerJobSchema\n .omit({\n id: true,\n createdAt: true,\n lastRunAt: true,\n lastRunStatus: true,\n })\n .extend({\n enabled: z.boolean().default(true),\n });\n\nexport type NewSchedulerJob = z.infer<typeof newSchedulerJobSchema>;\n\n// Job update schema (partial fields)\nexport const updateSchedulerJobSchema = schedulerJobSchema.partial().pick({\n name: true,\n schedule: true,\n message: true,\n enabled: true,\n});\n\nexport type UpdateSchedulerJob = z.infer<typeof updateSchedulerJobSchema>;\n", "import {\n Context,\n Cron,\n Data,\n Duration,\n Effect,\n Fiber,\n Layer,\n Ref,\n Schedule,\n} from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { initializeConfig, readConfig, writeConfig } from \"../config\";\nimport type {\n NewSchedulerJob,\n SchedulerConfig,\n SchedulerJob,\n UpdateSchedulerJob,\n} from \"../schema\";\nimport { calculateReservedDelay, executeJob } from \"./Job\";\n\nclass SchedulerJobNotFoundError extends Data.TaggedError(\n \"SchedulerJobNotFoundError\",\n)<{\n readonly jobId: string;\n}> {}\n\nclass InvalidCronExpressionError extends Data.TaggedError(\n \"InvalidCronExpressionError\",\n)<{\n readonly expression: string;\n readonly cause: unknown;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const fibersRef = yield* Ref.make<\n Map<string, Fiber.RuntimeFiber<unknown, unknown>>\n >(new Map());\n const runningJobsRef = yield* Ref.make<Set<string>>(new Set());\n\n const startJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const now = new Date();\n\n if (job.schedule.type === \"cron\") {\n const cronResult = Cron.parse(job.schedule.expression);\n\n if (cronResult._tag === \"Left\") {\n return yield* Effect.fail(\n new InvalidCronExpressionError({\n expression: job.schedule.expression,\n cause: cronResult.left,\n }),\n );\n }\n\n const cronSchedule = Schedule.cron(cronResult.right);\n\n // Wait for the next cron time before starting the repeat loop\n // This prevents immediate execution on job creation/update\n const fiber = yield* Effect.gen(function* () {\n // Get the next scheduled time\n const nextTime = Cron.next(cronResult.right, new Date());\n const nextDelay = Math.max(0, nextTime.getTime() - Date.now());\n\n // Wait until the next scheduled time\n yield* Effect.sleep(Duration.millis(nextDelay));\n\n // Then repeat on the cron schedule\n yield* Effect.repeat(runJobWithConcurrencyControl(job), cronSchedule);\n }).pipe(Effect.forkDaemon);\n\n yield* Ref.update(fibersRef, (fibers) =>\n new Map(fibers).set(job.id, fiber),\n );\n } else if (job.schedule.type === \"reserved\") {\n // For reserved jobs, skip scheduling if already executed\n if (job.lastRunStatus !== null) {\n return;\n }\n\n const delay = calculateReservedDelay(job, now);\n const delayDuration = Duration.millis(delay);\n\n const fiber = yield* Effect.delay(\n runJobWithConcurrencyControl(job),\n delayDuration,\n ).pipe(Effect.forkDaemon);\n\n yield* Ref.update(fibersRef, (fibers) =>\n new Map(fibers).set(job.id, fiber),\n );\n }\n });\n\n const runJobWithConcurrencyControl = (job: SchedulerJob) =>\n Effect.gen(function* () {\n // Check concurrency policy (only for cron jobs)\n if (\n job.schedule.type === \"cron\" &&\n job.schedule.concurrencyPolicy === \"skip\"\n ) {\n const runningJobs = yield* Ref.get(runningJobsRef);\n if (runningJobs.has(job.id)) {\n return;\n }\n }\n\n yield* Ref.update(runningJobsRef, (jobs) => new Set(jobs).add(job.id));\n\n // For reserved jobs, delete after execution without updating status\n if (job.schedule.type === \"reserved\") {\n const result = yield* executeJob(job).pipe(\n Effect.matchEffect({\n onSuccess: () => Effect.void,\n onFailure: () => Effect.void,\n }),\n );\n yield* Ref.update(runningJobsRef, (jobs) => {\n const newJobs = new Set(jobs);\n newJobs.delete(job.id);\n return newJobs;\n });\n\n // Delete reserved job after execution (skip fiber stop, just delete from config)\n yield* deleteJobFromConfig(job.id).pipe(\n Effect.catchAll((error) => {\n console.error(\n `[Scheduler] Failed to delete reserved job ${job.id}:`,\n error,\n );\n return Effect.void;\n }),\n );\n\n return result;\n }\n\n // For non-reserved jobs, update status\n const result = yield* executeJob(job).pipe(\n Effect.matchEffect({\n onSuccess: () =>\n updateJobStatus(job.id, \"success\", new Date().toISOString()),\n onFailure: () =>\n updateJobStatus(job.id, \"failed\", new Date().toISOString()),\n }),\n );\n\n yield* Ref.update(runningJobsRef, (jobs) => {\n const newJobs = new Set(jobs);\n newJobs.delete(job.id);\n return newJobs;\n });\n\n return result;\n });\n\n const updateJobStatus = (\n jobId: string,\n status: \"success\" | \"failed\",\n runAt: string,\n ) =>\n Effect.gen(function* () {\n const config = yield* readConfig;\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return;\n }\n\n const updatedJob: SchedulerJob = {\n ...job,\n lastRunAt: runAt,\n lastRunStatus: status,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.map((j) => (j.id === jobId ? updatedJob : j)),\n };\n\n yield* writeConfig(updatedConfig);\n });\n\n const stopJob = (jobId: string) =>\n Effect.gen(function* () {\n const fibers = yield* Ref.get(fibersRef);\n const fiber = fibers.get(jobId);\n\n if (fiber !== undefined) {\n yield* Fiber.interrupt(fiber);\n yield* Ref.update(fibersRef, (fibers) => {\n const newFibers = new Map(fibers);\n newFibers.delete(jobId);\n return newFibers;\n });\n }\n });\n\n const startScheduler = Effect.gen(function* () {\n yield* initializeConfig;\n const config = yield* readConfig;\n\n for (const job of config.jobs) {\n if (job.enabled) {\n yield* startJob(job);\n }\n }\n });\n\n const stopScheduler = Effect.gen(function* () {\n const fibers = yield* Ref.get(fibersRef);\n\n for (const fiber of fibers.values()) {\n yield* Fiber.interrupt(fiber);\n }\n\n yield* Ref.set(fibersRef, new Map());\n });\n\n const getJobs = () =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n return config.jobs;\n });\n\n const addJob = (newJob: NewSchedulerJob) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job: SchedulerJob = {\n ...newJob,\n id: ulid(),\n createdAt: new Date().toISOString(),\n lastRunAt: null,\n lastRunStatus: null,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: [...config.jobs, job],\n };\n\n yield* writeConfig(updatedConfig);\n\n if (job.enabled) {\n yield* startJob(job);\n }\n\n return job;\n });\n\n const updateJob = (jobId: string, updates: UpdateSchedulerJob) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n yield* stopJob(jobId);\n\n const updatedJob: SchedulerJob = {\n ...job,\n ...updates,\n };\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.map((j) => (j.id === jobId ? updatedJob : j)),\n };\n\n yield* writeConfig(updatedConfig);\n\n if (updatedJob.enabled) {\n yield* startJob(updatedJob);\n }\n\n return updatedJob;\n });\n\n const deleteJobFromConfig = (jobId: string) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n const updatedConfig: SchedulerConfig = {\n jobs: config.jobs.filter((j) => j.id !== jobId),\n };\n\n yield* writeConfig(updatedConfig);\n });\n\n const deleteJob = (jobId: string) =>\n Effect.gen(function* () {\n const config = yield* readConfig.pipe(\n Effect.catchTags({\n ConfigFileNotFoundError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () =>\n initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n }),\n );\n const job = config.jobs.find((j) => j.id === jobId);\n\n if (job === undefined) {\n return yield* Effect.fail(new SchedulerJobNotFoundError({ jobId }));\n }\n\n yield* stopJob(jobId);\n yield* deleteJobFromConfig(jobId);\n });\n\n return {\n startScheduler,\n stopScheduler,\n getJobs,\n addJob,\n updateJob,\n deleteJob,\n };\n});\n\nexport type ISchedulerService = InferEffect<typeof LayerImpl>;\n\nexport class SchedulerService extends Context.Tag(\"SchedulerService\")<\n SchedulerService,\n ISchedulerService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Effect } from \"effect\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport type { SchedulerJob } from \"../schema\";\n\nexport const executeJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n const userConfigService = yield* UserConfigService;\n\n const { message } = job;\n const { project } = yield* projectRepository.getProject(message.projectId);\n const userConfig = yield* userConfigService.getUserConfig();\n\n if (project.meta.projectPath === null) {\n return yield* Effect.fail(\n new Error(`Project path not found for projectId: ${message.projectId}`),\n );\n }\n\n yield* lifeCycleService.startTask({\n baseSession: {\n cwd: project.meta.projectPath,\n projectId: message.projectId,\n sessionId: message.baseSessionId ?? undefined,\n },\n userConfig,\n input: {\n text: message.content,\n },\n });\n });\n\nexport const shouldExecuteJob = (job: SchedulerJob, now: Date): boolean => {\n if (!job.enabled) {\n return false;\n }\n\n if (job.schedule.type === \"cron\") {\n return true;\n }\n\n if (job.schedule.type === \"reserved\") {\n // Reserved jobs are one-time, skip if already executed\n if (job.lastRunStatus !== null) {\n return false;\n }\n\n const scheduledTime = new Date(job.schedule.reservedExecutionTime);\n return now >= scheduledTime;\n }\n\n return true;\n};\n\nexport const calculateReservedDelay = (\n job: SchedulerJob,\n now: Date,\n): number => {\n if (job.schedule.type !== \"reserved\") {\n throw new Error(\"Job schedule type must be reserved\");\n }\n\n const scheduledTime = new Date(job.schedule.reservedExecutionTime);\n const delay = scheduledTime.getTime() - now.getTime();\n\n return Math.max(0, delay);\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SchedulerService } from \"../domain/Scheduler\";\nimport type { NewSchedulerJob, UpdateSchedulerJob } from \"../schema\";\n\nconst LayerImpl = Effect.gen(function* () {\n const schedulerService = yield* SchedulerService;\n\n const getJobs = () =>\n Effect.gen(function* () {\n const jobs = yield* schedulerService.getJobs();\n return {\n response: jobs,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const addJob = (options: { job: NewSchedulerJob }) =>\n Effect.gen(function* () {\n const { job } = options;\n const result = yield* schedulerService.addJob(job);\n return {\n response: result,\n status: 201,\n } as const satisfies ControllerResponse;\n });\n\n const updateJob = (options: { id: string; job: UpdateSchedulerJob }) =>\n Effect.gen(function* () {\n const { id, job } = options;\n const result = yield* schedulerService\n .updateJob(id, job)\n .pipe(\n Effect.catchTag(\"SchedulerJobNotFoundError\", () =>\n Effect.succeed(null),\n ),\n );\n\n if (result === null) {\n return {\n response: { error: \"Job not found\" },\n status: 404,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const deleteJob = (options: { id: string }) =>\n Effect.gen(function* () {\n const { id } = options;\n const result = yield* schedulerService.deleteJob(id).pipe(\n Effect.catchTag(\"SchedulerJobNotFoundError\", () =>\n Effect.succeed(false),\n ),\n Effect.map(() => true),\n );\n\n if (!result) {\n return {\n response: { error: \"Job not found\" },\n status: 404,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getJobs,\n addJob,\n updateJob,\n deleteJob,\n };\n});\n\nexport type ISchedulerController = InferEffect<typeof LayerImpl>;\n\nexport class SchedulerController extends Context.Tag(\"SchedulerController\")<\n SchedulerController,\n ISchedulerController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SearchService } from \"../services/SearchService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const searchService = yield* SearchService;\n\n const search = (options: {\n query: string;\n limit?: number;\n projectId?: string;\n }) =>\n Effect.gen(function* () {\n const { query, limit, projectId } = options;\n\n if (query.trim().length < 2) {\n return {\n status: 400,\n response: {\n error: \"Query must contain at least 2 non-whitespace characters\",\n },\n } as const satisfies ControllerResponse;\n }\n\n const { results } = yield* searchService.search(\n query.trim(),\n limit,\n projectId,\n );\n\n return {\n status: 200,\n response: { results },\n } as const satisfies ControllerResponse;\n });\n\n return {\n search,\n };\n});\n\nexport type ISearchController = InferEffect<typeof LayerImpl>;\nexport class SearchController extends Context.Tag(\"SearchController\")<\n SearchController,\n ISearchController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport MiniSearch from \"minisearch\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext\";\nimport { encodeProjectId } from \"../../project/functions/id\";\nimport { encodeSessionId } from \"../../session/functions/id\";\nimport { isRegularSessionFile } from \"../../session/functions/isRegularSessionFile\";\nimport { extractSearchableText } from \"../functions/extractSearchableText\";\n\nexport type SearchResult = {\n projectId: string;\n projectName: string;\n sessionId: string;\n conversationIndex: number;\n type: \"user\" | \"assistant\";\n snippet: string;\n timestamp: string;\n score: number;\n};\n\ntype SearchDocument = {\n id: string;\n projectId: string;\n projectName: string;\n sessionId: string;\n conversationIndex: number;\n type: \"user\" | \"assistant\";\n text: string;\n timestamp: string;\n};\n\ntype IndexCache = {\n index: MiniSearch<SearchDocument>;\n documents: Map<string, SearchDocument>;\n builtAt: number;\n};\n\nconst INDEX_TTL_MS = 60_000; // Cache index for 1 minute\nconst MAX_TEXT_LENGTH = 2000; // Limit indexed text to reduce memory\nconst MAX_ASSISTANT_TEXT_LENGTH = 500; // Assistant responses less important\n\nconst createMiniSearchIndex = () =>\n new MiniSearch<SearchDocument>({\n fields: [\"text\"],\n storeFields: [\"id\"],\n searchOptions: {\n fuzzy: 0.2,\n prefix: true,\n boost: { text: 1 },\n },\n });\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const context = yield* ApplicationContext;\n const indexCacheRef = yield* Ref.make<IndexCache | null>(null);\n\n const buildIndex = () =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = context.claudeCodePaths;\n\n const dirExists = yield* fs.exists(claudeProjectsDirPath);\n if (!dirExists) {\n return { index: createMiniSearchIndex(), documents: new Map() };\n }\n\n const projectEntries = yield* fs.readDirectory(claudeProjectsDirPath);\n const miniSearch = createMiniSearchIndex();\n\n const documentEffects = projectEntries.map((projectEntry) =>\n Effect.gen(function* () {\n const projectPath = path.resolve(claudeProjectsDirPath, projectEntry);\n const stat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n\n if (stat?.type !== \"Directory\") {\n return [];\n }\n\n const projectId = encodeProjectId(projectPath);\n const projectName = path.basename(projectPath);\n\n const sessionEntries = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([])));\n\n const sessionFiles = sessionEntries.filter(isRegularSessionFile);\n\n const sessionDocuments = yield* Effect.all(\n sessionFiles.map((sessionFile) =>\n Effect.gen(function* () {\n const sessionPath = path.resolve(projectPath, sessionFile);\n const sessionId = encodeSessionId(sessionPath);\n\n const content = yield* fs\n .readFileString(sessionPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (!content) return [];\n\n const conversations = parseJsonl(content);\n const documents: SearchDocument[] = [];\n\n for (let i = 0; i < conversations.length; i++) {\n const conversation = conversations[i];\n if (conversation === undefined) continue;\n if (\n conversation.type !== \"user\" &&\n conversation.type !== \"assistant\"\n ) {\n continue;\n }\n\n let text = extractSearchableText(conversation);\n if (!text || text.length < 3) continue;\n\n // Truncate text to reduce memory usage\n // User prompts get more space as they're more relevant\n const maxLen =\n conversation.type === \"user\"\n ? MAX_TEXT_LENGTH\n : MAX_ASSISTANT_TEXT_LENGTH;\n if (text.length > maxLen) {\n text = text.slice(0, maxLen);\n }\n\n documents.push({\n id: `${sessionId}:${i}`,\n projectId,\n projectName,\n sessionId,\n conversationIndex: i,\n type: conversation.type,\n text,\n timestamp:\n \"timestamp\" in conversation ? conversation.timestamp : \"\",\n });\n }\n\n return documents;\n }),\n ),\n { concurrency: 20 },\n );\n\n return sessionDocuments.flat();\n }),\n );\n\n const allDocuments = yield* Effect.all(documentEffects, {\n concurrency: 10,\n });\n const flatDocuments = allDocuments.flat();\n\n miniSearch.addAll(flatDocuments);\n\n const documentsMap = new Map<string, SearchDocument>();\n for (const doc of flatDocuments) {\n documentsMap.set(doc.id, doc);\n }\n\n return { index: miniSearch, documents: documentsMap };\n });\n\n const getIndex = () =>\n Effect.gen(function* () {\n const cached = yield* Ref.get(indexCacheRef);\n const now = Date.now();\n\n if (cached && now - cached.builtAt < INDEX_TTL_MS) {\n return { index: cached.index, documents: cached.documents };\n }\n\n const { index, documents } = yield* buildIndex();\n yield* Ref.set(indexCacheRef, { index, documents, builtAt: now });\n return { index, documents };\n });\n\n const search = (query: string, limit = 20, projectId?: string) =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = context.claudeCodePaths;\n\n const dirExists = yield* fs.exists(claudeProjectsDirPath);\n if (!dirExists) {\n return { results: [] as SearchResult[] };\n }\n\n const { index: miniSearch, documents } = yield* getIndex();\n\n const searchResults = miniSearch.search(query).slice(0, limit * 2); // fetch extra to account for filtering\n\n const results: SearchResult[] = [];\n for (const result of searchResults) {\n if (results.length >= limit) break;\n\n const doc = documents.get(String(result.id));\n if (!doc) continue;\n\n // Filter by projectId if provided\n if (projectId && doc.projectId !== projectId) continue;\n\n // Minor boost for user messages (your prompts)\n const score = doc.type === \"user\" ? result.score * 1.2 : result.score;\n\n const snippetLength = 150;\n const text = doc.text;\n const queryLower = query.toLowerCase();\n const textLower = text.toLowerCase();\n const matchIndex = textLower.indexOf(queryLower);\n\n let snippet: string;\n if (matchIndex !== -1) {\n const start = Math.max(0, matchIndex - 50);\n const end = Math.min(text.length, start + snippetLength);\n snippet =\n (start > 0 ? \"...\" : \"\") +\n text.slice(start, end) +\n (end < text.length ? \"...\" : \"\");\n } else {\n snippet =\n text.slice(0, snippetLength) +\n (text.length > snippetLength ? \"...\" : \"\");\n }\n\n results.push({\n projectId: doc.projectId,\n projectName: doc.projectName,\n sessionId: doc.sessionId,\n conversationIndex: doc.conversationIndex,\n type: doc.type,\n snippet,\n timestamp: doc.timestamp,\n score,\n });\n }\n\n return { results };\n });\n\n const invalidateIndex = () => Ref.set(indexCacheRef, null);\n\n return {\n search,\n invalidateIndex,\n };\n});\n\nexport type ISearchService = InferEffect<typeof LayerImpl>;\nexport class SearchService extends Context.Tag(\"SearchService\")<\n SearchService,\n ISearchService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { ExtendedConversation } from \"../../types\";\n\n/**\n * Extracts searchable text from a conversation entry.\n * Returns the user prompt or assistant response text.\n */\nexport const extractSearchableText = (\n conversation: ExtendedConversation,\n): string | null => {\n if (conversation.type === \"x-error\") {\n return null;\n }\n\n if (conversation.type === \"user\") {\n return extractUserText(conversation);\n }\n\n if (conversation.type === \"assistant\") {\n return extractAssistantText(conversation);\n }\n\n return null;\n};\n\nconst extractUserText = (\n entry: Extract<Conversation, { type: \"user\" }>,\n): string => {\n const content = entry.message.content;\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((item) => {\n if (typeof item === \"string\") return item;\n if (\"text\" in item && typeof item.text === \"string\") return item.text;\n return \"\";\n })\n .filter(Boolean)\n .join(\" \");\n};\n\nconst extractAssistantText = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n): string => {\n return entry.message.content\n .filter((item): item is { type: \"text\"; text: string } => {\n return item.type === \"text\" && \"text\" in item;\n })\n .map((item) => item.text)\n .join(\" \");\n};\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { generateSessionHtml } from \"../services/ExportService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const sessionRepository = yield* SessionRepository;\n\n const getSession = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(\n projectId,\n sessionId,\n );\n\n return {\n status: 200,\n response: { session },\n } as const satisfies ControllerResponse;\n });\n\n const exportSessionHtml = (options: {\n projectId: string;\n sessionId: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(\n projectId,\n sessionId,\n );\n\n if (session === null) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n const html = yield* generateSessionHtml(session, projectId);\n\n return {\n status: 200,\n response: { html },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSession,\n exportSessionHtml,\n };\n});\n\nexport type ISessionController = InferEffect<typeof LayerImpl>;\nexport class SessionController extends Context.Tag(\"SessionController\")<\n SessionController,\n ISessionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Effect } from \"effect\";\nimport type { Conversation } from \"../../../../lib/conversation-schema\";\nimport type { SessionDetail } from \"../../types\";\n\n/**\n * Escapes HTML special characters to prevent XSS\n */\nconst escapeHtml = (text: string): string => {\n const map: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n };\n return text.replace(/[&<>\"']/g, (char) => map[char] ?? char);\n};\n\n/**\n * Formats JSON with proper newlines instead of escaped \\n characters\n */\nconst formatJsonWithNewlines = (obj: unknown): string => {\n const jsonString = JSON.stringify(obj, null, 2);\n\n // Replace escaped newlines, tabs, and carriage returns with actual characters\n return jsonString\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\r/g, \"\\r\");\n};\n\n/**\n * Formats timestamp to readable date string\n * Timestamps in the schema are stored as ISO 8601 strings\n */\nconst formatTimestamp = (timestamp: number | string): string => {\n const date = new Date(timestamp);\n return date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n};\n\n/**\n * Renders markdown content to HTML (simplified version)\n */\nconst renderMarkdown = (content: string): string => {\n let html = escapeHtml(content);\n\n // Code blocks\n html = html.replace(\n /```(\\w+)?\\n([\\s\\S]*?)```/g,\n (_match, lang, code) => `\n <div class=\"code-block\">\n ${lang ? `<div class=\"code-header\"><span class=\"code-lang\">${escapeHtml(lang.toUpperCase())}</span></div>` : \"\"}\n <pre><code class=\"language-${escapeHtml(lang || \"text\")}\">${code.trim()}</code></pre>\n </div>\n `,\n );\n\n // Inline code\n html = html.replace(/`([^`]+)`/g, '<code class=\"inline-code\">$1</code>');\n\n // Bold\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n\n // Italic\n html = html.replace(/\\*(.+?)\\*/g, \"<em>$1</em>\");\n\n // Headers\n html = html.replace(/^### (.+)$/gm, '<h3 class=\"markdown-h3\">$1</h3>');\n html = html.replace(/^## (.+)$/gm, '<h2 class=\"markdown-h2\">$1</h2>');\n html = html.replace(/^# (.+)$/gm, '<h1 class=\"markdown-h1\">$1</h1>');\n\n // Links\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n\n // Paragraphs\n html = html\n .split(\"\\n\\n\")\n .map((para) => {\n if (\n para.startsWith(\"<h\") ||\n para.startsWith(\"<div\") ||\n para.startsWith(\"<pre\") ||\n para.trim() === \"\"\n ) {\n return para;\n }\n return `<p class=\"markdown-p\">${para.replace(/\\n/g, \"<br>\")}</p>`;\n })\n .join(\"\\n\");\n\n return html;\n};\n\n/**\n * Renders a user message entry\n */\nconst renderUserEntry = (\n entry: Extract<Conversation, { type: \"user\" }>,\n): string => {\n const contentArray = Array.isArray(entry.message.content)\n ? entry.message.content\n : [entry.message.content];\n\n const contentHtml = contentArray\n .map((msg) => {\n if (typeof msg === \"string\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg)}</div>`;\n }\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n if (msg.type === \"image\") {\n return `<img src=\"data:${msg.source.media_type};base64,${msg.source.data}\" alt=\"User uploaded image\" class=\"message-image\" />`;\n }\n if (msg.type === \"document\") {\n return `<div class=\"document-content\"><strong>Document:</strong> ${escapeHtml(msg.source.media_type)}</div>`;\n }\n if (msg.type === \"tool_result\") {\n // Skip tool results in user messages - they're shown in assistant message context\n return \"\";\n }\n return \"\";\n })\n .join(\"\");\n\n // Skip rendering if there's no actual user content (only tool results)\n if (!contentHtml.trim()) {\n return \"\";\n }\n\n return `\n <div class=\"conversation-entry user-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">User</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders an assistant message entry\n */\nconst renderAssistantEntry = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n): string => {\n const contentHtml = entry.message.content\n .map((msg) => {\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n\n if (msg.type === \"thinking\") {\n const charCount = msg.thinking.length;\n return `\n <div class=\"thinking-block collapsible\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 2v1m0 18v1m9-10h1M2 12H1m17.66-7.66l.71.71M3.63 20.37l.71.71m0-14.14l-.71.71m17.02 12.73l-.71.71M12 7a5 5 0 0 1 5 5 5 5 0 0 1-1.47 3.53c-.6.6-.94 1.42-.94 2.27V18a1 1 0 0 1-1 1h-3a1 1 0 0 1-1-1v-.2c0-.85-.34-1.67-.94-2.27A5 5 0 0 1 7 12a5 5 0 0 1 5-5Z\"/>\n </svg>\n <span class=\"thinking-title\">Thinking</span>\n <span class=\"expand-hint\">(${charCount} characters \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"thinking-content collapsible-content\">\n <pre class=\"thinking-text\">${escapeHtml(msg.thinking)}</pre>\n </div>\n </div>\n `;\n }\n\n if (msg.type === \"tool_use\") {\n const inputKeys = Object.keys(msg.input).length;\n return `\n <div class=\"tool-use-block collapsible\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/>\n </svg>\n <span class=\"tool-name\">${escapeHtml(msg.name)}</span>\n <span class=\"expand-hint\">(${inputKeys} parameter${inputKeys !== 1 ? \"s\" : \"\"} \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"tool-use-content collapsible-content\">\n <div class=\"tool-id\"><strong>Tool ID:</strong> <code>${escapeHtml(msg.id)}</code></div>\n <div class=\"tool-input\">\n <strong>Input Parameters:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"conversation-entry assistant-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">Assistant</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders a system message entry\n */\nconst renderSystemEntry = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n return `\n <div class=\"conversation-entry system-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">System</span>\n <span class=\"entry-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n <div class=\"system-message\">${escapeHtml(entry.content)}</div>\n </div>\n </div>\n `;\n};\n\n/**\n * Groups consecutive assistant messages together\n */\nconst groupConsecutiveAssistantMessages = (\n conversations: SessionDetail[\"conversations\"],\n): Array<{\n type: \"grouped\" | \"single\";\n entries: Array<\n Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>\n >;\n}> => {\n const grouped: Array<{\n type: \"grouped\" | \"single\";\n entries: Array<\n Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>\n >;\n }> = [];\n\n let currentGroup: Array<Extract<Conversation, { type: \"assistant\" }>> = [];\n\n for (const conv of conversations) {\n if (conv.type === \"assistant\") {\n // Add all consecutive assistant messages to the group\n currentGroup.push(conv);\n } else if (conv.type === \"user\" || conv.type === \"system\") {\n // End the current group when we hit a non-assistant message\n if (currentGroup.length > 0) {\n grouped.push({\n type: currentGroup.length > 1 ? \"grouped\" : \"single\",\n entries: currentGroup,\n });\n currentGroup = [];\n }\n grouped.push({ type: \"single\", entries: [conv] });\n }\n }\n\n // Don't forget the last group\n if (currentGroup.length > 0) {\n grouped.push({\n type: currentGroup.length > 1 ? \"grouped\" : \"single\",\n entries: currentGroup,\n });\n }\n\n return grouped;\n};\n\n/**\n * Renders a group of consecutive assistant tool calls\n */\nconst renderGroupedAssistantEntries = (\n entries: Array<Extract<Conversation, { type: \"assistant\" }>>,\n): string => {\n const allContent = entries.flatMap((entry) => entry.message.content);\n const firstEntry = entries[0];\n\n if (!firstEntry) {\n return \"\";\n }\n\n const contentHtml = allContent\n .map((msg) => {\n if (msg.type === \"text\") {\n return `<div class=\"markdown-content\">${renderMarkdown(msg.text)}</div>`;\n }\n\n if (msg.type === \"thinking\") {\n const charCount = msg.thinking.length;\n return `\n <div class=\"thinking-block collapsible\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 2v1m0 18v1m9-10h1M2 12H1m17.66-7.66l.71.71M3.63 20.37l.71.71m0-14.14l-.71.71m17.02 12.73l-.71.71M12 7a5 5 0 0 1 5 5 5 5 0 0 1-1.47 3.53c-.6.6-.94 1.42-.94 2.27V18a1 1 0 0 1-1 1h-3a1 1 0 0 1-1-1v-.2c0-.85-.34-1.67-.94-2.27A5 5 0 0 1 7 12a5 5 0 0 1 5-5Z\"/>\n </svg>\n <span class=\"thinking-title\">Thinking</span>\n <span class=\"expand-hint\">(${charCount} characters \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"thinking-content collapsible-content\">\n <pre class=\"thinking-text\">${escapeHtml(msg.thinking)}</pre>\n </div>\n </div>\n `;\n }\n\n if (msg.type === \"tool_use\") {\n const inputKeys = Object.keys(msg.input).length;\n return `\n <div class=\"tool-use-block collapsible\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/>\n </svg>\n <span class=\"tool-name\">${escapeHtml(msg.name)}</span>\n <span class=\"expand-hint\">(${inputKeys} parameter${inputKeys !== 1 ? \"s\" : \"\"} \u00B7 click to collapse)</span>\n <svg class=\"icon-chevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n <div class=\"tool-use-content collapsible-content\">\n <div class=\"tool-id\"><strong>Tool ID:</strong> <code>${escapeHtml(msg.id)}</code></div>\n <div class=\"tool-input\">\n <strong>Input Parameters:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"conversation-entry assistant-entry\">\n <div class=\"entry-header\">\n <span class=\"entry-role\">Assistant</span>\n <span class=\"entry-timestamp\">${formatTimestamp(firstEntry.timestamp)}</span>\n </div>\n <div class=\"entry-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Generates the full HTML document for a session export\n */\nexport const generateSessionHtml = (\n session: SessionDetail,\n projectId: string,\n): Effect.Effect<string> =>\n Effect.gen(function* () {\n const grouped = groupConsecutiveAssistantMessages(session.conversations);\n\n const conversationsHtml = grouped\n .map((group) => {\n if (group.type === \"grouped\") {\n return renderGroupedAssistantEntries(\n group.entries as Array<\n Extract<Conversation, { type: \"assistant\" }>\n >,\n );\n }\n\n const conv = group.entries[0];\n if (!conv) {\n return \"\";\n }\n\n if (conv.type === \"user\") {\n return renderUserEntry(conv);\n }\n if (conv.type === \"assistant\") {\n return renderAssistantEntry(conv);\n }\n if (conv.type === \"system\") {\n return renderSystemEntry(conv);\n }\n return \"\";\n })\n .filter((html) => html !== \"\")\n .join(\"\\n\");\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Claude Code Session - ${escapeHtml(session.id)}</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n :root {\n --background: 0 0% 100%;\n --foreground: 0 0% 3.9%;\n --muted: 0 0% 96.1%;\n --muted-foreground: 0 0% 45.1%;\n --border: 0 0% 89.8%;\n --primary: 0 0% 9%;\n --blue-50: 214 100% 97%;\n --blue-200: 213 97% 87%;\n --blue-600: 217 91% 60%;\n --blue-800: 217 91% 35%;\n }\n\n body {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: hsl(var(--foreground));\n background: hsl(var(--background));\n padding: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n }\n\n .header {\n border-bottom: 1px solid hsl(var(--border));\n padding-bottom: 2rem;\n margin-bottom: 2rem;\n }\n\n .header h1 {\n font-size: 2rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .header .metadata {\n color: hsl(var(--muted-foreground));\n font-size: 0.875rem;\n }\n\n .conversation-list {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n\n .conversation-entry {\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .entry-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n font-weight: 500;\n border-bottom: 1px solid;\n }\n\n .entry-timestamp {\n color: hsl(var(--muted-foreground));\n font-size: 0.75rem;\n }\n\n .entry-content {\n padding: 1.5rem;\n }\n\n /* User entry styles */\n .user-entry {\n background: hsl(var(--muted) / 0.3);\n border: 1px solid hsl(var(--border));\n }\n\n .user-entry .entry-header {\n background: hsl(var(--muted) / 0.5);\n border-bottom-color: hsl(var(--border));\n }\n\n /* Assistant entry styles */\n .assistant-entry {\n background: hsl(var(--background));\n border: 1px solid hsl(var(--border));\n }\n\n .assistant-entry .entry-header {\n background: hsl(var(--muted) / 0.3);\n border-bottom-color: hsl(var(--border));\n }\n\n /* System entry styles */\n .system-entry {\n background: hsl(var(--muted) / 0.2);\n border: 1px dashed hsl(var(--border));\n }\n\n .system-entry .entry-header {\n background: hsl(var(--muted) / 0.4);\n border-bottom-color: hsl(var(--border));\n }\n\n .system-message {\n font-family: monospace;\n font-size: 0.875rem;\n color: hsl(var(--muted-foreground));\n }\n\n /* Markdown styles */\n .markdown-content {\n width: 100%;\n margin: 1rem 0.25rem;\n }\n\n .markdown-h1 {\n font-size: 1.875rem;\n font-weight: 700;\n margin-bottom: 1.5rem;\n margin-top: 2rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid hsl(var(--border));\n }\n\n .markdown-h2 {\n font-size: 1.5rem;\n font-weight: 600;\n margin-bottom: 1rem;\n margin-top: 2rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n }\n\n .markdown-h3 {\n font-size: 1.25rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n margin-top: 1.5rem;\n }\n\n .markdown-p {\n margin-bottom: 1rem;\n line-height: 1.75;\n word-break: break-all;\n }\n\n .inline-code {\n background: hsl(var(--muted) / 0.7);\n padding: 0.25rem 0.5rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-family: monospace;\n border: 1px solid hsl(var(--border));\n }\n\n .code-block {\n position: relative;\n margin: 1.5rem 0;\n }\n\n .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: hsl(var(--muted) / 0.3);\n padding: 0.5rem 1rem;\n border-bottom: 1px solid hsl(var(--border));\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n border: 1px solid hsl(var(--border));\n border-bottom: none;\n }\n\n .code-lang {\n font-size: 0.75rem;\n font-weight: 500;\n color: hsl(var(--muted-foreground));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .code-block pre {\n margin: 0;\n padding: 1rem;\n background: hsl(var(--muted) / 0.2);\n border: 1px solid hsl(var(--border));\n border-top: none;\n border-bottom-left-radius: 0.5rem;\n border-bottom-right-radius: 0.5rem;\n overflow-x: auto;\n }\n\n .code-block code {\n font-family: 'Monaco', 'Courier New', monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n /* Thinking block styles */\n .thinking-block {\n background: hsl(var(--muted) / 0.5);\n border: 2px dashed hsl(var(--border));\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .thinking-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: hsl(var(--muted) / 0.3);\n transition: background 0.2s;\n }\n\n .thinking-header:hover {\n background: hsl(var(--muted) / 0.5);\n }\n\n .icon-lightbulb {\n color: hsl(var(--muted-foreground));\n flex-shrink: 0;\n }\n\n .thinking-title {\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .expand-hint {\n font-size: 0.75rem;\n color: hsl(var(--muted-foreground));\n font-weight: normal;\n margin-left: 0.5rem;\n }\n\n .collapsible:not(.collapsed) .expand-hint {\n display: none;\n }\n\n .icon-chevron {\n margin-left: auto;\n color: hsl(var(--muted-foreground));\n transition: transform 0.2s;\n }\n\n .collapsible.collapsed .icon-chevron {\n transform: rotate(-90deg);\n }\n\n .thinking-content {\n padding: 0.5rem 1rem;\n }\n\n .collapsible-content {\n max-height: 1000px;\n overflow: hidden;\n transition: max-height 0.3s ease-out, opacity 0.2s ease-out;\n }\n\n .collapsible.collapsed .collapsible-content {\n max-height: 0;\n opacity: 0;\n }\n\n .thinking-text {\n font-size: 0.875rem;\n color: hsl(var(--muted-foreground));\n font-family: monospace;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n /* Tool use block styles */\n .tool-use-block {\n border: 1px solid hsl(var(--blue-200));\n background: hsl(var(--blue-50) / 0.5);\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .tool-use-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n cursor: pointer;\n background: hsl(var(--blue-50) / 0.3);\n transition: background 0.2s;\n }\n\n .tool-use-header:hover {\n background: hsl(var(--blue-50) / 0.6);\n }\n\n .icon-wrench {\n color: hsl(var(--blue-600));\n flex-shrink: 0;\n }\n\n .tool-name {\n font-size: 0.875rem;\n font-weight: 500;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tool-use-content {\n padding: 0.75rem 1rem;\n border-top: 1px solid hsl(var(--blue-200));\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .tool-id {\n font-size: 0.75rem;\n }\n\n .tool-id code {\n background: hsl(var(--background) / 0.5);\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid hsl(var(--blue-200));\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .tool-input {\n font-size: 0.75rem;\n }\n\n .json-input {\n background: hsl(var(--background));\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n padding: 0.75rem;\n margin-top: 0.5rem;\n overflow-x: auto;\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-all;\n overflow-wrap: break-word;\n }\n\n .message-image {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1rem 0;\n }\n\n strong {\n font-weight: 600;\n }\n\n em {\n font-style: italic;\n }\n\n a {\n color: hsl(var(--primary));\n text-decoration: underline;\n text-decoration-color: hsl(var(--primary) / 0.3);\n text-underline-offset: 4px;\n transition: text-decoration-color 0.2s;\n }\n\n a:hover {\n text-decoration-color: hsl(var(--primary) / 0.6);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n }\n\n .toggle-all-button {\n padding: 0.5rem 1rem;\n background: hsl(var(--primary));\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .toggle-all-button:hover {\n opacity: 0.9;\n }\n\n .toggle-all-button:active {\n opacity: 0.8;\n }\n\n .footer {\n margin-top: 4rem;\n padding-top: 2rem;\n border-top: 1px solid hsl(var(--border));\n text-align: center;\n color: hsl(var(--muted-foreground));\n font-size: 0.875rem;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <div class=\"header-top\">\n <h1>Claude Code Session Export</h1>\n <button id=\"toggle-all-btn\" class=\"toggle-all-button\">Collapse All</button>\n </div>\n <div class=\"metadata\">\n <div><strong>Session ID:</strong> ${escapeHtml(session.id)}</div>\n <div><strong>Project ID:</strong> ${escapeHtml(projectId)}</div>\n <div><strong>Exported:</strong> ${formatTimestamp(Date.now())}</div>\n <div><strong>Total Conversations:</strong> ${session.conversations.length}</div>\n </div>\n </div>\n\n <div class=\"conversation-list\">\n ${conversationsHtml}\n </div>\n\n <div class=\"footer\">\n <p>Exported from Claude Code Viewer</p>\n </div>\n\n <script>\n // Add click handlers for collapsible blocks\n document.addEventListener('DOMContentLoaded', function() {\n const triggers = document.querySelectorAll('.collapsible-trigger');\n const toggleAllBtn = document.getElementById('toggle-all-btn');\n let allExpanded = true; // Start as expanded since blocks are expanded by default\n\n // Individual collapsible click handlers\n triggers.forEach(function(trigger) {\n trigger.addEventListener('click', function() {\n const collapsible = this.closest('.collapsible');\n if (collapsible) {\n collapsible.classList.toggle('collapsed');\n }\n });\n });\n\n // Toggle all button\n if (toggleAllBtn) {\n toggleAllBtn.addEventListener('click', function() {\n const collapsibles = document.querySelectorAll('.collapsible');\n\n if (allExpanded) {\n // Collapse all\n collapsibles.forEach(function(collapsible) {\n collapsible.classList.add('collapsed');\n });\n toggleAllBtn.textContent = 'Expand All';\n allExpanded = false;\n } else {\n // Expand all\n collapsibles.forEach(function(collapsible) {\n collapsible.classList.remove('collapsed');\n });\n toggleAllBtn.textContent = 'Collapse All';\n allExpanded = true;\n }\n });\n }\n });\n </script>\n</body>\n</html>`;\n\n return html;\n });\n", "import { Hono } from \"hono\";\nimport type { UserConfig } from \"../lib/config/config\";\n\nexport type HonoContext = {\n Variables: {\n userConfig: UserConfig;\n };\n};\n\nexport const honoApp = new Hono<HonoContext>();\n\nexport type HonoAppType = typeof honoApp;\n", "import { Context, Effect, Layer, Ref, Schedule } from \"effect\";\nimport { EventBus } from \"../core/events/services/EventBus\";\nimport { FileWatcherService } from \"../core/events/services/fileWatcher\";\nimport type { InternalEventDeclaration } from \"../core/events/types/InternalEventDeclaration\";\nimport { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository\";\nimport { ProjectMetaService } from \"../core/project/services/ProjectMetaService\";\nimport { SessionRepository } from \"../core/session/infrastructure/SessionRepository\";\nimport { VirtualConversationDatabase } from \"../core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionMetaService } from \"../core/session/services/SessionMetaService\";\n\ninterface InitializeServiceInterface {\n readonly startInitialization: () => Effect.Effect<void>;\n readonly stopCleanup: () => Effect.Effect<void>;\n}\n\nexport class InitializeService extends Context.Tag(\"InitializeService\")<\n InitializeService,\n InitializeServiceInterface\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const fileWatcher = yield* FileWatcherService;\n const projectRepository = yield* ProjectRepository;\n const sessionRepository = yield* SessionRepository;\n const projectMetaService = yield* ProjectMetaService;\n const sessionMetaService = yield* SessionMetaService;\n const virtualConversationDatabase = yield* VirtualConversationDatabase;\n\n // \u72B6\u614B\u7BA1\u7406\u7528\u306E Ref\n const listenersRef = yield* Ref.make<{\n sessionProcessChanged?:\n | ((event: InternalEventDeclaration[\"sessionProcessChanged\"]) => void)\n | null;\n sessionChanged?:\n | ((event: InternalEventDeclaration[\"sessionChanged\"]) => void)\n | null;\n }>({});\n\n const startInitialization = (): Effect.Effect<void> => {\n return Effect.gen(function* () {\n // \u30D5\u30A1\u30A4\u30EB\u30A6\u30A9\u30C3\u30C1\u30E3\u30FC\u3092\u958B\u59CB\n yield* fileWatcher.startWatching();\n\n // \u30CF\u30FC\u30C8\u30D3\u30FC\u30C8\u3092\u5B9A\u671F\u7684\u306B\u9001\u4FE1\n const daemon = Effect.repeat(\n eventBus.emit(\"heartbeat\", {}),\n Schedule.fixed(\"10 seconds\"),\n );\n\n console.log(\"start heartbeat\");\n yield* Effect.forkDaemon(daemon);\n console.log(\"after starting heartbeat fork\");\n\n // sessionChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) => {\n Effect.runFork(\n projectMetaService.invalidateProject(event.projectId),\n );\n\n Effect.runFork(\n sessionMetaService.invalidateSession(\n event.projectId,\n event.sessionId,\n ),\n );\n };\n\n const onSessionProcessChanged = (\n event: InternalEventDeclaration[\"sessionProcessChanged\"],\n ) => {\n if (\n (event.changed.type === \"completed\" ||\n event.changed.type === \"paused\") &&\n event.changed.sessionId !== undefined\n ) {\n Effect.runFork(\n virtualConversationDatabase.deleteVirtualConversations(\n event.changed.sessionId,\n ),\n );\n return;\n }\n };\n\n yield* Ref.set(listenersRef, {\n sessionChanged: onSessionChanged,\n sessionProcessChanged: onSessionProcessChanged,\n });\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"sessionProcessChanged\", onSessionProcessChanged);\n\n yield* Effect.gen(function* () {\n console.log(\"Initializing projects cache\");\n const { projects } = yield* projectRepository.getProjects();\n console.log(`${projects.length} projects cache initialized`);\n\n console.log(\"Initializing sessions cache\");\n const results = yield* Effect.all(\n projects.map((project) =>\n sessionRepository.getSessions(project.id),\n ),\n { concurrency: \"unbounded\" },\n );\n const totalSessions = results.reduce(\n (s, { sessions }) => s + sessions.length,\n 0,\n );\n console.log(`${totalSessions} sessions cache initialized`);\n }).pipe(\n Effect.catchAll(() => Effect.void),\n Effect.withSpan(\"initialize-cache\"),\n );\n }).pipe(Effect.withSpan(\"start-initialization\")) as Effect.Effect<void>;\n };\n\n const stopCleanup = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listeners = yield* Ref.get(listenersRef);\n if (listeners.sessionChanged) {\n yield* eventBus.off(\"sessionChanged\", listeners.sessionChanged);\n }\n\n if (listeners.sessionProcessChanged) {\n yield* eventBus.off(\n \"sessionProcessChanged\",\n listeners.sessionProcessChanged,\n );\n }\n\n yield* Ref.set(listenersRef, {});\n yield* fileWatcher.stop();\n });\n\n return {\n startInitialization,\n stopCleanup,\n } satisfies InitializeServiceInterface;\n }),\n );\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport { EnvService } from \"../../core/platform/services/EnvService\";\nimport type { InferEffect } from \"../../lib/effect/types\";\nimport type { HonoContext } from \"../app\";\n\n// Session token is a simple hash of the password\nconst generateSessionToken = (password: string | undefined): string => {\n if (!password) return \"\";\n return Buffer.from(`ccv-session:${password}`).toString(\"base64\");\n};\n\n// Routes that don't require authentication\nconst PUBLIC_API_ROUTES = [\n \"/api/auth/login\",\n \"/api/auth/check\",\n \"/api/auth/logout\",\n \"/api/config\", // Allow config access for theme/locale loading\n \"/api/version\",\n];\n\nconst LayerImpl = Effect.gen(function* () {\n const envService = yield* EnvService;\n\n const anthPassword = yield* envService.getEnv(\n \"CLAUDE_CODE_VIEWER_AUTH_PASSWORD\",\n ) ?? undefined;\n const authEnabled = anthPassword !== undefined;\n\n const validSessionToken = generateSessionToken(anthPassword);\n\n const authMiddleware = createMiddleware<HonoContext>(async (c, next) => {\n // Skip auth for public routes\n if (PUBLIC_API_ROUTES.includes(c.req.path)) {\n return next();\n }\n\n // Skip auth for non-API routes (let frontend handle auth state)\n if (!c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n // Skip auth check if authentication is not enabled\n if (!authEnabled) {\n return next();\n }\n\n const sessionToken = getCookie(c, \"ccv-session\");\n\n if (!sessionToken || sessionToken !== validSessionToken) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n await next();\n });\n\n return {\n authEnabled,\n anthPassword,\n validSessionToken,\n authMiddleware,\n };\n});\n\nexport type IAuthMiddleware = InferEffect<typeof LayerImpl>;\nexport class AuthMiddleware extends Context.Tag(\"AuthMiddleware\")<\n AuthMiddleware,\n IAuthMiddleware\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { CommandExecutor, FileSystem, Path } from \"@effect/platform\";\nimport { zValidator } from \"@hono/zod-validator\";\nimport { Effect, Runtime } from \"effect\";\nimport { deleteCookie, getCookie, setCookie } from \"hono/cookie\";\nimport { streamSSE } from \"hono/streaming\";\nimport prexit from \"prexit\";\nimport { z } from \"zod\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { AgentSessionController } from \"../core/agent-session/presentation/AgentSessionController\";\nimport { ClaudeCodeController } from \"../core/claude-code/presentation/ClaudeCodeController\";\nimport { ClaudeCodePermissionController } from \"../core/claude-code/presentation/ClaudeCodePermissionController\";\nimport { ClaudeCodeSessionProcessController } from \"../core/claude-code/presentation/ClaudeCodeSessionProcessController\";\nimport { userMessageInputSchema } from \"../core/claude-code/schema\";\nimport { ClaudeCodeLifeCycleService } from \"../core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport { TypeSafeSSE } from \"../core/events/functions/typeSafeSSE\";\nimport { SSEController } from \"../core/events/presentation/SSEController\";\nimport { FeatureFlagController } from \"../core/feature-flag/presentation/FeatureFlagController\";\nimport { FileSystemController } from \"../core/file-system/presentation/FileSystemController\";\nimport { GitController } from \"../core/git/presentation/GitController\";\nimport { CommitRequestSchema, PushRequestSchema } from \"../core/git/schema\";\nimport { EnvService } from \"../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../core/platform/services/UserConfigService\";\nimport type { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"../core/project/presentation/ProjectController\";\nimport type { SchedulerConfigBaseDir } from \"../core/scheduler/config\";\nimport { SchedulerController } from \"../core/scheduler/presentation/SchedulerController\";\nimport {\n newSchedulerJobSchema,\n updateSchedulerJobSchema,\n} from \"../core/scheduler/schema\";\nimport { SearchController } from \"../core/search/presentation/SearchController\";\nimport type { VirtualConversationDatabase } from \"../core/session/infrastructure/VirtualConversationDatabase\";\nimport { SessionController } from \"../core/session/presentation/SessionController\";\nimport type { SessionMetaService } from \"../core/session/services/SessionMetaService\";\nimport { userConfigSchema } from \"../lib/config/config\";\nimport { effectToResponse } from \"../lib/effect/toEffectResponse\";\nimport type { HonoAppType } from \"./app\";\nimport { InitializeService } from \"./initialize\";\nimport { AuthMiddleware } from \"./middleware/auth.middleware\";\nimport { configMiddleware } from \"./middleware/config.middleware\";\n\nexport const routes = (app: HonoAppType) =>\n Effect.gen(function* () {\n // controllers\n const projectController = yield* ProjectController;\n const sessionController = yield* SessionController;\n const agentSessionController = yield* AgentSessionController;\n const gitController = yield* GitController;\n const claudeCodeSessionProcessController =\n yield* ClaudeCodeSessionProcessController;\n const claudeCodePermissionController =\n yield* ClaudeCodePermissionController;\n const sseController = yield* SSEController;\n const fileSystemController = yield* FileSystemController;\n const claudeCodeController = yield* ClaudeCodeController;\n const schedulerController = yield* SchedulerController;\n const featureFlagController = yield* FeatureFlagController;\n const searchController = yield* SearchController;\n\n // services\n const envService = yield* EnvService;\n const userConfigService = yield* UserConfigService;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const initializeService = yield* InitializeService;\n\n // middleware\n const { authMiddleware, validSessionToken, authEnabled, anthPassword } =\n yield* AuthMiddleware;\n\n const runtime = yield* Effect.runtime<\n | EnvService\n | SessionMetaService\n | VirtualConversationDatabase\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor.CommandExecutor\n | UserConfigService\n | ClaudeCodeLifeCycleService\n | ProjectRepository\n | SchedulerConfigBaseDir\n >();\n\n if ((yield* envService.getEnv(\"NEXT_PHASE\")) !== \"phase-production-build\") {\n yield* initializeService.startInitialization();\n\n prexit(async () => {\n await Runtime.runPromise(runtime)(initializeService.stopCleanup());\n });\n }\n\n return (\n app\n // middleware\n .use(configMiddleware)\n .use(authMiddleware)\n .use(async (c, next) => {\n await Effect.runPromise(\n userConfigService.setUserConfig({\n ...c.get(\"userConfig\"),\n }),\n );\n\n await next();\n })\n\n // auth routes\n .post(\n \"/api/auth/login\",\n zValidator(\"json\", z.object({ password: z.string() })),\n async (c) => {\n const { password } = c.req.valid(\"json\");\n\n // Check if auth is configured\n if (!authEnabled) {\n return c.json(\n {\n error:\n \"Authentication not configured. Set CLAUDE_CODE_VIEWER_AUTH_PASSWORD environment variable.\",\n },\n 500,\n );\n }\n\n if (password !== anthPassword) {\n return c.json({ error: \"Invalid password\" }, 401);\n }\n\n setCookie(c, \"ccv-session\", validSessionToken, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: \"Lax\",\n path: \"/\",\n maxAge: 60 * 60 * 24 * 7, // 7 days\n });\n\n return c.json({ success: true });\n },\n )\n\n .post(\"/api/auth/logout\", async (c) => {\n deleteCookie(c, \"ccv-session\", { path: \"/\" });\n return c.json({ success: true });\n })\n\n .get(\"/api/auth/check\", async (c) => {\n const sessionToken = getCookie(c, \"ccv-session\");\n const isAuthenticated = authEnabled\n ? sessionToken === validSessionToken\n : true;\n return c.json({ authenticated: isAuthenticated, authEnabled });\n })\n\n // routes\n .get(\"/api/config\", async (c) => {\n return c.json({\n config: c.get(\"userConfig\"),\n });\n })\n\n .put(\"/api/config\", zValidator(\"json\", userConfigSchema), async (c) => {\n const { ...config } = c.req.valid(\"json\");\n\n setCookie(c, \"ccv-config\", JSON.stringify(config));\n\n return c.json({\n config,\n });\n })\n\n .get(\"/api/version\", async (c) => {\n return c.json({\n version: packageJson.version,\n });\n })\n\n /**\n * ProjectController Routes\n */\n\n .get(\"/api/projects\", async (c) => {\n const response = await effectToResponse(\n c,\n projectController.getProjects(),\n );\n return response;\n })\n\n .get(\n \"/api/projects/:projectId\",\n zValidator(\"query\", z.object({ cursor: z.string().optional() })),\n async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .getProject({\n ...c.req.param(),\n ...c.req.valid(\"query\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects\",\n zValidator(\n \"json\",\n z.object({\n projectPath: z.string().min(1, \"Project path is required\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .createProject({\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .get(\"/api/projects/:projectId/latest-session\", async (c) => {\n const response = await effectToResponse(\n c,\n projectController\n .getProjectLatestSession({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * SessionController Routes\n */\n\n .get(\"/api/projects/:projectId/sessions/:sessionId\", async (c) => {\n const response = await effectToResponse(\n c,\n sessionController\n .getSession({ ...c.req.param() })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\n \"/api/projects/:projectId/sessions/:sessionId/export\",\n async (c) => {\n const response = await effectToResponse(\n c,\n sessionController\n .exportSessionHtml({ ...c.req.param() })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .get(\"/api/projects/:projectId/agent-sessions/:agentId\", async (c) => {\n const { projectId, agentId } = c.req.param();\n\n const response = await effectToResponse(\n c,\n agentSessionController\n .getAgentSession({\n projectId,\n agentId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * GitController Routes\n */\n\n .get(\"/api/projects/:projectId/git/current-revisions\", async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .getCurrentRevisions({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .post(\n \"/api/projects/:projectId/git/diff\",\n zValidator(\n \"json\",\n z.object({\n fromRef: z.string().min(1, \"fromRef is required\"),\n toRef: z.string().min(1, \"toRef is required\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .getGitDiff({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/commit\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .commitFiles({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/push\",\n zValidator(\"json\", PushRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .pushCommits({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/projects/:projectId/git/commit-and-push\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n gitController\n .commitAndPush({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n /**\n * ClaudeCodeController Routes\n */\n\n .get(\"/api/projects/:projectId/claude-commands\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getClaudeCommands({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/projects/:projectId/mcp/list\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getMcpListRoute({\n ...c.req.param(),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/cc/meta\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getClaudeCodeMeta()\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\"/api/cc/features\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController\n .getAvailableFeatures()\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * ClaudeCodeSessionProcessController Routes\n */\n\n .get(\"/api/cc/session-processes\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.getSessionProcesses(),\n );\n return response;\n })\n\n // new or resume\n .post(\n \"/api/cc/session-processes\",\n zValidator(\n \"json\",\n z.object({\n projectId: z.string(),\n input: userMessageInputSchema,\n baseSessionId: z.string().optional(),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.createSessionProcess(\n c.req.valid(\"json\"),\n ),\n );\n return response;\n },\n )\n\n // continue\n .post(\n \"/api/cc/session-processes/:sessionProcessId/continue\",\n zValidator(\n \"json\",\n z.object({\n projectId: z.string(),\n input: userMessageInputSchema,\n baseSessionId: z.string(),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController\n .continueSessionProcess({\n ...c.req.param(),\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .post(\n \"/api/cc/session-processes/:sessionProcessId/abort\",\n zValidator(\"json\", z.object({ projectId: z.string() })),\n async (c) => {\n const { sessionProcessId } = c.req.param();\n void Effect.runFork(\n claudeCodeLifeCycleService.abortTask(sessionProcessId),\n );\n return c.json({ message: \"Task aborted\" });\n },\n )\n\n /**\n * ClaudeCodePermissionController Routes\n */\n\n .post(\n \"/api/cc/permission-response\",\n zValidator(\n \"json\",\n z.object({\n permissionRequestId: z.string(),\n decision: z.enum([\"allow\", \"deny\"]),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodePermissionController.permissionResponse({\n permissionResponse: c.req.valid(\"json\"),\n }),\n );\n return response;\n },\n )\n\n /**\n * SSEController Routes\n */\n\n .get(\"/api/sse\", async (c) => {\n return streamSSE(\n c,\n async (rawStream) => {\n await Runtime.runPromise(runtime)(\n sseController\n .handleSSE(rawStream)\n .pipe(Effect.provide(TypeSafeSSE.make(rawStream))),\n );\n },\n async (err) => {\n console.error(\"Streaming error:\", err);\n },\n );\n })\n\n /**\n * SchedulerController Routes\n */\n\n .get(\"/api/scheduler/jobs\", async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController.getJobs().pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .post(\n \"/api/scheduler/jobs\",\n zValidator(\"json\", newSchedulerJobSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .addJob({\n job: c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .patch(\n \"/api/scheduler/jobs/:id\",\n zValidator(\"json\", updateSchedulerJobSchema),\n async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .updateJob({\n id: c.req.param(\"id\"),\n job: c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n .delete(\"/api/scheduler/jobs/:id\", async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController\n .deleteJob({\n id: c.req.param(\"id\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * FileSystemController Routes\n */\n\n .get(\n \"/api/fs/file-completion\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n basePath: z.string().optional().default(\"/api/\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n fileSystemController.getFileCompletionRoute({\n ...c.req.valid(\"query\"),\n }),\n );\n\n return response;\n },\n )\n\n .get(\n \"/api/fs/directory-browser\",\n zValidator(\n \"query\",\n z.object({\n currentPath: z.string().optional(),\n showHidden: z\n .string()\n .optional()\n .transform((val) => val === \"true\"),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n fileSystemController.getDirectoryListingRoute({\n ...c.req.valid(\"query\"),\n }),\n );\n return response;\n },\n )\n\n /**\n * SearchController Routes\n */\n .get(\n \"/api/search\",\n zValidator(\n \"query\",\n z.object({\n q: z.string().min(2),\n limit: z\n .string()\n .optional()\n .transform((val) => (val ? parseInt(val, 10) : undefined)),\n projectId: z.string().optional(),\n }),\n ),\n async (c) => {\n const { q, limit, projectId } = c.req.valid(\"query\");\n const response = await effectToResponse(\n c,\n searchController\n .search({ query: q, limit, projectId })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n /**\n * FeatureFlagController Routes\n */\n .get(\"/api/flags\", async (c) => {\n const response = await effectToResponse(\n c,\n featureFlagController.getFlags().pipe(Effect.provide(runtime)),\n );\n\n return response;\n })\n );\n });\n\nexport type RouteType = ReturnType<typeof routes> extends Effect.Effect<\n infer A,\n unknown,\n unknown\n>\n ? A\n : never;\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.4.14\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/d-kimuson/claude-code-viewer.git\"\n },\n \"homepage\": \"https://github.com/d-kimuson/claude-code-viewer\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"bin\": {\n \"claude-code-viewer\": \"./dist/main.js\"\n },\n \"scripts\": {\n \"dev\": \"run-p 'dev:*'\",\n \"dev:frontend\": \"vite\",\n \"dev:backend\": \"NODE_ENV=development tsx watch src/server/main.ts --env-file-if-exists=.env.local\",\n \"start\": \"node dist/index.js\",\n \"build\": \"./scripts/build.sh\",\n \"build:frontend\": \"vite build\",\n \"build:backend\": \"esbuild src/server/main.ts --format=esm --bundle --packages=external --sourcemap --platform=node --outfile=dist/main.js\",\n \"lint\": \"run-s 'lint:*'\",\n \"lint:biome-format\": \"biome format .\",\n \"lint:biome-lint\": \"biome check .\",\n \"fix\": \"run-s 'fix:*'\",\n \"fix:biome-format\": \"biome format --write .\",\n \"fix:biome-lint\": \"biome check --write --unsafe .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest --run\",\n \"test:watch\": \"vitest\",\n \"e2e\": \"./scripts/e2e/exec_e2e.sh\",\n \"e2e:start-server\": \"./scripts/e2e/start_server.sh\",\n \"e2e:capture-snapshots\": \"./scripts/e2e/capture_snapshots.sh\",\n \"lingui:extract\": \"lingui extract --clean && node ./scripts/lingui-sort.js\",\n \"lingui:compile\": \"lingui compile --typescript\",\n \"prepare\": \"lefthook install\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.1.30\",\n \"@anthropic-ai/claude-code\": \"2.0.24\",\n \"@anthropic-ai/sdk\": \"0.67.0\",\n \"@effect/cluster\": \"0.55.0\",\n \"@effect/experimental\": \"0.57.11\",\n \"@effect/platform\": \"0.93.6\",\n \"@effect/platform-node\": \"0.103.0\",\n \"@effect/rpc\": \"0.72.2\",\n \"@effect/sql\": \"0.48.6\",\n \"@effect/workflow\": \"0.15.1\",\n \"@hono/node-server\": \"1.19.5\",\n \"@hono/zod-validator\": \"0.7.4\",\n \"@lingui/core\": \"5.5.1\",\n \"@lingui/react\": \"5.5.1\",\n \"@radix-ui/react-avatar\": \"1.1.10\",\n \"@radix-ui/react-checkbox\": \"1.3.3\",\n \"@radix-ui/react-collapsible\": \"1.1.12\",\n \"@radix-ui/react-dialog\": \"1.1.15\",\n \"@radix-ui/react-hover-card\": \"1.1.15\",\n \"@radix-ui/react-popover\": \"1.1.15\",\n \"@radix-ui/react-select\": \"2.2.6\",\n \"@radix-ui/react-slot\": \"1.2.3\",\n \"@radix-ui/react-tabs\": \"1.1.13\",\n \"@radix-ui/react-tooltip\": \"1.2.8\",\n \"@tailwindcss/vite\": \"4.1.16\",\n \"@tanstack/react-devtools\": \"0.7.8\",\n \"@tanstack/react-query\": \"5.90.5\",\n \"@tanstack/react-router\": \"1.133.32\",\n \"@tanstack/react-router-devtools\": \"1.133.32\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"date-fns\": \"4.1.0\",\n \"effect\": \"3.19.9\",\n \"es-toolkit\": \"1.41.0\",\n \"hono\": \"4.10.3\",\n \"jotai\": \"2.15.0\",\n \"lucide-react\": \"0.548.0\",\n \"minisearch\": \"7.2.0\",\n \"parse-git-diff\": \"0.0.19\",\n \"prexit\": \"2.3.0\",\n \"react\": \"19.2.0\",\n \"react-dom\": \"19.2.0\",\n \"react-error-boundary\": \"6.0.0\",\n \"react-helmet-async\": \"2.0.5\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"15.6.6\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.3.1\",\n \"ulid\": \"3.0.1\",\n \"zod\": \"4.1.13\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.1\",\n \"@effect/language-service\": \"0.60.0\",\n \"@lingui/cli\": \"5.5.1\",\n \"@lingui/conf\": \"5.5.1\",\n \"@lingui/format-json\": \"5.5.1\",\n \"@lingui/loader\": \"5.5.1\",\n \"@lingui/vite-plugin\": \"5.5.1\",\n \"@tailwindcss/postcss\": \"4.1.16\",\n \"@tanstack/router-plugin\": \"1.133.32\",\n \"@tsconfig/strictest\": \"2.0.6\",\n \"@types/node\": \"24.9.1\",\n \"@types/react\": \"19.2.2\",\n \"@types/react-dom\": \"19.2.2\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@vitejs/plugin-react-swc\": \"4.2.0\",\n \"dotenv\": \"17.2.3\",\n \"esbuild\": \"0.25.11\",\n \"lefthook\": \"2.0.8\",\n \"npm-run-all2\": \"8.0.4\",\n \"playwright\": \"1.56.1\",\n \"release-it\": \"19.0.5\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.1.16\",\n \"tsx\": \"4.20.6\",\n \"tw-animate-css\": \"1.4.0\",\n \"typescript\": \"5.9.3\",\n \"vite\": \"7.1.12\",\n \"vitest\": \"4.0.3\"\n },\n \"packageManager\": \"pnpm@10.18.3+sha512.bbd16e6d7286fd7e01f6b3c0b3c932cda2965c06a908328f74663f10a9aea51f1129eea615134bf992831b009eabe167ecb7008b597f40ff9bc75946aadfb08d\"\n}\n", "import { z } from \"zod\";\n\nexport const mediaTypeSchema = z.enum([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport type MediaType = z.infer<typeof mediaTypeSchema>;\n\n/**\n * Schema for image block parameter\n */\nconst imageBlockSchema = z.object({\n type: z.literal(\"image\"),\n source: z.object({\n type: z.literal(\"base64\"),\n media_type: mediaTypeSchema,\n data: z.string(),\n }),\n});\n\nexport type ImageBlockParam = z.infer<typeof imageBlockSchema>;\n\n/**\n * Schema for document block parameter\n */\nconst documentBlockSchema = z.object({\n type: z.literal(\"document\"),\n source: z.union([\n z.object({\n type: z.literal(\"text\"),\n media_type: z.enum([\"text/plain\"]),\n data: z.string(),\n }),\n z.object({\n type: z.literal(\"base64\"),\n media_type: z.enum([\"application/pdf\"]),\n data: z.string(),\n }),\n ]),\n});\n\nexport type DocumentBlockParam = z.infer<typeof documentBlockSchema>;\n\n/**\n * Schema for user message input with optional images and documents\n */\nexport const userMessageInputSchema = z.object({\n text: z.string().min(1),\n images: z.array(imageBlockSchema).optional(),\n documents: z.array(documentBlockSchema).optional(),\n});\n\nexport type UserMessageInputSchema = z.infer<typeof userMessageInputSchema>;\n", "import { z } from \"zod\";\n\n// Request Schemas\n\nexport const CommitRequestSchema = z.object({\n projectId: z.string().min(1),\n files: z.array(z.string().min(1)).min(1),\n message: z.string().trim().min(1),\n});\n\nexport const PushRequestSchema = z.object({\n projectId: z.string().min(1),\n});\n\nexport const CommitAndPushRequestSchema = CommitRequestSchema;\n\n// Response Schemas - Commit\n\nexport const CommitResultSuccessSchema = z.object({\n success: z.literal(true),\n commitSha: z.string().length(40),\n filesCommitted: z.number().int().positive(),\n message: z.string(),\n});\n\nexport const CommitResultErrorSchema = z.object({\n success: z.literal(false),\n error: z.string(),\n errorCode: z.enum([\n \"EMPTY_MESSAGE\",\n \"NO_FILES\",\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"HOOK_FAILED\",\n \"GIT_COMMAND_ERROR\",\n ]),\n details: z.string().optional(),\n});\n\nexport const CommitResultSchema = z.discriminatedUnion(\"success\", [\n CommitResultSuccessSchema,\n CommitResultErrorSchema,\n]);\n\n// Response Schemas - Push\n\nexport const PushResultSuccessSchema = z.object({\n success: z.literal(true),\n remote: z.string(),\n branch: z.string(),\n objectsPushed: z.number().int().optional(),\n});\n\nexport const PushResultErrorSchema = z.object({\n success: z.literal(false),\n error: z.string(),\n errorCode: z.enum([\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"NO_UPSTREAM\",\n \"NON_FAST_FORWARD\",\n \"AUTH_FAILED\",\n \"NETWORK_ERROR\",\n \"TIMEOUT\",\n \"GIT_COMMAND_ERROR\",\n ]),\n details: z.string().optional(),\n});\n\nexport const PushResultSchema = z.discriminatedUnion(\"success\", [\n PushResultSuccessSchema,\n PushResultErrorSchema,\n]);\n\n// Response Schemas - Commit and Push\n\nexport const CommitAndPushResultSuccessSchema = z.object({\n success: z.literal(true),\n commitSha: z.string().length(40),\n filesCommitted: z.number().int().positive(),\n message: z.string(),\n remote: z.string(),\n branch: z.string(),\n});\n\nexport const CommitAndPushResultErrorSchema = z.object({\n success: z.literal(false),\n commitSucceeded: z.boolean(),\n commitSha: z.string().length(40).optional(),\n error: z.string(),\n errorCode: z.enum([\n \"EMPTY_MESSAGE\",\n \"NO_FILES\",\n \"PROJECT_NOT_FOUND\",\n \"NOT_A_REPOSITORY\",\n \"HOOK_FAILED\",\n \"GIT_COMMAND_ERROR\",\n \"NO_UPSTREAM\",\n \"NON_FAST_FORWARD\",\n \"AUTH_FAILED\",\n \"NETWORK_ERROR\",\n \"TIMEOUT\",\n ]),\n details: z.string().optional(),\n});\n\nexport const CommitAndPushResultSchema = z.discriminatedUnion(\"success\", [\n CommitAndPushResultSuccessSchema,\n CommitAndPushResultErrorSchema,\n]);\n\n// Type Exports\n\nexport type CommitRequest = z.infer<typeof CommitRequestSchema>;\nexport type PushRequest = z.infer<typeof PushRequestSchema>;\nexport type CommitAndPushRequest = z.infer<typeof CommitAndPushRequestSchema>;\n\nexport type CommitResultSuccess = z.infer<typeof CommitResultSuccessSchema>;\nexport type CommitResultError = z.infer<typeof CommitResultErrorSchema>;\nexport type CommitResult = z.infer<typeof CommitResultSchema>;\n\nexport type PushResultSuccess = z.infer<typeof PushResultSuccessSchema>;\nexport type PushResultError = z.infer<typeof PushResultErrorSchema>;\nexport type PushResult = z.infer<typeof PushResultSchema>;\n\nexport type CommitAndPushResultSuccess = z.infer<\n typeof CommitAndPushResultSuccessSchema\n>;\nexport type CommitAndPushResultError = z.infer<\n typeof CommitAndPushResultErrorSchema\n>;\nexport type CommitAndPushResult = z.infer<typeof CommitAndPushResultSchema>;\n\nexport type CommitErrorCode = CommitResultError[\"errorCode\"];\nexport type PushErrorCode = PushResultError[\"errorCode\"];\n", "import z from \"zod\";\nimport { localeSchema } from \"../../../lib/i18n/schema\";\n\nexport const userConfigSchema = z.object({\n hideNoUserMessageSession: z.boolean().optional().default(true),\n unifySameTitleSession: z.boolean().optional().default(false),\n enterKeyBehavior: z\n .enum([\"shift-enter-send\", \"enter-send\", \"command-enter-send\"])\n .optional()\n .default(\"shift-enter-send\"),\n permissionMode: z\n .enum([\"acceptEdits\", \"bypassPermissions\", \"default\", \"plan\"])\n .optional()\n .default(\"default\"),\n locale: localeSchema.optional().default(\"en\"),\n theme: z.enum([\"light\", \"dark\", \"system\"]).optional().default(\"system\"),\n});\n\nexport const defaultUserConfig = userConfigSchema.parse({});\n\nexport type UserConfig = z.infer<typeof userConfigSchema>;\n", "import z from \"zod\";\n\nexport const localeSchema = z.enum([\"ja\", \"en\", \"zh_CN\"]);\nexport type SupportedLocale = z.infer<typeof localeSchema>;\n", "import { Effect } from \"effect\";\nimport type { Context, Input } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { HonoContext } from \"../../hono/app\";\n\nexport type ControllerResponse = {\n status: ContentfulStatusCode;\n response: object;\n};\n\ndeclare const dummyCtx: Context<HonoContext, string, Input>;\nconst dummyJson = <S extends ContentfulStatusCode, T extends object>(\n s: S,\n t: T,\n) => dummyCtx.json(t, s);\ntype ResponseType<\n S extends ContentfulStatusCode,\n T extends object,\n> = ReturnType<typeof dummyJson<S, T>>;\n\nexport const effectToResponse = async <\n const P extends string,\n const I extends Input,\n const CR extends ControllerResponse,\n const E,\n Ret = CR extends infer I\n ? I extends { status: infer S; response: infer T }\n ? S extends ContentfulStatusCode\n ? T extends object\n ? ResponseType<S, T>\n : never\n : never\n : never\n : never,\n>(\n ctx: Context<HonoContext, P, I>,\n effect: Effect.Effect<CR, E, never>,\n) => {\n const result = await Effect.runPromise(effect);\n const result2 = ctx.json(result.response, result.status);\n\n return result2 as Ret;\n};\n", "import { getCookie, setCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport {\n DEFAULT_LOCALE,\n detectLocaleFromAcceptLanguage,\n} from \"../../../lib/i18n/localeDetection\";\nimport { defaultUserConfig, type UserConfig } from \"../../lib/config/config\";\nimport { parseUserConfig } from \"../../lib/config/parseUserConfig\";\nimport type { HonoContext } from \"../app\";\n\nexport const configMiddleware = createMiddleware<HonoContext>(\n async (c, next) => {\n const cookie = getCookie(c, \"ccv-config\");\n const parsed = parseUserConfig(cookie);\n\n if (cookie === undefined) {\n const preferredLocale =\n detectLocaleFromAcceptLanguage(c.req.header(\"accept-language\")) ??\n DEFAULT_LOCALE;\n\n setCookie(\n c,\n \"ccv-config\",\n JSON.stringify({\n ...defaultUserConfig,\n locale: preferredLocale,\n } satisfies UserConfig),\n );\n }\n\n c.set(\"userConfig\", parsed);\n\n await next();\n },\n);\n", "import { userConfigSchema } from \"./config\";\n\nexport const parseUserConfig = (configJson: string | undefined) => {\n const parsed = (() => {\n try {\n return userConfigSchema.parse(JSON.parse(configJson ?? \"{}\"));\n } catch {\n return userConfigSchema.parse({});\n }\n })();\n\n return parsed;\n};\n", "import { NodeContext } from \"@effect/platform-node\";\nimport { Layer } from \"effect\";\nimport { EventBus } from \"../../core/events/services/EventBus\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext\";\nimport { EnvService } from \"../../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService\";\n\nexport const platformLayer = Layer.mergeAll(\n ApplicationContext.Live,\n UserConfigService.Live,\n EventBus.Live,\n EnvService.Live,\n).pipe(Layer.provide(EnvService.Live), Layer.provide(NodeContext.layer));\n"],
|
|
5
|
+
"mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
|
|
6
|
+
"names": ["readFile", "resolve", "NodeContext", "Effect", "Layer", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "Layer", "Context", "Effect", "Layer", "z", "LayerImpl", "Effect", "Context", "Layer", "LayerImpl", "Effect", "Path", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "z", "Context", "Effect", "Layer", "Ref", "FileSystem", "Path", "Context", "Effect", "Layer", "z", "homedir", "z", "LayerImpl", "Effect", "Path", "FileSystem", "Context", "Layer", "Context", "Layer", "Effect", "Ref", "z", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "Option", "Context", "Layer", "FileSystem", "Path", "Effect", "z", "Context", "Data", "Effect", "Layer", "Path", "Effect", "Effect", "Path", "options", "canUseTool", "Data", "LayerImpl", "Effect", "getAvailableFeatures", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "getAvailableFeatures", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Ref", "Context", "Layer", "LayerImpl", "Effect", "permissionResponse", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "LayerImpl", "Effect", "Ref", "Context", "Layer", "Context", "Effect", "Layer", "Runtime", "ulid", "resolve", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "z", "resolve", "resolve", "Context", "Effect", "Layer", "Ref", "createVirtualConversation", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "FileSystem", "Path", "Effect", "Context", "Layer", "Effect", "FileSystem", "Path", "Ref", "LayerImpl", "Effect", "FileSystem", "Path", "sessionDetail", "Option", "sessionsToReturn", "sessionsWithMeta", "Context", "Layer", "Effect", "process", "Effect", "Context", "Data", "Effect", "Layer", "Ref", "Data", "LayerImpl", "Effect", "Ref", "process", "Context", "Layer", "LayerImpl", "Effect", "ulid", "input", "Runtime", "process", "Context", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "resolve", "Context", "Effect", "Layer", "ulid", "LayerImpl", "Effect", "Context", "Layer", "Path", "Context", "Effect", "Layer", "Ref", "z", "Context", "Layer", "Effect", "Path", "Ref", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "homedir", "Context", "Effect", "Layer", "dirname", "resolve", "existsSync", "readdir", "join", "resolve", "LayerImpl", "Effect", "homedir", "Context", "Layer", "Context", "Effect", "Either", "Layer", "resolve", "existsSync", "existsSync", "resolve", "Command", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "Data", "LayerImpl", "Effect", "FileSystem", "Path", "Command", "commit", "Context", "Layer", "LayerImpl", "Effect", "Either", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "LayerImpl", "Effect", "FileSystem", "Path", "Context", "Layer", "homedir", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "z", "Data", "Context", "Layer", "homedir", "Effect", "Path", "FileSystem", "Context", "Data", "Duration", "Effect", "Layer", "Ref", "ulid", "Effect", "Effect", "Data", "LayerImpl", "Effect", "Ref", "Duration", "result", "fibers", "ulid", "Context", "Layer", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "query", "Context", "Layer", "LayerImpl", "Effect", "query", "Context", "Layer", "Context", "Effect", "Layer", "Effect", "html", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "Ref", "Schedule", "Context", "Layer", "Effect", "Ref", "Schedule", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Effect", "Runtime", "getCookie", "setCookie", "z", "z", "z", "z", "z", "z", "z", "Effect", "Effect", "getCookie", "createMiddleware", "createMiddleware", "getCookie", "Effect", "Runtime", "z", "setCookie", "getCookie", "Layer", "Layer", "resolve", "readFile", "Effect", "NodeContext"]
|
|
7
7
|
}
|