@kimuson/claude-code-viewer 0.5.9 → 0.6.0-beta.2
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 +17 -1
- package/dist/main.js +1859 -811
- package/dist/main.js.map +4 -4
- package/dist/static/assets/ProtectedRoute-kldRjzy3.js +1 -0
- package/dist/static/assets/{eye-BGsXRq_8.js → eye-BEkfdnRO.js} +1 -1
- package/dist/static/assets/index-C9P7O98i.js +1 -0
- package/dist/static/assets/{index-sXgy7Ajd.js → index-CHZixXYx.js} +1 -1
- package/dist/static/assets/index-CTq99aOX.css +1 -0
- package/dist/static/assets/index-nTFAt0o5.js +101 -0
- package/dist/static/assets/{label-gygRdIVO.js → label-DigNu3m4.js} +1 -1
- package/dist/static/assets/{login-DRDs0jaq.js → login-CotBrr4P.js} +1 -1
- package/dist/static/assets/messages-D_2afeYc.js +1 -0
- package/dist/static/assets/messages-lrmcxVGh.js +1 -0
- package/dist/static/assets/messages-m0e3n_U5.js +1 -0
- package/dist/static/assets/session-B4VFb0DB.js +51 -0
- package/dist/static/assets/{session-B5BSJDkJ.js → session-BfEVLScy.js} +1 -1
- package/dist/static/assets/session-DFuMZ0ql.css +1 -0
- package/dist/static/index.html +2 -2
- package/package.json +14 -4
- package/dist/static/assets/ProtectedRoute-BZvfrfXZ.js +0 -1
- package/dist/static/assets/index-D9d-SW2q.js +0 -1
- package/dist/static/assets/index-hJ5yiXvq.js +0 -101
- package/dist/static/assets/index-kl3XSvPM.css +0 -1
- package/dist/static/assets/messages-5zx59L1k.js +0 -1
- package/dist/static/assets/messages-Diwakl7a.js +0 -1
- package/dist/static/assets/messages-Pr7vABlX.js +0 -1
- package/dist/static/assets/session-D2lB0w81.js +0 -40
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/server/main.ts", "../package.json", "../src/server/core/platform/services/DeprecatedEnvDetector.ts", "../src/server/startServer.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/ProgressEntrySchema.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/CcvOptionsService.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/
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { Effect } from \"effect\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport type { CliOptions } from \"./core/platform/services/CcvOptionsService\";\nimport { checkDeprecatedEnvs } from \"./core/platform/services/DeprecatedEnvDetector\";\nimport { startServer } from \"./startServer\";\n\nconst program = new Command();\n\nprogram\n .name(packageJson.name)\n .version(packageJson.version)\n .description(packageJson.description);\n\n// start server\nprogram\n .option(\"-p, --port <port>\", \"port to listen on\")\n .option(\"-h, --hostname <hostname>\", \"hostname to listen on\")\n .option(\"-P, --password <password>\", \"password to authenticate\")\n .option(\"-e, --executable <executable>\", \"path to claude code executable\")\n .option(\"--claude-dir <claude-dir>\", \"path to claude directory\")\n .action(async (options: CliOptions) => {\n // Check for deprecated environment variables and show migration guide\n await Effect.runPromise(checkDeprecatedEnvs);\n\n await startServer(options);\n });\n\n/* Other Commands Here */\n\nconst main = async () => {\n program.parse(process.argv);\n};\n\nmain().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.5.9\",\n \"description\": \"A full-featured web-based Claude Code client that provides complete interactive functionality for managing Claude Code projects.\",\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/main.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 \"prepack\": \"pnpm build\",\n \"prepare\": \"lefthook install\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.20\",\n \"@anthropic-ai/claude-code\": \"2.0.24\",\n \"@anthropic-ai/sdk\": \"0.71.2\",\n \"@effect/cluster\": \"0.56.1\",\n \"@effect/experimental\": \"0.58.0\",\n \"@effect/platform\": \"0.94.2\",\n \"@effect/platform-node\": \"0.104.1\",\n \"@effect/rpc\": \"0.73.0\",\n \"@effect/sql\": \"0.49.0\",\n \"@effect/workflow\": \"0.16.0\",\n \"@hono/node-server\": \"1.19.9\",\n \"@hono/zod-validator\": \"0.7.6\",\n \"@lingui/core\": \"5.9.0\",\n \"@lingui/react\": \"5.9.0\",\n \"@radix-ui/react-avatar\": \"1.1.11\",\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.4\",\n \"@radix-ui/react-tabs\": \"1.1.13\",\n \"@radix-ui/react-tooltip\": \"1.2.8\",\n \"@tailwindcss/vite\": \"4.1.18\",\n \"@tanstack/react-devtools\": \"0.9.2\",\n \"@tanstack/react-query\": \"5.90.20\",\n \"@tanstack/react-router\": \"1.156.0\",\n \"@tanstack/react-router-devtools\": \"1.156.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"commander\": \"^14.0.2\",\n \"date-fns\": \"4.1.0\",\n \"effect\": \"3.19.15\",\n \"es-toolkit\": \"1.44.0\",\n \"hono\": \"4.11.5\",\n \"jotai\": \"2.16.2\",\n \"lucide-react\": \"0.563.0\",\n \"minisearch\": \"7.2.0\",\n \"parse-git-diff\": \"0.0.19\",\n \"prexit\": \"2.3.0\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"react-error-boundary\": \"6.1.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"16.1.0\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.4.0\",\n \"ulid\": \"3.0.2\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.12\",\n \"@effect/language-service\": \"0.72.0\",\n \"@lingui/cli\": \"5.9.0\",\n \"@lingui/conf\": \"5.9.0\",\n \"@lingui/format-json\": \"5.9.0\",\n \"@lingui/loader\": \"5.9.0\",\n \"@lingui/vite-plugin\": \"5.9.0\",\n \"@tailwindcss/postcss\": \"4.1.18\",\n \"@tanstack/router-plugin\": \"1.156.0\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/node\": \"25.0.10\",\n \"@types/react\": \"19.2.9\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@vitejs/plugin-react-swc\": \"4.2.2\",\n \"dotenv\": \"17.2.3\",\n \"esbuild\": \"0.27.2\",\n \"lefthook\": \"2.0.15\",\n \"npm-run-all2\": \"8.0.4\",\n \"playwright\": \"1.58.0\",\n \"release-it\": \"19.2.4\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.1.18\",\n \"tsx\": \"4.21.0\",\n \"tw-animate-css\": \"1.4.0\",\n \"typescript\": \"5.9.3\",\n \"vite\": \"7.3.1\",\n \"vitest\": \"4.0.18\"\n },\n \"packageManager\": \"pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316\"\n}\n", "import { Console, Effect } from \"effect\";\n\ntype DeprecationWarning = {\n type: \"removed\" | \"deprecated\";\n envKey: string;\n message: string;\n suggestion: string;\n};\n\ntype DeprecatedEnvConfig = {\n type: \"removed\" | \"deprecated\";\n newEnv: string | null;\n cliOption: string;\n};\n\nconst DEPRECATED_ENVS: Record<string, DeprecatedEnvConfig> = {\n // Removed in PR #101\n CLAUDE_CODE_VIEWER_AUTH_PASSWORD: {\n type: \"removed\",\n newEnv: \"CCV_PASSWORD\",\n cliOption: \"--password\",\n },\n CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH: {\n type: \"removed\",\n newEnv: \"CCV_CC_EXECUTABLE_PATH\",\n cliOption: \"--executable\",\n },\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n return process.env[key] ?? undefined;\n};\n\nconst detectDeprecatedEnvs = (): DeprecationWarning[] => {\n const warnings: DeprecationWarning[] = [];\n\n for (const [envKey, config] of Object.entries(DEPRECATED_ENVS)) {\n const value = getOptionalEnv(envKey);\n if (value !== undefined) {\n if (config.type === \"removed\") {\n warnings.push({\n type: \"removed\",\n envKey,\n message: `Environment variable ${envKey} has been removed.`,\n suggestion: config.newEnv\n ? `Please use ${config.newEnv} environment variable or ${config.cliOption} CLI option instead.`\n : `Please use ${config.cliOption} CLI option instead.`,\n });\n } else {\n warnings.push({\n type: \"deprecated\",\n envKey,\n message: `Environment variable ${envKey} is deprecated and will be removed in a future release.`,\n suggestion: config.newEnv\n ? `Please migrate to ${config.newEnv} environment variable or ${config.cliOption} CLI option.`\n : `Please use ${config.cliOption} CLI option instead.`,\n });\n }\n }\n }\n\n return warnings;\n};\n\nconst formatWarning = (warning: DeprecationWarning): string => {\n const prefix = warning.type === \"removed\" ? \"\u274C REMOVED\" : \"\u26A0\uFE0F DEPRECATED\";\n return `${prefix}: ${warning.message}\\n \u2192 ${warning.suggestion}`;\n};\n\nexport const checkDeprecatedEnvs = Effect.gen(function* () {\n const warnings = detectDeprecatedEnvs();\n\n if (warnings.length === 0) {\n return;\n }\n\n const hasRemovedEnvs = warnings.some((warning) => warning.type === \"removed\");\n\n yield* Console.log(\"\");\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\" Migration Guide\");\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\"\");\n\n for (const warning of warnings) {\n yield* Console.log(formatWarning(warning));\n yield* Console.log(\"\");\n }\n\n yield* Console.log(\"For more details, see:\");\n yield* Console.log(\n \" https://github.com/d-kimuson/claude-code-viewer#configuration\",\n );\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\"\");\n\n if (hasRemovedEnvs) {\n yield* Effect.fail(\n new Error(\n \"Cannot start server: removed environment variables detected. Please update your configuration.\",\n ),\n );\n }\n});\n", "import { 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, Layer } 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 type { CliOptions } from \"./core/platform/services/CcvOptionsService\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService\";\nimport { RateLimitAutoScheduleService } from \"./core/rate-limit/services/RateLimitAutoScheduleService\";\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 { TasksController } from \"./core/tasks/presentation/TasksController\";\nimport { TasksService } from \"./core/tasks/services/TasksService\";\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\nexport const startServer = async (options: CliOptions) => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n const isDevelopment = process.env.NODE_ENV === \"development\";\n\n if (!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\n const program = routes(honoApp, options)\n // \u4F9D\u5B58\u306E\u6D45\u3044\u9806\u306B\u30B3\u30F3\u30C6\u30CA\u306B pipe \u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\n .pipe(Effect.provide(MainLayer));\n\n await Effect.runPromise(program);\n\n const 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 (options.port ?? process.env.PORT ?? \"3000\");\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n const hostname = options.hostname ?? process.env.HOSTNAME ?? \"localhost\";\n\n serve(\n {\n fetch: honoApp.fetch,\n port: parseInt(port, 10),\n hostname,\n },\n (info) => {\n console.log(`Server is running on http://${hostname}:${info.port}`);\n },\n );\n};\n\nconst PlatformLayer = Layer.mergeAll(platformLayer, NodeContext.layer);\n\nconst InfraBasics = Layer.mergeAll(\n VirtualConversationDatabase.Live,\n ProjectMetaService.Live,\n SessionMetaService.Live,\n);\n\nconst InfraRepos = Layer.mergeAll(\n ProjectRepository.Live,\n SessionRepository.Live,\n).pipe(Layer.provideMerge(InfraBasics));\n\nconst InfraLayer = AgentSessionLayer.pipe(Layer.provideMerge(InfraRepos));\n\nconst DomainBase = Layer.mergeAll(\n ClaudeCodePermissionService.Live,\n ClaudeCodeSessionProcessService.Live,\n ClaudeCodeService.Live,\n GitService.Live,\n SchedulerService.Live,\n SchedulerConfigBaseDir.Live,\n SearchService.Live,\n TasksService.Live,\n);\n\nconst DomainLayer = ClaudeCodeLifeCycleService.Live.pipe(\n Layer.provideMerge(DomainBase),\n);\n\nconst AppServices = Layer.mergeAll(\n FileWatcherService.Live,\n RateLimitAutoScheduleService.Live,\n AuthMiddleware.Live,\n);\n\nconst ApplicationLayer = InitializeService.Live.pipe(\n Layer.provideMerge(AppServices),\n);\n\nconst PresentationLayer = Layer.mergeAll(\n ProjectController.Live,\n SessionController.Live,\n AgentSessionController.Live,\n GitController.Live,\n ClaudeCodeController.Live,\n ClaudeCodeSessionProcessController.Live,\n ClaudeCodePermissionController.Live,\n FileSystemController.Live,\n SSEController.Live,\n SchedulerController.Live,\n FeatureFlagController.Live,\n SearchController.Live,\n TasksController.Live,\n);\n\nconst MainLayer = PresentationLayer.pipe(\n Layer.provideMerge(ApplicationLayer),\n Layer.provideMerge(DomainLayer),\n Layer.provideMerge(InfraLayer),\n Layer.provideMerge(PlatformLayer),\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 * Checks new path: {project}/{sessionId}/subagents/agent-{agentId}.jsonl\n * Fallback to old path: {project}/agent-{agentId}.jsonl\n */\n const getAgentSessionByAgentId = (\n projectId: string,\n agentId: string,\n sessionId?: string,\n ): Effect.Effect<ExtendedConversation[] | null, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n // Try new path if sessionId is provided\n if (sessionId) {\n const newPath = path.resolve(\n projectPath,\n sessionId,\n \"subagents\",\n `agent-${agentId}.jsonl`,\n );\n\n if (yield* fs.exists(newPath)) {\n const content = yield* fs.readFileString(newPath);\n return parseJsonl(content);\n }\n }\n\n // Fallback to old path\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 sessionId?: 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 { ProgressEntrySchema } from \"./entry/ProgressEntrySchema\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema\";\n\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 ProgressEntrySchema,\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 agentId: z.string().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 { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const ProgressEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"progress\"),\n\n // required\n data: z.record(z.string(), z.any()),\n toolUseID: z.string().optional(),\n parentToolUseID: z.string().optional(),\n});\n\nexport type ProgressEntry = z.infer<typeof ProgressEntrySchema>;\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 z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"remove\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"popAll\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n content: z.string().optional(),\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\n// Hook info for stop_hook_summary\nconst HookInfoSchema = z.object({\n command: z.string(),\n});\n\n// Base system entry with content (original format)\nconst SystemEntryWithContentSchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n content: z.string(),\n toolUseID: z.string(),\n level: z.enum([\"info\"]),\n subtype: z.undefined().optional(),\n});\n\n// Stop hook summary entry (new format from Claude Code v2.0.76+)\nconst StopHookSummaryEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"stop_hook_summary\"),\n toolUseID: z.string(),\n level: z.enum([\"info\", \"suggestion\"]),\n slug: z.string().optional(),\n hookCount: z.number(),\n hookInfos: z.array(HookInfoSchema),\n hookErrors: z.array(z.unknown()),\n preventedContinuation: z.boolean(),\n stopReason: z.string(),\n hasOutput: z.boolean(),\n});\n\n// Local command entry (e.g., /mcp, /help commands)\nconst LocalCommandEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"local_command\"),\n content: z.string(),\n level: z.enum([\"info\"]),\n});\n\n// Turn duration entry (tracks duration of assistant turns, Claude Code v2.1+)\nconst TurnDurationEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"turn_duration\"),\n durationMs: z.number(),\n slug: z.string().optional(),\n});\n\n// Compact boundary entry (new format from Claude Code)\nconst CompactBoundaryEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"compact_boundary\"),\n content: z.string(),\n level: z.enum([\"info\"]),\n slug: z.string().optional(),\n logicalParentUuid: z.string().optional(),\n compactMetadata: z\n .object({\n trigger: z.string(),\n preTokens: z.number(),\n })\n .optional(),\n});\n\n// API error entry (tracks API errors and retries)\nconst ApiErrorEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"api_error\"),\n level: z.enum([\"error\", \"warning\", \"info\"]),\n error: z.object({\n status: z.number().optional(),\n headers: z.record(z.string(), z.unknown()).optional(),\n requestID: z.string().nullable().optional(),\n error: z\n .object({\n type: z.string(),\n error: z\n .object({\n type: z.string(),\n message: z.string(),\n })\n .optional(),\n message: z.string().optional(),\n })\n .optional(),\n }),\n retryInMs: z.number().optional(),\n retryAttempt: z.number().optional(),\n maxRetries: z.number().optional(),\n});\n\nexport const SystemEntrySchema = z.union([\n StopHookSummaryEntrySchema,\n LocalCommandEntrySchema,\n TurnDurationEntrySchema,\n CompactBoundaryEntrySchema,\n ApiErrorEntrySchema,\n SystemEntryWithContentSchema, // Must be last (catch-all for undefined subtype)\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: {\n projectId: string;\n agentId: string;\n sessionId?: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, agentId, sessionId } = params;\n\n // Read conversations directly using agentId\n const conversations = yield* repository.getAgentSessionByAgentId(\n projectId,\n agentId,\n sessionId,\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 {\n type CommandInfo,\n scanCommandFilesWithMetadata,\n scanSkillFilesWithMetadata,\n} 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 const features = yield* claudeCodeService.getAvailableFeatures();\n\n const globalCommands: CommandInfo[] = yield* scanCommandFilesWithMetadata(\n (yield* context.claudeCodePaths).claudeCommandsDirPath,\n );\n\n const projectCommands: CommandInfo[] =\n project.meta.projectPath === null\n ? []\n : yield* scanCommandFilesWithMetadata(\n path.resolve(project.meta.projectPath, \".claude\", \"commands\"),\n );\n\n const globalSkills: CommandInfo[] = features.runSkillsDirectly\n ? yield* scanSkillFilesWithMetadata(\n (yield* context.claudeCodePaths).claudeSkillsDirPath,\n )\n : [];\n\n const projectSkills: CommandInfo[] =\n features.runSkillsDirectly && project.meta.projectPath !== null\n ? yield* scanSkillFilesWithMetadata(\n path.resolve(project.meta.projectPath, \".claude\", \"skills\"),\n )\n : [];\n\n const defaultCommands: CommandInfo[] = [\n {\n name: \"init\",\n description: \"Initialize Claude Code in current project\",\n argumentHint: null,\n },\n {\n name: \"compact\",\n description: \"Compact conversation history\",\n argumentHint: null,\n },\n {\n name: \"security-review\",\n description: \"Review code for security issues\",\n argumentHint: null,\n },\n {\n name: \"review\",\n description: \"Review code changes\",\n argumentHint: null,\n },\n ];\n\n // Helper to extract command names for backward compatibility\n const toNames = (commands: CommandInfo[]) => commands.map((c) => c.name);\n\n return {\n response: {\n // New format: CommandInfo[] with metadata\n globalCommands,\n projectCommands,\n globalSkills,\n projectSkills,\n defaultCommands,\n // Legacy format: string[] for backward compatibility\n globalCommandsLegacy: toNames(globalCommands),\n projectCommandsLegacy: toNames(projectCommands),\n globalSkillsLegacy: toNames(globalSkills),\n projectSkillsLegacy: toNames(projectSkills),\n defaultCommandsLegacy: toNames(defaultCommands),\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 { CcvOptionsService } from \"./CcvOptionsService\";\n\nexport type ClaudeCodePaths = {\n globalClaudeDirectoryPath: string;\n claudeCommandsDirPath: string;\n claudeSkillsDirPath: string;\n claudeProjectsDirPath: string;\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const ccvOptionsService = yield* CcvOptionsService;\n\n const claudeCodePaths = Effect.gen(function* () {\n const globalClaudeDirectoryPath = yield* ccvOptionsService\n .getCcvOptions(\"claudeDir\")\n .pipe(\n Effect.map((envVar) =>\n envVar === undefined\n ? path.resolve(homedir(), \".claude\")\n : path.resolve(envVar),\n ),\n );\n\n return {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(\n globalClaudeDirectoryPath,\n \"commands\",\n ),\n claudeSkillsDirPath: path.resolve(globalClaudeDirectoryPath, \"skills\"),\n claudeProjectsDirPath: path.resolve(\n globalClaudeDirectoryPath,\n \"projects\",\n ),\n } as const satisfies ClaudeCodePaths;\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\";\n\nexport type CliOptions = {\n port: string;\n hostname: string;\n password?: string | undefined;\n executable?: string | undefined;\n claudeDir?: string | undefined;\n};\n\nexport type CcvOptions = {\n port: number;\n hostname: string;\n password?: string | undefined;\n executable?: string | undefined;\n claudeDir?: string | undefined;\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n return process.env[key] ?? undefined;\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvOptionsRef = yield* Ref.make<CcvOptions | undefined>(undefined);\n\n const loadCliOptions = (cliOptions: CliOptions) => {\n return Effect.gen(function* () {\n yield* Ref.update(ccvOptionsRef, () => {\n return {\n port: Number.parseInt(\n cliOptions.port ?? getOptionalEnv(\"PORT\") ?? \"3000\",\n 10,\n ),\n hostname:\n cliOptions.hostname ?? getOptionalEnv(\"HOSTNAME\") ?? \"localhost\",\n password:\n cliOptions.password ?? getOptionalEnv(\"CCV_PASSWORD\") ?? undefined,\n executable:\n cliOptions.executable ??\n getOptionalEnv(\"CCV_CC_EXECUTABLE_PATH\") ??\n undefined,\n claudeDir:\n cliOptions.claudeDir ?? getOptionalEnv(\"CCV_GLOBAL_CLAUDE_DIR\"),\n };\n });\n });\n };\n\n const getCcvOptions = <K extends keyof CcvOptions>(key: K) => {\n return Effect.gen(function* () {\n const ccvOptions = yield* Ref.get(ccvOptionsRef);\n if (ccvOptions === undefined) {\n throw new Error(\"Unexpected error: CCV options are not loaded\");\n }\n return ccvOptions[key];\n });\n };\n\n return {\n loadCliOptions,\n getCcvOptions,\n };\n});\n\nexport type ICcvOptionsService = InferEffect<typeof LayerImpl>;\n\nexport class CcvOptionsService extends Context.Tag(\"CcvOptionsService\")<\n CcvOptionsService,\n ICcvOptionsService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\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 (yield* context.claudeCodePaths).claudeProjectsDirPath,\n );\n if (!dirExists) {\n console.warn(\n `Claude projects directory not found at ${(yield* context.claudeCodePaths).claudeProjectsDirPath}`,\n );\n return { projects: [] };\n }\n\n // Read directory entries\n const entries = yield* fs.readDirectory(\n (yield* 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 (yield* 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 * Command metadata extracted from .md file frontmatter.\n */\nexport type CommandInfo = {\n /** Command name (e.g., \"impl\", \"frontend:impl\") */\n name: string;\n /** Command description from frontmatter */\n description: string | null;\n /** Argument hint for user input from frontmatter */\n argumentHint: string | null;\n};\n\n/**\n * Parse YAML frontmatter from markdown content to extract command metadata.\n * Supports `description` and `argument-hint` fields.\n *\n * @param content - Markdown file content\n * @returns Object with description and argumentHint (null if not found)\n *\n * @example\n * parseCommandFrontmatter(\"---\\ndescription: 'My command'\\nargument-hint: '<file>'\\n---\\n# Content\")\n * // => { description: \"My command\", argumentHint: \"<file>\" }\n */\nexport const parseCommandFrontmatter = (\n content: string,\n): { description: string | null; argumentHint: string | null } => {\n // Match YAML frontmatter between --- delimiters\n const frontmatterMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!frontmatterMatch?.[1]) {\n return { description: null, argumentHint: null };\n }\n\n const frontmatter = frontmatterMatch[1];\n\n // Extract description field (supports both quoted and unquoted values)\n const descriptionMatch = frontmatter.match(\n /^description:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m,\n );\n const description = descriptionMatch?.[1]?.trim() ?? null;\n\n // Extract argument-hint field\n const argumentHintMatch = frontmatter.match(\n /^argument-hint:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m,\n );\n const argumentHint = argumentHintMatch?.[1]?.trim() ?? null;\n\n return { description, argumentHint };\n};\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\n/**\n * Recursively scan a directory for .md files and return them as CommandInfo with metadata.\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Directory path to scan\n * @returns Array of CommandInfo objects with name, description, and argumentHint\n *\n * @example\n * // For directory structure:\n * // commands/\n * // impl.md (with frontmatter: description: \"Implementation command\")\n * scanCommandFilesWithMetadata(\"/path/to/commands\")\n * // => [{ name: \"impl\", description: \"Implementation command\", argumentHint: null }]\n */\nexport const scanCommandFilesWithMetadata = (\n dirPath: string,\n): Effect.Effect<CommandInfo[], 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 CommandInfo[],\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 // Read file content and parse frontmatter\n const content = yield* fs.readFileString(itemPath);\n const { description, argumentHint } =\n parseCommandFrontmatter(content);\n const name = pathToCommandName(itemPath, dirPath);\n\n return [{ name, description, argumentHint }] as CommandInfo[];\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\n/**\n\n * Recursively scan a skills directory for SKILL.md files and return skill names.\n * Skills are expected to be in the format: skills/<skill-name>/SKILL.md\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Skills directory path to scan\n * @returns Array of skill names (e.g., [\"typescript\", \"react\", \"frontend:design\"])\n *\n * @example\n * // For directory structure:\n * // skills/\n * // typescript/\n * // SKILL.md\n * // frontend/\n * // design/\n * // SKILL.md\n * scanSkillFilesRecursively(\"/path/to/skills\")\n * // => [\"typescript\", \"frontend:design\"]\n */\nexport const scanSkillFilesRecursively = (\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 for SKILL.md files\n const scanDirectory = (\n currentPath: string,\n relativePath: 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 // Check if SKILL.md exists in current directory\n const skillFilePath = path.join(currentPath, \"SKILL.md\");\n const skillFileExists = yield* fs.exists(skillFilePath);\n\n const skillNames: string[] = [];\n\n if (skillFileExists) {\n // Extract skill name from relative path\n const skillName = relativePath.replace(/\\//g, \":\");\n if (skillName) {\n skillNames.push(skillName);\n }\n }\n\n // Read directory contents to recursively scan subdirectories\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each subdirectory\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 const newRelativePath = relativePath\n ? `${relativePath}/${item}`\n : item;\n return yield* scanDirectory(itemPath, newRelativePath);\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Combine current directory skills and subdirectory results\n return [...skillNames, ...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\n/**\n * Recursively scan a skills directory for SKILL.md files and return CommandInfo with metadata.\n * Skills are expected to be in the format: skills/<skill-name>/SKILL.md\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Skills directory path to scan\n * @returns Array of CommandInfo objects with name, description, and argumentHint\n *\n * @example\n * // For directory structure:\n * // skills/\n * // typescript/\n * // SKILL.md (with frontmatter: description: \"TypeScript development\")\n * scanSkillFilesWithMetadata(\"/path/to/skills\")\n * // => [{ name: \"typescript\", description: \"TypeScript development\", argumentHint: null }]\n */\nexport const scanSkillFilesWithMetadata = (\n dirPath: string,\n): Effect.Effect<CommandInfo[], 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 for SKILL.md files\n const scanDirectory = (\n currentPath: string,\n relativePath: string,\n ): Effect.Effect<\n CommandInfo[],\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 // Check if SKILL.md exists in current directory\n const skillFilePath = path.join(currentPath, \"SKILL.md\");\n const skillFileExists = yield* fs.exists(skillFilePath);\n\n const skills: CommandInfo[] = [];\n\n if (skillFileExists) {\n // Extract skill name from relative path\n const skillName = relativePath.replace(/\\//g, \":\");\n if (skillName) {\n // Read file content and parse frontmatter\n const content = yield* fs.readFileString(skillFilePath);\n const { description, argumentHint } =\n parseCommandFrontmatter(content);\n skills.push({ name: skillName, description, argumentHint });\n }\n }\n\n // Read directory contents to recursively scan subdirectories\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each subdirectory\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 const newRelativePath = relativePath\n ? `${relativePath}/${item}`\n : item;\n return yield* scanDirectory(itemPath, newRelativePath);\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Combine current directory skills and subdirectory results\n return [...skills, ...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 type McpServerStatus = \"connected\" | \"failed\" | \"unknown\";\n\nexport interface McpServer {\n name: string;\n command: string;\n status: McpServerStatus;\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 // Extract status from indicators (\u2713 Connected, \u2717 Failed, etc.)\n let status: McpServerStatus = \"unknown\";\n if (rest.includes(\"\u2713\") || rest.toLowerCase().includes(\"connected\")) {\n status = \"connected\";\n } else if (rest.includes(\"\u2717\") || rest.toLowerCase().includes(\"failed\")) {\n status = \"failed\";\n }\n\n // Remove status indicators to get clean command\n const command = rest.replace(/\\s*-\\s*[\u2713\u2717].*$/, \"\").trim();\n\n if (name && command) {\n servers.push({ name, command, status });\n }\n }\n }\n\n return servers;\n};\n", "import * as agentSdk from \"@anthropic-ai/claude-agent-sdk\";\nimport * as claudeCodeSdk from \"@anthropic-ai/claude-code\";\nimport { Command, Path } from \"@effect/platform\";\nimport { Data, Effect } from \"effect\";\nimport { uniq } from \"es-toolkit\";\nimport { CcvOptionsService } from \"../../platform/services/CcvOptionsService\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\ntype AgentSdkQuery = typeof agentSdk.query;\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 ccvOptionsService = yield* CcvOptionsService;\n\n // Environment variable (highest priority)\n const specifiedExecutablePath =\n yield* ccvOptionsService.getCcvOptions(\"executable\");\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 runSkillsDirectly:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 1,\n patch: 0,\n }) ||\n ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 0,\n patch: 77,\n })\n : false,\n});\n\nexport const query = (\n prompt: AgentSdkPrompt,\n options: AgentSdkQueryOptions,\n) => {\n const { canUseTool, permissionMode, hooks, ...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 disallowedTools: [\"AskUserQuestion\"], // Cannot answer from web interface instead of CLI\n ...(availableFeatures.canUseTool\n ? { canUseTool, permissionMode }\n : {\n permissionMode: \"bypassPermissions\",\n }),\n };\n\n if (availableFeatures.agentSdk) {\n return agentSdk.query({\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: typeof canUseTool = async (\n toolName,\n input,\n canUseToolOptions,\n ) => {\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 claudeCodeSdk.query({\n prompt,\n options: {\n ...baseOptions,\n disallowedTools: [\"AskUserQuestion\"], // Cannot answer from web interface instead of CLI\n permissionMode:\n // fallback unsupported permission modes\n permissionMode === \"delegate\" || permissionMode === \"dontAsk\"\n ? \"bypassPermissions\"\n : permissionMode,\n hooks: hooks as Partial<\n Record<claudeCodeSdk.HookEvent, claudeCodeSdk.HookCallbackMatcher[]>\n >,\n canUseTool: fallbackCanUseTool as claudeCodeSdk.CanUseTool,\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 searchHotkey: \"command-k\",\n autoScheduleContinueOnRateLimit: false,\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 { CcvOptionsService } from \"../../platform/services/CcvOptionsService\";\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 | CcvOptionsService\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 // Notify frontend that user message was added to virtual conversation\n // This allows immediate display of the user's message before Claude responds\n yield* eventBusService.emit(\"virtualConversationUpdated\", {\n projectId: sessionProcess.def.projectId,\n sessionId: baseSessionId,\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 \u5047\u5B9A\u66F4\u65B0\u4E3A not_initialized\n return 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 // Notify frontend that new assistant message is available\n // This triggers before file watcher debounce, reducing perceived latency\n yield* eventBusService.emit(\"virtualConversationUpdated\", {\n projectId: processState.def.projectId,\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 // Check abort signal before processing message\n if (sessionProcess.def.abortController.signal.aborted) {\n break;\n }\n\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 modelName: null,\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 modelName: null,\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, modelName } =\n 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 modelName: modelName,\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: 2026-01-08\n *\n * Prices are in USD per million tokens (MTok)\n * Source: https://claude.com/pricing\n */\n\nexport type ModelName =\n | \"claude-opus-4.5\"\n | \"claude-opus-4.1\"\n | \"claude-sonnet-4.5\"\n | \"claude-3.5-sonnet\"\n | \"claude-haiku-4.5\"\n | \"claude-3-opus\"\n | \"claude-3-haiku\";\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 *\n * Note: Claude Sonnet 4.5 has tiered pricing based on prompt length:\n * - \u2264200K tokens: $3/$15 (standard tier, used here)\n * - >200K tokens: $6/$22.50 (extended context tier, not implemented)\n * This implementation uses standard tier pricing as the default approximation\n * since prompt length is not tracked at pricing calculation time.\n */\nexport const MODEL_PRICING: Record<ModelName, ModelPricing> = {\n \"claude-opus-4.5\": {\n input: 5.0,\n output: 25.0,\n cache_creation: 6.25,\n cache_read: 0.5,\n },\n \"claude-opus-4.1\": {\n input: 15.0,\n output: 75.0,\n cache_creation: 18.75,\n cache_read: 1.5,\n },\n \"claude-sonnet-4.5\": {\n input: 3.0,\n output: 15.0,\n cache_creation: 3.75,\n cache_read: 0.3,\n },\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-haiku-4.5\": {\n input: 1.0,\n output: 5.0,\n cache_creation: 1.25,\n cache_read: 0.1,\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} 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-opus-4-5-20251101\" -> \"claude-opus-4.5\"\n * - \"claude-opus-4-1-20250101\" -> \"claude-opus-4.1\"\n * - \"claude-sonnet-4-5-20250929\" -> \"claude-sonnet-4.5\"\n * - \"claude-haiku-4-5-20251001\" -> \"claude-haiku-4.5\"\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 *\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 Opus 4.5 patterns (more specific first)\n if (normalized.includes(\"opus-4-5\") || normalized.includes(\"opus-4.5\")) {\n return \"claude-opus-4.5\";\n }\n\n // Claude Opus 4.1 patterns\n if (normalized.includes(\"opus-4-1\") || normalized.includes(\"opus-4.1\")) {\n return \"claude-opus-4.1\";\n }\n\n // Claude Sonnet 4.5 patterns\n if (normalized.includes(\"sonnet-4-5\") || normalized.includes(\"sonnet-4.5\")) {\n return \"claude-sonnet-4.5\";\n }\n\n // Claude Haiku 4.5 patterns\n if (normalized.includes(\"haiku-4-5\") || normalized.includes(\"haiku-4.5\")) {\n return \"claude-haiku-4.5\";\n }\n\n // Claude 3.5 Sonnet patterns (Sonnet 4 without version suffix)\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 // 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 // Helper to check valid agent file\n const isValidAgentFile = (filePath: string, expectedSessionId?: string) =>\n Effect.gen(function* () {\n const content = yield* fs.readFileString(filePath);\n const firstLine = content.split(\"\\n\")[0];\n if (!firstLine || firstLine.trim() === \"\") {\n return false;\n }\n\n try {\n const firstLineData = JSON.parse(firstLine);\n if (typeof firstLineData !== \"object\" || firstLineData === null) {\n return false;\n }\n\n // If expectedSessionId is provided, strictly check it.\n // Otherwise, just ensure it looks like a valid log entry (has a sessionId).\n if (expectedSessionId !== undefined) {\n return (\n \"sessionId\" in firstLineData &&\n firstLineData.sessionId === expectedSessionId\n );\n }\n\n return \"sessionId\" in firstLineData;\n } catch {\n return false;\n }\n }).pipe(Effect.catchAll(() => Effect.succeed(false)));\n\n const matchingFilePaths: string[] = [];\n\n // 1. Check legacy root directory\n const rootEntries = yield* fs.readDirectory(projectPath);\n const rootAgentFiles = rootEntries.filter(\n (filename) =>\n filename.startsWith(\"agent-\") && filename.endsWith(\".jsonl\"),\n );\n\n for (const agentFile of rootAgentFiles) {\n const filePath = path.join(projectPath, agentFile);\n if (yield* isValidAgentFile(filePath, sessionId)) {\n matchingFilePaths.push(filePath);\n }\n }\n\n // 2. Check subagents directory: [projectPath]/[sessionId]/subagents\n const subagentsDir = path.join(projectPath, sessionId, \"subagents\");\n const subagentsDirExists = yield* fs.exists(subagentsDir);\n\n if (subagentsDirExists) {\n const subagentEntries = yield* fs.readDirectory(subagentsDir).pipe(\n Effect.catchAll(() => Effect.succeed([] as string[])), // Handle permission or other errors gracefully\n );\n\n const subagentFiles = subagentEntries.filter(\n (filename) =>\n filename.startsWith(\"agent-\") && filename.endsWith(\".jsonl\"),\n );\n\n for (const agentFile of subagentFiles) {\n const filePath = path.join(subagentsDir, agentFile);\n // For subagents, we don't enforce matching sessionId because they have their own IDs.\n // We trust the directory structure.\n if (yield* isValidAgentFile(filePath, undefined)) {\n matchingFilePaths.push(filePath);\n }\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 {\n SDKMessage as AgentSDKMessage,\n ModelUsage,\n SDKHookResponseMessage,\n} 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 if (message.subtype === \"hook_response\") {\n return {\n ...message,\n } as SDKHookResponseMessage;\n }\n\n return message;\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n return {\n ...message,\n modelUsage: {\n ...message.modelUsage,\n } as Record<string, ModelUsage>,\n };\n }\n\n return {\n ...message,\n errors: [],\n modelUsage: {\n ...message.modelUsage,\n } as Record<string, ModelUsage>,\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 const onVirtualConversationUpdated = (\n event: InternalEventDeclaration[\"virtualConversationUpdated\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"virtualConversationUpdated\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\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 yield* eventBus.on(\n \"virtualConversationUpdated\",\n onVirtualConversationUpdated,\n );\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 yield* eventBus.off(\n \"virtualConversationUpdated\",\n onVirtualConversationUpdated,\n );\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 const claudeCodePaths = yield* context.claudeCodePaths;\n\n yield* Ref.set(isWatchingRef, true);\n\n yield* Effect.tryPromise({\n try: async () => {\n console.log(\n \"Starting file watcher on:\",\n claudeCodePaths.claudeProjectsDirPath,\n );\n\n const watcher = watch(\n 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 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 }, 100); // Reduced from 300ms to improve message latency\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 {\n name: \"uuid-on-sdk-message\",\n enabled: claudeCodeFeatures.uuidOnSDKMessage,\n },\n {\n name: \"run-skills-directly\",\n enabled: claudeCodeFeatures.runSkillsDirectly,\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 { 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 // Frameworks\n NODE_ENV: z\n .enum([\"development\", \"production\", \"test\"])\n .optional()\n .default(\"development\"),\n NEXT_PHASE: z.string().optional(),\n PATH: z.string().optional(),\n});\n\nexport type EnvSchema = z.infer<typeof envSchema>;\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: (yield* context.claudeCodePaths)\n .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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ClaudeCodeSessionProcessService } from \"../../claude-code/services/ClaudeCodeSessionProcessService\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport type { InternalEventDeclaration } from \"../../events/types/InternalEventDeclaration\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { SchedulerConfigBaseDir } from \"../../scheduler/config\";\nimport { SchedulerService } from \"../../scheduler/domain/Scheduler\";\nimport { detectRateLimitFromLastLine } from \"../functions/detectRateLimitFromLastLine\";\nimport { parseRateLimitResetTime } from \"../functions/parseRateLimitResetTime\";\nimport { readLastLine } from \"../functions/readLastLine\";\n\ntype SessionChangedListener = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n) => void;\n\n/**\n * Service that monitors session changes and automatically schedules\n * a \"continue\" task when a rate limit is detected on a live session.\n *\n * This service:\n * 1. Subscribes to `sessionChanged` events via EventBus\n * 2. When a session changes:\n * a. Checks if `autoScheduleContinueOnRateLimit` is enabled\n * b. Checks if the session has a live process\n * c. Reads the last line of the session JSONL file\n * d. Detects if it's a rate limit message\n * e. If yes, creates a scheduled task with the parsed reset time\n */\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const userConfigService = yield* UserConfigService;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const schedulerService = yield* SchedulerService;\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const schedulerConfigBaseDir = yield* SchedulerConfigBaseDir;\n const projectRepository = yield* ProjectRepository;\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n\n // Store listener reference for cleanup\n const listenerRef = yield* Ref.make<SessionChangedListener | null>(null);\n\n /**\n * Checks if a session has a live process.\n * Returns the projectId if found, undefined otherwise.\n */\n const getSessionProcessProjectId = (\n sessionId: string,\n ): Effect.Effect<string | undefined> =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n\n // Find a process that matches the sessionId and is in a live state\n const liveProcess = processes.find(\n (process) =>\n process.sessionId === sessionId &&\n (process.type === \"initialized\" ||\n process.type === \"file_created\" ||\n process.type === \"paused\"),\n );\n\n return liveProcess?.def.projectId;\n });\n\n /**\n * Checks if a reserved job already exists for this session.\n * This prevents duplicate job creation.\n */\n const hasExistingReservedJobForSession = (sessionId: string) =>\n Effect.gen(function* () {\n const jobs = yield* schedulerService\n .getJobs()\n .pipe(Effect.catchAll(() => Effect.succeed([])));\n\n return jobs.some(\n (job) =>\n job.schedule.type === \"reserved\" &&\n job.message.baseSessionId === sessionId &&\n job.lastRunStatus === null, // Not yet executed\n );\n });\n\n /**\n * Handles a sessionChanged event.\n * Checks conditions and potentially schedules a continue task.\n */\n const handleSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = event;\n\n // 1. Check if auto-schedule is enabled\n const config = yield* userConfigService.getUserConfig();\n if (!config.autoScheduleContinueOnRateLimit) {\n return;\n }\n\n // 2. Check if session has a live process\n const processProjectId = yield* getSessionProcessProjectId(sessionId);\n if (processProjectId === undefined) {\n return;\n }\n\n // 3. Check if a job already exists for this session\n const hasExistingJob = yield* hasExistingReservedJobForSession(sessionId);\n if (hasExistingJob) {\n return;\n }\n\n // 4. Read the last line of the session file\n const projectPath = decodeProjectId(projectId);\n const sessionFilePath = pathService.join(\n projectPath,\n `${sessionId}.jsonl`,\n );\n\n const lastLine = yield* readLastLine(sessionFilePath).pipe(\n Effect.catchAll(() => Effect.succeed(\"\")),\n );\n\n if (lastLine === \"\") {\n return;\n }\n\n // 5. Detect if it's a rate limit message\n const detection = detectRateLimitFromLastLine(lastLine);\n if (!detection.detected) {\n return;\n }\n\n // 6. Parse the reset time\n const resetTime = parseRateLimitResetTime(detection.resetTimeText);\n\n // 7. Create the scheduled job\n yield* schedulerService\n .addJob({\n name: `Rate limit auto-continue: ${sessionId.slice(0, 8)}...`,\n schedule: {\n type: \"reserved\",\n reservedExecutionTime: resetTime,\n },\n message: {\n content: \"continue\",\n projectId: processProjectId,\n baseSessionId: sessionId,\n },\n enabled: true,\n })\n .pipe(\n Effect.catchAll((error) => {\n console.error(\n `[RateLimitAutoScheduleService] Failed to add job for session ${sessionId}:`,\n error,\n );\n return Effect.void;\n }),\n );\n\n console.log(\n `[RateLimitAutoScheduleService] Scheduled continue task for session ${sessionId} at ${resetTime}`,\n );\n });\n\n // Layer with captured dependencies for running effects in callbacks\n const runtimeLayer = Layer.mergeAll(\n Layer.succeed(FileSystem.FileSystem, fs),\n Layer.succeed(Path.Path, pathService),\n Layer.succeed(SchedulerConfigBaseDir, schedulerConfigBaseDir),\n Layer.succeed(ProjectRepository, projectRepository),\n Layer.succeed(UserConfigService, userConfigService),\n Layer.succeed(ClaudeCodeLifeCycleService, lifeCycleService),\n );\n\n /**\n * Starts the service by subscribing to sessionChanged events.\n */\n const start = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n // Check if already started\n const existingListener = yield* Ref.get(listenerRef);\n if (existingListener !== null) {\n return;\n }\n\n const listener: SessionChangedListener = (event) => {\n Effect.runFork(\n handleSessionChanged(event).pipe(Effect.provide(runtimeLayer)),\n );\n };\n\n yield* Ref.set(listenerRef, listener);\n yield* eventBus.on(\"sessionChanged\", listener);\n\n console.log(\"[RateLimitAutoScheduleService] Started\");\n });\n\n /**\n * Stops the service by unsubscribing from sessionChanged events.\n */\n const stop = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listener = yield* Ref.get(listenerRef);\n if (listener !== null) {\n yield* eventBus.off(\"sessionChanged\", listener);\n yield* Ref.set(listenerRef, null);\n }\n console.log(\"[RateLimitAutoScheduleService] Stopped\");\n });\n\n return {\n start,\n stop,\n };\n});\n\nexport type IRateLimitAutoScheduleService = InferEffect<typeof LayerImpl>;\n\nexport class RateLimitAutoScheduleService extends Context.Tag(\n \"RateLimitAutoScheduleService\",\n)<RateLimitAutoScheduleService, IRateLimitAutoScheduleService>() {\n static Live = Layer.effect(this, LayerImpl);\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 { z } from \"zod\";\n\n/**\n * Schema for detecting rate limit messages from Claude Code session JSONL.\n *\n * This is a focused validation schema that only checks the required fields\n * for rate limit detection. It is intentionally less strict than the full\n * AssistantEntrySchema to avoid breaking when Claude Code adds new fields.\n */\nexport const RateLimitEntrySchema = z.object({\n type: z.literal(\"assistant\"),\n error: z.literal(\"rate_limit\"),\n isApiErrorMessage: z.literal(true),\n sessionId: z.string(),\n message: z.object({\n content: z.array(\n z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n }),\n ),\n }),\n});\n\nexport type RateLimitEntry = z.infer<typeof RateLimitEntrySchema>;\n\n/**\n * Result of rate limit detection.\n */\nexport type RateLimitDetectionResult =\n | {\n detected: true;\n sessionId: string;\n resetTimeText: string;\n }\n | {\n detected: false;\n };\n", "import type { RateLimitDetectionResult } from \"../schema\";\nimport { RateLimitEntrySchema } from \"../schema\";\n\n/**\n * Detects if a JSON line represents a rate limit error from Claude Code.\n *\n * This pure function parses a single JSON line string and determines if it\n * matches the rate limit entry pattern. If matched, it extracts the session\n * ID and reset time text.\n *\n * @param jsonLine - A single line of JSON from a Claude Code session JSONL file\n * @returns Detection result with session info if rate limit detected\n */\nexport const detectRateLimitFromLastLine = (\n jsonLine: string,\n): RateLimitDetectionResult => {\n const trimmed = jsonLine.trim();\n if (trimmed === \"\") {\n return { detected: false };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return { detected: false };\n }\n\n const validation = RateLimitEntrySchema.safeParse(parsed);\n if (!validation.success) {\n return { detected: false };\n }\n\n const entry = validation.data;\n const firstTextContent = entry.message.content[0];\n if (!firstTextContent) {\n return { detected: false };\n }\n\n return {\n detected: true,\n sessionId: entry.sessionId,\n resetTimeText: firstTextContent.text,\n };\n};\n", "/**\n * Parses reset time text from a rate limit message and returns an ISO datetime string.\n *\n * Expected input formats:\n * - \"You've hit your limit \u00B7 resets 8pm (Asia/Tokyo)\"\n * - \"You've hit your limit \u00B7 resets 3:00 AM (UTC)\"\n * - \"You've hit your limit \u00B7 resets 8:30pm (America/New_York)\"\n *\n * @param resetTimeText - The text containing the reset time information\n * @returns ISO datetime string for when the rate limit resets\n */\nexport const parseRateLimitResetTime = (resetTimeText: string): string => {\n // Pattern to match: \"resets <time> (<timezone>)\"\n // Time formats: \"8pm\", \"8PM\", \"8 pm\", \"8:30pm\", \"3:00 AM\", \"12am\", \"12pm\"\n const pattern =\n /resets\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm|AM|PM)\\s*\\(([^)]+)\\)/i;\n const match = pattern.exec(resetTimeText);\n\n if (!match) {\n return getFallbackTime();\n }\n\n const hoursStr = match[1];\n const minutesStr = match[2];\n const meridiem = match[3];\n const timezone = match[4];\n\n if (\n hoursStr === undefined ||\n meridiem === undefined ||\n timezone === undefined\n ) {\n return getFallbackTime();\n }\n\n const hours = Number.parseInt(hoursStr, 10);\n const minutes =\n minutesStr !== undefined ? Number.parseInt(minutesStr, 10) : 0;\n\n if (Number.isNaN(hours) || Number.isNaN(minutes)) {\n return getFallbackTime();\n }\n\n // Convert 12-hour format to 24-hour format\n const hours24 = convertTo24Hour(hours, meridiem.toLowerCase());\n\n // Create date in the target timezone\n const resetDate = createDateInTimezone(hours24, minutes, timezone);\n if (resetDate === null) {\n return getFallbackTime();\n }\n\n // Add 1 minute to the reset time to avoid scheduling exactly at the limit reset\n resetDate.setMinutes(resetDate.getMinutes() + 1);\n\n return resetDate.toISOString();\n};\n\n/**\n * Converts 12-hour format to 24-hour format.\n */\nconst convertTo24Hour = (hours: number, meridiem: string): number => {\n const isPM = meridiem === \"pm\";\n\n if (hours === 12) {\n // 12am = 0 (midnight), 12pm = 12 (noon)\n return isPM ? 12 : 0;\n }\n\n return isPM ? hours + 12 : hours;\n};\n\n/**\n * Calculates the UTC offset in minutes for a given timezone at a specific point in time.\n * Positive offset means timezone is ahead of UTC (e.g., +540 for JST).\n */\nconst getTimezoneOffsetMinutes = (timezone: string, date: Date): number => {\n // Format the same instant in both UTC and the target timezone\n const utcFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"UTC\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n const tzFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n const utcParts = utcFormatter.formatToParts(date);\n const tzParts = tzFormatter.formatToParts(date);\n\n const extractDateTime = (\n parts: Intl.DateTimeFormatPart[],\n ): { day: number; hour: number; minute: number } => ({\n day: Number.parseInt(parts.find((p) => p.type === \"day\")?.value ?? \"0\", 10),\n hour: Number.parseInt(\n parts.find((p) => p.type === \"hour\")?.value ?? \"0\",\n 10,\n ),\n minute: Number.parseInt(\n parts.find((p) => p.type === \"minute\")?.value ?? \"0\",\n 10,\n ),\n });\n\n const utc = extractDateTime(utcParts);\n const tz = extractDateTime(tzParts);\n\n // Calculate the difference in minutes\n // Handle day boundary crossing\n let dayDiff = tz.day - utc.day;\n // Normalize day difference (handle month boundaries)\n if (dayDiff > 15) dayDiff -= 31; // Crossed month boundary backwards\n if (dayDiff < -15) dayDiff += 31; // Crossed month boundary forwards\n\n const offsetMinutes =\n dayDiff * 24 * 60 + (tz.hour - utc.hour) * 60 + (tz.minute - utc.minute);\n\n return offsetMinutes;\n};\n\n/**\n * Creates a Date object for the given time in the specified timezone.\n * If the resulting time is in the past, it adjusts to the next day.\n */\nconst createDateInTimezone = (\n hours: number,\n minutes: number,\n timezone: string,\n): Date | null => {\n const now = new Date();\n\n try {\n // Validate timezone by trying to use it\n const testFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n });\n testFormatter.format(now); // This will throw if timezone is invalid\n\n // Get the timezone offset\n const offsetMinutes = getTimezoneOffsetMinutes(timezone, now);\n\n // Get current date in the target timezone\n const tzFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = tzFormatter.formatToParts(now);\n const year = parts.find((p) => p.type === \"year\")?.value;\n const month = parts.find((p) => p.type === \"month\")?.value;\n const day = parts.find((p) => p.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return null;\n }\n\n // Calculate the UTC time for the target local time\n // If it's 8pm in Asia/Tokyo (UTC+9), UTC time would be 11am (subtract 9 hours)\n const totalTargetMinutes = hours * 60 + minutes;\n const totalUtcMinutes = totalTargetMinutes - offsetMinutes;\n\n // Create a date for today at midnight UTC\n const baseDate = new Date(`${year}-${month}-${day}T00:00:00.000Z`);\n\n // Add the UTC minutes\n const resetDate = new Date(\n baseDate.getTime() + totalUtcMinutes * 60 * 1000,\n );\n\n // If the reset time is in the past or equal to now, add one day\n if (resetDate.getTime() <= now.getTime()) {\n resetDate.setTime(resetDate.getTime() + 24 * 60 * 60 * 1000);\n }\n\n return resetDate;\n } catch {\n return null;\n }\n};\n\n/**\n * Returns a fallback time (30 minutes from now) as ISO string.\n */\nconst getFallbackTime = (): string => {\n const fallback = new Date();\n fallback.setMinutes(fallback.getMinutes() + 30);\n return fallback.toISOString();\n};\n", "import { FileSystem } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\n\n/**\n * Extracts the last non-empty line from a string content.\n * Handles both LF and CRLF line endings.\n *\n * @param content - The content to extract the last line from\n * @returns The last non-empty line, or empty string if no lines exist\n */\nexport const extractLastNonEmptyLine = (content: string): string => {\n // Split by newline, handling both LF and CRLF\n const lines = content.split(/\\r?\\n/);\n\n // Find the last non-empty line by iterating from the end\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line !== undefined && line.trim() !== \"\") {\n return line;\n }\n }\n\n return \"\";\n};\n\n/**\n * Reads the last non-empty line of a file.\n *\n * This function reads the entire file content and extracts the last non-empty line.\n * While simpler than seeking to the end of the file, this approach is reliable\n * and acceptable for typical JSONL session files which are monitored via SSE\n * and read infrequently on file change events.\n *\n * @param filePath - Absolute path to the file\n * @returns Effect that resolves to the last non-empty line of the file\n *\n * @example\n * ```typescript\n * const effect = readLastLine(\"/path/to/session.jsonl\");\n * const lastLine = await Effect.runPromise(effect.pipe(Effect.provide(NodeContext.layer)));\n * ```\n */\nexport const readLastLine = (\n filePath: string,\n): Effect.Effect<string, PlatformError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n // Read the entire file content\n const content = yield* fs.readFileString(filePath);\n\n // Extract the last non-empty line\n return extractLastNonEmptyLine(content);\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 } = yield* 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 } = yield* 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 { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { AgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { decodeSessionId } from \"../functions/id\";\nimport { generateSessionHtml } from \"../services/ExportService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const sessionRepository = yield* SessionRepository;\n const agentSessionRepository = yield* AgentSessionRepository;\n const fs = yield* FileSystem.FileSystem;\n const eventBus = yield* EventBus;\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(\n session,\n projectId,\n agentSessionRepository,\n );\n\n return {\n status: 200,\n response: { html },\n } as const satisfies ControllerResponse;\n });\n\n const deleteSession = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n const sessionPath = decodeSessionId(projectId, sessionId);\n\n // Check if session file exists\n const exists = yield* fs.exists(sessionPath);\n if (!exists) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n // Delete the session file\n const deleteResult = yield* fs.remove(sessionPath).pipe(\n Effect.map(() => ({ success: true, error: null }) as const),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false,\n error: `Failed to delete session: ${error.message}`,\n } as const),\n ),\n );\n\n if (!deleteResult.success) {\n return {\n status: 500,\n response: { error: deleteResult.error },\n } as const satisfies ControllerResponse;\n }\n\n // Emit sessionListChanged event to notify clients\n yield* eventBus.emit(\"sessionListChanged\", { projectId });\n\n return {\n status: 200,\n response: { success: true },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSession,\n exportSessionHtml,\n deleteSession,\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 { ToolResultContent } from \"../../../../lib/conversation-schema/content/ToolResultContentSchema\";\nimport type { IAgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository\";\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 (enhanced version)\n * Supports: code blocks, tables, blockquotes, lists (ul/ol/task), hr, strikethrough,\n * inline code, bold, italic, headers, links, paragraphs\n */\nconst renderMarkdown = (content: string): string => {\n // First, extract code blocks to protect them from other processing\n const codeBlocks: string[] = [];\n let processedContent = content.replace(\n /```(\\w+)?\\n([\\s\\S]*?)```/g,\n (_match, lang, code) => {\n const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`\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\")}\">${escapeHtml(code.trim())}</code></pre>\n </div>\n `);\n return placeholder;\n },\n );\n\n // Process tables (before escaping HTML)\n processedContent = processedContent.replace(\n /(?:^\\|.+\\|$\\n?)+/gm,\n (tableBlock) => {\n const rows = tableBlock.trim().split(\"\\n\");\n if (rows.length < 2) return escapeHtml(tableBlock);\n\n const headerRow = rows[0];\n const separatorRow = rows[1];\n\n // Check if second row is a separator (contains only |, -, :, and spaces)\n if (\n !headerRow ||\n !separatorRow ||\n !/^\\|[\\s\\-:|]+\\|$/.test(separatorRow)\n ) {\n return escapeHtml(tableBlock);\n }\n\n const parseRow = (row: string): string[] =>\n row\n .split(\"|\")\n .slice(1, -1)\n .map((cell) => cell.trim());\n\n const headerCells = parseRow(headerRow);\n const dataRows = rows.slice(2);\n\n let tableHtml = '<table class=\"markdown-table\"><thead><tr>';\n for (const cell of headerCells) {\n tableHtml += `<th>${escapeHtml(cell)}</th>`;\n }\n tableHtml += \"</tr></thead><tbody>\";\n\n for (const row of dataRows) {\n const cells = parseRow(row);\n tableHtml += \"<tr>\";\n for (const cell of cells) {\n tableHtml += `<td>${escapeHtml(cell)}</td>`;\n }\n tableHtml += \"</tr>\";\n }\n tableHtml += \"</tbody></table>\";\n\n return tableHtml;\n },\n );\n\n // Escape HTML for remaining content (except already processed tables)\n // We need to escape only non-processed parts\n processedContent = processedContent\n .split(\n /(<table class=\"markdown-table\">[\\s\\S]*?<\\/table>|__CODE_BLOCK_\\d+__)/,\n )\n .map((part) => {\n if (\n part.startsWith('<table class=\"markdown-table\">') ||\n /^__CODE_BLOCK_\\d+__$/.test(part)\n ) {\n return part;\n }\n return escapeHtml(part);\n })\n .join(\"\");\n\n // Blockquotes (multi-line support)\n processedContent = processedContent.replace(\n /(?:^> .+$\\n?)+/gm,\n (quoteBlock) => {\n const lines = quoteBlock\n .split(\"\\n\")\n .filter((l) => l.trim())\n .map((l) => l.replace(/^> /, \"\"))\n .join(\"<br>\");\n return `<blockquote class=\"markdown-blockquote\">${lines}</blockquote>`;\n },\n );\n\n // Horizontal rule\n processedContent = processedContent.replace(\n /^(\\*{3,}|-{3,}|_{3,})$/gm,\n '<hr class=\"markdown-hr\">',\n );\n\n // Task lists (must be before regular lists)\n processedContent = processedContent.replace(\n /(?:^- \\[([ xX])\\] .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^- \\[([ xX])\\] (.+)$/);\n if (match?.[1] !== undefined && match[2] !== undefined) {\n const checked = match[1].toLowerCase() === \"x\";\n return `<li class=\"task-item\"><input type=\"checkbox\" class=\"task-checkbox\" ${checked ? \"checked\" : \"\"} disabled>${match[2]}</li>`;\n }\n return \"\";\n })\n .join(\"\");\n return `<ul class=\"markdown-task-list\">${items}</ul>`;\n },\n );\n\n // Unordered lists\n processedContent = processedContent.replace(\n /(?:^[-*+] .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^[-*+] (.+)$/);\n return match ? `<li>${match[1]}</li>` : \"\";\n })\n .join(\"\");\n return `<ul class=\"markdown-ul\">${items}</ul>`;\n },\n );\n\n // Ordered lists\n processedContent = processedContent.replace(\n /(?:^\\d+\\. .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^\\d+\\. (.+)$/);\n return match ? `<li>${match[1]}</li>` : \"\";\n })\n .join(\"\");\n return `<ol class=\"markdown-ol\">${items}</ol>`;\n },\n );\n\n // Strikethrough\n processedContent = processedContent.replace(\n /~~(.+?)~~/g,\n '<del class=\"markdown-del\">$1</del>',\n );\n\n // Inline code\n processedContent = processedContent.replace(\n /`([^`]+)`/g,\n '<code class=\"inline-code\">$1</code>',\n );\n\n // Bold\n processedContent = processedContent.replace(\n /\\*\\*(.+?)\\*\\*/g,\n \"<strong>$1</strong>\",\n );\n\n // Italic (avoiding conflict with bold)\n processedContent = processedContent.replace(\n /(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g,\n \"<em>$1</em>\",\n );\n\n // Headers\n processedContent = processedContent.replace(\n /^### (.+)$/gm,\n '<h3 class=\"markdown-h3\">$1</h3>',\n );\n processedContent = processedContent.replace(\n /^## (.+)$/gm,\n '<h2 class=\"markdown-h2\">$1</h2>',\n );\n processedContent = processedContent.replace(\n /^# (.+)$/gm,\n '<h1 class=\"markdown-h1\">$1</h1>',\n );\n\n // Links (already escaped, so we look for escaped version)\n processedContent = processedContent.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n\n // Paragraphs - process remaining text blocks\n const blockElements = [\n \"<h1\",\n \"<h2\",\n \"<h3\",\n \"<div\",\n \"<pre\",\n \"<table\",\n \"<ul\",\n \"<ol\",\n \"<blockquote\",\n \"<hr\",\n \"__CODE_BLOCK_\",\n ];\n processedContent = processedContent\n .split(\"\\n\\n\")\n .map((para) => {\n const trimmed = para.trim();\n if (trimmed === \"\") return \"\";\n if (blockElements.some((tag) => trimmed.startsWith(tag))) {\n return para;\n }\n return `<p class=\"markdown-p\">${para.replace(/\\n/g, \"<br>\")}</p>`;\n })\n .filter((p) => p !== \"\")\n .join(\"\\n\");\n\n // Restore code blocks\n for (let i = 0; i < codeBlocks.length; i++) {\n const codeBlock = codeBlocks[i];\n if (codeBlock !== undefined) {\n processedContent = processedContent.replace(\n `__CODE_BLOCK_${i}__`,\n codeBlock,\n );\n }\n }\n\n return processedContent;\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 * Type for tool result map\n */\ntype ToolResultMap = Map<string, ToolResultContent>;\n\n/**\n * Renders tool result content\n */\nconst renderToolResultContent = (result: ToolResultContent): string => {\n const isError = result.is_error === true;\n const errorClass = isError ? \" tool-result-error\" : \"\";\n\n let contentHtml: string;\n if (typeof result.content === \"string\") {\n contentHtml = `<pre class=\"tool-result-text\">${escapeHtml(result.content)}</pre>`;\n } else {\n contentHtml = result.content\n .map((item) => {\n if (item.type === \"text\") {\n return `<pre class=\"tool-result-text\">${escapeHtml(item.text)}</pre>`;\n }\n if (item.type === \"image\") {\n return `<img src=\"data:${item.source.media_type};base64,${item.source.data}\" alt=\"Tool result image\" class=\"tool-result-image\" />`;\n }\n return \"\";\n })\n .join(\"\");\n }\n\n return `\n <div class=\"tool-result-block${errorClass}\">\n <div class=\"tool-result-header\">\n <svg class=\"icon-check\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${isError ? '<path d=\"M18 6L6 18M6 6l12 12\"/>' : '<path d=\"M20 6L9 17l-5-5\"/>'}\n </svg>\n <span class=\"tool-result-label\">${isError ? \"Error\" : \"Result\"}</span>\n </div>\n <div class=\"tool-result-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Sidechain data structure - matches frontend useSidechain logic\n */\ntype SidechainData = {\n // Map from root uuid to all conversations in that sidechain\n groupsByRootUuid: Map<\n string,\n Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>\n >;\n // Map from prompt string to root conversation\n promptToRoot: Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >;\n // Map from agentId to root conversation\n agentIdToRoot: Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >;\n // Map from tool_use_id to agentId (extracted from toolUseResult)\n toolUseIdToAgentId: Map<string, string>;\n};\n\n/**\n * Type guard to check if toolUseResult contains agentId\n */\nconst hasAgentId = (\n toolUseResult: unknown,\n): toolUseResult is { agentId: string } => {\n return (\n typeof toolUseResult === \"object\" &&\n toolUseResult !== null &&\n \"agentId\" in toolUseResult &&\n typeof (toolUseResult as { agentId: unknown }).agentId === \"string\"\n );\n};\n\n/**\n * Builds sidechain data structures matching frontend useSidechain logic\n */\nconst buildSidechainData = (\n conversations: Array<Conversation>,\n): SidechainData => {\n // Filter sidechain conversations\n const sidechainConversations = conversations.filter(\n (conv) =>\n conv.type !== \"summary\" &&\n conv.type !== \"file-history-snapshot\" &&\n conv.type !== \"queue-operation\" &&\n conv.type !== \"progress\" &&\n conv.isSidechain === true,\n ) as Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\n\n // Build uuid -> conversation map for parent lookup\n const uuidMap = new Map(\n sidechainConversations.map((conv) => [conv.uuid, conv] as const),\n );\n\n // Find root conversation for each sidechain conversation\n const getRootConversation = (\n conv: Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>,\n ): Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }> => {\n if (conv.parentUuid === null) {\n return conv;\n }\n const parent = uuidMap.get(conv.parentUuid);\n if (parent === undefined) {\n return conv;\n }\n return getRootConversation(parent);\n };\n\n // Group by root conversation's uuid (matching frontend logic)\n const groupsByRootUuid = new Map<\n string,\n Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>\n >();\n for (const conv of sidechainConversations) {\n const root = getRootConversation(conv);\n const existing = groupsByRootUuid.get(root.uuid);\n if (existing) {\n existing.push(conv);\n } else {\n groupsByRootUuid.set(root.uuid, [conv]);\n }\n }\n\n // Sort each group by timestamp to ensure correct order\n for (const [, convs] of groupsByRootUuid) {\n convs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n }\n\n // Build prompt -> root mapping (for root user messages with string content)\n const promptToRoot = new Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >();\n for (const conv of sidechainConversations) {\n if (\n conv.type === \"user\" &&\n conv.parentUuid === null &&\n typeof conv.message.content === \"string\"\n ) {\n promptToRoot.set(conv.message.content, conv);\n }\n }\n\n // Build agentId -> root mapping\n const agentIdToRoot = new Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >();\n for (const conv of sidechainConversations) {\n if (conv.parentUuid === null && conv.agentId !== undefined) {\n agentIdToRoot.set(conv.agentId, conv);\n }\n }\n\n // Build tool_use_id -> agentId mapping from ALL user messages (not just sidechain)\n // This is the critical mapping that links Task tool calls to their subagent sessions\n const toolUseIdToAgentId = new Map<string, string>();\n for (const conv of conversations) {\n if (\n conv.type === \"summary\" ||\n conv.type === \"file-history-snapshot\" ||\n conv.type === \"queue-operation\" ||\n conv.type === \"progress\"\n ) {\n continue;\n }\n if (conv.type !== \"user\") continue;\n const messageContent = conv.message.content;\n if (typeof messageContent === \"string\") continue;\n\n for (const content of messageContent) {\n if (typeof content === \"string\") continue;\n if (content.type === \"tool_result\") {\n const toolUseResult = conv.toolUseResult;\n if (hasAgentId(toolUseResult)) {\n toolUseIdToAgentId.set(content.tool_use_id, toolUseResult.agentId);\n }\n }\n }\n }\n\n return { groupsByRootUuid, promptToRoot, agentIdToRoot, toolUseIdToAgentId };\n};\n\n/**\n * Renders a single sidechain conversation entry (for nested display)\n */\nconst renderSidechainEntry = (\n entry: Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>,\n toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\n): string => {\n if (entry.type === \"user\") {\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 === \"tool_result\") {\n return \"\"; // Skip tool results in user messages\n }\n return \"\";\n })\n .join(\"\");\n\n if (!contentHtml.trim()) return \"\";\n\n return `\n <div class=\"sidechain-entry sidechain-user-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">User</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">${contentHtml}</div>\n </div>\n `;\n }\n\n if (entry.type === \"assistant\") {\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 collapsed\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"14\" height=\"14\" 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} chars)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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 toolResult = toolResultMap.get(msg.id);\n\n // Check if this is a nested Task tool (recursive subagent)\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\n return `\n <div class=\"tool-use-block collapsible collapsed\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"14\" height=\"14\" 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} params)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n ${toolResultHtml}\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"sidechain-entry sidechain-assistant-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">Subagent</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">${contentHtml}</div>\n </div>\n `;\n }\n\n if (entry.type === \"system\") {\n const content =\n \"content\" in entry && typeof entry.content === \"string\"\n ? entry.content\n : \"System message\";\n return `\n <div class=\"sidechain-entry sidechain-system-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">System</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">\n <div class=\"system-message\">${escapeHtml(content)}</div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n};\n/**\n * Renders a Task tool specially with prompt display and subagent conversations\n */\nconst renderTaskTool = (\n toolId: string,\n input: Record<string, unknown>,\n toolResult: ToolResultContent | undefined,\n sidechainData: SidechainData,\n toolResultMap: ToolResultMap,\n): string => {\n const prompt = typeof input.prompt === \"string\" ? input.prompt : \"\";\n const truncatedPrompt =\n prompt.length > 200 ? `${prompt.slice(0, 200)}...` : prompt;\n\n // Find sidechain conversations using the new data structure\n let sidechainConversations: Array<\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n > = [];\n\n // 1. Try to find by agentId (from tool use result)\n const agentId = sidechainData.toolUseIdToAgentId.get(toolId);\n if (agentId) {\n const rootByAgentId = sidechainData.agentIdToRoot.get(agentId);\n if (rootByAgentId) {\n const convs = sidechainData.groupsByRootUuid.get(rootByAgentId.uuid);\n if (convs) {\n sidechainConversations = convs;\n }\n }\n }\n\n // 2. Fallback: Try to find by prompt\n if (sidechainConversations.length === 0) {\n const rootConversation = sidechainData.promptToRoot.get(prompt);\n if (rootConversation) {\n const convs = sidechainData.groupsByRootUuid.get(rootConversation.uuid);\n if (convs) {\n sidechainConversations = convs;\n }\n }\n }\n\n const hasSidechain = sidechainConversations.length > 0;\n const sidechainHtml = hasSidechain\n ? `\n <div class=\"sidechain-container collapsible\">\n <div class=\"sidechain-header collapsible-trigger\">\n <svg class=\"icon-layers\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\"/>\n <polyline points=\"2 17 12 22 22 17\"/>\n <polyline points=\"2 12 12 17 22 12\"/>\n </svg>\n <span>Subagent Work Log (${sidechainConversations.length} entries)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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=\"sidechain-content collapsible-content\">\n ${sidechainConversations\n .map((conv) =>\n renderSidechainEntry(conv, toolResultMap, sidechainData),\n )\n .filter((html) => html !== \"\")\n .join(\"\\n\")}\n </div>\n </div>\n `\n : \"\";\n\n return `\n <div class=\"task-tool-block collapsible\">\n <div class=\"task-tool-header collapsible-trigger\">\n <svg class=\"icon-task\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\n <path d=\"M9 12l2 2 4-4\"/>\n </svg>\n <span class=\"task-tool-name\">Task${hasSidechain ? ` (${sidechainConversations.length} steps)` : \"\"}</span>\n <span class=\"task-prompt-preview\">${escapeHtml(truncatedPrompt)}</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=\"task-tool-content collapsible-content\">\n <div class=\"task-tool-id\"><strong>Task ID:</strong> <code>${escapeHtml(toolId)}</code></div>\n <div class=\"task-prompt\">\n <strong>Prompt:</strong>\n <div class=\"task-prompt-text\">${renderMarkdown(prompt)}</div>\n </div>\n ${toolResult ? renderToolResultContent(toolResult) : \"\"}\n ${sidechainHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders an assistant message entry\n */\nconst renderAssistantEntry = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\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 toolResult = toolResultMap.get(msg.id);\n\n // Special rendering for Task tool\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\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 ${toolResultHtml}\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 * Gets the content to display for a system entry\n */\nconst getSystemEntryContent = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n if (\"content\" in entry && typeof entry.content === \"string\") {\n return entry.content;\n }\n if (\"subtype\" in entry && entry.subtype === \"stop_hook_summary\") {\n const hookNames = entry.hookInfos.map((h) => h.command).join(\", \");\n return `Stop hook executed: ${hookNames}`;\n }\n return \"System message\";\n};\n\n/**\n * Renders a system message entry\n */\nconst renderSystemEntry = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n const content = getSystemEntryContent(entry);\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(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 toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\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 toolResult = toolResultMap.get(msg.id);\n\n // Special rendering for Task tool\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\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 ${toolResultHtml}\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 agentSessionRepo: IAgentSessionRepository,\n): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n // Identify all agentIds from tool usage in the main session\n const agentIds = new Set<string>();\n\n for (const conv of session.conversations) {\n if (conv.type !== \"user\" || typeof conv.message.content === \"string\") {\n continue;\n }\n\n for (const content of conv.message.content) {\n if (typeof content === \"string\") continue;\n if (content.type === \"tool_result\") {\n const toolUseResult = conv.toolUseResult;\n if (hasAgentId(toolUseResult)) {\n agentIds.add(toolUseResult.agentId);\n }\n }\n }\n }\n\n // Check which agentIds are already present in the session (legacy format)\n const existingAgentIds = new Set<string>();\n for (const conv of session.conversations) {\n if (conv.type === \"x-error\") continue;\n if (\n conv.type !== \"summary\" &&\n conv.type !== \"file-history-snapshot\" &&\n conv.type !== \"queue-operation\" &&\n conv.type !== \"progress\" &&\n conv.isSidechain === true &&\n conv.agentId !== undefined\n ) {\n existingAgentIds.add(conv.agentId);\n }\n }\n\n // Determine missing agentIds\n const missingAgentIds = Array.from(agentIds).filter(\n (id) => !existingAgentIds.has(id),\n );\n\n // Load missing agent sessions\n const loadedConversations: Conversation[] = [];\n\n if (missingAgentIds.length > 0) {\n // Load concurrently\n const loadedSessions = yield* Effect.all(\n missingAgentIds.map((agentId) =>\n agentSessionRepo.getAgentSessionByAgentId(\n projectId,\n agentId,\n session.id,\n ),\n ),\n { concurrency: 5 },\n );\n\n for (const sess of loadedSessions) {\n if (sess) {\n // Verify items are valid conversations (filter out unknowns if any)\n const validConvs = sess.filter(\n (c): c is Conversation =>\n c.type === \"user\" ||\n c.type === \"assistant\" ||\n c.type === \"system\",\n );\n loadedConversations.push(\n ...validConvs.map((c) => ({\n ...c,\n isSidechain: true, // Ensure they are marked as sidechain\n })),\n );\n }\n }\n }\n\n // Combine all conversations for data building\n const allConversations = [\n ...session.conversations.filter(\n (conv): conv is Conversation => conv.type !== \"x-error\",\n ),\n ...loadedConversations,\n ];\n\n // Build sidechain data using ALL conversations\n const sidechainData = buildSidechainData(allConversations);\n\n // Build tool result map from user messages (including loaded sidechain ones)\n const toolResultMap: ToolResultMap = new Map();\n for (const conv of allConversations) {\n // Skip non-conversation types\n if (\n conv.type === \"summary\" ||\n conv.type === \"file-history-snapshot\" ||\n conv.type === \"queue-operation\" ||\n conv.type === \"progress\"\n ) {\n continue;\n }\n if (conv.type !== \"user\") continue;\n const content = conv.message.content;\n if (typeof content === \"string\") continue;\n for (const msg of content) {\n if (typeof msg === \"string\") continue;\n if (msg.type === \"tool_result\") {\n toolResultMap.set(msg.tool_use_id, msg);\n }\n }\n }\n\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 toolResultMap,\n sidechainData,\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, toolResultMap, sidechainData);\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-word;\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 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\n /* Enhanced Markdown Styles */\n .markdown-table {\n width: 100%;\n border-collapse: collapse;\n margin: 1rem 0;\n font-size: 0.875rem;\n }\n\n .markdown-table th,\n .markdown-table td {\n border: 1px solid hsl(var(--border));\n padding: 0.5rem 0.75rem;\n text-align: left;\n }\n\n .markdown-table th {\n background: hsl(var(--muted) / 0.5);\n font-weight: 600;\n }\n\n .markdown-table tr:nth-child(even) {\n background: hsl(var(--muted) / 0.2);\n }\n\n .markdown-blockquote {\n border-left: 4px solid hsl(var(--blue-600));\n padding: 0.75rem 1rem;\n margin: 1rem 0;\n background: hsl(var(--muted) / 0.3);\n color: hsl(var(--muted-foreground));\n font-style: italic;\n }\n\n .markdown-ul,\n .markdown-ol {\n margin: 1rem 0;\n padding-left: 1.5rem;\n }\n\n .markdown-ul li,\n .markdown-ol li {\n margin-bottom: 0.25rem;\n line-height: 1.6;\n }\n\n .markdown-task-list {\n list-style: none;\n padding-left: 0;\n margin: 1rem 0;\n }\n\n .task-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n }\n\n .task-checkbox {\n margin-top: 0.25rem;\n width: 1rem;\n height: 1rem;\n accent-color: hsl(var(--blue-600));\n }\n\n .markdown-hr {\n border: none;\n border-top: 2px solid hsl(var(--border));\n margin: 2rem 0;\n }\n\n .markdown-del {\n text-decoration: line-through;\n color: hsl(var(--muted-foreground));\n }\n\n /* Tool Result Styles */\n .tool-result-block {\n margin-top: 0.75rem;\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n overflow: scroll;\n }\n\n .tool-result-error {\n border-color: hsl(0 84% 60%);\n }\n\n .tool-result-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n background: hsl(var(--muted) / 0.3);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .tool-result-error .tool-result-header {\n background: hsl(0 84% 60% / 0.1);\n color: hsl(0 84% 40%);\n }\n\n .icon-check {\n flex-shrink: 0;\n color: hsl(142 76% 36%);\n }\n\n .tool-result-error .icon-check {\n color: hsl(0 84% 60%);\n }\n\n .tool-result-label {\n font-weight: 500;\n }\n\n .tool-result-content {\n padding: 0.75rem;\n background: hsl(var(--background));\n }\n\n .tool-result-text {\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: break-word;\n margin: 0;\n }\n\n .tool-result-image {\n max-width: 100%;\n height: auto;\n border-radius: 0.25rem;\n }\n\n /* Task Tool Styles */\n .task-tool-block {\n border: 1px solid hsl(142 76% 36% / 0.3);\n background: hsl(142 76% 36% / 0.05);\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .task-tool-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n background: hsl(142 76% 36% / 0.1);\n transition: background 0.2s;\n }\n\n .task-tool-header:hover {\n background: hsl(142 76% 36% / 0.15);\n }\n\n .icon-task {\n color: hsl(142 76% 36%);\n flex-shrink: 0;\n }\n\n .task-tool-name {\n font-size: 0.875rem;\n font-weight: 600;\n color: hsl(142 76% 30%);\n }\n\n .task-prompt-preview {\n flex: 1;\n font-size: 0.75rem;\n color: hsl(var(--muted-foreground));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .task-tool-content {\n padding: 0.75rem 1rem;\n border-top: 1px solid hsl(142 76% 36% / 0.2);\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .task-tool-id {\n font-size: 0.75rem;\n }\n\n .task-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(142 76% 36% / 0.2);\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .task-prompt {\n font-size: 0.875rem;\n }\n\n .task-prompt-text {\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 }\n\n /* Sidechain / Subagent Styles */\n .sidechain-container {\n margin-top: 1rem;\n border: 1px solid hsl(217 91% 60% / 0.3);\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .sidechain-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: hsl(217 91% 60% / 0.1);\n color: hsl(217 91% 40%);\n font-size: 0.8rem;\n font-weight: 500;\n cursor: pointer;\n }\n\n .sidechain-header:hover {\n background: hsl(217 91% 60% / 0.15);\n }\n\n .icon-layers {\n flex-shrink: 0;\n }\n\n .sidechain-content {\n padding: 0.75rem;\n background: hsl(217 91% 60% / 0.02);\n border-top: 1px solid hsl(217 91% 60% / 0.2);\n }\n\n .sidechain-entry {\n margin-left: 1rem;\n padding: 0.5rem 0.75rem;\n border-left: 2px solid hsl(217 91% 60% / 0.3);\n margin-bottom: 0.5rem;\n }\n\n .sidechain-entry:last-child {\n margin-bottom: 0;\n }\n\n .sidechain-entry-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n font-size: 0.75rem;\n }\n\n .sidechain-role {\n font-weight: 600;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n }\n\n .sidechain-user-entry .sidechain-role {\n background: hsl(var(--muted));\n color: hsl(var(--foreground));\n }\n\n .sidechain-assistant-entry .sidechain-role {\n background: hsl(217 91% 60% / 0.1);\n color: hsl(217 91% 40%);\n }\n\n .sidechain-system-entry .sidechain-role {\n background: hsl(var(--muted) / 0.5);\n color: hsl(var(--muted-foreground));\n }\n\n .sidechain-timestamp {\n color: hsl(var(--muted-foreground));\n }\n\n .sidechain-entry-content {\n font-size: 0.875rem;\n }\n\n .sidechain-entry .thinking-block,\n .sidechain-entry .tool-use-block {\n margin: 0.5rem 0;\n font-size: 0.8rem;\n }\n\n .sidechain-entry .thinking-header,\n .sidechain-entry .tool-use-header {\n padding: 0.375rem 0.5rem;\n }\n\n .sidechain-entry .thinking-content,\n .sidechain-entry .tool-use-content {\n padding: 0.5rem;\n }\n\n /* Optimize content display */\n .entry-content > *:first-child {\n margin-top: 0;\n }\n\n .entry-content > *:last-child {\n margin-bottom: 0;\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 { Context, Effect, Layer } from \"effect\";\nimport type { TaskCreate, TaskUpdate } from \"../schema\";\nimport { TasksService } from \"../services/TasksService\";\n\nconst make = Effect.gen(function* () {\n const service = yield* TasksService;\n\n const listTasks = (projectPath: string, specificSessionId?: string) =>\n service.listTasks(projectPath, specificSessionId);\n\n const createTask = (\n projectPath: string,\n task: TaskCreate,\n specificSessionId?: string,\n ) => service.createTask(projectPath, task, specificSessionId);\n\n const updateTask = (\n projectPath: string,\n task: TaskUpdate,\n specificSessionId?: string,\n ) => service.updateTask(projectPath, task, specificSessionId);\n\n return {\n listTasks,\n createTask,\n updateTask,\n };\n});\n\nexport class TasksController extends Context.Tag(\"TasksController\")<\n TasksController,\n Effect.Effect.Success<typeof make>\n>() {\n static Live = Layer.effect(this, make);\n}\n", "/** @effect-diagnostics globalErrorInEffectFailure:skip-file */\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport {\n type Task,\n type TaskCreate,\n TaskSchema,\n type TaskUpdate,\n} from \"../schema\";\n\nconst TASKS_DIR_NAME = \"tasks\";\nconst PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_DIR_NAME = \".claude\";\n\nexport class TasksService extends Context.Tag(\"TasksService\")<\n TasksService,\n {\n listTasks: (\n projectPath: string,\n specificSessionId?: string,\n ) => Effect.Effect<Task[], Error>;\n getTask: (\n projectPath: string,\n taskId: string,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\n createTask: (\n projectPath: string,\n task: TaskCreate,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\n updateTask: (\n projectPath: string,\n task: TaskUpdate,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\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\n // Helper to find the Global Claude Directory\n const getClaudeDir = () =>\n Effect.succeed(join(homedir(), CLAUDE_DIR_NAME));\n\n const normalizeProjectPath = (projectPath: string) => {\n // e.g. /Users/foo/bar -> -Users-foo-bar\n const normalized = projectPath.replaceAll(path.sep, \"-\");\n // Ensure it starts with - if the original path started with /\n return normalized.startsWith(\"-\") ? normalized : `-${normalized}`;\n };\n\n /**\n * Resolves the project UUID for a given project path.\n * Returns Option.none() when:\n * - Project metadata directory doesn't exist\n * - No UUID file found in project metadata directory\n * - Specific sessionId is provided but its tasks directory doesn't exist\n * Returns Option.some(uuid) when resolution succeeds.\n */\n const resolveProjectUuid = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<Option.Option<string>, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n\n // If a specific session ID is provided, verify it exists and return it\n if (specificSessionId) {\n const sessionTasksDir = path.join(\n claudeDir,\n TASKS_DIR_NAME,\n specificSessionId,\n );\n if (yield* fs.exists(sessionTasksDir)) {\n return Option.some(specificSessionId);\n }\n // Return none when requested session has no tasks directory\n return Option.none<string>();\n }\n\n // Check if the projectPath is already pointing to a metadata directory in .claude/projects\n // Path structure: .../.claude/projects/<normalized-id>\n const isMetadataPath =\n projectPath.includes(join(CLAUDE_DIR_NAME, PROJECTS_DIR_NAME)) &&\n projectPath.split(path.sep).pop()?.startsWith(\"-\");\n\n let projectMetaDir: string;\n\n if (isMetadataPath && (yield* fs.exists(projectPath))) {\n projectMetaDir = projectPath;\n } else {\n const identifier = normalizeProjectPath(projectPath);\n projectMetaDir = path.join(\n claudeDir,\n PROJECTS_DIR_NAME,\n identifier,\n );\n }\n\n // Check if directory exists\n const exists = yield* fs.exists(projectMetaDir);\n if (!exists) {\n return Option.none<string>();\n }\n\n // Read directory to find all UUID-like files (json, jsonl, or no extension)\n const files = yield* fs.readDirectory(projectMetaDir);\n\n const uuidPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;\n\n const candidates = files.filter((f) => uuidPattern.test(f));\n\n if (candidates.length === 0) {\n return Option.none<string>();\n }\n\n // Analyze candidates: valid UUID, mtime, and whether they have a tasks directory\n const candidateInfo = yield* Effect.all(\n candidates.map((file) =>\n Effect.gen(function* () {\n const fullPath = path.join(projectMetaDir, file);\n const stat = yield* fs.stat(fullPath);\n const match = file.match(uuidPattern);\n const uuid = match ? match[0] : file;\n\n const tasksPath = path.join(claudeDir, TASKS_DIR_NAME, uuid);\n const hasTasks = yield* fs.exists(tasksPath);\n\n return {\n file,\n uuid,\n mtime: Option.getOrElse(stat.mtime, () => new Date(0)),\n hasTasks,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n // Sort logic:\n // 1. Has tasks directory (Priority #1)\n // 2. Newer mtime (Priority #2)\n const sorted = candidateInfo.sort((a, b) => {\n if (a.hasTasks && !b.hasTasks) return -1;\n if (!a.hasTasks && b.hasTasks) return 1;\n return b.mtime.getTime() - a.mtime.getTime();\n });\n\n const best = sorted[0];\n\n if (!best) {\n return Option.none<string>();\n }\n\n return Option.some(best.uuid);\n });\n\n /**\n * Resolves the project UUID, but fails with an error when resolution fails.\n * Used by operations that require a valid project (getTask, createTask, updateTask).\n */\n const resolveProjectUuidOrFail = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const uuidOption = yield* resolveProjectUuid(\n projectPath,\n specificSessionId,\n );\n\n if (Option.isNone(uuidOption)) {\n if (specificSessionId) {\n return yield* Effect.fail(\n new Error(\n `Requested session ${specificSessionId} has no tasks directory`,\n ),\n );\n }\n const claudeDir = yield* getClaudeDir();\n const identifier = normalizeProjectPath(projectPath);\n const projectMetaDir = path.join(\n claudeDir,\n PROJECTS_DIR_NAME,\n identifier,\n );\n return yield* Effect.fail(\n new Error(\n `Project metadata directory not found or no UUID: ${projectMetaDir}`,\n ),\n );\n }\n\n return uuidOption.value;\n });\n\n /**\n * Gets the tasks directory path for a given project.\n * Returns Option.none() when resolution fails.\n * Used by listTasks for graceful handling of missing directories.\n */\n const getTasksDir = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<Option.Option<string>, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n const uuidOption = yield* resolveProjectUuid(\n projectPath,\n specificSessionId,\n );\n\n return Option.map(uuidOption, (uuid) =>\n path.join(claudeDir, TASKS_DIR_NAME, uuid),\n );\n });\n\n /**\n * Gets the tasks directory path, but fails with an error when resolution fails.\n * Used by operations that require a valid directory (getTask, createTask, updateTask).\n */\n const getTasksDirOrFail = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n const uuid = yield* resolveProjectUuidOrFail(\n projectPath,\n specificSessionId,\n );\n return path.join(claudeDir, TASKS_DIR_NAME, uuid);\n });\n\n const listTasks = (projectPath: string, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDirOption = yield* getTasksDir(\n projectPath,\n specificSessionId,\n );\n\n if (Option.isNone(tasksDirOption)) {\n return [];\n }\n\n const tasksDir = tasksDirOption.value;\n\n const exists = yield* fs.exists(tasksDir);\n if (!exists) {\n return [];\n }\n\n const files = yield* fs.readDirectory(tasksDir);\n const tasks: Task[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const content = yield* fs.readFileString(path.join(tasksDir, file));\n try {\n const task = JSON.parse(content);\n // Validate with schema optionally\n const parsed = TaskSchema.safeParse(task);\n if (parsed.success) {\n tasks.push(parsed.data);\n } else {\n console.warn(`Invalid task file ${file}:`, parsed.error);\n // Create a fallback task for invalid schema\n const fallbackTask: Task = {\n id:\n typeof task === \"object\" &&\n task !== null &&\n \"id\" in task &&\n typeof task.id === \"string\"\n ? task.id\n : file.replace(\".json\", \"\"),\n subject:\n typeof task === \"object\" &&\n task !== null &&\n \"subject\" in task &&\n typeof task.subject === \"string\"\n ? task.subject\n : typeof task === \"object\" &&\n task !== null &&\n \"title\" in task &&\n typeof task.title === \"string\"\n ? task.title\n : \"Invalid Task Schema\",\n description: `Validation Error: ${JSON.stringify(parsed.error.format())}. Raw: ${JSON.stringify(task)}`,\n status:\n typeof task === \"object\" &&\n task !== null &&\n \"status\" in task &&\n typeof task.status === \"string\" &&\n (task.status === \"pending\" ||\n task.status === \"in_progress\" ||\n task.status === \"completed\" ||\n task.status === \"failed\")\n ? task.status\n : \"failed\",\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n } catch (e) {\n console.error(`Failed to parse task file ${file}`, e);\n const fallbackTask: Task = {\n id: file.replace(\".json\", \"\"),\n subject: \"Corrupted Task File\",\n description: String(e),\n status: \"failed\",\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n }\n\n return tasks.sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10));\n });\n\n const getTask = (\n projectPath: string,\n taskId: string,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n const taskFile = path.join(tasksDir, `${taskId}.json`);\n\n const exists = yield* fs.exists(taskFile);\n if (!exists) {\n return yield* Effect.fail(new Error(`Task ${taskId} not found`));\n }\n\n const content = yield* fs.readFileString(taskFile);\n const task = JSON.parse(content);\n return yield* Effect.try(() => TaskSchema.parse(task));\n });\n\n const createTask = (\n projectPath: string,\n taskDef: TaskCreate,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n // Ensure directory exists\n const dirExists = yield* fs.exists(tasksDir);\n if (!dirExists) {\n yield* fs.makeDirectory(tasksDir, { recursive: true });\n }\n\n // Generate ID: find max ID and increment\n const files = yield* fs.readDirectory(tasksDir);\n let maxId = 0;\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const idPart = file.replace(\".json\", \"\");\n const idNum = parseInt(idPart, 10);\n if (!Number.isNaN(idNum) && idNum > maxId) {\n maxId = idNum;\n }\n }\n }\n const newId = (maxId + 1).toString();\n\n const newTask: Task = {\n id: newId,\n status: \"pending\",\n blocks: [],\n blockedBy: [],\n ...taskDef,\n };\n\n const filePath = path.join(tasksDir, `${newId}.json`);\n yield* fs.writeFileString(filePath, JSON.stringify(newTask, null, 2));\n\n return newTask;\n });\n\n const updateTask = (\n projectPath: string,\n update: TaskUpdate,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n const filePath = path.join(tasksDir, `${update.taskId}.json`);\n\n const exists = yield* fs.exists(filePath);\n if (!exists) {\n return yield* Effect.fail(\n new Error(`Task ${update.taskId} not found`),\n );\n }\n\n const content = yield* fs.readFileString(filePath);\n const currentTask = TaskSchema.parse(JSON.parse(content));\n\n const updatedTask: Task = {\n ...currentTask,\n // User cannot update status via Viewer, it is managed by Claude Agent\n status: currentTask.status,\n subject: update.subject ?? currentTask.subject,\n description: update.description ?? currentTask.description,\n activeForm: update.activeForm ?? currentTask.activeForm,\n owner: update.owner ?? currentTask.owner,\n blockedBy: update.addBlockedBy\n ? [...(currentTask.blockedBy || []), ...update.addBlockedBy]\n : currentTask.blockedBy,\n blocks: update.addBlocks\n ? [...(currentTask.blocks || []), ...update.addBlocks]\n : currentTask.blocks,\n metadata: update.metadata\n ? { ...currentTask.metadata, ...update.metadata }\n : currentTask.metadata,\n };\n\n // Remove null metadata keys\n if (updatedTask.metadata) {\n for (const key in updatedTask.metadata) {\n if (updatedTask.metadata[key] === null) {\n delete updatedTask.metadata[key];\n }\n }\n }\n\n yield* fs.writeFileString(\n filePath,\n JSON.stringify(updatedTask, null, 2),\n );\n return updatedTask;\n });\n\n return {\n listTasks,\n getTask,\n createTask,\n updateTask,\n };\n }),\n );\n}\n", "import { z } from \"zod\";\n\nexport const TaskStatusSchema = z.enum([\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"failed\",\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskSchema = z.object({\n id: z.string(),\n subject: z.string(),\n description: z.string().optional(),\n status: TaskStatusSchema,\n owner: z.string().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n activeForm: z.string().optional(),\n});\n\nexport type Task = z.infer<typeof TaskSchema>;\n\nexport const TaskCreateSchema = z.object({\n subject: z.string(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type TaskCreate = z.infer<typeof TaskCreateSchema>;\n\nexport const TaskUpdateSchema = z.object({\n taskId: z.string(),\n status: TaskStatusSchema.optional(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n owner: z.string().optional(),\n addBlockedBy: z.array(z.string()).optional(),\n addBlocks: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type TaskUpdate = z.infer<typeof TaskUpdateSchema>;\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 { RateLimitAutoScheduleService } from \"../core/rate-limit/services/RateLimitAutoScheduleService\";\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 const rateLimitAutoScheduleService = yield* RateLimitAutoScheduleService;\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 // Rate limit auto-schedule service \u3092\u958B\u59CB\n yield* rateLimitAutoScheduleService.start();\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* rateLimitAutoScheduleService.stop();\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 { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService\";\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 ccvOptionsService = yield* CcvOptionsService;\n\n return Effect.gen(function* () {\n const anthPassword = yield* ccvOptionsService.getCcvOptions(\"password\");\n const authEnabled = anthPassword !== undefined;\n const validSessionToken = generateSessionToken(anthPassword);\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});\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 {\n CcvOptionsService,\n type CliOptions,\n} from \"../core/platform/services/CcvOptionsService\";\nimport { EnvService } from \"../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../core/platform/services/UserConfigService\";\nimport { decodeProjectId } from \"../core/project/functions/id\";\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 { TasksController } from \"../core/tasks/presentation/TasksController\";\nimport { TaskCreateSchema, TaskUpdateSchema } from \"../core/tasks/schema\";\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, options: CliOptions) =>\n Effect.gen(function* () {\n const ccvOptionsService = yield* CcvOptionsService;\n yield* ccvOptionsService.loadCliOptions(options);\n\n // services\n // const ccvOptionsService = yield* CcvOptionsService;\n const envService = yield* EnvService;\n const userConfigService = yield* UserConfigService;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const initializeService = yield* InitializeService;\n\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 const tasksController = yield* TasksController;\n\n // middleware\n const authMiddlewareService = yield* AuthMiddleware;\n const { authMiddleware, validSessionToken, authEnabled, anthPassword } =\n yield* authMiddlewareService;\n\n const runtime = yield* Effect.runtime<\n | CcvOptionsService\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 .delete(\"/api/projects/:projectId/sessions/:sessionId\", async (c) => {\n const response = await effectToResponse(\n c,\n sessionController\n .deleteSession({ ...c.req.param() })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n .get(\n \"/api/projects/:projectId/agent-sessions/:agentId\",\n zValidator(\"query\", z.object({ sessionId: z.string().optional() })),\n async (c) => {\n const { projectId, agentId } = c.req.param();\n const { sessionId } = c.req.valid(\"query\");\n\n const response = await effectToResponse(\n c,\n agentSessionController\n .getAgentSession({\n projectId,\n agentId,\n sessionId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\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 * TasksController Routes\n */\n .get(\n \"/api/tasks\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n async (c) => {\n const { projectId, sessionId } = c.req.valid(\"query\");\n const projectPath = decodeProjectId(projectId);\n\n const response = await effectToResponse(\n c,\n tasksController.listTasks(projectPath, sessionId).pipe(\n Effect.map((tasks) => ({\n status: 200 as const,\n response: tasks,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n )\n .post(\n \"/api/tasks\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n zValidator(\"json\", TaskCreateSchema),\n async (c) => {\n const { projectId, sessionId } = c.req.valid(\"query\");\n const body = c.req.valid(\"json\");\n const projectPath = decodeProjectId(projectId);\n\n const response = await effectToResponse(\n c,\n tasksController.createTask(projectPath, body, sessionId).pipe(\n Effect.map((task) => ({\n status: 200 as const,\n response: task,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n )\n .patch(\n \"/api/tasks/:id\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n zValidator(\"json\", TaskUpdateSchema.omit({ taskId: true })),\n async (c) => {\n const { id } = c.req.param();\n const { projectId, sessionId } = c.req.valid(\"query\");\n const body = c.req.valid(\"json\");\n const projectPath = decodeProjectId(projectId);\n\n const response = await effectToResponse(\n c,\n tasksController\n .updateTask(projectPath, { ...body, taskId: id }, sessionId)\n .pipe(\n Effect.map((task) => ({\n status: 200 as const,\n response: task,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n )\n );\n });\n\nexport type RouteType =\n ReturnType<typeof routes> extends Effect.Effect<infer A, unknown, unknown>\n ? A\n : never;\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 searchHotkey: z.enum([\"ctrl-k\", \"command-k\"]).optional().default(\"command-k\"),\n autoScheduleContinueOnRateLimit: z.boolean().optional().default(false),\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 { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService\";\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 CcvOptionsService.Live,\n).pipe(\n Layer.provide(EnvService.Live),\n Layer.provide(CcvOptionsService.Live),\n Layer.provide(NodeContext.layer),\n);\n"],
|
|
5
|
-
"mappings": "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AA;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;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;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;AA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",
|
|
6
|
-
"names": ["Command", "Effect", "readFile", "resolve", "NodeContext", "Effect", "Layer", "Layer", "Effect", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "Effect", "content", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "Layer", "Context", "Effect", "Layer", "getOptionalEnv", "LayerImpl", "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", "Effect", "FileSystem", "Path", "Effect", "FileSystem", "Path", "z", "Context", "Data", "Effect", "Layer", "Path", "Effect", "Effect", "Path", "query", "options", "
|
|
3
|
+
"sources": ["../src/server/main.ts", "../package.json", "../src/server/core/platform/services/DeprecatedEnvDetector.ts", "../src/server/startServer.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/ProgressEntrySchema.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/CcvOptionsService.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/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/file-system/functions/getFileContent.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/platform/services/EnvService.ts", "../src/server/core/platform/schema.ts", "../src/server/core/git/functions/parseGitBranchesOutput.ts", "../src/server/core/git/functions/parseGitCommitsOutput.ts", "../src/server/core/platform/ccvEnv.ts", "../src/server/core/project/presentation/ProjectController.ts", "../src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts", "../src/server/core/rate-limit/services/RateLimitAutoScheduleService.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/rate-limit/schema.ts", "../src/server/core/rate-limit/functions/detectRateLimitFromLastLine.ts", "../src/server/core/rate-limit/functions/parseRateLimitResetTime.ts", "../src/server/core/rate-limit/functions/readLastLine.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/core/tasks/presentation/TasksController.ts", "../src/server/core/tasks/services/TasksService.ts", "../src/server/core/tasks/schema.ts", "../src/server/core/terminal/TerminalService.ts", "../src/server/core/terminal/normalizePtyChunk.ts", "../src/server/core/terminal/rusptyAdapter.ts", "../src/server/hono/app.ts", "../src/server/hono/initialize.ts", "../src/server/hono/middleware/auth.middleware.ts", "../src/server/hono/routes/index.ts", "../src/server/lib/config/config.ts", "../src/lib/i18n/schema.ts", "../src/server/hono/middleware/config.middleware.ts", "../src/server/lib/config/parseUserConfig.ts", "../src/server/hono/runtime.ts", "../src/server/hono/routes/authRoutes.ts", "../src/server/hono/routes/claudeCodeRoutes.ts", "../src/server/core/claude-code/schema.ts", "../src/server/lib/effect/toEffectResponse.ts", "../src/server/hono/routes/featureFlagRoutes.ts", "../src/server/hono/routes/fileSystemRoutes.ts", "../src/server/hono/routes/projectRoutes.ts", "../src/server/core/git/schema.ts", "../src/server/hono/routes/schedulerRoutes.ts", "../src/server/hono/routes/searchRoutes.ts", "../src/server/hono/routes/sseRoutes.ts", "../src/server/hono/routes/tasksRoutes.ts", "../src/server/lib/effect/layers.ts", "../src/server/terminal/terminalWebSocket.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { Effect } from \"effect\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport type { CliOptions } from \"./core/platform/services/CcvOptionsService\";\nimport { checkDeprecatedEnvs } from \"./core/platform/services/DeprecatedEnvDetector\";\nimport { startServer } from \"./startServer\";\n\nconst program = new Command();\n\nprogram\n .name(packageJson.name)\n .version(packageJson.version)\n .description(packageJson.description);\n\n// start server\nprogram\n .option(\"-p, --port <port>\", \"port to listen on\")\n .option(\"-h, --hostname <hostname>\", \"hostname to listen on\")\n .option(\"-P, --password <password>\", \"password to authenticate\")\n .option(\"-e, --executable <executable>\", \"path to claude code executable\")\n .option(\"--claude-dir <claude-dir>\", \"path to claude directory\")\n .option(\n \"--terminal-disabled\",\n \"disable the in-app terminal panel when enabled\",\n )\n .option(\"--terminal-shell <path>\", \"shell executable for terminal sessions\")\n .option(\n \"--terminal-unrestricted\",\n \"disable restricted shell flags for bash sessions\",\n )\n .action(async (options: CliOptions) => {\n // Check for deprecated environment variables and show migration guide\n await Effect.runPromise(checkDeprecatedEnvs);\n\n await startServer(options);\n });\n\n/* Other Commands Here */\n\nconst main = async () => {\n program.parse(process.argv);\n};\n\nmain().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.6.0-beta.2\",\n \"description\": \"A full-featured web-based Claude Code client that provides complete interactive functionality for managing Claude Code projects.\",\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\": \"CCV_ENV=development tsx watch --env-file-if-exists=.env.local src/server/main.ts\",\n \"start\": \"node dist/main.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\": \"tsgo --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 \"prepack\": \"pnpm build\",\n \"prepare\": \"lefthook install\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.20\",\n \"@anthropic-ai/claude-code\": \"2.1.29\",\n \"@anthropic-ai/sdk\": \"0.71.2\",\n \"@effect/cluster\": \"0.56.1\",\n \"@effect/experimental\": \"0.58.0\",\n \"@effect/platform\": \"0.94.2\",\n \"@effect/platform-node\": \"0.104.1\",\n \"@effect/rpc\": \"0.73.0\",\n \"@effect/sql\": \"0.49.0\",\n \"@effect/workflow\": \"0.16.0\",\n \"@hono/node-server\": \"1.19.9\",\n \"@hono/zod-validator\": \"0.7.6\",\n \"@hookform/resolvers\": \"^5.2.2\",\n \"@lingui/core\": \"5.9.0\",\n \"@lingui/react\": \"5.9.0\",\n \"@radix-ui/react-avatar\": \"1.1.11\",\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.4\",\n \"@radix-ui/react-tabs\": \"1.1.13\",\n \"@radix-ui/react-tooltip\": \"1.2.8\",\n \"@replit/ruspty\": \"^3.6.0\",\n \"@tailwindcss/vite\": \"4.1.18\",\n \"@tanstack/react-devtools\": \"0.9.2\",\n \"@tanstack/react-query\": \"5.90.20\",\n \"@tanstack/react-router\": \"1.156.0\",\n \"@tanstack/react-router-devtools\": \"1.156.0\",\n \"@xterm/addon-fit\": \"0.10.0\",\n \"@xterm/xterm\": \"5.5.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"cmdk\": \"^1.1.1\",\n \"commander\": \"^14.0.2\",\n \"date-fns\": \"4.1.0\",\n \"effect\": \"3.19.15\",\n \"es-toolkit\": \"1.44.0\",\n \"hono\": \"4.11.5\",\n \"jotai\": \"2.16.2\",\n \"lucide-react\": \"0.563.0\",\n \"minisearch\": \"7.2.0\",\n \"parse-git-diff\": \"0.0.19\",\n \"prexit\": \"2.3.0\",\n \"radix-ui\": \"^1.4.3\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"react-error-boundary\": \"6.1.0\",\n \"react-hook-form\": \"^7.71.1\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"16.1.0\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.4.0\",\n \"ulid\": \"3.0.2\",\n \"ws\": \"8.18.3\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.12\",\n \"@effect/language-service\": \"0.72.0\",\n \"@lingui/cli\": \"5.9.0\",\n \"@lingui/conf\": \"5.9.0\",\n \"@lingui/format-json\": \"5.9.0\",\n \"@lingui/loader\": \"5.9.0\",\n \"@lingui/vite-plugin\": \"5.9.0\",\n \"@tailwindcss/postcss\": \"4.1.18\",\n \"@tanstack/router-plugin\": \"1.156.0\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/node\": \"25.0.10\",\n \"@types/react\": \"19.2.9\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@types/ws\": \"8.18.0\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260207.1\",\n \"@vitejs/plugin-react-swc\": \"4.2.2\",\n \"dotenv\": \"17.2.3\",\n \"esbuild\": \"0.27.2\",\n \"lefthook\": \"2.0.15\",\n \"npm-run-all2\": \"8.0.4\",\n \"playwright\": \"1.58.0\",\n \"release-it\": \"19.2.4\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.1.18\",\n \"tsx\": \"4.21.0\",\n \"tw-animate-css\": \"1.4.0\",\n \"typescript\": \"5.9.3\",\n \"vite\": \"7.3.1\",\n \"vitest\": \"4.0.18\"\n },\n \"packageManager\": \"pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316\"\n}\n", "import { Console, Effect } from \"effect\";\n\ntype DeprecationWarning = {\n type: \"removed\" | \"deprecated\";\n envKey: string;\n message: string;\n suggestion: string;\n};\n\ntype DeprecatedEnvConfig = {\n type: \"removed\" | \"deprecated\";\n newEnv: string | null;\n cliOption: string;\n};\n\nconst DEPRECATED_ENVS: Record<string, DeprecatedEnvConfig> = {\n // Removed in PR #101\n CLAUDE_CODE_VIEWER_AUTH_PASSWORD: {\n type: \"removed\",\n newEnv: \"CCV_PASSWORD\",\n cliOption: \"--password\",\n },\n CLAUDE_CODE_VIEWER_CC_EXECUTABLE_PATH: {\n type: \"removed\",\n newEnv: \"CCV_CC_EXECUTABLE_PATH\",\n cliOption: \"--executable\",\n },\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n return process.env[key] ?? undefined;\n};\n\nconst detectDeprecatedEnvs = (): DeprecationWarning[] => {\n const warnings: DeprecationWarning[] = [];\n\n for (const [envKey, config] of Object.entries(DEPRECATED_ENVS)) {\n const value = getOptionalEnv(envKey);\n if (value !== undefined) {\n if (config.type === \"removed\") {\n warnings.push({\n type: \"removed\",\n envKey,\n message: `Environment variable ${envKey} has been removed.`,\n suggestion: config.newEnv\n ? `Please use ${config.newEnv} environment variable or ${config.cliOption} CLI option instead.`\n : `Please use ${config.cliOption} CLI option instead.`,\n });\n } else {\n warnings.push({\n type: \"deprecated\",\n envKey,\n message: `Environment variable ${envKey} is deprecated and will be removed in a future release.`,\n suggestion: config.newEnv\n ? `Please migrate to ${config.newEnv} environment variable or ${config.cliOption} CLI option.`\n : `Please use ${config.cliOption} CLI option instead.`,\n });\n }\n }\n }\n\n return warnings;\n};\n\nconst formatWarning = (warning: DeprecationWarning): string => {\n const prefix = warning.type === \"removed\" ? \"\u274C REMOVED\" : \"\u26A0\uFE0F DEPRECATED\";\n return `${prefix}: ${warning.message}\\n \u2192 ${warning.suggestion}`;\n};\n\nexport const checkDeprecatedEnvs = Effect.gen(function* () {\n const warnings = detectDeprecatedEnvs();\n\n if (warnings.length === 0) {\n return;\n }\n\n const hasRemovedEnvs = warnings.some((warning) => warning.type === \"removed\");\n\n yield* Console.log(\"\");\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\" Migration Guide\");\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\"\");\n\n for (const warning of warnings) {\n yield* Console.log(formatWarning(warning));\n yield* Console.log(\"\");\n }\n\n yield* Console.log(\"For more details, see:\");\n yield* Console.log(\n \" https://github.com/d-kimuson/claude-code-viewer#configuration\",\n );\n yield* Console.log(\"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\");\n yield* Console.log(\"\");\n\n if (hasRemovedEnvs) {\n yield* Effect.fail(\n new Error(\n \"Cannot start server: removed environment variables detected. Please update your configuration.\",\n ),\n );\n }\n});\n", "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { NodeContext } from \"@effect/platform-node\";\nimport { createAdaptorServer } from \"@hono/node-server\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { Effect, Layer } 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 { isDevelopmentEnv } from \"./core/platform/ccvEnv\";\nimport type { CliOptions } from \"./core/platform/services/CcvOptionsService\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService\";\nimport { RateLimitAutoScheduleService } from \"./core/rate-limit/services/RateLimitAutoScheduleService\";\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 { TasksController } from \"./core/tasks/presentation/TasksController\";\nimport { TasksService } from \"./core/tasks/services/TasksService\";\nimport { TerminalService } from \"./core/terminal/TerminalService\";\nimport { honoApp } from \"./hono/app\";\nimport { InitializeService } from \"./hono/initialize\";\nimport { AuthMiddleware } from \"./hono/middleware/auth.middleware\";\nimport { routes } from \"./hono/routes\";\nimport { platformLayer } from \"./lib/effect/layers\";\nimport { setupTerminalWebSocket } from \"./terminal/terminalWebSocket\";\n\nexport const startServer = async (options: CliOptions) => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n const isDevelopment = isDevelopmentEnv(process.env.CCV_ENV);\n\n if (!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\n const server = createAdaptorServer({\n fetch: honoApp.fetch,\n });\n\n const program = Effect.gen(function* () {\n yield* routes(honoApp, options);\n yield* setupTerminalWebSocket(server);\n })\n // \u4F9D\u5B58\u306E\u6D45\u3044\u9806\u306B\u30B3\u30F3\u30C6\u30CA\u306B pipe \u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\n .pipe(Effect.provide(MainLayer), Effect.scoped);\n\n await Effect.runPromise(program);\n\n const 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 (options.port ?? process.env.PORT ?? \"3000\");\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n const hostname = options.hostname ?? process.env.HOSTNAME ?? \"localhost\";\n\n server.listen(parseInt(port, 10), hostname, () => {\n const info = server.address();\n const serverPort =\n typeof info === \"object\" && info !== null ? info.port : port;\n console.log(`Server is running on http://${hostname}:${serverPort}`);\n });\n};\n\nconst PlatformLayer = Layer.mergeAll(platformLayer, NodeContext.layer);\n\nconst InfraBasics = Layer.mergeAll(\n VirtualConversationDatabase.Live,\n ProjectMetaService.Live,\n SessionMetaService.Live,\n);\n\nconst InfraRepos = Layer.mergeAll(\n ProjectRepository.Live,\n SessionRepository.Live,\n).pipe(Layer.provideMerge(InfraBasics));\n\nconst InfraLayer = AgentSessionLayer.pipe(Layer.provideMerge(InfraRepos));\n\nconst DomainBase = Layer.mergeAll(\n ClaudeCodePermissionService.Live,\n ClaudeCodeSessionProcessService.Live,\n ClaudeCodeService.Live,\n GitService.Live,\n SchedulerService.Live,\n SchedulerConfigBaseDir.Live,\n SearchService.Live,\n TasksService.Live,\n);\n\nconst DomainLayer = ClaudeCodeLifeCycleService.Live.pipe(\n Layer.provideMerge(DomainBase),\n);\n\nconst AppServices = Layer.mergeAll(\n FileWatcherService.Live,\n RateLimitAutoScheduleService.Live,\n AuthMiddleware.Live,\n TerminalService.Live,\n);\n\nconst ApplicationLayer = InitializeService.Live.pipe(\n Layer.provideMerge(AppServices),\n);\n\nconst PresentationLayer = Layer.mergeAll(\n ProjectController.Live,\n SessionController.Live,\n AgentSessionController.Live,\n GitController.Live,\n ClaudeCodeController.Live,\n ClaudeCodeSessionProcessController.Live,\n ClaudeCodePermissionController.Live,\n FileSystemController.Live,\n SSEController.Live,\n SchedulerController.Live,\n FeatureFlagController.Live,\n SearchController.Live,\n TasksController.Live,\n);\n\nconst MainLayer = PresentationLayer.pipe(\n Layer.provideMerge(ApplicationLayer),\n Layer.provideMerge(DomainLayer),\n Layer.provideMerge(InfraLayer),\n Layer.provideMerge(PlatformLayer),\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 * Checks new path: {project}/{sessionId}/subagents/agent-{agentId}.jsonl\n * Fallback to old path: {project}/agent-{agentId}.jsonl\n */\n const getAgentSessionByAgentId = (\n projectId: string,\n agentId: string,\n sessionId?: string,\n ): Effect.Effect<ExtendedConversation[] | null, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n // Try new path if sessionId is provided\n if (sessionId) {\n const newPath = path.resolve(\n projectPath,\n sessionId,\n \"subagents\",\n `agent-${agentId}.jsonl`,\n );\n\n if (yield* fs.exists(newPath)) {\n const content = yield* fs.readFileString(newPath);\n return parseJsonl(content);\n }\n }\n\n // Fallback to old path\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 sessionId?: 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 { ProgressEntrySchema } from \"./entry/ProgressEntrySchema\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema\";\n\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 ProgressEntrySchema,\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\nexport type ToolUseContent = z.infer<typeof ToolUseContentSchema>;\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 agentId: z.string().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 { BaseEntrySchema } from \"./BaseEntrySchema\";\n\nexport const ProgressEntrySchema = BaseEntrySchema.extend({\n // discriminator\n type: z.literal(\"progress\"),\n\n // required\n data: z.record(z.string(), z.any()),\n toolUseID: z.string().optional(),\n parentToolUseID: z.string().optional(),\n});\n\nexport type ProgressEntry = z.infer<typeof ProgressEntrySchema>;\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 z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"remove\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n }),\n z.object({\n type: z.literal(\"queue-operation\"),\n operation: z.literal(\"popAll\"),\n sessionId: z.string(),\n timestamp: z.iso.datetime(),\n content: z.string().optional(),\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\n// Hook info for stop_hook_summary\nconst HookInfoSchema = z.object({\n command: z.string(),\n});\n\n// Base system entry with content (original format)\nconst SystemEntryWithContentSchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n content: z.string(),\n toolUseID: z.string(),\n level: z.enum([\"info\"]),\n subtype: z.undefined().optional(),\n});\n\n// Stop hook summary entry (new format from Claude Code v2.0.76+)\nconst StopHookSummaryEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"stop_hook_summary\"),\n toolUseID: z.string(),\n level: z.enum([\"info\", \"suggestion\"]),\n slug: z.string().optional(),\n hookCount: z.number(),\n hookInfos: z.array(HookInfoSchema),\n hookErrors: z.array(z.unknown()),\n preventedContinuation: z.boolean(),\n stopReason: z.string(),\n hasOutput: z.boolean(),\n});\n\n// Local command entry (e.g., /mcp, /help commands)\nconst LocalCommandEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"local_command\"),\n content: z.string(),\n level: z.enum([\"info\"]),\n});\n\n// Turn duration entry (tracks duration of assistant turns, Claude Code v2.1+)\nconst TurnDurationEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"turn_duration\"),\n durationMs: z.number(),\n slug: z.string().optional(),\n});\n\n// Compact boundary entry (new format from Claude Code)\nconst CompactBoundaryEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"compact_boundary\"),\n content: z.string(),\n level: z.enum([\"info\"]),\n slug: z.string().optional(),\n logicalParentUuid: z.string().optional(),\n compactMetadata: z\n .object({\n trigger: z.string(),\n preTokens: z.number(),\n })\n .optional(),\n});\n\n// API error entry (tracks API errors and retries)\nconst ApiErrorEntrySchema = BaseEntrySchema.extend({\n type: z.literal(\"system\"),\n subtype: z.literal(\"api_error\"),\n level: z.enum([\"error\", \"warning\", \"info\"]),\n error: z.object({\n status: z.number().optional(),\n headers: z.record(z.string(), z.unknown()).optional(),\n requestID: z.string().nullable().optional(),\n error: z\n .object({\n type: z.string(),\n error: z\n .object({\n type: z.string(),\n message: z.string(),\n })\n .optional(),\n message: z.string().optional(),\n })\n .optional(),\n }),\n retryInMs: z.number().optional(),\n retryAttempt: z.number().optional(),\n maxRetries: z.number().optional(),\n});\n\nexport const SystemEntrySchema = z.union([\n StopHookSummaryEntrySchema,\n LocalCommandEntrySchema,\n TurnDurationEntrySchema,\n CompactBoundaryEntrySchema,\n ApiErrorEntrySchema,\n SystemEntryWithContentSchema, // Must be last (catch-all for undefined subtype)\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: {\n projectId: string;\n agentId: string;\n sessionId?: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, agentId, sessionId } = params;\n\n // Read conversations directly using agentId\n const conversations = yield* repository.getAgentSessionByAgentId(\n projectId,\n agentId,\n sessionId,\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 {\n type CommandInfo,\n scanCommandFilesWithMetadata,\n scanSkillFilesWithMetadata,\n} 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 const features = yield* claudeCodeService.getAvailableFeatures();\n\n const globalCommands: CommandInfo[] = yield* scanCommandFilesWithMetadata(\n (yield* context.claudeCodePaths).claudeCommandsDirPath,\n );\n\n const projectCommands: CommandInfo[] =\n project.meta.projectPath === null\n ? []\n : yield* scanCommandFilesWithMetadata(\n path.resolve(project.meta.projectPath, \".claude\", \"commands\"),\n );\n\n const globalSkills: CommandInfo[] = features.runSkillsDirectly\n ? yield* scanSkillFilesWithMetadata(\n (yield* context.claudeCodePaths).claudeSkillsDirPath,\n )\n : [];\n\n const projectSkills: CommandInfo[] =\n features.runSkillsDirectly && project.meta.projectPath !== null\n ? yield* scanSkillFilesWithMetadata(\n path.resolve(project.meta.projectPath, \".claude\", \"skills\"),\n )\n : [];\n\n const defaultCommands: CommandInfo[] = [\n {\n name: \"init\",\n description: \"Initialize Claude Code in current project\",\n argumentHint: null,\n },\n {\n name: \"compact\",\n description: \"Compact conversation history\",\n argumentHint: null,\n },\n {\n name: \"security-review\",\n description: \"Review code for security issues\",\n argumentHint: null,\n },\n {\n name: \"review\",\n description: \"Review code changes\",\n argumentHint: null,\n },\n ];\n\n // Helper to extract command names for backward compatibility\n const toNames = (commands: CommandInfo[]) => commands.map((c) => c.name);\n\n return {\n response: {\n // New format: CommandInfo[] with metadata\n globalCommands,\n projectCommands,\n globalSkills,\n projectSkills,\n defaultCommands,\n // Legacy format: string[] for backward compatibility\n globalCommandsLegacy: toNames(globalCommands),\n projectCommandsLegacy: toNames(projectCommands),\n globalSkillsLegacy: toNames(globalSkills),\n projectSkillsLegacy: toNames(projectSkills),\n defaultCommandsLegacy: toNames(defaultCommands),\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 { CcvOptionsService } from \"./CcvOptionsService\";\n\nexport type ClaudeCodePaths = {\n globalClaudeDirectoryPath: string;\n claudeCommandsDirPath: string;\n claudeSkillsDirPath: string;\n claudeProjectsDirPath: string;\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const ccvOptionsService = yield* CcvOptionsService;\n\n const claudeCodePaths = Effect.gen(function* () {\n const globalClaudeDirectoryPath = yield* ccvOptionsService\n .getCcvOptions(\"claudeDir\")\n .pipe(\n Effect.map((envVar) =>\n envVar === undefined\n ? path.resolve(homedir(), \".claude\")\n : path.resolve(envVar),\n ),\n );\n\n return {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(\n globalClaudeDirectoryPath,\n \"commands\",\n ),\n claudeSkillsDirPath: path.resolve(globalClaudeDirectoryPath, \"skills\"),\n claudeProjectsDirPath: path.resolve(\n globalClaudeDirectoryPath,\n \"projects\",\n ),\n } as const satisfies ClaudeCodePaths;\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\";\n\nexport type CliOptions = {\n port: string;\n hostname: string;\n password?: string | undefined;\n executable?: string | undefined;\n claudeDir?: string | undefined;\n terminalDisabled?: boolean | undefined;\n terminalShell?: string | undefined;\n terminalUnrestricted?: boolean | undefined;\n};\n\nexport type CcvOptions = {\n port: number;\n hostname: string;\n password?: string | undefined;\n executable?: string | undefined;\n claudeDir?: string | undefined;\n terminalDisabled?: boolean | undefined;\n terminalShell?: string | undefined;\n terminalUnrestricted?: boolean | undefined;\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n return process.env[key] ?? undefined;\n};\n\nconst isFlagEnabled = (value: string | undefined) => {\n if (!value) return false;\n return value === \"1\" || value.toLowerCase() === \"true\";\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvOptionsRef = yield* Ref.make<CcvOptions | undefined>(undefined);\n\n const loadCliOptions = (cliOptions: CliOptions) => {\n return Effect.gen(function* () {\n yield* Ref.update(ccvOptionsRef, () => {\n return {\n port: Number.parseInt(\n cliOptions.port ?? getOptionalEnv(\"PORT\") ?? \"3000\",\n 10,\n ),\n hostname:\n cliOptions.hostname ?? getOptionalEnv(\"HOSTNAME\") ?? \"localhost\",\n password:\n cliOptions.password ?? getOptionalEnv(\"CCV_PASSWORD\") ?? undefined,\n executable:\n cliOptions.executable ??\n getOptionalEnv(\"CCV_CC_EXECUTABLE_PATH\") ??\n undefined,\n claudeDir:\n cliOptions.claudeDir ?? getOptionalEnv(\"CCV_GLOBAL_CLAUDE_DIR\"),\n terminalDisabled:\n cliOptions.terminalDisabled ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_DISABLED\"))\n ? true\n : undefined),\n terminalShell:\n cliOptions.terminalShell ??\n getOptionalEnv(\"CCV_TERMINAL_SHELL\") ??\n undefined,\n terminalUnrestricted:\n cliOptions.terminalUnrestricted ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_UNRESTRICTED\"))\n ? true\n : undefined),\n };\n });\n });\n };\n\n const getCcvOptions = <K extends keyof CcvOptions>(key: K) => {\n return Effect.gen(function* () {\n const ccvOptions = yield* Ref.get(ccvOptionsRef);\n if (ccvOptions === undefined) {\n throw new Error(\"Unexpected error: CCV options are not loaded\");\n }\n return ccvOptions[key];\n });\n };\n\n return {\n loadCliOptions,\n getCcvOptions,\n };\n});\n\nexport type ICcvOptionsService = InferEffect<typeof LayerImpl>;\n\nexport class CcvOptionsService extends Context.Tag(\"CcvOptionsService\")<\n CcvOptionsService,\n ICcvOptionsService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\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 (yield* context.claudeCodePaths).claudeProjectsDirPath,\n );\n if (!dirExists) {\n console.warn(\n `Claude projects directory not found at ${(yield* context.claudeCodePaths).claudeProjectsDirPath}`,\n );\n return { projects: [] };\n }\n\n // Read directory entries\n const entries = yield* fs.readDirectory(\n (yield* 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 (yield* 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 * Command metadata extracted from .md file frontmatter.\n */\nexport type CommandInfo = {\n /** Command name (e.g., \"impl\", \"frontend:impl\") */\n name: string;\n /** Command description from frontmatter */\n description: string | null;\n /** Argument hint for user input from frontmatter */\n argumentHint: string | null;\n};\n\n/**\n * Parse YAML frontmatter from markdown content to extract command metadata.\n * Supports `description` and `argument-hint` fields.\n *\n * @param content - Markdown file content\n * @returns Object with description and argumentHint (null if not found)\n *\n * @example\n * parseCommandFrontmatter(\"---\\ndescription: 'My command'\\nargument-hint: '<file>'\\n---\\n# Content\")\n * // => { description: \"My command\", argumentHint: \"<file>\" }\n */\nexport const parseCommandFrontmatter = (\n content: string,\n): { description: string | null; argumentHint: string | null } => {\n // Match YAML frontmatter between --- delimiters\n const frontmatterMatch = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!frontmatterMatch?.[1]) {\n return { description: null, argumentHint: null };\n }\n\n const frontmatter = frontmatterMatch[1];\n\n // Extract description field (supports both quoted and unquoted values)\n const descriptionMatch = frontmatter.match(\n /^description:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m,\n );\n const description = descriptionMatch?.[1]?.trim() ?? null;\n\n // Extract argument-hint field\n const argumentHintMatch = frontmatter.match(\n /^argument-hint:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m,\n );\n const argumentHint = argumentHintMatch?.[1]?.trim() ?? null;\n\n return { description, argumentHint };\n};\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\n/**\n * Recursively scan a directory for .md files and return them as CommandInfo with metadata.\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Directory path to scan\n * @returns Array of CommandInfo objects with name, description, and argumentHint\n *\n * @example\n * // For directory structure:\n * // commands/\n * // impl.md (with frontmatter: description: \"Implementation command\")\n * scanCommandFilesWithMetadata(\"/path/to/commands\")\n * // => [{ name: \"impl\", description: \"Implementation command\", argumentHint: null }]\n */\nexport const scanCommandFilesWithMetadata = (\n dirPath: string,\n): Effect.Effect<CommandInfo[], 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 CommandInfo[],\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 // Read file content and parse frontmatter\n const content = yield* fs.readFileString(itemPath);\n const { description, argumentHint } =\n parseCommandFrontmatter(content);\n const name = pathToCommandName(itemPath, dirPath);\n\n return [{ name, description, argumentHint }] as CommandInfo[];\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\n/**\n\n * Recursively scan a skills directory for SKILL.md files and return skill names.\n * Skills are expected to be in the format: skills/<skill-name>/SKILL.md\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Skills directory path to scan\n * @returns Array of skill names (e.g., [\"typescript\", \"react\", \"frontend:design\"])\n *\n * @example\n * // For directory structure:\n * // skills/\n * // typescript/\n * // SKILL.md\n * // frontend/\n * // design/\n * // SKILL.md\n * scanSkillFilesRecursively(\"/path/to/skills\")\n * // => [\"typescript\", \"frontend:design\"]\n */\nexport const scanSkillFilesRecursively = (\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 for SKILL.md files\n const scanDirectory = (\n currentPath: string,\n relativePath: 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 // Check if SKILL.md exists in current directory\n const skillFilePath = path.join(currentPath, \"SKILL.md\");\n const skillFileExists = yield* fs.exists(skillFilePath);\n\n const skillNames: string[] = [];\n\n if (skillFileExists) {\n // Extract skill name from relative path\n const skillName = relativePath.replace(/\\//g, \":\");\n if (skillName) {\n skillNames.push(skillName);\n }\n }\n\n // Read directory contents to recursively scan subdirectories\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each subdirectory\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 const newRelativePath = relativePath\n ? `${relativePath}/${item}`\n : item;\n return yield* scanDirectory(itemPath, newRelativePath);\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Combine current directory skills and subdirectory results\n return [...skillNames, ...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\n/**\n * Recursively scan a skills directory for SKILL.md files and return CommandInfo with metadata.\n * Skills are expected to be in the format: skills/<skill-name>/SKILL.md\n * Hidden files and directories (starting with .) are excluded.\n *\n * @param dirPath - Skills directory path to scan\n * @returns Array of CommandInfo objects with name, description, and argumentHint\n *\n * @example\n * // For directory structure:\n * // skills/\n * // typescript/\n * // SKILL.md (with frontmatter: description: \"TypeScript development\")\n * scanSkillFilesWithMetadata(\"/path/to/skills\")\n * // => [{ name: \"typescript\", description: \"TypeScript development\", argumentHint: null }]\n */\nexport const scanSkillFilesWithMetadata = (\n dirPath: string,\n): Effect.Effect<CommandInfo[], 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 for SKILL.md files\n const scanDirectory = (\n currentPath: string,\n relativePath: string,\n ): Effect.Effect<\n CommandInfo[],\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 // Check if SKILL.md exists in current directory\n const skillFilePath = path.join(currentPath, \"SKILL.md\");\n const skillFileExists = yield* fs.exists(skillFilePath);\n\n const skills: CommandInfo[] = [];\n\n if (skillFileExists) {\n // Extract skill name from relative path\n const skillName = relativePath.replace(/\\//g, \":\");\n if (skillName) {\n // Read file content and parse frontmatter\n const content = yield* fs.readFileString(skillFilePath);\n const { description, argumentHint } =\n parseCommandFrontmatter(content);\n skills.push({ name: skillName, description, argumentHint });\n }\n }\n\n // Read directory contents to recursively scan subdirectories\n const items = yield* fs.readDirectory(currentPath);\n\n // Process each subdirectory\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 const newRelativePath = relativePath\n ? `${relativePath}/${item}`\n : item;\n return yield* scanDirectory(itemPath, newRelativePath);\n }\n return [];\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Combine current directory skills and subdirectory results\n return [...skills, ...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 type McpServerStatus = \"connected\" | \"failed\" | \"unknown\";\n\nexport interface McpServer {\n name: string;\n command: string;\n status: McpServerStatus;\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 // Extract status from indicators (\u2713 Connected, \u2717 Failed, etc.)\n let status: McpServerStatus = \"unknown\";\n if (rest.includes(\"\u2713\") || rest.toLowerCase().includes(\"connected\")) {\n status = \"connected\";\n } else if (rest.includes(\"\u2717\") || rest.toLowerCase().includes(\"failed\")) {\n status = \"failed\";\n }\n\n // Remove status indicators to get clean command\n const command = rest.replace(/\\s*-\\s*[\u2713\u2717].*$/, \"\").trim();\n\n if (name && command) {\n servers.push({ name, command, status });\n }\n }\n }\n\n return servers;\n};\n", "import * as agentSdk from \"@anthropic-ai/claude-agent-sdk\";\nimport { Command, Path } from \"@effect/platform\";\nimport { Data, Effect } from \"effect\";\nimport { uniq } from \"es-toolkit\";\nimport { CcvOptionsService } from \"../../platform/services/CcvOptionsService\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion\";\n\ntype AgentSdkQuery = typeof agentSdk.query;\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\nclass ClaudeCodeAgentSdkNotSupportedError extends Data.TaggedError(\n \"ClaudeCodeAgentSdkNotSupportedError\",\n)<{\n message: string;\n}> {}\n\nconst resolveClaudeCodePath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const ccvOptionsService = yield* CcvOptionsService;\n\n // Environment variable (highest priority)\n const specifiedExecutablePath =\n yield* ccvOptionsService.getCcvOptions(\"executable\");\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 runSkillsDirectly:\n claudeCodeVersion !== null\n ? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 1,\n patch: 0,\n }) ||\n ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {\n major: 2,\n minor: 0,\n patch: 77,\n })\n : false,\n});\n\nexport const query = (\n prompt: AgentSdkPrompt,\n options: AgentSdkQueryOptions,\n) => {\n const {\n canUseTool,\n permissionMode,\n hooks,\n systemPrompt,\n settingSources,\n ...baseOptions\n } = options;\n\n return Effect.gen(function* () {\n const { claudeCodeExecutablePath, claudeCodeVersion } = yield* Config;\n const availableFeatures = getAvailableFeatures(claudeCodeVersion);\n\n const options: AgentSdkQueryOptions = {\n ...baseOptions,\n systemPrompt,\n settingSources,\n pathToClaudeCodeExecutable: claudeCodeExecutablePath,\n disallowedTools: [\n \"AskUserQuestion\",\n ...(baseOptions.disallowedTools ?? []),\n ], // Cannot answer from web interface instead of CLI\n ...(availableFeatures.canUseTool\n ? { canUseTool, permissionMode }\n : {\n permissionMode: \"bypassPermissions\",\n }),\n };\n\n if (!availableFeatures.agentSdk) {\n return yield* new ClaudeCodeAgentSdkNotSupportedError({\n message: \"Agent SDK is not supported in this version of Claude Code\",\n });\n }\n\n return agentSdk.query({\n prompt,\n options: {\n settingSources: [\"user\", \"project\", \"local\"],\n ...options,\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 turnId: string;\n userConfig: UserConfig;\n sessionId?: string;\n }) => {\n const { turnId, 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 turnId,\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 type * as CCTurn from \"../models/ClaudeCodeTurn\";\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 baseSession:\n | undefined\n | {\n type: \"fork\";\n sessionId: string;\n }\n | {\n type: \"resume\";\n sessionId: string;\n };\n ccOptions?: CCTurn.CCOptions;\n }) =>\n Effect.gen(function* () {\n const { projectId, input, baseSession, ccOptions } = 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.startSessionProcess({\n projectId,\n cwd: project.meta.projectPath,\n baseSession,\n userConfig,\n input,\n ccOptions,\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.continueSessionProcess({\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 searchHotkey: \"command-k\",\n autoScheduleContinueOnRateLimit: false,\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 { CcvOptionsService } from \"../../platform/services/CcvOptionsService\";\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 * as CCSessionProcess from \"../models/CCSessionProcess\";\nimport * as ClaudeCode from \"../models/ClaudeCode\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn\";\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 | CcvOptionsService\n >();\n\n const continueSessionProcess = (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 turnDef: {\n type: \"continue\",\n sessionId: baseSessionId,\n baseSessionId: baseSessionId,\n turnId: 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 // Notify frontend that user message was added to virtual conversation\n // This allows immediate display of the user's message before Claude responds\n yield* eventBusService.emit(\"virtualConversationUpdated\", {\n projectId: sessionProcess.def.projectId,\n sessionId: baseSessionId,\n });\n\n sessionProcess.def.setNextMessage(input);\n return {\n sessionProcess,\n task,\n };\n });\n };\n\n const startSessionProcess = (options: {\n projectId: string;\n cwd: string;\n input: UserMessageInput;\n userConfig: UserConfig;\n baseSession:\n | undefined\n | {\n type: \"fork\";\n sessionId: string;\n }\n | {\n type: \"resume\";\n sessionId: string;\n };\n ccOptions?: CCTurn.CCOptions;\n }) => {\n const { projectId, cwd, input, userConfig, baseSession, ccOptions } =\n 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,\n cwd,\n abortController: new AbortController(),\n setNextMessage,\n sessionProcessId: ulid(),\n },\n turnDef:\n baseSession === undefined\n ? {\n type: \"new\",\n turnId: ulid(),\n ccOptions,\n }\n : baseSession.type === \"fork\"\n ? {\n type: \"fork\",\n turnId: ulid(),\n sessionId: baseSession.sessionId,\n baseSessionId: baseSession.sessionId,\n ccOptions,\n }\n : {\n type: \"resume\",\n turnId: ulid(),\n sessionId: undefined,\n baseSessionId: baseSession.sessionId,\n ccOptions,\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 // Check abort signal before processing message\n if (sessionProcess.def.abortController.signal.aborted) {\n return \"break\" as const;\n }\n\n if (processState.type === \"completed\") {\n return \"break\" as const;\n }\n\n if (processState.type === \"paused\") {\n // rule: paused \u5047\u5B9A\u66F4\u65B0\u4E3A not_initialized\n return 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 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 // Notify frontend that new assistant message is available\n // This triggers before file watcher debounce, reducing perceived latency\n yield* eventBusService.emit(\"virtualConversationUpdated\", {\n projectId: processState.def.projectId,\n sessionId: message.session_id,\n });\n\n yield* virtualConversationDatabase.deleteVirtualConversations(\n message.session_id,\n );\n }\n\n if (message.type === \"result\") {\n if (\n processState.type === \"file_created\" ||\n processState.type === \"initialized\"\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\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 turnId: task.def.turnId,\n userConfig,\n sessionId: task.def.baseSessionId,\n });\n\n return yield* ClaudeCode.query(generateMessages(), {\n ...(task.def.type === \"continue\" ? {} : task.def.ccOptions),\n ...permissionOptions,\n resume: task.def.baseSessionId,\n cwd: sessionProcess.def.cwd,\n abortController: sessionProcess.def.abortController,\n });\n }),\n );\n\n setNextMessage(input);\n\n try {\n for await (const message of messageIter) {\n const result = await Runtime.runPromise(runtime)(\n handleMessage(message),\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.changeTurnState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n turnId: task.def.turnId,\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.changeTurnState({\n sessionProcessId: sessionProcess.def.sessionProcessId,\n turnId: task.def.turnId,\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 continueSessionProcess,\n startSessionProcess,\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 modelName: null,\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 modelName: null,\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 {\n extractFirstUserMessage,\n isLocalCommandCaveat,\n} 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 if (\n cached !== null &&\n cached.kind === \"text\" &&\n isLocalCommandCaveat(cached.content)\n ) {\n // Ignore stale cache entries that only contain the caveat.\n } else {\n return cached;\n }\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, modelName } =\n 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 modelName: modelName,\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: 2026-01-08\n *\n * Prices are in USD per million tokens (MTok)\n * Source: https://claude.com/pricing\n */\n\nexport type ModelName =\n | \"claude-opus-4.5\"\n | \"claude-opus-4.1\"\n | \"claude-sonnet-4.5\"\n | \"claude-3.5-sonnet\"\n | \"claude-haiku-4.5\"\n | \"claude-3-opus\"\n | \"claude-3-haiku\";\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 *\n * Note: Claude Sonnet 4.5 has tiered pricing based on prompt length:\n * - \u2264200K tokens: $3/$15 (standard tier, used here)\n * - >200K tokens: $6/$22.50 (extended context tier, not implemented)\n * This implementation uses standard tier pricing as the default approximation\n * since prompt length is not tracked at pricing calculation time.\n */\nexport const MODEL_PRICING: Record<ModelName, ModelPricing> = {\n \"claude-opus-4.5\": {\n input: 5.0,\n output: 25.0,\n cache_creation: 6.25,\n cache_read: 0.5,\n },\n \"claude-opus-4.1\": {\n input: 15.0,\n output: 75.0,\n cache_creation: 18.75,\n cache_read: 1.5,\n },\n \"claude-sonnet-4.5\": {\n input: 3.0,\n output: 15.0,\n cache_creation: 3.75,\n cache_read: 0.3,\n },\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-haiku-4.5\": {\n input: 1.0,\n output: 5.0,\n cache_creation: 1.25,\n cache_read: 0.1,\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} 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-opus-4-5-20251101\" -> \"claude-opus-4.5\"\n * - \"claude-opus-4-1-20250101\" -> \"claude-opus-4.1\"\n * - \"claude-sonnet-4-5-20250929\" -> \"claude-sonnet-4.5\"\n * - \"claude-haiku-4-5-20251001\" -> \"claude-haiku-4.5\"\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 *\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 Opus 4.5 patterns (more specific first)\n if (normalized.includes(\"opus-4-5\") || normalized.includes(\"opus-4.5\")) {\n return \"claude-opus-4.5\";\n }\n\n // Claude Opus 4.1 patterns\n if (normalized.includes(\"opus-4-1\") || normalized.includes(\"opus-4.1\")) {\n return \"claude-opus-4.1\";\n }\n\n // Claude Sonnet 4.5 patterns\n if (normalized.includes(\"sonnet-4-5\") || normalized.includes(\"sonnet-4.5\")) {\n return \"claude-sonnet-4.5\";\n }\n\n // Claude Haiku 4.5 patterns\n if (normalized.includes(\"haiku-4-5\") || normalized.includes(\"haiku-4.5\")) {\n return \"claude-haiku-4.5\";\n }\n\n // Claude 3.5 Sonnet patterns (Sonnet 4 without version suffix)\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 // 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 // Helper to check valid agent file\n const isValidAgentFile = (filePath: string, expectedSessionId?: string) =>\n Effect.gen(function* () {\n const content = yield* fs.readFileString(filePath);\n const firstLine = content.split(\"\\n\")[0];\n if (!firstLine || firstLine.trim() === \"\") {\n return false;\n }\n\n try {\n const firstLineData = JSON.parse(firstLine);\n if (typeof firstLineData !== \"object\" || firstLineData === null) {\n return false;\n }\n\n // If expectedSessionId is provided, strictly check it.\n // Otherwise, just ensure it looks like a valid log entry (has a sessionId).\n if (expectedSessionId !== undefined) {\n return (\n \"sessionId\" in firstLineData &&\n firstLineData.sessionId === expectedSessionId\n );\n }\n\n return \"sessionId\" in firstLineData;\n } catch {\n return false;\n }\n }).pipe(Effect.catchAll(() => Effect.succeed(false)));\n\n const matchingFilePaths: string[] = [];\n\n // 1. Check legacy root directory\n const rootEntries = yield* fs.readDirectory(projectPath);\n const rootAgentFiles = rootEntries.filter(\n (filename) =>\n filename.startsWith(\"agent-\") && filename.endsWith(\".jsonl\"),\n );\n\n for (const agentFile of rootAgentFiles) {\n const filePath = path.join(projectPath, agentFile);\n if (yield* isValidAgentFile(filePath, sessionId)) {\n matchingFilePaths.push(filePath);\n }\n }\n\n // 2. Check subagents directory: [projectPath]/[sessionId]/subagents\n const subagentsDir = path.join(projectPath, sessionId, \"subagents\");\n const subagentsDirExists = yield* fs.exists(subagentsDir);\n\n if (subagentsDirExists) {\n const subagentEntries = yield* fs.readDirectory(subagentsDir).pipe(\n Effect.catchAll(() => Effect.succeed([] as string[])), // Handle permission or other errors gracefully\n );\n\n const subagentFiles = subagentEntries.filter(\n (filename) =>\n filename.startsWith(\"agent-\") && filename.endsWith(\".jsonl\"),\n );\n\n for (const agentFile of subagentFiles) {\n const filePath = path.join(subagentsDir, agentFile);\n // For subagents, we don't enforce matching sessionId because they have their own IDs.\n // We trust the directory structure.\n if (yield* isValidAgentFile(filePath, undefined)) {\n matchingFilePaths.push(filePath);\n }\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];\nconst localCommandCaveatText =\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.\";\nconst localCommandCaveatPattern =\n /<local-command-caveat>[\\s\\S]*?<\\/local-command-caveat>/;\n\nexport const isLocalCommandCaveat = (text: string) => {\n return (\n text === localCommandCaveatText || localCommandCaveatPattern.test(text)\n );\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 (isLocalCommandCaveat(firstUserText)) {\n return undefined;\n }\n\n if (firstUserText === \"Warmup\") {\n return undefined;\n }\n\n const command = parseUserMessage(firstUserText);\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 { 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 CCTurn from \"./ClaudeCodeTurn\";\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: CCTurn.ClaudeCodeTurnState[];\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: CCTurn.PendingClaudeCodeTurnState;\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: CCTurn.RunningClaudeCodeTurnState;\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: CCTurn.RunningClaudeCodeTurnState;\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: CCTurn.RunningClaudeCodeTurnState;\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): CCTurn.AliveClaudeCodeTurnState[] => {\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 CCTurn from \"../models/ClaudeCodeTurn\";\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 turnId: 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 turnDef:\n | CCTurn.NewClaudeCodeTurnDef\n | CCTurn.ResumeClaudeCodeTurnDef\n | CCTurn.ForkClaudeCodeTurnDef;\n }) => {\n const { sessionDef, turnDef } = options;\n\n return Effect.gen(function* () {\n const task: CCTurn.PendingClaudeCodeTurnState = {\n def: turnDef,\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 turnDef: CCTurn.ContinueClaudeCodeTurnDef;\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.turnId,\n aliveTaskSessionId:\n firstAliveTask.def.sessionId ?? firstAliveTask.sessionId,\n }),\n );\n }\n\n const newTask: CCTurn.PendingClaudeCodeTurnState = {\n def: options.turnDef,\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 = (turnId: 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.turnId === turnId);\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({ turnId }));\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 changeTurnState = <T extends CCTurn.ClaudeCodeTurnState>(options: {\n sessionProcessId: string;\n turnId: string;\n nextTask: T;\n }) => {\n const { sessionProcessId, turnId, nextTask } = options;\n\n return Effect.gen(function* () {\n const { task } = yield* getTask(turnId);\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.turnId === task.def.turnId ? { ...nextTask } : t,\n ),\n }\n : p,\n );\n });\n\n const updated = yield* getTask(turnId);\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* changeTurnState({\n sessionProcessId,\n turnId: currentProcess.currentTask.def.turnId,\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 (\n currentProcess.type !== \"file_created\" &&\n currentProcess.type !== \"initialized\"\n ) {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"paused\",\n }),\n );\n }\n\n const newTask = yield* changeTurnState({\n sessionProcessId,\n turnId: currentProcess.currentTask.def.turnId,\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.turnId === newTask.def.turnId ? 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* changeTurnState({\n sessionProcessId,\n turnId: newTask.def.turnId,\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.turnId === newTask.def.turnId ? 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 changeTurnState,\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 const onVirtualConversationUpdated = (\n event: InternalEventDeclaration[\"virtualConversationUpdated\"],\n ) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"virtualConversationUpdated\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\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 yield* eventBus.on(\n \"virtualConversationUpdated\",\n onVirtualConversationUpdated,\n );\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 yield* eventBus.off(\n \"virtualConversationUpdated\",\n onVirtualConversationUpdated,\n );\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 const claudeCodePaths = yield* context.claudeCodePaths;\n\n yield* Ref.set(isWatchingRef, true);\n\n yield* Effect.tryPromise({\n try: async () => {\n console.log(\n \"Starting file watcher on:\",\n claudeCodePaths.claudeProjectsDirPath,\n );\n\n const watcher = watch(\n 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 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 }, 100); // Reduced from 300ms to improve message latency\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 {\n name: \"uuid-on-sdk-message\",\n enabled: claudeCodeFeatures.uuidOnSDKMessage,\n },\n {\n name: \"run-skills-directly\",\n enabled: claudeCodeFeatures.runSkillsDirectly,\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\";\nimport { getFileContent } from \"../functions/getFileContent\";\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 const getFileContentRoute = (options: {\n projectId: string;\n filePath: string;\n }) =>\n Effect.gen(function* () {\n const { projectId, filePath } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: {\n success: false,\n error: \"PROJECT_PATH_NOT_SET\",\n message:\n \"Project path is not configured. Cannot read files without a project root.\",\n filePath,\n },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n const result = yield* Effect.promise(() =>\n getFileContent(projectPath, filePath),\n );\n\n if (!result.success) {\n const statusCode = result.error === \"NOT_FOUND\" ? 404 : 400;\n return {\n response: result,\n status: statusCode,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getFileCompletionRoute,\n getDirectoryListingRoute,\n getFileContentRoute,\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 { readFile, stat } from \"node:fs/promises\";\nimport { extname, normalize, resolve } from \"node:path\";\n\n/** Default maximum file size in bytes (1MB) */\nexport const DEFAULT_MAX_FILE_SIZE = 1024 * 1024;\n\n/** Binary file extensions that should be rejected */\nconst BINARY_EXTENSIONS = new Set([\n // Images\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"bmp\",\n \"ico\",\n \"webp\",\n \"svg\",\n \"tiff\",\n \"tif\",\n // Archives\n \"zip\",\n \"tar\",\n \"gz\",\n \"bz2\",\n \"7z\",\n \"rar\",\n \"xz\",\n // Executables\n \"exe\",\n \"dll\",\n \"so\",\n \"dylib\",\n \"bin\",\n // Documents\n \"pdf\",\n \"doc\",\n \"docx\",\n \"xls\",\n \"xlsx\",\n \"ppt\",\n \"pptx\",\n // Media\n \"mp3\",\n \"mp4\",\n \"avi\",\n \"mov\",\n \"mkv\",\n \"wav\",\n \"flac\",\n // Database\n \"db\",\n \"sqlite\",\n \"sqlite3\",\n // Other\n \"wasm\",\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n]);\n\n/** Language detection mapping from file extension */\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"tsx\",\n js: \"javascript\",\n jsx: \"jsx\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n md: \"markdown\",\n mdx: \"markdown\",\n py: \"python\",\n rs: \"rust\",\n go: \"go\",\n html: \"html\",\n htm: \"html\",\n css: \"css\",\n scss: \"scss\",\n sass: \"sass\",\n less: \"less\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"toml\",\n xml: \"xml\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n fish: \"fish\",\n ps1: \"powershell\",\n sql: \"sql\",\n graphql: \"graphql\",\n gql: \"graphql\",\n java: \"java\",\n kt: \"kotlin\",\n kts: \"kotlin\",\n scala: \"scala\",\n rb: \"ruby\",\n php: \"php\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n cxx: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n swift: \"swift\",\n m: \"objectivec\",\n mm: \"objectivec\",\n r: \"r\",\n lua: \"lua\",\n vim: \"vim\",\n dockerfile: \"dockerfile\",\n makefile: \"makefile\",\n cmake: \"cmake\",\n tf: \"hcl\",\n hcl: \"hcl\",\n proto: \"protobuf\",\n prisma: \"prisma\",\n vue: \"vue\",\n svelte: \"svelte\",\n astro: \"astro\",\n zig: \"zig\",\n elm: \"elm\",\n ex: \"elixir\",\n exs: \"elixir\",\n erl: \"erlang\",\n hrl: \"erlang\",\n clj: \"clojure\",\n cljs: \"clojure\",\n cljc: \"clojure\",\n hs: \"haskell\",\n lhs: \"haskell\",\n ml: \"ocaml\",\n mli: \"ocaml\",\n fs: \"fsharp\",\n fsx: \"fsharp\",\n fsi: \"fsharp\",\n pl: \"perl\",\n pm: \"perl\",\n nim: \"nim\",\n d: \"d\",\n dart: \"dart\",\n v: \"v\",\n sol: \"solidity\",\n ini: \"ini\",\n cfg: \"ini\",\n conf: \"ini\",\n env: \"shell\",\n gitignore: \"gitignore\",\n editorconfig: \"editorconfig\",\n txt: \"text\",\n};\n\nexport type FileContentSuccess = {\n success: true;\n content: string;\n filePath: string;\n truncated: boolean;\n language: string;\n};\n\nexport type FileContentError = {\n success: false;\n error: \"INVALID_PATH\" | \"NOT_FOUND\" | \"BINARY_FILE\" | \"READ_ERROR\";\n message: string;\n filePath: string;\n};\n\nexport type FileContentResult = FileContentSuccess | FileContentError;\n\nexport type GetFileContentOptions = {\n maxFileSize?: number;\n};\n\n/**\n * Detects the programming language from a file path\n */\nexport const detectLanguage = (filePath: string): string => {\n const ext = extname(filePath).toLowerCase().slice(1);\n\n // Handle special filenames without extension\n const basename = filePath.split(\"/\").pop() ?? \"\";\n const lowerBasename = basename.toLowerCase();\n\n if (lowerBasename === \"dockerfile\") return \"dockerfile\";\n if (lowerBasename === \"makefile\") return \"makefile\";\n if (lowerBasename.startsWith(\".env\")) return \"shell\";\n\n return EXTENSION_TO_LANGUAGE[ext] ?? \"text\";\n};\n\n/**\n * Checks if a file extension indicates a binary file\n */\nexport const isBinaryExtension = (filePath: string): boolean => {\n const ext = extname(filePath).toLowerCase().slice(1);\n return BINARY_EXTENSIONS.has(ext);\n};\n\n/**\n * Checks if file content appears to be binary\n * Detects null bytes which are common in binary files\n */\nexport const isBinaryContent = (buffer: Buffer): boolean => {\n // Check first 8KB for null bytes\n const checkLength = Math.min(buffer.length, 8192);\n for (let i = 0; i < checkLength; i++) {\n if (buffer[i] === 0) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Validates that the file path is safe and within the project root\n * Accepts both absolute paths (must be within project root) and relative paths\n */\nexport const validateFilePath = (\n projectRoot: string,\n filePath: string,\n):\n | { valid: true; resolvedPath: string }\n | { valid: false; message: string } => {\n // Check for empty path\n if (!filePath || filePath.trim() === \"\") {\n return { valid: false, message: \"File path cannot be empty\" };\n }\n\n // Check for null bytes\n if (filePath.includes(\"\\x00\")) {\n return { valid: false, message: \"File path contains invalid characters\" };\n }\n\n // Check for path traversal attempts\n if (filePath.includes(\"..\")) {\n return { valid: false, message: \"Path traversal (..) is not allowed\" };\n }\n\n const resolvedRoot = resolve(projectRoot);\n let resolvedPath: string;\n\n // Handle absolute paths\n if (filePath.startsWith(\"/\")) {\n resolvedPath = normalize(filePath);\n } else {\n // Handle relative paths\n const normalizedPath = normalize(filePath);\n resolvedPath = resolve(projectRoot, normalizedPath);\n }\n\n // Ensure the resolved path is within the project root\n if (\n !resolvedPath.startsWith(`${resolvedRoot}/`) &&\n resolvedPath !== resolvedRoot\n ) {\n return { valid: false, message: \"Path is outside the project root\" };\n }\n\n return { valid: true, resolvedPath };\n};\n\n/**\n * Reads file content from a project directory with security validations\n *\n * @param projectRoot - The root directory of the project\n * @param filePath - Relative path to the file within the project\n * @param options - Optional configuration (maxFileSize)\n * @returns FileContentResult with either success data or error information\n */\nexport const getFileContent = async (\n projectRoot: string,\n filePath: string,\n options: GetFileContentOptions = {},\n): Promise<FileContentResult> => {\n const { maxFileSize = DEFAULT_MAX_FILE_SIZE } = options;\n\n // Validate the file path\n const validation = validateFilePath(projectRoot, filePath);\n if (!validation.valid) {\n return {\n success: false,\n error: \"INVALID_PATH\",\n message: validation.message,\n filePath,\n };\n }\n\n const { resolvedPath } = validation;\n\n // Check if file is binary by extension first\n if (isBinaryExtension(filePath)) {\n return {\n success: false,\n error: \"BINARY_FILE\",\n message: \"Binary file cannot be displayed\",\n filePath,\n };\n }\n\n try {\n // Check if file exists and is a file (not directory)\n const fileStat = await stat(resolvedPath);\n if (!fileStat.isFile()) {\n return {\n success: false,\n error: \"NOT_FOUND\",\n message: \"File not found or is a directory\",\n filePath,\n };\n }\n\n // Read file content\n const buffer = await readFile(resolvedPath);\n\n // Check for binary content\n if (isBinaryContent(buffer)) {\n return {\n success: false,\n error: \"BINARY_FILE\",\n message: \"Binary file cannot be displayed\",\n filePath,\n };\n }\n\n // Convert to string and handle size limit\n let content = buffer.toString(\"utf-8\");\n const truncated = buffer.length > maxFileSize;\n\n if (truncated) {\n // Truncate at a UTF-8 safe boundary\n const truncatedBuffer = buffer.subarray(0, maxFileSize);\n content = truncatedBuffer.toString(\"utf-8\");\n }\n\n // Detect language\n const language = detectLanguage(filePath);\n\n return {\n success: true,\n content,\n filePath,\n truncated,\n language,\n };\n } catch (error) {\n // Handle file not found\n if (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n ) {\n return {\n success: false,\n error: \"NOT_FOUND\",\n message: \"File not found\",\n filePath,\n };\n }\n\n // Handle other errors\n return {\n success: false,\n error: \"READ_ERROR\",\n message: error instanceof Error ? error.message : \"Failed to read file\",\n filePath,\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 const getBranches = (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: { success: false, error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n const branchesResult = yield* Effect.either(\n gitService.getBranches(projectPath),\n );\n\n if (Either.isLeft(branchesResult)) {\n return {\n response: { success: false, error: \"Failed to get branches\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n const currentBranchResult = yield* Effect.either(\n gitService.getCurrentBranch(projectPath),\n );\n\n const currentBranch = Either.isRight(currentBranchResult)\n ? currentBranchResult.right\n : null;\n\n return {\n response: {\n success: true,\n data: {\n branches: branchesResult.right.data,\n currentBranch,\n },\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const checkoutBranch = (options: { projectId: string; branchName: string }) =>\n Effect.gen(function* () {\n const { projectId, branchName } = options;\n\n const { project } = yield* projectRepository.getProject(projectId);\n\n if (project.meta.projectPath === null) {\n return {\n response: { success: false, error: \"Project path not found\" },\n status: 400,\n } as const satisfies ControllerResponse;\n }\n\n const projectPath = project.meta.projectPath;\n\n const checkoutResult = yield* Effect.either(\n gitService.checkout(projectPath, branchName),\n );\n\n if (Either.isLeft(checkoutResult)) {\n return {\n response: { success: false, error: \"Failed to checkout branch\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: {\n success: true,\n branch: checkoutResult.right.branch,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getGitDiff,\n commitFiles,\n pushCommits,\n commitAndPush,\n getCurrentRevisions,\n getBranches,\n checkoutBranch,\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 const checkout = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n yield* execGitCommand([\"checkout\", branchName], cwd);\n return { success: true, branch: branchName };\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 checkout,\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 { 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 const getAllEnv = (): Effect.Effect<Record<string, string>> => {\n return Effect.sync(() => {\n const entries: Array<[string, string]> = [];\n // biome-ignore lint/style/noProcessEnv: centralized env access\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === \"string\") {\n entries.push([key, value]);\n }\n }\n return Object.fromEntries(entries);\n });\n };\n\n return {\n getEnv,\n getAllEnv,\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 // Frameworks\n CCV_ENV: z\n .enum([\"development\", \"production\", \"test\"])\n .optional()\n .default(\"development\"),\n NEXT_PHASE: z.string().optional(),\n PATH: z.string().optional(),\n SHELL: z.string().optional(),\n CCV_TERMINAL_SHELL: z.string().optional(),\n CCV_TERMINAL_UNRESTRICTED: z.string().optional(),\n CCV_TERMINAL_DISABLED: z.string().optional(),\n});\n\nexport type EnvSchema = z.infer<typeof envSchema>;\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", "export const isDevelopmentEnv = (ccvEnv: string | undefined): boolean =>\n ccvEnv === \"development\";\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: (yield* context.claudeCodePaths)\n .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.startSessionProcess({\n projectId,\n cwd: projectPath,\n baseSession: undefined,\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService\";\nimport { ClaudeCodeSessionProcessService } from \"../../claude-code/services/ClaudeCodeSessionProcessService\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport type { InternalEventDeclaration } from \"../../events/types/InternalEventDeclaration\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService\";\nimport { decodeProjectId } from \"../../project/functions/id\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository\";\nimport { SchedulerConfigBaseDir } from \"../../scheduler/config\";\nimport { SchedulerService } from \"../../scheduler/domain/Scheduler\";\nimport { detectRateLimitFromLastLine } from \"../functions/detectRateLimitFromLastLine\";\nimport { parseRateLimitResetTime } from \"../functions/parseRateLimitResetTime\";\nimport { readLastLine } from \"../functions/readLastLine\";\n\ntype SessionChangedListener = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n) => void;\n\n/**\n * Service that monitors session changes and automatically schedules\n * a \"continue\" task when a rate limit is detected on a live session.\n *\n * This service:\n * 1. Subscribes to `sessionChanged` events via EventBus\n * 2. When a session changes:\n * a. Checks if `autoScheduleContinueOnRateLimit` is enabled\n * b. Checks if the session has a live process\n * c. Reads the last line of the session JSONL file\n * d. Detects if it's a rate limit message\n * e. If yes, creates a scheduled task with the parsed reset time\n */\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const userConfigService = yield* UserConfigService;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const schedulerService = yield* SchedulerService;\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const schedulerConfigBaseDir = yield* SchedulerConfigBaseDir;\n const projectRepository = yield* ProjectRepository;\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n\n // Store listener reference for cleanup\n const listenerRef = yield* Ref.make<SessionChangedListener | null>(null);\n\n /**\n * Checks if a session has a live process.\n * Returns the projectId if found, undefined otherwise.\n */\n const getSessionProcessProjectId = (\n sessionId: string,\n ): Effect.Effect<string | undefined> =>\n Effect.gen(function* () {\n const processes = yield* sessionProcessService.getSessionProcesses();\n\n // Find a process that matches the sessionId and is in a live state\n const liveProcess = processes.find(\n (process) =>\n process.sessionId === sessionId &&\n (process.type === \"initialized\" ||\n process.type === \"file_created\" ||\n process.type === \"paused\"),\n );\n\n return liveProcess?.def.projectId;\n });\n\n /**\n * Checks if a reserved job already exists for this session.\n * This prevents duplicate job creation.\n */\n const hasExistingReservedJobForSession = (sessionId: string) =>\n Effect.gen(function* () {\n const jobs = yield* schedulerService\n .getJobs()\n .pipe(Effect.catchAll(() => Effect.succeed([])));\n\n return jobs.some(\n (job) =>\n job.schedule.type === \"reserved\" &&\n job.message.baseSession?.sessionId === sessionId &&\n job.lastRunStatus === null, // Not yet executed\n );\n });\n\n /**\n * Handles a sessionChanged event.\n * Checks conditions and potentially schedules a continue task.\n */\n const handleSessionChanged = (\n event: InternalEventDeclaration[\"sessionChanged\"],\n ) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = event;\n\n // 1. Check if auto-schedule is enabled\n const config = yield* userConfigService.getUserConfig();\n if (!config.autoScheduleContinueOnRateLimit) {\n return;\n }\n\n // 2. Check if session has a live process\n const processProjectId = yield* getSessionProcessProjectId(sessionId);\n if (processProjectId === undefined) {\n return;\n }\n\n // 3. Check if a job already exists for this session\n const hasExistingJob = yield* hasExistingReservedJobForSession(sessionId);\n if (hasExistingJob) {\n return;\n }\n\n // 4. Read the last line of the session file\n const projectPath = decodeProjectId(projectId);\n const sessionFilePath = pathService.join(\n projectPath,\n `${sessionId}.jsonl`,\n );\n\n const lastLine = yield* readLastLine(sessionFilePath).pipe(\n Effect.catchAll(() => Effect.succeed(\"\")),\n );\n\n if (lastLine === \"\") {\n return;\n }\n\n // 5. Detect if it's a rate limit message\n const detection = detectRateLimitFromLastLine(lastLine);\n if (!detection.detected) {\n return;\n }\n\n // 6. Parse the reset time\n const resetTime = parseRateLimitResetTime(detection.resetTimeText);\n\n // 7. Create the scheduled job\n yield* schedulerService\n .addJob({\n name: `Rate limit auto-continue: ${sessionId.slice(0, 8)}...`,\n schedule: {\n type: \"reserved\",\n reservedExecutionTime: resetTime,\n },\n message: {\n content: \"continue\",\n projectId: processProjectId,\n baseSession: {\n type: \"resume\",\n sessionId,\n },\n },\n enabled: true,\n })\n .pipe(\n Effect.catchAll((error) => {\n console.error(\n `[RateLimitAutoScheduleService] Failed to add job for session ${sessionId}:`,\n error,\n );\n return Effect.void;\n }),\n );\n\n console.log(\n `[RateLimitAutoScheduleService] Scheduled continue task for session ${sessionId} at ${resetTime}`,\n );\n });\n\n // Layer with captured dependencies for running effects in callbacks\n const runtimeLayer = Layer.mergeAll(\n Layer.succeed(FileSystem.FileSystem, fs),\n Layer.succeed(Path.Path, pathService),\n Layer.succeed(SchedulerConfigBaseDir, schedulerConfigBaseDir),\n Layer.succeed(ProjectRepository, projectRepository),\n Layer.succeed(UserConfigService, userConfigService),\n Layer.succeed(ClaudeCodeLifeCycleService, lifeCycleService),\n );\n\n /**\n * Starts the service by subscribing to sessionChanged events.\n */\n const start = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n // Check if already started\n const existingListener = yield* Ref.get(listenerRef);\n if (existingListener !== null) {\n return;\n }\n\n const listener: SessionChangedListener = (event) => {\n Effect.runFork(\n handleSessionChanged(event).pipe(Effect.provide(runtimeLayer)),\n );\n };\n\n yield* Ref.set(listenerRef, listener);\n yield* eventBus.on(\"sessionChanged\", listener);\n\n console.log(\"[RateLimitAutoScheduleService] Started\");\n });\n\n /**\n * Stops the service by unsubscribing from sessionChanged events.\n */\n const stop = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const listener = yield* Ref.get(listenerRef);\n if (listener !== null) {\n yield* eventBus.off(\"sessionChanged\", listener);\n yield* Ref.set(listenerRef, null);\n }\n console.log(\"[RateLimitAutoScheduleService] Stopped\");\n });\n\n return {\n start,\n stop,\n };\n});\n\nexport type IRateLimitAutoScheduleService = InferEffect<typeof LayerImpl>;\n\nexport class RateLimitAutoScheduleService extends Context.Tag(\n \"RateLimitAutoScheduleService\",\n)<RateLimitAutoScheduleService, IRateLimitAutoScheduleService>() {\n static Live = Layer.effect(this, LayerImpl);\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 baseSession: z.union([\n z.null(),\n z.object({\n type: z.literal(\"fork\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"resume\"),\n sessionId: z.string(),\n }),\n ]),\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.startSessionProcess({\n projectId: message.projectId,\n cwd: project.meta.projectPath,\n baseSession: message.baseSession ?? undefined,\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 { z } from \"zod\";\n\n/**\n * Schema for detecting rate limit messages from Claude Code session JSONL.\n *\n * This is a focused validation schema that only checks the required fields\n * for rate limit detection. It is intentionally less strict than the full\n * AssistantEntrySchema to avoid breaking when Claude Code adds new fields.\n */\nexport const RateLimitEntrySchema = z.object({\n type: z.literal(\"assistant\"),\n error: z.literal(\"rate_limit\"),\n isApiErrorMessage: z.literal(true),\n sessionId: z.string(),\n message: z.object({\n content: z.array(\n z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n }),\n ),\n }),\n});\n\nexport type RateLimitEntry = z.infer<typeof RateLimitEntrySchema>;\n\n/**\n * Result of rate limit detection.\n */\nexport type RateLimitDetectionResult =\n | {\n detected: true;\n sessionId: string;\n resetTimeText: string;\n }\n | {\n detected: false;\n };\n", "import type { RateLimitDetectionResult } from \"../schema\";\nimport { RateLimitEntrySchema } from \"../schema\";\n\n/**\n * Detects if a JSON line represents a rate limit error from Claude Code.\n *\n * This pure function parses a single JSON line string and determines if it\n * matches the rate limit entry pattern. If matched, it extracts the session\n * ID and reset time text.\n *\n * @param jsonLine - A single line of JSON from a Claude Code session JSONL file\n * @returns Detection result with session info if rate limit detected\n */\nexport const detectRateLimitFromLastLine = (\n jsonLine: string,\n): RateLimitDetectionResult => {\n const trimmed = jsonLine.trim();\n if (trimmed === \"\") {\n return { detected: false };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return { detected: false };\n }\n\n const validation = RateLimitEntrySchema.safeParse(parsed);\n if (!validation.success) {\n return { detected: false };\n }\n\n const entry = validation.data;\n const firstTextContent = entry.message.content[0];\n if (!firstTextContent) {\n return { detected: false };\n }\n\n return {\n detected: true,\n sessionId: entry.sessionId,\n resetTimeText: firstTextContent.text,\n };\n};\n", "/**\n * Parses reset time text from a rate limit message and returns an ISO datetime string.\n *\n * Expected input formats:\n * - \"You've hit your limit \u00B7 resets 8pm (Asia/Tokyo)\"\n * - \"You've hit your limit \u00B7 resets 3:00 AM (UTC)\"\n * - \"You've hit your limit \u00B7 resets 8:30pm (America/New_York)\"\n *\n * @param resetTimeText - The text containing the reset time information\n * @returns ISO datetime string for when the rate limit resets\n */\nexport const parseRateLimitResetTime = (resetTimeText: string): string => {\n // Pattern to match: \"resets <time> (<timezone>)\"\n // Time formats: \"8pm\", \"8PM\", \"8 pm\", \"8:30pm\", \"3:00 AM\", \"12am\", \"12pm\"\n const pattern =\n /resets\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm|AM|PM)\\s*\\(([^)]+)\\)/i;\n const match = pattern.exec(resetTimeText);\n\n if (!match) {\n return getFallbackTime();\n }\n\n const hoursStr = match[1];\n const minutesStr = match[2];\n const meridiem = match[3];\n const timezone = match[4];\n\n if (\n hoursStr === undefined ||\n meridiem === undefined ||\n timezone === undefined\n ) {\n return getFallbackTime();\n }\n\n const hours = Number.parseInt(hoursStr, 10);\n const minutes =\n minutesStr !== undefined ? Number.parseInt(minutesStr, 10) : 0;\n\n if (Number.isNaN(hours) || Number.isNaN(minutes)) {\n return getFallbackTime();\n }\n\n // Convert 12-hour format to 24-hour format\n const hours24 = convertTo24Hour(hours, meridiem.toLowerCase());\n\n // Create date in the target timezone\n const resetDate = createDateInTimezone(hours24, minutes, timezone);\n if (resetDate === null) {\n return getFallbackTime();\n }\n\n // Add 1 minute to the reset time to avoid scheduling exactly at the limit reset\n resetDate.setMinutes(resetDate.getMinutes() + 1);\n\n return resetDate.toISOString();\n};\n\n/**\n * Converts 12-hour format to 24-hour format.\n */\nconst convertTo24Hour = (hours: number, meridiem: string): number => {\n const isPM = meridiem === \"pm\";\n\n if (hours === 12) {\n // 12am = 0 (midnight), 12pm = 12 (noon)\n return isPM ? 12 : 0;\n }\n\n return isPM ? hours + 12 : hours;\n};\n\n/**\n * Calculates the UTC offset in minutes for a given timezone at a specific point in time.\n * Positive offset means timezone is ahead of UTC (e.g., +540 for JST).\n */\nconst getTimezoneOffsetMinutes = (timezone: string, date: Date): number => {\n // Format the same instant in both UTC and the target timezone\n const utcFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"UTC\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n const tzFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n const utcParts = utcFormatter.formatToParts(date);\n const tzParts = tzFormatter.formatToParts(date);\n\n const extractDateTime = (\n parts: Intl.DateTimeFormatPart[],\n ): { day: number; hour: number; minute: number } => ({\n day: Number.parseInt(parts.find((p) => p.type === \"day\")?.value ?? \"0\", 10),\n hour: Number.parseInt(\n parts.find((p) => p.type === \"hour\")?.value ?? \"0\",\n 10,\n ),\n minute: Number.parseInt(\n parts.find((p) => p.type === \"minute\")?.value ?? \"0\",\n 10,\n ),\n });\n\n const utc = extractDateTime(utcParts);\n const tz = extractDateTime(tzParts);\n\n // Calculate the difference in minutes\n // Handle day boundary crossing\n let dayDiff = tz.day - utc.day;\n // Normalize day difference (handle month boundaries)\n if (dayDiff > 15) dayDiff -= 31; // Crossed month boundary backwards\n if (dayDiff < -15) dayDiff += 31; // Crossed month boundary forwards\n\n const offsetMinutes =\n dayDiff * 24 * 60 + (tz.hour - utc.hour) * 60 + (tz.minute - utc.minute);\n\n return offsetMinutes;\n};\n\n/**\n * Creates a Date object for the given time in the specified timezone.\n * If the resulting time is in the past, it adjusts to the next day.\n */\nconst createDateInTimezone = (\n hours: number,\n minutes: number,\n timezone: string,\n): Date | null => {\n const now = new Date();\n\n try {\n // Validate timezone by trying to use it\n const testFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n });\n testFormatter.format(now); // This will throw if timezone is invalid\n\n // Get the timezone offset\n const offsetMinutes = getTimezoneOffsetMinutes(timezone, now);\n\n // Get current date in the target timezone\n const tzFormatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = tzFormatter.formatToParts(now);\n const year = parts.find((p) => p.type === \"year\")?.value;\n const month = parts.find((p) => p.type === \"month\")?.value;\n const day = parts.find((p) => p.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return null;\n }\n\n // Calculate the UTC time for the target local time\n // If it's 8pm in Asia/Tokyo (UTC+9), UTC time would be 11am (subtract 9 hours)\n const totalTargetMinutes = hours * 60 + minutes;\n const totalUtcMinutes = totalTargetMinutes - offsetMinutes;\n\n // Create a date for today at midnight UTC\n const baseDate = new Date(`${year}-${month}-${day}T00:00:00.000Z`);\n\n // Add the UTC minutes\n const resetDate = new Date(\n baseDate.getTime() + totalUtcMinutes * 60 * 1000,\n );\n\n // If the reset time is in the past or equal to now, add one day\n if (resetDate.getTime() <= now.getTime()) {\n resetDate.setTime(resetDate.getTime() + 24 * 60 * 60 * 1000);\n }\n\n return resetDate;\n } catch {\n return null;\n }\n};\n\n/**\n * Returns a fallback time (30 minutes from now) as ISO string.\n */\nconst getFallbackTime = (): string => {\n const fallback = new Date();\n fallback.setMinutes(fallback.getMinutes() + 30);\n return fallback.toISOString();\n};\n", "import { FileSystem } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\n\n/**\n * Extracts the last non-empty line from a string content.\n * Handles both LF and CRLF line endings.\n *\n * @param content - The content to extract the last line from\n * @returns The last non-empty line, or empty string if no lines exist\n */\nexport const extractLastNonEmptyLine = (content: string): string => {\n // Split by newline, handling both LF and CRLF\n const lines = content.split(/\\r?\\n/);\n\n // Find the last non-empty line by iterating from the end\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line !== undefined && line.trim() !== \"\") {\n return line;\n }\n }\n\n return \"\";\n};\n\n/**\n * Reads the last non-empty line of a file.\n *\n * This function reads the entire file content and extracts the last non-empty line.\n * While simpler than seeking to the end of the file, this approach is reliable\n * and acceptable for typical JSONL session files which are monitored via SSE\n * and read infrequently on file change events.\n *\n * @param filePath - Absolute path to the file\n * @returns Effect that resolves to the last non-empty line of the file\n *\n * @example\n * ```typescript\n * const effect = readLastLine(\"/path/to/session.jsonl\");\n * const lastLine = await Effect.runPromise(effect.pipe(Effect.provide(NodeContext.layer)));\n * ```\n */\nexport const readLastLine = (\n filePath: string,\n): Effect.Effect<string, PlatformError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n // Read the entire file content\n const content = yield* fs.readFileString(filePath);\n\n // Extract the last non-empty line\n return extractLastNonEmptyLine(content);\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 } = yield* 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 } = yield* 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 { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse\";\nimport type { InferEffect } from \"../../../lib/effect/types\";\nimport { AgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository\";\nimport { EventBus } from \"../../events/services/EventBus\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository\";\nimport { decodeSessionId } from \"../functions/id\";\nimport { generateSessionHtml } from \"../services/ExportService\";\n\nconst LayerImpl = Effect.gen(function* () {\n const sessionRepository = yield* SessionRepository;\n const agentSessionRepository = yield* AgentSessionRepository;\n const fs = yield* FileSystem.FileSystem;\n const eventBus = yield* EventBus;\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(\n session,\n projectId,\n agentSessionRepository,\n );\n\n return {\n status: 200,\n response: { html },\n } as const satisfies ControllerResponse;\n });\n\n const deleteSession = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n const sessionPath = decodeSessionId(projectId, sessionId);\n\n // Check if session file exists\n const exists = yield* fs.exists(sessionPath);\n if (!exists) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n // Delete the session file\n const deleteResult = yield* fs.remove(sessionPath).pipe(\n Effect.map(() => ({ success: true, error: null }) as const),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false,\n error: `Failed to delete session: ${error.message}`,\n } as const),\n ),\n );\n\n if (!deleteResult.success) {\n return {\n status: 500,\n response: { error: deleteResult.error },\n } as const satisfies ControllerResponse;\n }\n\n // Emit sessionListChanged event to notify clients\n yield* eventBus.emit(\"sessionListChanged\", { projectId });\n\n return {\n status: 200,\n response: { success: true },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getSession,\n exportSessionHtml,\n deleteSession,\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 { ToolResultContent } from \"../../../../lib/conversation-schema/content/ToolResultContentSchema\";\nimport type { IAgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository\";\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 (enhanced version)\n * Supports: code blocks, tables, blockquotes, lists (ul/ol/task), hr, strikethrough,\n * inline code, bold, italic, headers, links, paragraphs\n */\nconst renderMarkdown = (content: string): string => {\n // First, extract code blocks to protect them from other processing\n const codeBlocks: string[] = [];\n let processedContent = content.replace(\n /```(\\w+)?\\n([\\s\\S]*?)```/g,\n (_match, lang, code) => {\n const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`\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\")}\">${escapeHtml(code.trim())}</code></pre>\n </div>\n `);\n return placeholder;\n },\n );\n\n // Process tables (before escaping HTML)\n processedContent = processedContent.replace(\n /(?:^\\|.+\\|$\\n?)+/gm,\n (tableBlock) => {\n const rows = tableBlock.trim().split(\"\\n\");\n if (rows.length < 2) return escapeHtml(tableBlock);\n\n const headerRow = rows[0];\n const separatorRow = rows[1];\n\n // Check if second row is a separator (contains only |, -, :, and spaces)\n if (\n !headerRow ||\n !separatorRow ||\n !/^\\|[\\s\\-:|]+\\|$/.test(separatorRow)\n ) {\n return escapeHtml(tableBlock);\n }\n\n const parseRow = (row: string): string[] =>\n row\n .split(\"|\")\n .slice(1, -1)\n .map((cell) => cell.trim());\n\n const headerCells = parseRow(headerRow);\n const dataRows = rows.slice(2);\n\n let tableHtml = '<table class=\"markdown-table\"><thead><tr>';\n for (const cell of headerCells) {\n tableHtml += `<th>${escapeHtml(cell)}</th>`;\n }\n tableHtml += \"</tr></thead><tbody>\";\n\n for (const row of dataRows) {\n const cells = parseRow(row);\n tableHtml += \"<tr>\";\n for (const cell of cells) {\n tableHtml += `<td>${escapeHtml(cell)}</td>`;\n }\n tableHtml += \"</tr>\";\n }\n tableHtml += \"</tbody></table>\";\n\n return tableHtml;\n },\n );\n\n // Escape HTML for remaining content (except already processed tables)\n // We need to escape only non-processed parts\n processedContent = processedContent\n .split(\n /(<table class=\"markdown-table\">[\\s\\S]*?<\\/table>|__CODE_BLOCK_\\d+__)/,\n )\n .map((part) => {\n if (\n part.startsWith('<table class=\"markdown-table\">') ||\n /^__CODE_BLOCK_\\d+__$/.test(part)\n ) {\n return part;\n }\n return escapeHtml(part);\n })\n .join(\"\");\n\n // Blockquotes (multi-line support)\n processedContent = processedContent.replace(\n /(?:^> .+$\\n?)+/gm,\n (quoteBlock) => {\n const lines = quoteBlock\n .split(\"\\n\")\n .filter((l) => l.trim())\n .map((l) => l.replace(/^> /, \"\"))\n .join(\"<br>\");\n return `<blockquote class=\"markdown-blockquote\">${lines}</blockquote>`;\n },\n );\n\n // Horizontal rule\n processedContent = processedContent.replace(\n /^(\\*{3,}|-{3,}|_{3,})$/gm,\n '<hr class=\"markdown-hr\">',\n );\n\n // Task lists (must be before regular lists)\n processedContent = processedContent.replace(\n /(?:^- \\[([ xX])\\] .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^- \\[([ xX])\\] (.+)$/);\n if (match?.[1] !== undefined && match[2] !== undefined) {\n const checked = match[1].toLowerCase() === \"x\";\n return `<li class=\"task-item\"><input type=\"checkbox\" class=\"task-checkbox\" ${checked ? \"checked\" : \"\"} disabled>${match[2]}</li>`;\n }\n return \"\";\n })\n .join(\"\");\n return `<ul class=\"markdown-task-list\">${items}</ul>`;\n },\n );\n\n // Unordered lists\n processedContent = processedContent.replace(\n /(?:^[-*+] .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^[-*+] (.+)$/);\n return match ? `<li>${match[1]}</li>` : \"\";\n })\n .join(\"\");\n return `<ul class=\"markdown-ul\">${items}</ul>`;\n },\n );\n\n // Ordered lists\n processedContent = processedContent.replace(\n /(?:^\\d+\\. .+$\\n?)+/gm,\n (listBlock) => {\n const items = listBlock\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^\\d+\\. (.+)$/);\n return match ? `<li>${match[1]}</li>` : \"\";\n })\n .join(\"\");\n return `<ol class=\"markdown-ol\">${items}</ol>`;\n },\n );\n\n // Strikethrough\n processedContent = processedContent.replace(\n /~~(.+?)~~/g,\n '<del class=\"markdown-del\">$1</del>',\n );\n\n // Inline code\n processedContent = processedContent.replace(\n /`([^`]+)`/g,\n '<code class=\"inline-code\">$1</code>',\n );\n\n // Bold\n processedContent = processedContent.replace(\n /\\*\\*(.+?)\\*\\*/g,\n \"<strong>$1</strong>\",\n );\n\n // Italic (avoiding conflict with bold)\n processedContent = processedContent.replace(\n /(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g,\n \"<em>$1</em>\",\n );\n\n // Headers\n processedContent = processedContent.replace(\n /^### (.+)$/gm,\n '<h3 class=\"markdown-h3\">$1</h3>',\n );\n processedContent = processedContent.replace(\n /^## (.+)$/gm,\n '<h2 class=\"markdown-h2\">$1</h2>',\n );\n processedContent = processedContent.replace(\n /^# (.+)$/gm,\n '<h1 class=\"markdown-h1\">$1</h1>',\n );\n\n // Links (already escaped, so we look for escaped version)\n processedContent = processedContent.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n\n // Paragraphs - process remaining text blocks\n const blockElements = [\n \"<h1\",\n \"<h2\",\n \"<h3\",\n \"<div\",\n \"<pre\",\n \"<table\",\n \"<ul\",\n \"<ol\",\n \"<blockquote\",\n \"<hr\",\n \"__CODE_BLOCK_\",\n ];\n processedContent = processedContent\n .split(\"\\n\\n\")\n .map((para) => {\n const trimmed = para.trim();\n if (trimmed === \"\") return \"\";\n if (blockElements.some((tag) => trimmed.startsWith(tag))) {\n return para;\n }\n return `<p class=\"markdown-p\">${para.replace(/\\n/g, \"<br>\")}</p>`;\n })\n .filter((p) => p !== \"\")\n .join(\"\\n\");\n\n // Restore code blocks\n for (let i = 0; i < codeBlocks.length; i++) {\n const codeBlock = codeBlocks[i];\n if (codeBlock !== undefined) {\n processedContent = processedContent.replace(\n `__CODE_BLOCK_${i}__`,\n codeBlock,\n );\n }\n }\n\n return processedContent;\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 * Type for tool result map\n */\ntype ToolResultMap = Map<string, ToolResultContent>;\n\n/**\n * Renders tool result content\n */\nconst renderToolResultContent = (result: ToolResultContent): string => {\n const isError = result.is_error === true;\n const errorClass = isError ? \" tool-result-error\" : \"\";\n\n let contentHtml: string;\n if (typeof result.content === \"string\") {\n contentHtml = `<pre class=\"tool-result-text\">${escapeHtml(result.content)}</pre>`;\n } else {\n contentHtml = result.content\n .map((item) => {\n if (item.type === \"text\") {\n return `<pre class=\"tool-result-text\">${escapeHtml(item.text)}</pre>`;\n }\n if (item.type === \"image\") {\n return `<img src=\"data:${item.source.media_type};base64,${item.source.data}\" alt=\"Tool result image\" class=\"tool-result-image\" />`;\n }\n return \"\";\n })\n .join(\"\");\n }\n\n return `\n <div class=\"tool-result-block${errorClass}\">\n <div class=\"tool-result-header\">\n <svg class=\"icon-check\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${isError ? '<path d=\"M18 6L6 18M6 6l12 12\"/>' : '<path d=\"M20 6L9 17l-5-5\"/>'}\n </svg>\n <span class=\"tool-result-label\">${isError ? \"Error\" : \"Result\"}</span>\n </div>\n <div class=\"tool-result-content\">\n ${contentHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Sidechain data structure - matches frontend useSidechain logic\n */\ntype SidechainData = {\n // Map from root uuid to all conversations in that sidechain\n groupsByRootUuid: Map<\n string,\n Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>\n >;\n // Map from prompt string to root conversation\n promptToRoot: Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >;\n // Map from agentId to root conversation\n agentIdToRoot: Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >;\n // Map from tool_use_id to agentId (extracted from toolUseResult)\n toolUseIdToAgentId: Map<string, string>;\n};\n\n/**\n * Type guard to check if toolUseResult contains agentId\n */\nconst hasAgentId = (\n toolUseResult: unknown,\n): toolUseResult is { agentId: string } => {\n return (\n typeof toolUseResult === \"object\" &&\n toolUseResult !== null &&\n \"agentId\" in toolUseResult &&\n typeof (toolUseResult as { agentId: unknown }).agentId === \"string\"\n );\n};\n\n/**\n * Builds sidechain data structures matching frontend useSidechain logic\n */\nconst buildSidechainData = (\n conversations: Array<Conversation>,\n): SidechainData => {\n // Filter sidechain conversations\n const sidechainConversations = conversations.filter(\n (conv) =>\n conv.type !== \"summary\" &&\n conv.type !== \"file-history-snapshot\" &&\n conv.type !== \"queue-operation\" &&\n conv.type !== \"progress\" &&\n conv.isSidechain === true,\n ) as Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\n\n // Build uuid -> conversation map for parent lookup\n const uuidMap = new Map(\n sidechainConversations.map((conv) => [conv.uuid, conv] as const),\n );\n\n // Find root conversation for each sidechain conversation\n const getRootConversation = (\n conv: Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>,\n ): Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }> => {\n if (conv.parentUuid === null) {\n return conv;\n }\n const parent = uuidMap.get(conv.parentUuid);\n if (parent === undefined) {\n return conv;\n }\n return getRootConversation(parent);\n };\n\n // Group by root conversation's uuid (matching frontend logic)\n const groupsByRootUuid = new Map<\n string,\n Array<Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>\n >();\n for (const conv of sidechainConversations) {\n const root = getRootConversation(conv);\n const existing = groupsByRootUuid.get(root.uuid);\n if (existing) {\n existing.push(conv);\n } else {\n groupsByRootUuid.set(root.uuid, [conv]);\n }\n }\n\n // Sort each group by timestamp to ensure correct order\n for (const [, convs] of groupsByRootUuid) {\n convs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n }\n\n // Build prompt -> root mapping (for root user messages with string content)\n const promptToRoot = new Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >();\n for (const conv of sidechainConversations) {\n if (\n conv.type === \"user\" &&\n conv.parentUuid === null &&\n typeof conv.message.content === \"string\"\n ) {\n promptToRoot.set(conv.message.content, conv);\n }\n }\n\n // Build agentId -> root mapping\n const agentIdToRoot = new Map<\n string,\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n >();\n for (const conv of sidechainConversations) {\n if (conv.parentUuid === null && conv.agentId !== undefined) {\n agentIdToRoot.set(conv.agentId, conv);\n }\n }\n\n // Build tool_use_id -> agentId mapping from ALL user messages (not just sidechain)\n // This is the critical mapping that links Task tool calls to their subagent sessions\n const toolUseIdToAgentId = new Map<string, string>();\n for (const conv of conversations) {\n if (\n conv.type === \"summary\" ||\n conv.type === \"file-history-snapshot\" ||\n conv.type === \"queue-operation\" ||\n conv.type === \"progress\"\n ) {\n continue;\n }\n if (conv.type !== \"user\") continue;\n const messageContent = conv.message.content;\n if (typeof messageContent === \"string\") continue;\n\n for (const content of messageContent) {\n if (typeof content === \"string\") continue;\n if (content.type === \"tool_result\") {\n const toolUseResult = conv.toolUseResult;\n if (hasAgentId(toolUseResult)) {\n toolUseIdToAgentId.set(content.tool_use_id, toolUseResult.agentId);\n }\n }\n }\n }\n\n return { groupsByRootUuid, promptToRoot, agentIdToRoot, toolUseIdToAgentId };\n};\n\n/**\n * Renders a single sidechain conversation entry (for nested display)\n */\nconst renderSidechainEntry = (\n entry: Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>,\n toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\n): string => {\n if (entry.type === \"user\") {\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 === \"tool_result\") {\n return \"\"; // Skip tool results in user messages\n }\n return \"\";\n })\n .join(\"\");\n\n if (!contentHtml.trim()) return \"\";\n\n return `\n <div class=\"sidechain-entry sidechain-user-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">User</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">${contentHtml}</div>\n </div>\n `;\n }\n\n if (entry.type === \"assistant\") {\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 collapsed\">\n <div class=\"thinking-header collapsible-trigger\">\n <svg class=\"icon-lightbulb\" width=\"14\" height=\"14\" 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} chars)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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 toolResult = toolResultMap.get(msg.id);\n\n // Check if this is a nested Task tool (recursive subagent)\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\n return `\n <div class=\"tool-use-block collapsible collapsed\">\n <div class=\"tool-use-header collapsible-trigger\">\n <svg class=\"icon-wrench\" width=\"14\" height=\"14\" 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} params)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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:</strong>\n <pre class=\"json-input\">${escapeHtml(formatJsonWithNewlines(msg.input))}</pre>\n </div>\n ${toolResultHtml}\n </div>\n </div>\n `;\n }\n\n return \"\";\n })\n .join(\"\");\n\n return `\n <div class=\"sidechain-entry sidechain-assistant-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">Subagent</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">${contentHtml}</div>\n </div>\n `;\n }\n\n if (entry.type === \"system\") {\n const content =\n \"content\" in entry && typeof entry.content === \"string\"\n ? entry.content\n : \"System message\";\n return `\n <div class=\"sidechain-entry sidechain-system-entry\">\n <div class=\"sidechain-entry-header\">\n <span class=\"sidechain-role\">System</span>\n <span class=\"sidechain-timestamp\">${formatTimestamp(entry.timestamp)}</span>\n </div>\n <div class=\"sidechain-entry-content\">\n <div class=\"system-message\">${escapeHtml(content)}</div>\n </div>\n </div>\n `;\n }\n\n return \"\";\n};\n/**\n * Renders a Task tool specially with prompt display and subagent conversations\n */\nconst renderTaskTool = (\n toolId: string,\n input: Record<string, unknown>,\n toolResult: ToolResultContent | undefined,\n sidechainData: SidechainData,\n toolResultMap: ToolResultMap,\n): string => {\n const prompt = typeof input.prompt === \"string\" ? input.prompt : \"\";\n const truncatedPrompt =\n prompt.length > 200 ? `${prompt.slice(0, 200)}...` : prompt;\n\n // Find sidechain conversations using the new data structure\n let sidechainConversations: Array<\n Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>\n > = [];\n\n // 1. Try to find by agentId (from tool use result)\n const agentId = sidechainData.toolUseIdToAgentId.get(toolId);\n if (agentId) {\n const rootByAgentId = sidechainData.agentIdToRoot.get(agentId);\n if (rootByAgentId) {\n const convs = sidechainData.groupsByRootUuid.get(rootByAgentId.uuid);\n if (convs) {\n sidechainConversations = convs;\n }\n }\n }\n\n // 2. Fallback: Try to find by prompt\n if (sidechainConversations.length === 0) {\n const rootConversation = sidechainData.promptToRoot.get(prompt);\n if (rootConversation) {\n const convs = sidechainData.groupsByRootUuid.get(rootConversation.uuid);\n if (convs) {\n sidechainConversations = convs;\n }\n }\n }\n\n const hasSidechain = sidechainConversations.length > 0;\n const sidechainHtml = hasSidechain\n ? `\n <div class=\"sidechain-container collapsible\">\n <div class=\"sidechain-header collapsible-trigger\">\n <svg class=\"icon-layers\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\"/>\n <polyline points=\"2 17 12 22 22 17\"/>\n <polyline points=\"2 12 12 17 22 12\"/>\n </svg>\n <span>Subagent Work Log (${sidechainConversations.length} entries)</span>\n <svg class=\"icon-chevron\" width=\"14\" height=\"14\" 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=\"sidechain-content collapsible-content\">\n ${sidechainConversations\n .map((conv) =>\n renderSidechainEntry(conv, toolResultMap, sidechainData),\n )\n .filter((html) => html !== \"\")\n .join(\"\\n\")}\n </div>\n </div>\n `\n : \"\";\n\n return `\n <div class=\"task-tool-block collapsible\">\n <div class=\"task-tool-header collapsible-trigger\">\n <svg class=\"icon-task\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\n <path d=\"M9 12l2 2 4-4\"/>\n </svg>\n <span class=\"task-tool-name\">Task${hasSidechain ? ` (${sidechainConversations.length} steps)` : \"\"}</span>\n <span class=\"task-prompt-preview\">${escapeHtml(truncatedPrompt)}</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=\"task-tool-content collapsible-content\">\n <div class=\"task-tool-id\"><strong>Task ID:</strong> <code>${escapeHtml(toolId)}</code></div>\n <div class=\"task-prompt\">\n <strong>Prompt:</strong>\n <div class=\"task-prompt-text\">${renderMarkdown(prompt)}</div>\n </div>\n ${toolResult ? renderToolResultContent(toolResult) : \"\"}\n ${sidechainHtml}\n </div>\n </div>\n `;\n};\n\n/**\n * Renders an assistant message entry\n */\nconst renderAssistantEntry = (\n entry: Extract<Conversation, { type: \"assistant\" }>,\n toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\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 toolResult = toolResultMap.get(msg.id);\n\n // Special rendering for Task tool\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\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 ${toolResultHtml}\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 * Gets the content to display for a system entry\n */\nconst getSystemEntryContent = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n if (\"content\" in entry && typeof entry.content === \"string\") {\n return entry.content;\n }\n if (\"subtype\" in entry && entry.subtype === \"stop_hook_summary\") {\n const hookNames = entry.hookInfos.map((h) => h.command).join(\", \");\n return `Stop hook executed: ${hookNames}`;\n }\n return \"System message\";\n};\n\n/**\n * Renders a system message entry\n */\nconst renderSystemEntry = (\n entry: Extract<Conversation, { type: \"system\" }>,\n): string => {\n const content = getSystemEntryContent(entry);\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(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 toolResultMap: ToolResultMap,\n sidechainData: SidechainData,\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 toolResult = toolResultMap.get(msg.id);\n\n // Special rendering for Task tool\n if (msg.name === \"Task\") {\n return renderTaskTool(\n msg.id,\n msg.input,\n toolResult,\n sidechainData,\n toolResultMap,\n );\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult\n ? renderToolResultContent(toolResult)\n : \"\";\n\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 ${toolResultHtml}\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 agentSessionRepo: IAgentSessionRepository,\n): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n // Identify all agentIds from tool usage in the main session\n const agentIds = new Set<string>();\n\n for (const conv of session.conversations) {\n if (conv.type !== \"user\" || typeof conv.message.content === \"string\") {\n continue;\n }\n\n for (const content of conv.message.content) {\n if (typeof content === \"string\") continue;\n if (content.type === \"tool_result\") {\n const toolUseResult = conv.toolUseResult;\n if (hasAgentId(toolUseResult)) {\n agentIds.add(toolUseResult.agentId);\n }\n }\n }\n }\n\n // Check which agentIds are already present in the session (legacy format)\n const existingAgentIds = new Set<string>();\n for (const conv of session.conversations) {\n if (conv.type === \"x-error\") continue;\n if (\n conv.type !== \"summary\" &&\n conv.type !== \"file-history-snapshot\" &&\n conv.type !== \"queue-operation\" &&\n conv.type !== \"progress\" &&\n conv.isSidechain === true &&\n conv.agentId !== undefined\n ) {\n existingAgentIds.add(conv.agentId);\n }\n }\n\n // Determine missing agentIds\n const missingAgentIds = Array.from(agentIds).filter(\n (id) => !existingAgentIds.has(id),\n );\n\n // Load missing agent sessions\n const loadedConversations: Conversation[] = [];\n\n if (missingAgentIds.length > 0) {\n // Load concurrently\n const loadedSessions = yield* Effect.all(\n missingAgentIds.map((agentId) =>\n agentSessionRepo.getAgentSessionByAgentId(\n projectId,\n agentId,\n session.id,\n ),\n ),\n { concurrency: 5 },\n );\n\n for (const sess of loadedSessions) {\n if (sess) {\n // Verify items are valid conversations (filter out unknowns if any)\n const validConvs = sess.filter(\n (c): c is Conversation =>\n c.type === \"user\" ||\n c.type === \"assistant\" ||\n c.type === \"system\",\n );\n loadedConversations.push(\n ...validConvs.map((c) => ({\n ...c,\n isSidechain: true, // Ensure they are marked as sidechain\n })),\n );\n }\n }\n }\n\n // Combine all conversations for data building\n const allConversations = [\n ...session.conversations.filter(\n (conv): conv is Conversation => conv.type !== \"x-error\",\n ),\n ...loadedConversations,\n ];\n\n // Build sidechain data using ALL conversations\n const sidechainData = buildSidechainData(allConversations);\n\n // Build tool result map from user messages (including loaded sidechain ones)\n const toolResultMap: ToolResultMap = new Map();\n for (const conv of allConversations) {\n // Skip non-conversation types\n if (\n conv.type === \"summary\" ||\n conv.type === \"file-history-snapshot\" ||\n conv.type === \"queue-operation\" ||\n conv.type === \"progress\"\n ) {\n continue;\n }\n if (conv.type !== \"user\") continue;\n const content = conv.message.content;\n if (typeof content === \"string\") continue;\n for (const msg of content) {\n if (typeof msg === \"string\") continue;\n if (msg.type === \"tool_result\") {\n toolResultMap.set(msg.tool_use_id, msg);\n }\n }\n }\n\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 toolResultMap,\n sidechainData,\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, toolResultMap, sidechainData);\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-word;\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 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\n /* Enhanced Markdown Styles */\n .markdown-table {\n width: 100%;\n border-collapse: collapse;\n margin: 1rem 0;\n font-size: 0.875rem;\n }\n\n .markdown-table th,\n .markdown-table td {\n border: 1px solid hsl(var(--border));\n padding: 0.5rem 0.75rem;\n text-align: left;\n }\n\n .markdown-table th {\n background: hsl(var(--muted) / 0.5);\n font-weight: 600;\n }\n\n .markdown-table tr:nth-child(even) {\n background: hsl(var(--muted) / 0.2);\n }\n\n .markdown-blockquote {\n border-left: 4px solid hsl(var(--blue-600));\n padding: 0.75rem 1rem;\n margin: 1rem 0;\n background: hsl(var(--muted) / 0.3);\n color: hsl(var(--muted-foreground));\n font-style: italic;\n }\n\n .markdown-ul,\n .markdown-ol {\n margin: 1rem 0;\n padding-left: 1.5rem;\n }\n\n .markdown-ul li,\n .markdown-ol li {\n margin-bottom: 0.25rem;\n line-height: 1.6;\n }\n\n .markdown-task-list {\n list-style: none;\n padding-left: 0;\n margin: 1rem 0;\n }\n\n .task-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n }\n\n .task-checkbox {\n margin-top: 0.25rem;\n width: 1rem;\n height: 1rem;\n accent-color: hsl(var(--blue-600));\n }\n\n .markdown-hr {\n border: none;\n border-top: 2px solid hsl(var(--border));\n margin: 2rem 0;\n }\n\n .markdown-del {\n text-decoration: line-through;\n color: hsl(var(--muted-foreground));\n }\n\n /* Tool Result Styles */\n .tool-result-block {\n margin-top: 0.75rem;\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n overflow: scroll;\n }\n\n .tool-result-error {\n border-color: hsl(0 84% 60%);\n }\n\n .tool-result-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n background: hsl(var(--muted) / 0.3);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .tool-result-error .tool-result-header {\n background: hsl(0 84% 60% / 0.1);\n color: hsl(0 84% 40%);\n }\n\n .icon-check {\n flex-shrink: 0;\n color: hsl(142 76% 36%);\n }\n\n .tool-result-error .icon-check {\n color: hsl(0 84% 60%);\n }\n\n .tool-result-label {\n font-weight: 500;\n }\n\n .tool-result-content {\n padding: 0.75rem;\n background: hsl(var(--background));\n }\n\n .tool-result-text {\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: break-word;\n margin: 0;\n }\n\n .tool-result-image {\n max-width: 100%;\n height: auto;\n border-radius: 0.25rem;\n }\n\n /* Task Tool Styles */\n .task-tool-block {\n border: 1px solid hsl(142 76% 36% / 0.3);\n background: hsl(142 76% 36% / 0.05);\n border-radius: 0.5rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n }\n\n .task-tool-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n background: hsl(142 76% 36% / 0.1);\n transition: background 0.2s;\n }\n\n .task-tool-header:hover {\n background: hsl(142 76% 36% / 0.15);\n }\n\n .icon-task {\n color: hsl(142 76% 36%);\n flex-shrink: 0;\n }\n\n .task-tool-name {\n font-size: 0.875rem;\n font-weight: 600;\n color: hsl(142 76% 30%);\n }\n\n .task-prompt-preview {\n flex: 1;\n font-size: 0.75rem;\n color: hsl(var(--muted-foreground));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .task-tool-content {\n padding: 0.75rem 1rem;\n border-top: 1px solid hsl(142 76% 36% / 0.2);\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .task-tool-id {\n font-size: 0.75rem;\n }\n\n .task-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(142 76% 36% / 0.2);\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .task-prompt {\n font-size: 0.875rem;\n }\n\n .task-prompt-text {\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 }\n\n /* Sidechain / Subagent Styles */\n .sidechain-container {\n margin-top: 1rem;\n border: 1px solid hsl(217 91% 60% / 0.3);\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .sidechain-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: hsl(217 91% 60% / 0.1);\n color: hsl(217 91% 40%);\n font-size: 0.8rem;\n font-weight: 500;\n cursor: pointer;\n }\n\n .sidechain-header:hover {\n background: hsl(217 91% 60% / 0.15);\n }\n\n .icon-layers {\n flex-shrink: 0;\n }\n\n .sidechain-content {\n padding: 0.75rem;\n background: hsl(217 91% 60% / 0.02);\n border-top: 1px solid hsl(217 91% 60% / 0.2);\n }\n\n .sidechain-entry {\n margin-left: 1rem;\n padding: 0.5rem 0.75rem;\n border-left: 2px solid hsl(217 91% 60% / 0.3);\n margin-bottom: 0.5rem;\n }\n\n .sidechain-entry:last-child {\n margin-bottom: 0;\n }\n\n .sidechain-entry-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n font-size: 0.75rem;\n }\n\n .sidechain-role {\n font-weight: 600;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n }\n\n .sidechain-user-entry .sidechain-role {\n background: hsl(var(--muted));\n color: hsl(var(--foreground));\n }\n\n .sidechain-assistant-entry .sidechain-role {\n background: hsl(217 91% 60% / 0.1);\n color: hsl(217 91% 40%);\n }\n\n .sidechain-system-entry .sidechain-role {\n background: hsl(var(--muted) / 0.5);\n color: hsl(var(--muted-foreground));\n }\n\n .sidechain-timestamp {\n color: hsl(var(--muted-foreground));\n }\n\n .sidechain-entry-content {\n font-size: 0.875rem;\n }\n\n .sidechain-entry .thinking-block,\n .sidechain-entry .tool-use-block {\n margin: 0.5rem 0;\n font-size: 0.8rem;\n }\n\n .sidechain-entry .thinking-header,\n .sidechain-entry .tool-use-header {\n padding: 0.375rem 0.5rem;\n }\n\n .sidechain-entry .thinking-content,\n .sidechain-entry .tool-use-content {\n padding: 0.5rem;\n }\n\n /* Optimize content display */\n .entry-content > *:first-child {\n margin-top: 0;\n }\n\n .entry-content > *:last-child {\n margin-bottom: 0;\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 { Context, Effect, Layer } from \"effect\";\nimport type { TaskCreate, TaskUpdate } from \"../schema\";\nimport { TasksService } from \"../services/TasksService\";\n\nconst make = Effect.gen(function* () {\n const service = yield* TasksService;\n\n const listTasks = (projectPath: string, specificSessionId?: string) =>\n service.listTasks(projectPath, specificSessionId);\n\n const createTask = (\n projectPath: string,\n task: TaskCreate,\n specificSessionId?: string,\n ) => service.createTask(projectPath, task, specificSessionId);\n\n const updateTask = (\n projectPath: string,\n task: TaskUpdate,\n specificSessionId?: string,\n ) => service.updateTask(projectPath, task, specificSessionId);\n\n return {\n listTasks,\n createTask,\n updateTask,\n };\n});\n\nexport class TasksController extends Context.Tag(\"TasksController\")<\n TasksController,\n Effect.Effect.Success<typeof make>\n>() {\n static Live = Layer.effect(this, make);\n}\n", "/** @effect-diagnostics globalErrorInEffectFailure:skip-file */\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport {\n type Task,\n type TaskCreate,\n TaskSchema,\n type TaskUpdate,\n} from \"../schema\";\n\nconst TASKS_DIR_NAME = \"tasks\";\nconst PROJECTS_DIR_NAME = \"projects\";\nconst CLAUDE_DIR_NAME = \".claude\";\n\nexport class TasksService extends Context.Tag(\"TasksService\")<\n TasksService,\n {\n listTasks: (\n projectPath: string,\n specificSessionId?: string,\n ) => Effect.Effect<Task[], Error>;\n getTask: (\n projectPath: string,\n turnId: string,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\n createTask: (\n projectPath: string,\n task: TaskCreate,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\n updateTask: (\n projectPath: string,\n task: TaskUpdate,\n specificSessionId?: string,\n ) => Effect.Effect<Task, Error>;\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\n // Helper to find the Global Claude Directory\n const getClaudeDir = () =>\n Effect.succeed(join(homedir(), CLAUDE_DIR_NAME));\n\n const normalizeProjectPath = (projectPath: string) => {\n // e.g. /Users/foo/bar -> -Users-foo-bar\n const normalized = projectPath.replaceAll(path.sep, \"-\");\n // Ensure it starts with - if the original path started with /\n return normalized.startsWith(\"-\") ? normalized : `-${normalized}`;\n };\n\n /**\n * Resolves the project UUID for a given project path.\n * Returns Option.none() when:\n * - Project metadata directory doesn't exist\n * - No UUID file found in project metadata directory\n * - Specific sessionId is provided but its tasks directory doesn't exist\n * Returns Option.some(uuid) when resolution succeeds.\n */\n const resolveProjectUuid = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<Option.Option<string>, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n\n // If a specific session ID is provided, verify it exists and return it\n if (specificSessionId) {\n const sessionTasksDir = path.join(\n claudeDir,\n TASKS_DIR_NAME,\n specificSessionId,\n );\n if (yield* fs.exists(sessionTasksDir)) {\n return Option.some(specificSessionId);\n }\n // Return none when requested session has no tasks directory\n return Option.none<string>();\n }\n\n // Check if the projectPath is already pointing to a metadata directory in .claude/projects\n // Path structure: .../.claude/projects/<normalized-id>\n const isMetadataPath =\n projectPath.includes(join(CLAUDE_DIR_NAME, PROJECTS_DIR_NAME)) &&\n projectPath.split(path.sep).pop()?.startsWith(\"-\");\n\n let projectMetaDir: string;\n\n if (isMetadataPath && (yield* fs.exists(projectPath))) {\n projectMetaDir = projectPath;\n } else {\n const identifier = normalizeProjectPath(projectPath);\n projectMetaDir = path.join(\n claudeDir,\n PROJECTS_DIR_NAME,\n identifier,\n );\n }\n\n // Check if directory exists\n const exists = yield* fs.exists(projectMetaDir);\n if (!exists) {\n return Option.none<string>();\n }\n\n // Read directory to find all UUID-like files (json, jsonl, or no extension)\n const files = yield* fs.readDirectory(projectMetaDir);\n\n const uuidPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;\n\n const candidates = files.filter((f) => uuidPattern.test(f));\n\n if (candidates.length === 0) {\n return Option.none<string>();\n }\n\n // Analyze candidates: valid UUID, mtime, and whether they have a tasks directory\n const candidateInfo = yield* Effect.all(\n candidates.map((file) =>\n Effect.gen(function* () {\n const fullPath = path.join(projectMetaDir, file);\n const stat = yield* fs.stat(fullPath);\n const match = file.match(uuidPattern);\n const uuid = match ? match[0] : file;\n\n const tasksPath = path.join(claudeDir, TASKS_DIR_NAME, uuid);\n const hasTasks = yield* fs.exists(tasksPath);\n\n return {\n file,\n uuid,\n mtime: Option.getOrElse(stat.mtime, () => new Date(0)),\n hasTasks,\n };\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n // Sort logic:\n // 1. Has tasks directory (Priority #1)\n // 2. Newer mtime (Priority #2)\n const sorted = candidateInfo.sort((a, b) => {\n if (a.hasTasks && !b.hasTasks) return -1;\n if (!a.hasTasks && b.hasTasks) return 1;\n return b.mtime.getTime() - a.mtime.getTime();\n });\n\n const best = sorted[0];\n\n if (!best) {\n return Option.none<string>();\n }\n\n return Option.some(best.uuid);\n });\n\n /**\n * Resolves the project UUID, but fails with an error when resolution fails.\n * Used by operations that require a valid project (getTask, createTask, updateTask).\n */\n const resolveProjectUuidOrFail = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const uuidOption = yield* resolveProjectUuid(\n projectPath,\n specificSessionId,\n );\n\n if (Option.isNone(uuidOption)) {\n if (specificSessionId) {\n return yield* Effect.fail(\n new Error(\n `Requested session ${specificSessionId} has no tasks directory`,\n ),\n );\n }\n const claudeDir = yield* getClaudeDir();\n const identifier = normalizeProjectPath(projectPath);\n const projectMetaDir = path.join(\n claudeDir,\n PROJECTS_DIR_NAME,\n identifier,\n );\n return yield* Effect.fail(\n new Error(\n `Project metadata directory not found or no UUID: ${projectMetaDir}`,\n ),\n );\n }\n\n return uuidOption.value;\n });\n\n /**\n * Gets the tasks directory path for a given project.\n * Returns Option.none() when resolution fails.\n * Used by listTasks for graceful handling of missing directories.\n */\n const getTasksDir = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<Option.Option<string>, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n const uuidOption = yield* resolveProjectUuid(\n projectPath,\n specificSessionId,\n );\n\n return Option.map(uuidOption, (uuid) =>\n path.join(claudeDir, TASKS_DIR_NAME, uuid),\n );\n });\n\n /**\n * Gets the tasks directory path, but fails with an error when resolution fails.\n * Used by operations that require a valid directory (getTask, createTask, updateTask).\n */\n const getTasksDirOrFail = (\n projectPath: string,\n specificSessionId?: string,\n ): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const claudeDir = yield* getClaudeDir();\n const uuid = yield* resolveProjectUuidOrFail(\n projectPath,\n specificSessionId,\n );\n return path.join(claudeDir, TASKS_DIR_NAME, uuid);\n });\n\n const listTasks = (projectPath: string, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDirOption = yield* getTasksDir(\n projectPath,\n specificSessionId,\n );\n\n if (Option.isNone(tasksDirOption)) {\n return [];\n }\n\n const tasksDir = tasksDirOption.value;\n\n const exists = yield* fs.exists(tasksDir);\n if (!exists) {\n return [];\n }\n\n const files = yield* fs.readDirectory(tasksDir);\n const tasks: Task[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const content = yield* fs.readFileString(path.join(tasksDir, file));\n try {\n const task = JSON.parse(content);\n // Validate with schema optionally\n const parsed = TaskSchema.safeParse(task);\n if (parsed.success) {\n tasks.push(parsed.data);\n } else {\n console.warn(`Invalid task file ${file}:`, parsed.error);\n // Create a fallback task for invalid schema\n const fallbackTask: Task = {\n id:\n typeof task === \"object\" &&\n task !== null &&\n \"id\" in task &&\n typeof task.id === \"string\"\n ? task.id\n : file.replace(\".json\", \"\"),\n subject:\n typeof task === \"object\" &&\n task !== null &&\n \"subject\" in task &&\n typeof task.subject === \"string\"\n ? task.subject\n : typeof task === \"object\" &&\n task !== null &&\n \"title\" in task &&\n typeof task.title === \"string\"\n ? task.title\n : \"Invalid Task Schema\",\n description: `Validation Error: ${JSON.stringify(parsed.error.format())}. Raw: ${JSON.stringify(task)}`,\n status:\n typeof task === \"object\" &&\n task !== null &&\n \"status\" in task &&\n typeof task.status === \"string\" &&\n (task.status === \"pending\" ||\n task.status === \"in_progress\" ||\n task.status === \"completed\" ||\n task.status === \"failed\")\n ? task.status\n : \"failed\",\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n } catch (e) {\n console.error(`Failed to parse task file ${file}`, e);\n const fallbackTask: Task = {\n id: file.replace(\".json\", \"\"),\n subject: \"Corrupted Task File\",\n description: String(e),\n status: \"failed\",\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n }\n\n return tasks.sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10));\n });\n\n const getTask = (\n projectPath: string,\n turnId: string,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n const taskFile = path.join(tasksDir, `${turnId}.json`);\n\n const exists = yield* fs.exists(taskFile);\n if (!exists) {\n return yield* Effect.fail(new Error(`Task ${turnId} not found`));\n }\n\n const content = yield* fs.readFileString(taskFile);\n const task = JSON.parse(content);\n return yield* Effect.try(() => TaskSchema.parse(task));\n });\n\n const createTask = (\n projectPath: string,\n turnDef: TaskCreate,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n // Ensure directory exists\n const dirExists = yield* fs.exists(tasksDir);\n if (!dirExists) {\n yield* fs.makeDirectory(tasksDir, { recursive: true });\n }\n\n // Generate ID: find max ID and increment\n const files = yield* fs.readDirectory(tasksDir);\n let maxId = 0;\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const idPart = file.replace(\".json\", \"\");\n const idNum = parseInt(idPart, 10);\n if (!Number.isNaN(idNum) && idNum > maxId) {\n maxId = idNum;\n }\n }\n }\n const newId = (maxId + 1).toString();\n\n const newTask: Task = {\n id: newId,\n status: \"pending\",\n blocks: [],\n blockedBy: [],\n ...turnDef,\n };\n\n const filePath = path.join(tasksDir, `${newId}.json`);\n yield* fs.writeFileString(filePath, JSON.stringify(newTask, null, 2));\n\n return newTask;\n });\n\n const updateTask = (\n projectPath: string,\n update: TaskUpdate,\n specificSessionId?: string,\n ) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(\n projectPath,\n specificSessionId,\n );\n const filePath = path.join(tasksDir, `${update.taskId}.json`);\n\n const exists = yield* fs.exists(filePath);\n if (!exists) {\n return yield* Effect.fail(\n new Error(`Task ${update.taskId} not found`),\n );\n }\n\n const content = yield* fs.readFileString(filePath);\n const currentTask = TaskSchema.parse(JSON.parse(content));\n\n const updatedTask: Task = {\n ...currentTask,\n // User cannot update status via Viewer, it is managed by Claude Agent\n status: currentTask.status,\n subject: update.subject ?? currentTask.subject,\n description: update.description ?? currentTask.description,\n activeForm: update.activeForm ?? currentTask.activeForm,\n owner: update.owner ?? currentTask.owner,\n blockedBy: update.addBlockedBy\n ? [...(currentTask.blockedBy || []), ...update.addBlockedBy]\n : currentTask.blockedBy,\n blocks: update.addBlocks\n ? [...(currentTask.blocks || []), ...update.addBlocks]\n : currentTask.blocks,\n metadata: update.metadata\n ? { ...currentTask.metadata, ...update.metadata }\n : currentTask.metadata,\n };\n\n // Remove null metadata keys\n if (updatedTask.metadata) {\n for (const key in updatedTask.metadata) {\n if (updatedTask.metadata[key] === null) {\n delete updatedTask.metadata[key];\n }\n }\n }\n\n yield* fs.writeFileString(\n filePath,\n JSON.stringify(updatedTask, null, 2),\n );\n return updatedTask;\n });\n\n return {\n listTasks,\n getTask,\n createTask,\n updateTask,\n };\n }),\n );\n}\n", "import { z } from \"zod\";\n\nexport const TaskStatusSchema = z.enum([\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"failed\",\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskSchema = z.object({\n id: z.string(),\n subject: z.string(),\n description: z.string().optional(),\n status: TaskStatusSchema,\n owner: z.string().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n activeForm: z.string().optional(),\n});\n\nexport type Task = z.infer<typeof TaskSchema>;\n\nexport const TaskCreateSchema = z.object({\n subject: z.string(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type TaskCreate = z.infer<typeof TaskCreateSchema>;\n\nexport const TaskUpdateSchema = z.object({\n taskId: z.string(),\n status: TaskStatusSchema.optional(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n owner: z.string().optional(),\n addBlockedBy: z.array(z.string()).optional(),\n addBlocks: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type TaskUpdate = z.infer<typeof TaskUpdateSchema>;\n", "import { Context, Effect, Layer } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type WebSocket from \"ws\";\nimport type { InferEffect } from \"../../lib/effect/types\";\nimport { CcvOptionsService } from \"../platform/services/CcvOptionsService\";\nimport { EnvService } from \"../platform/services/EnvService\";\nimport { normalizePtyChunk } from \"./normalizePtyChunk\";\nimport {\n createRusptySession,\n type RusptyModule,\n type TerminalPtyProcess,\n} from \"./rusptyAdapter\";\n\ntype PtyProcess = TerminalPtyProcess;\n\ntype TerminalOutputChunk = {\n seq: number;\n data: string;\n};\n\ntype TerminalSession = {\n id: string;\n pty: PtyProcess;\n seq: number;\n buffer: TerminalOutputChunk[];\n bufferBytes: number;\n lastActivity: number;\n clients: Set<WebSocket>;\n exited: boolean;\n inputBuffer: string;\n};\n\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst MAX_BUFFER_BYTES = 1024 * 1024 * 2;\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_SESSIONS = 10;\n\nconst selectShell = (\n shellEnv: string | undefined,\n fallbackShell: string | undefined,\n unrestrictedFlag: boolean | undefined,\n) => {\n if (process.platform === \"win32\") {\n return { command: \"powershell.exe\", args: [\"-NoLogo\"] };\n }\n const command = shellEnv ?? fallbackShell ?? \"bash\";\n const args: string[] = [];\n if (!unrestrictedFlag && command.toLowerCase().includes(\"bash\")) {\n args.push(\"--noprofile\", \"--norc\", \"--restricted\");\n }\n return { command, args };\n};\n\nconst isFlagEnabled = (value: string | undefined) => {\n if (!value) return false;\n return value === \"1\" || value.toLowerCase() === \"true\";\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const envService = yield* EnvService;\n const ccvOptionsService = yield* CcvOptionsService;\n const sessions = new Map<string, TerminalSession>();\n\n const disabledService = (reason: string) => {\n const getOrCreateSession = (_sessionId?: string, _cwdOverride?: string) =>\n Effect.fail(new Error(`Terminal support is unavailable (${reason}).`));\n return {\n getOrCreateSession,\n registerClient: () => Effect.void,\n unregisterClient: () => Effect.void,\n writeInput: () => Effect.void,\n resize: () => Effect.void,\n signal: () => Effect.void,\n snapshotSince: () => Effect.succeed(undefined),\n };\n };\n\n const ruspty: RusptyModule | null = yield* Effect.tryPromise({\n try: () => import(\"@replit/ruspty\"),\n catch: (error) =>\n new Error(`Failed to load @replit/ruspty: ${String(error)}`),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n console.warn(error.message);\n return null;\n }),\n ),\n );\n\n if (!ruspty) {\n return disabledService(\"@replit/ruspty failed to load\");\n }\n\n const trimBuffer = (session: TerminalSession) => {\n while (\n session.bufferBytes > MAX_BUFFER_BYTES &&\n session.buffer.length > 0\n ) {\n const removed = session.buffer.shift();\n if (removed) {\n session.bufferBytes -= Buffer.byteLength(removed.data, \"utf8\");\n }\n }\n };\n\n const sendJson = (client: WebSocket, payload: unknown) => {\n if (client.readyState !== 1) return;\n client.send(JSON.stringify(payload));\n };\n\n const broadcast = (session: TerminalSession, payload: unknown) => {\n for (const client of session.clients) {\n sendJson(client, payload);\n }\n };\n\n const destroySession = (sessionId: string) => {\n const session = sessions.get(sessionId);\n if (!session) return;\n sessions.delete(sessionId);\n session.exited = true;\n for (const client of session.clients) {\n if (client.readyState === 1) {\n client.close(1000, \"Session closed\");\n }\n }\n session.clients.clear();\n session.pty.kill();\n };\n\n const pruneSessions = () => {\n const now = Date.now();\n for (const [sessionId, session] of sessions.entries()) {\n if (session.clients.size > 0) {\n continue;\n }\n if (now - session.lastActivity > SESSION_TTL_MS) {\n destroySession(sessionId);\n }\n }\n if (sessions.size <= MAX_SESSIONS) return;\n const sorted = Array.from(sessions.values()).sort(\n (left, right) => left.lastActivity - right.lastActivity,\n );\n for (const session of sorted.slice(0, sessions.size - MAX_SESSIONS)) {\n destroySession(session.id);\n }\n };\n\n const createSession = (\n requestedId: string | undefined,\n options: {\n cwd: string;\n shell: string | undefined;\n fallbackShell: string | undefined;\n unrestrictedFlag: boolean | undefined;\n env: Record<string, string>;\n },\n ) => {\n const id = requestedId ?? ulid();\n const shell = selectShell(\n options.shell,\n options.fallbackShell,\n options.unrestrictedFlag,\n );\n const { process: ptyProcess, read } = createRusptySession(ruspty, {\n command: shell.command,\n args: shell.args,\n envs: options.env,\n dir: options.cwd,\n size: { cols: DEFAULT_COLS, rows: DEFAULT_ROWS },\n onExit: (_error, exitCode) => {\n const current = sessions.get(id);\n if (!current) return;\n current.exited = true;\n current.lastActivity = Date.now();\n broadcast(current, { type: \"exit\", code: exitCode });\n if (current.clients.size === 0) {\n destroySession(current.id);\n }\n },\n });\n const session: TerminalSession = {\n id,\n pty: ptyProcess,\n seq: 0,\n buffer: [],\n bufferBytes: 0,\n lastActivity: Date.now(),\n clients: new Set<WebSocket>(),\n exited: false,\n inputBuffer: \"\",\n };\n read.on(\"data\", (chunk: unknown) => {\n const data = normalizePtyChunk(chunk);\n if (data === null) return;\n const current = sessions.get(session.id);\n if (!current || current.exited) return;\n current.lastActivity = Date.now();\n current.seq += 1;\n current.buffer.push({ seq: current.seq, data });\n current.bufferBytes += Buffer.byteLength(data, \"utf8\");\n trimBuffer(current);\n broadcast(current, {\n type: \"output\",\n seq: current.seq,\n data,\n });\n });\n sessions.set(id, session);\n return session;\n };\n\n const getSession = (sessionId: string | undefined) => {\n if (!sessionId) return undefined;\n return sessions.get(sessionId);\n };\n\n const getOrCreateSession = (\n sessionId: string | undefined,\n cwdOverride?: string,\n ) =>\n Effect.gen(function* () {\n const terminalDisabledEnv = yield* envService.getEnv(\n \"CCV_TERMINAL_DISABLED\",\n );\n const terminalDisabledOption =\n yield* ccvOptionsService.getCcvOptions(\"terminalDisabled\");\n const terminalDisabled =\n terminalDisabledOption ?? isFlagEnabled(terminalDisabledEnv);\n if (terminalDisabled) {\n return yield* Effect.fail(\n new Error(\n \"Terminal support is unavailable (CCV_TERMINAL_DISABLED is enabled).\",\n ),\n );\n }\n const cwd = cwdOverride ?? process.cwd();\n const terminalShellOption =\n yield* ccvOptionsService.getCcvOptions(\"terminalShell\");\n const shell =\n terminalShellOption ?? (yield* envService.getEnv(\"CCV_TERMINAL_SHELL\"));\n const fallbackShell = yield* envService.getEnv(\"SHELL\");\n const terminalUnrestrictedOption = yield* ccvOptionsService.getCcvOptions(\n \"terminalUnrestricted\",\n );\n const terminalUnrestrictedEnv = yield* envService.getEnv(\n \"CCV_TERMINAL_UNRESTRICTED\",\n );\n const unrestrictedFlag =\n terminalUnrestrictedOption ?? isFlagEnabled(terminalUnrestrictedEnv);\n const env = yield* envService.getAllEnv();\n const existing = getSession(sessionId);\n if (existing) {\n existing.lastActivity = Date.now();\n return existing;\n }\n return createSession(sessionId, {\n cwd,\n shell,\n fallbackShell,\n unrestrictedFlag,\n env,\n });\n });\n\n const registerClient = (sessionId: string, client: WebSocket) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session) {\n return;\n }\n session.clients.add(client);\n session.lastActivity = Date.now();\n });\n\n const unregisterClient = (sessionId: string, client: WebSocket) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session) {\n return;\n }\n session.clients.delete(client);\n session.lastActivity = Date.now();\n if (session.exited && session.clients.size === 0) {\n destroySession(session.id);\n }\n });\n\n const writeInput = (sessionId: string, data: string) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session || session.exited) return;\n session.lastActivity = Date.now();\n const combined = session.inputBuffer + data;\n const lines = combined.split(/\\r\\n|\\n|\\r/);\n session.inputBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n console.log(`[terminal] session ${session.id} command: ${trimmed}`);\n }\n }\n session.pty.write(data);\n });\n\n const resize = (sessionId: string, cols: number, rows: number) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session || session.exited) return;\n session.lastActivity = Date.now();\n session.pty.resize(cols, rows);\n });\n\n const signal = (sessionId: string, name: string) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session || session.exited) return;\n session.lastActivity = Date.now();\n if (name === \"SIGINT\") {\n session.pty.write(\"\\x03\");\n }\n });\n\n const snapshotSince = (sessionId: string, lastSeq: number) =>\n Effect.sync(() => {\n const session = getSession(sessionId);\n if (!session) return undefined;\n const chunks = session.buffer.filter((chunk) => chunk.seq > lastSeq);\n if (chunks.length === 0) return undefined;\n const data = chunks.map((chunk) => chunk.data).join(\"\");\n return { seq: session.seq, data };\n });\n\n const cleanupLoop = Effect.forever(\n Effect.gen(function* () {\n yield* Effect.sleep(\"1 minute\");\n pruneSessions();\n }),\n );\n yield* Effect.forkScoped(cleanupLoop);\n\n return {\n getOrCreateSession,\n registerClient,\n unregisterClient,\n writeInput,\n resize,\n signal,\n snapshotSince,\n };\n});\n\nexport type ITerminalService = InferEffect<typeof LayerImpl>;\n\nexport class TerminalService extends Context.Tag(\"TerminalService\")<\n TerminalService,\n ITerminalService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export const normalizePtyChunk = (chunk: unknown): string | null => {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n if (chunk instanceof ArrayBuffer) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return null;\n};\n", "import type { Readable } from \"node:stream\";\nimport type { PtyOptions } from \"@replit/ruspty\";\n\ntype RusptyModule = typeof import(\"@replit/ruspty\");\n\ntype TerminalPtyProcess = {\n write: (data: string) => void;\n resize: (cols: number, rows: number) => void;\n kill: () => void;\n};\n\ntype TerminalPtySession = {\n process: TerminalPtyProcess;\n read: Readable;\n};\n\nconst createRusptySession = (\n ruspty: RusptyModule,\n options: PtyOptions,\n): TerminalPtySession => {\n const pty = new ruspty.Pty(options);\n\n return {\n process: {\n write: (data) => {\n pty.write.write(data);\n },\n resize: (cols, rows) => {\n pty.resize({ cols, rows });\n },\n kill: () => {\n pty.close();\n },\n },\n read: pty.read,\n };\n};\n\nexport type { RusptyModule, TerminalPtyProcess, TerminalPtySession };\nexport { createRusptySession };\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 { RateLimitAutoScheduleService } from \"../core/rate-limit/services/RateLimitAutoScheduleService\";\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 const rateLimitAutoScheduleService = yield* RateLimitAutoScheduleService;\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 // Rate limit auto-schedule service \u3092\u958B\u59CB\n yield* rateLimitAutoScheduleService.start();\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* rateLimitAutoScheduleService.stop();\n yield* fileWatcher.stop();\n });\n\n return {\n startInitialization,\n stopCleanup,\n } satisfies InitializeServiceInterface;\n }),\n );\n}\n", "import { Context, Effect, Layer, Runtime } from \"effect\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService\";\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\nconst getBearerToken = (authorization: string | undefined) => {\n if (!authorization) return undefined;\n const [scheme, token] = authorization.split(\" \");\n if (!scheme || !token) return undefined;\n if (scheme.toLowerCase() !== \"bearer\") return undefined;\n const trimmedToken = token.trim();\n return trimmedToken.length > 0 ? trimmedToken : undefined;\n};\n\nconst createAuthRequiredMiddleware = (\n authEnabled: boolean,\n validSessionToken: string,\n authPassword: string | undefined,\n) => {\n return createMiddleware<HonoContext>(async (c, next) => {\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 const bearerToken = getBearerToken(c.req.header(\"Authorization\"));\n const cookieAuthorized = sessionToken === validSessionToken;\n const bearerAuthorized =\n authPassword !== undefined && bearerToken === authPassword;\n\n if (!cookieAuthorized && !bearerAuthorized) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n await next();\n });\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvOptionsService = yield* CcvOptionsService;\n const runtime = yield* Effect.runtime<CcvOptionsService>();\n const runPromise = Runtime.runPromise(runtime);\n\n return yield* Effect.gen(function* () {\n const getAuthState = Effect.gen(function* () {\n const authPassword = yield* ccvOptionsService.getCcvOptions(\"password\");\n const authEnabled = authPassword !== undefined;\n const validSessionToken = generateSessionToken(authPassword);\n return { authEnabled, authPassword, validSessionToken };\n });\n\n const authRequiredMiddleware = createMiddleware<HonoContext>(\n async (c, next) => {\n if (!c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n const { authEnabled, validSessionToken, authPassword } =\n await runPromise(getAuthState);\n\n return createAuthRequiredMiddleware(\n authEnabled,\n validSessionToken,\n authPassword,\n )(c, next);\n },\n );\n\n return {\n getAuthState,\n authRequiredMiddleware,\n };\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 { zValidator } from \"@hono/zod-validator\";\nimport { Effect, Runtime } from \"effect\";\nimport { setCookie } from \"hono/cookie\";\nimport prexit from \"prexit\";\nimport packageJson from \"../../../../package.json\" with { type: \"json\" };\nimport {\n CcvOptionsService,\n type CliOptions,\n} from \"../../core/platform/services/CcvOptionsService\";\nimport { EnvService } from \"../../core/platform/services/EnvService\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService\";\nimport { userConfigSchema } from \"../../lib/config/config\";\nimport type { HonoAppType } from \"../app\";\nimport { InitializeService } from \"../initialize\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware\";\nimport { configMiddleware } from \"../middleware/config.middleware\";\nimport { getHonoRuntime } from \"../runtime\";\nimport { authRoutes } from \"./authRoutes\";\nimport { claudeCodeRoutes } from \"./claudeCodeRoutes\";\nimport { featureFlagRoutes } from \"./featureFlagRoutes\";\nimport { fileSystemRoutes } from \"./fileSystemRoutes\";\nimport { projectRoutes } from \"./projectRoutes\";\nimport { schedulerRoutes } from \"./schedulerRoutes\";\nimport { searchRoutes } from \"./searchRoutes\";\nimport { sseRoutes } from \"./sseRoutes\";\nimport { tasksRoutes } from \"./tasksRoutes\";\n\nexport const routes = (app: HonoAppType, options: CliOptions) =>\n Effect.gen(function* () {\n const ccvOptionsService = yield* CcvOptionsService;\n yield* ccvOptionsService.loadCliOptions(options);\n\n const envService = yield* EnvService;\n const userConfigService = yield* UserConfigService;\n const initializeService = yield* InitializeService;\n\n const { authRequiredMiddleware } = yield* AuthMiddleware;\n\n const runtime = yield* getHonoRuntime;\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(async (c, next) => {\n await Runtime.runPromise(\n runtime,\n userConfigService.setUserConfig({\n ...c.get(\"userConfig\"),\n }),\n );\n\n await next();\n })\n\n /**\n * Auth un-necessary Routes\n */\n .get(\"/api/version\", async (c) => {\n return c.json({\n version: packageJson.version,\n });\n })\n\n .route(\"/api/auth\", yield* authRoutes)\n\n .use(authRequiredMiddleware)\n\n /**\n * Private Routes\n */\n .get(\"/api/config\", async (c) => {\n return c.json({\n config: c.get(\"userConfig\"),\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 // core routes\n .route(\"/api/projects\", yield* projectRoutes)\n .route(\"/api/claude-code\", yield* claudeCodeRoutes)\n .route(\"/api/scheduler\", yield* schedulerRoutes)\n .route(\"/api/file-system\", yield* fileSystemRoutes)\n .route(\"/api/search\", yield* searchRoutes)\n .route(\"/api/feature-flags\", yield* featureFlagRoutes)\n .route(\"/api/tasks\", yield* tasksRoutes)\n .route(\"/api/sse\", yield* sseRoutes)\n );\n });\n\nexport type RouteType =\n ReturnType<typeof routes> extends Effect.Effect<infer A, unknown, unknown>\n ? A\n : never;\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 searchHotkey: z.enum([\"ctrl-k\", \"command-k\"]).optional().default(\"command-k\"),\n autoScheduleContinueOnRateLimit: z.boolean().optional().default(false),\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 { 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 type { CommandExecutor, FileSystem, Path } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport type { ClaudeCodeLifeCycleService } from \"../core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport type { CcvOptionsService } from \"../core/platform/services/CcvOptionsService\";\nimport type { EnvService } from \"../core/platform/services/EnvService\";\nimport type { UserConfigService } from \"../core/platform/services/UserConfigService\";\nimport type { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository\";\nimport type { SchedulerConfigBaseDir } from \"../core/scheduler/config\";\nimport type { VirtualConversationDatabase } from \"../core/session/infrastructure/VirtualConversationDatabase\";\nimport type { SessionMetaService } from \"../core/session/services/SessionMetaService\";\n\nexport type HonoRuntime =\n | CcvOptionsService\n | EnvService\n | SessionMetaService\n | VirtualConversationDatabase\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor.CommandExecutor\n | UserConfigService\n | ClaudeCodeLifeCycleService\n | ProjectRepository\n | SchedulerConfigBaseDir;\n\nexport const getHonoRuntime = Effect.runtime<HonoRuntime>();\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { deleteCookie, getCookie, setCookie } from \"hono/cookie\";\nimport { z } from \"zod\";\nimport type { HonoContext } from \"../app\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware\";\n\nconst authRoutes = Effect.gen(function* () {\n const { getAuthState } = yield* AuthMiddleware;\n const { validSessionToken, authEnabled, authPassword } = yield* getAuthState;\n\n return new Hono<HonoContext>()\n .post(\n \"/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 !== authPassword) {\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(\"/logout\", async (c) => {\n deleteCookie(c, \"ccv-session\", { path: \"/\" });\n return c.json({ success: true });\n })\n\n .get(\"/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\nexport { authRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport type { UserMessageInput } from \"../../core/claude-code/functions/createMessageGenerator\";\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 {\n ccOptionsSchema,\n userMessageInputSchema,\n} from \"../../core/claude-code/schema\";\nimport { ClaudeCodeLifeCycleService } from \"../../core/claude-code/services/ClaudeCodeLifeCycleService\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst normalizeUserMessageInput = (\n input: z.infer<typeof userMessageInputSchema>,\n): UserMessageInput => {\n const images = input.images?.map((image) => ({\n type: image.type,\n source: image.source,\n }));\n const documents = input.documents?.map((document) => {\n if (!document.source) {\n throw new Error(\"Document source is required\");\n }\n\n return {\n type: document.type,\n source: document.source,\n };\n });\n\n return {\n text: input.text,\n images,\n documents,\n };\n};\n\nconst claudeCodeRoutes = Effect.gen(function* () {\n const claudeCodeController = yield* ClaudeCodeController;\n const claudeCodeSessionProcessController =\n yield* ClaudeCodeSessionProcessController;\n const claudeCodePermissionController = yield* ClaudeCodePermissionController;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>()\n .get(\"/meta\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeController.getClaudeCodeMeta().pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .get(\"/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 .get(\"/session-processes\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.getSessionProcesses(),\n );\n return response;\n })\n .post(\n \"/session-processes\",\n zValidator(\n \"json\",\n z.object({\n projectId: z.string(),\n input: userMessageInputSchema,\n baseSession: z.union([\n z.undefined(),\n z.object({\n type: z.literal(\"fork\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"resume\"),\n sessionId: z.string(),\n }),\n ]),\n ccOptions: ccOptionsSchema.optional(),\n }),\n ),\n async (c) => {\n const body = c.req.valid(\"json\");\n const input = normalizeUserMessageInput(body.input);\n const { baseSession, ...rest } = body;\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController.createSessionProcess({\n ...rest,\n input,\n baseSession: baseSession ?? undefined,\n }),\n );\n return response;\n },\n )\n .post(\n \"/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 body = c.req.valid(\"json\");\n const input = normalizeUserMessageInput(body.input);\n const response = await effectToResponse(\n c,\n claudeCodeSessionProcessController\n .continueSessionProcess({\n ...c.req.param(),\n ...body,\n input,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n .post(\n \"/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 .post(\n \"/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\nexport { claudeCodeRoutes };\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\n/**\n * Schema for sandbox network configuration\n */\nexport const sandboxNetworkConfigSchema = z.object({\n allowedDomains: z.array(z.string()).optional(),\n allowUnixSockets: z.array(z.string()).optional(),\n allowAllUnixSockets: z.boolean().optional(),\n allowLocalBinding: z.boolean().optional(),\n httpProxyPort: z.number().optional(),\n socksProxyPort: z.number().optional(),\n});\n\nexport type SandboxNetworkConfig = z.infer<typeof sandboxNetworkConfigSchema>;\n\n/**\n * Schema for sandbox settings\n */\nexport const sandboxSettingsSchema = z.object({\n enabled: z.boolean().optional(),\n autoAllowBashIfSandboxed: z.boolean().optional(),\n allowUnsandboxedCommands: z.boolean().optional(),\n network: sandboxNetworkConfigSchema.optional(),\n});\n\nexport type SandboxSettings = z.infer<typeof sandboxSettingsSchema>;\n\n/**\n * Schema for Claude Code options (CCOptions)\n * Based on @anthropic-ai/claude-agent-sdk Options type\n */\nexport const ccOptionsSchema = z.object({\n disallowedTools: z.array(z.string()).optional(),\n settingSources: z.array(z.enum([\"user\", \"project\", \"local\"])).optional(),\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z.string().optional(),\n }),\n ])\n .optional(),\n model: z.string().optional(),\n sandbox: sandboxSettingsSchema.optional(),\n maxTurns: z.number().optional(),\n maxThinkingTokens: z.number().optional(),\n env: z.record(z.string(), z.string().optional()).optional(),\n maxBudgetUsd: z.number().optional(),\n});\n\nexport type CCOptionsSchema = z.infer<typeof ccOptionsSchema>;\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 { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { FeatureFlagController } from \"../../core/feature-flag/presentation/FeatureFlagController\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst featureFlagRoutes = Effect.gen(function* () {\n const featureFlagController = yield* FeatureFlagController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>().get(\"/\", async (c) => {\n const response = await effectToResponse(\n c,\n featureFlagController.getFlags().pipe(Effect.provide(runtime)),\n );\n\n return response;\n });\n});\n\nexport { featureFlagRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { FileSystemController } from \"../../core/file-system/presentation/FileSystemController\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\n\nconst fileSystemRoutes = Effect.gen(function* () {\n const fileSystemController = yield* FileSystemController;\n\n return new Hono<HonoContext>()\n .get(\n \"/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 .get(\n \"/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\nexport { fileSystemRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { AgentSessionController } from \"../../core/agent-session/presentation/AgentSessionController\";\nimport { ClaudeCodeController } from \"../../core/claude-code/presentation/ClaudeCodeController\";\nimport { FileSystemController } from \"../../core/file-system/presentation/FileSystemController\";\nimport { GitController } from \"../../core/git/presentation/GitController\";\nimport { CommitRequestSchema } from \"../../core/git/schema\";\nimport { ProjectController } from \"../../core/project/presentation/ProjectController\";\nimport { SessionController } from \"../../core/session/presentation/SessionController\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst projectRoutes = Effect.gen(function* () {\n const projectController = yield* ProjectController;\n const sessionController = yield* SessionController;\n const agentSessionController = yield* AgentSessionController;\n const claudeCodeController = yield* ClaudeCodeController;\n const fileSystemController = yield* FileSystemController;\n const gitController = yield* GitController;\n\n const runtime = yield* getHonoRuntime;\n\n return (\n new Hono<HonoContext>()\n /**\n * Projects\n */\n .get(\"/\", async (c) => {\n const response = await effectToResponse(\n c,\n projectController.getProjects(),\n );\n return response;\n })\n .get(\n \"/: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 .post(\n \"/\",\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 .get(\"/: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 * Sessions\n */\n .get(\"/:projectId/sessions/:sessionId\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const sessionId = c.req.param(\"sessionId\");\n const response = await effectToResponse(\n c,\n sessionController\n .getSession({ projectId, sessionId })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .get(\"/:projectId/sessions/:sessionId/export\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const sessionId = c.req.param(\"sessionId\");\n const response = await effectToResponse(\n c,\n sessionController\n .exportSessionHtml({ projectId, sessionId })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .delete(\"/:projectId/sessions/:sessionId\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const sessionId = c.req.param(\"sessionId\");\n const response = await effectToResponse(\n c,\n sessionController\n .deleteSession({ projectId, sessionId })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n\n /**\n * agent sessions\n */\n .get(\"/:projectId/agent-sessions/:agentId\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const agentId = c.req.param(\"agentId\");\n const response = await effectToResponse(\n c,\n agentSessionController.getAgentSession({ projectId, agentId }),\n );\n return response;\n })\n\n /**\n * claude code routes\n */\n .get(\"/: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 .get(\"/: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 /**\n * file system routes\n */\n .get(\n \"/:projectId/files\",\n zValidator(\n \"query\",\n z.object({\n filePath: z.string().min(1, \"filePath is required\"),\n }),\n ),\n async (c) => {\n const { projectId } = c.req.param();\n const { filePath } = c.req.valid(\"query\");\n const response = await effectToResponse(\n c,\n fileSystemController\n .getFileContentRoute({\n projectId,\n filePath,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n\n /**\n * git routes\n */\n .get(\"/:projectId/git/current-revisions\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .getCurrentRevisions({\n projectId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .post(\n \"/: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 projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .getGitDiff({\n projectId,\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n .post(\n \"/:projectId/git/commit\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .commitFiles({\n projectId,\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n .post(\"/:projectId/git/push\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .pushCommits({\n projectId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .post(\n \"/:projectId/git/commit-and-push\",\n zValidator(\"json\", CommitRequestSchema),\n async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .commitAndPush({\n projectId,\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n .get(\"/:projectId/git/branches\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .getBranches({\n projectId,\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .post(\n \"/:projectId/git/checkout\",\n zValidator(\n \"json\",\n z.object({\n branchName: z.string().min(1, \"branchName is required\"),\n }),\n ),\n async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await effectToResponse(\n c,\n gitController\n .checkoutBranch({\n projectId,\n ...c.req.valid(\"json\"),\n })\n .pipe(Effect.provide(runtime)),\n );\n return response;\n },\n )\n );\n});\n\nexport { projectRoutes };\n", "import { z } from \"zod\";\n\n// Request Schemas\n\nexport const CommitRequestSchema = z.object({\n files: z.array(z.string().min(1)).min(1),\n message: z.string().trim().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 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 { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { SchedulerController } from \"../../core/scheduler/presentation/SchedulerController\";\nimport {\n newSchedulerJobSchema,\n updateSchedulerJobSchema,\n} from \"../../core/scheduler/schema\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst schedulerRoutes = Effect.gen(function* () {\n const schedulerController = yield* SchedulerController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>()\n .get(\"/jobs\", async (c) => {\n const response = await effectToResponse(\n c,\n schedulerController.getJobs().pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .post(\"/jobs\", zValidator(\"json\", newSchedulerJobSchema), 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 .patch(\n \"/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 .delete(\"/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\nexport { schedulerRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { SearchController } from \"../../core/search/presentation/SearchController\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst searchRoutes = Effect.gen(function* () {\n const searchController = yield* SearchController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>().get(\n \"/\",\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\nexport { searchRoutes };\n", "import { Effect, Runtime } from \"effect\";\nimport { Hono } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport { TypeSafeSSE } from \"../../core/events/functions/typeSafeSSE\";\nimport { SSEController } from \"../../core/events/presentation/SSEController\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst sseRoutes = Effect.gen(function* () {\n const sseController = yield* SSEController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>().get(\"/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\nexport { sseRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { decodeProjectId } from \"../../core/project/functions/id\";\nimport { TasksController } from \"../../core/tasks/presentation/TasksController\";\nimport { TaskCreateSchema, TaskUpdateSchema } from \"../../core/tasks/schema\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse\";\nimport type { HonoContext } from \"../app\";\nimport { getHonoRuntime } from \"../runtime\";\n\nconst tasksRoutes = Effect.gen(function* () {\n const tasksController = yield* TasksController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>()\n .get(\n \"/\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n async (c) => {\n const { projectId, sessionId } = c.req.valid(\"query\");\n const projectPath = decodeProjectId(projectId);\n const status: 200 = 200;\n\n const response = await effectToResponse(\n c,\n tasksController.listTasks(projectPath, sessionId).pipe(\n Effect.map((tasks) => ({\n status,\n response: tasks,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n )\n .post(\n \"/\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n zValidator(\"json\", TaskCreateSchema),\n async (c) => {\n const { projectId, sessionId } = c.req.valid(\"query\");\n const body = c.req.valid(\"json\");\n const projectPath = decodeProjectId(projectId);\n const status: 200 = 200;\n\n const response = await effectToResponse(\n c,\n tasksController.createTask(projectPath, body, sessionId).pipe(\n Effect.map((task) => ({\n status,\n response: task,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n )\n .patch(\n \"/:taskId\",\n zValidator(\n \"query\",\n z.object({\n projectId: z.string(),\n sessionId: z.string().optional(),\n }),\n ),\n zValidator(\"json\", TaskUpdateSchema.omit({ taskId: true })),\n async (c) => {\n const { taskId } = c.req.param();\n const { projectId, sessionId } = c.req.valid(\"query\");\n const body = c.req.valid(\"json\");\n const projectPath = decodeProjectId(projectId);\n const status: 200 = 200;\n\n const response = await effectToResponse(\n c,\n tasksController\n .updateTask(projectPath, { ...body, taskId }, sessionId)\n .pipe(\n Effect.map((task) => ({\n status,\n response: task,\n })),\n Effect.provide(runtime),\n ),\n );\n return response;\n },\n );\n});\n\nexport { tasksRoutes };\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 { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService\";\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 CcvOptionsService.Live,\n).pipe(\n Layer.provide(EnvService.Live),\n Layer.provide(CcvOptionsService.Live),\n Layer.provide(NodeContext.layer),\n);\n", "import type { IncomingMessage } from \"node:http\";\nimport type { ServerType } from \"@hono/node-server\";\nimport { Effect, Runtime } from \"effect\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { TerminalService } from \"../core/terminal/TerminalService\";\nimport { AuthMiddleware } from \"../hono/middleware/auth.middleware\";\n\ntype ServerMessage =\n | { type: \"hello\"; sessionId: string; seq: number }\n | { type: \"output\"; seq: number; data: string }\n | { type: \"snapshot\"; seq: number; data: string }\n | { type: \"exit\"; code: number }\n | { type: \"pong\" };\n\ntype ClientMessage =\n | { type: \"input\"; data: string }\n | { type: \"resize\"; cols: number; rows: number }\n | { type: \"signal\"; name: string }\n | { type: \"sync\"; lastSeq: number }\n | { type: \"ping\" };\n\nconst parseCookies = (cookieHeader: string | undefined) => {\n const result: Record<string, string> = {};\n if (!cookieHeader) return result;\n const parts = cookieHeader.split(\";\");\n for (const part of parts) {\n const [rawKey, ...rest] = part.trim().split(\"=\");\n if (!rawKey) continue;\n result[rawKey] = rest.join(\"=\");\n }\n return result;\n};\n\nconst parseClientMessage = (payload: string): ClientMessage | undefined => {\n try {\n const parsed = JSON.parse(payload);\n if (!parsed || typeof parsed !== \"object\") return undefined;\n if (parsed.type === \"input\" && typeof parsed.data === \"string\") {\n return { type: \"input\", data: parsed.data };\n }\n if (\n parsed.type === \"resize\" &&\n typeof parsed.cols === \"number\" &&\n typeof parsed.rows === \"number\"\n ) {\n return { type: \"resize\", cols: parsed.cols, rows: parsed.rows };\n }\n if (parsed.type === \"signal\" && typeof parsed.name === \"string\") {\n return { type: \"signal\", name: parsed.name };\n }\n if (parsed.type === \"sync\" && typeof parsed.lastSeq === \"number\") {\n return { type: \"sync\", lastSeq: parsed.lastSeq };\n }\n if (parsed.type === \"ping\") {\n return { type: \"ping\" };\n }\n } catch {\n return undefined;\n }\n return undefined;\n};\n\nconst sendJson = (client: WebSocket, payload: ServerMessage) => {\n if (client.readyState !== WebSocket.OPEN) return;\n client.send(JSON.stringify(payload));\n};\n\nconst baseUrlForRequest = (req: IncomingMessage) => {\n const host = req.headers.host ?? \"localhost\";\n return `http://${host}`;\n};\n\nexport const setupTerminalWebSocket = (server: ServerType) =>\n Effect.gen(function* () {\n const terminalService = yield* TerminalService;\n const { getAuthState } = yield* AuthMiddleware;\n const { authEnabled, validSessionToken } = yield* getAuthState;\n const runtime = yield* Effect.runtime<TerminalService>();\n const runPromise = Runtime.runPromise(runtime);\n\n const wss = new WebSocketServer({ noServer: true });\n\n server.on(\"upgrade\", (req, socket, head) => {\n const url = new URL(req.url ?? \"/\", baseUrlForRequest(req));\n if (url.pathname !== \"/ws/terminal\") return;\n\n if (authEnabled) {\n const cookies = parseCookies(req.headers.cookie);\n if (cookies[\"ccv-session\"] !== validSessionToken) {\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n }\n\n wss.handleUpgrade(req, socket, head, (ws: WebSocket) => {\n wss.emit(\"connection\", ws, req);\n });\n });\n\n wss.on(\"connection\", (ws: WebSocket, req: IncomingMessage) => {\n const url = new URL(req.url ?? \"/\", baseUrlForRequest(req));\n const sessionIdParam = url.searchParams.get(\"sessionId\");\n const requestedSessionId =\n sessionIdParam && sessionIdParam.length > 0\n ? sessionIdParam\n : undefined;\n const cwdParam = url.searchParams.get(\"cwd\");\n const cwd = cwdParam && cwdParam.length > 0 ? cwdParam : undefined;\n\n runPromise(terminalService.getOrCreateSession(requestedSessionId, cwd))\n .then((session) => {\n sendJson(ws, {\n type: \"hello\",\n sessionId: session.id,\n seq: session.seq,\n });\n return runPromise(\n terminalService.registerClient(session.id, ws),\n ).then(() => session);\n })\n .then((session) => {\n ws.on(\"message\", (data: WebSocket.RawData) => {\n const text =\n typeof data === \"string\"\n ? data\n : data instanceof Buffer\n ? data.toString(\"utf8\")\n : undefined;\n if (!text) return;\n const message = parseClientMessage(text);\n if (!message) return;\n if (message.type === \"input\") {\n void runPromise(\n terminalService.writeInput(session.id, message.data),\n );\n return;\n }\n if (message.type === \"resize\") {\n void runPromise(\n terminalService.resize(session.id, message.cols, message.rows),\n );\n return;\n }\n if (message.type === \"signal\") {\n void runPromise(terminalService.signal(session.id, message.name));\n return;\n }\n if (message.type === \"sync\") {\n void runPromise(\n terminalService.snapshotSince(session.id, message.lastSeq),\n ).then((snapshot) => {\n if (!snapshot) return;\n sendJson(ws, {\n type: \"snapshot\",\n seq: snapshot.seq,\n data: snapshot.data,\n });\n });\n return;\n }\n if (message.type === \"ping\") {\n sendJson(ws, { type: \"pong\" });\n }\n });\n\n ws.on(\"close\", () => {\n void runPromise(terminalService.unregisterClient(session.id, ws));\n });\n })\n .catch(() => {\n ws.close(1011, \"Session initialization failed\");\n });\n });\n });\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;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": ["Command", "Effect", "readFile", "resolve", "NodeContext", "Effect", "Layer", "Layer", "Effect", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "Effect", "content", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "Layer", "Context", "Effect", "Layer", "getOptionalEnv", "LayerImpl", "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", "stat", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "stat", "Option", "Context", "Layer", "FileSystem", "Path", "Effect", "Effect", "FileSystem", "Path", "Effect", "FileSystem", "Path", "z", "Context", "Data", "Effect", "Layer", "Path", "Effect", "Effect", "Path", "query", "options", "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", "stat", "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", "query", "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", "extname", "resolve", "basename", "LayerImpl", "Effect", "homedir", "Context", "Layer", "Context", "Effect", "Either", "Layer", "readFile", "resolve", "existsSync", "existsSync", "resolve", "readFile", "Command", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "z", "LayerImpl", "Effect", "Ref", "Context", "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", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "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", "z", "FileSystem", "Effect", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "process", "Layer", "Context", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "LayerImpl", "Effect", "FileSystem", "Path", "Ref", "stat", "query", "Context", "Layer", "LayerImpl", "Effect", "query", "Context", "Layer", "FileSystem", "Context", "Effect", "Layer", "Effect", "html", "LayerImpl", "Effect", "FileSystem", "Context", "Layer", "Context", "Effect", "Layer", "homedir", "join", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "z", "Context", "Layer", "Effect", "FileSystem", "Path", "join", "homedir", "Option", "stat", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "ulid", "isFlagEnabled", "LayerImpl", "Effect", "getOrCreateSession", "sendJson", "ulid", "Context", "Layer", "Context", "Effect", "Layer", "Ref", "Schedule", "Context", "Layer", "Effect", "Ref", "Schedule", "Context", "Effect", "Layer", "Runtime", "LayerImpl", "Effect", "Runtime", "Context", "Layer", "zValidator", "Effect", "Runtime", "setCookie", "z", "z", "z", "getCookie", "createMiddleware", "createMiddleware", "getCookie", "Effect", "Effect", "Hono", "getCookie", "setCookie", "z", "Effect", "Hono", "z", "setCookie", "getCookie", "zValidator", "Effect", "Hono", "z", "z", "Effect", "Effect", "Effect", "Hono", "zValidator", "z", "Effect", "Hono", "Effect", "Hono", "zValidator", "Effect", "Hono", "z", "Effect", "Hono", "zValidator", "z", "zValidator", "Effect", "Hono", "z", "z", "z", "Effect", "Hono", "zValidator", "z", "zValidator", "Effect", "Hono", "Effect", "Hono", "zValidator", "zValidator", "Effect", "Hono", "z", "Effect", "Hono", "zValidator", "z", "Effect", "Runtime", "Hono", "Effect", "Hono", "Runtime", "zValidator", "Effect", "Hono", "z", "Effect", "Hono", "zValidator", "z", "Effect", "Runtime", "zValidator", "setCookie", "Layer", "Layer", "Effect", "Runtime", "Effect", "Runtime", "resolve", "readFile", "program", "Effect", "Layer", "NodeContext", "Command", "Effect"]
|
|
7
7
|
}
|