@kimuson/claude-code-viewer 0.7.0 → 0.7.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 +22 -0
- package/dist/main.js +1708 -1401
- package/dist/main.js.map +4 -4
- package/dist/migrations/20260403053302_nappy_night_thrasher/migration.sql +28 -0
- package/dist/migrations/20260403053302_nappy_night_thrasher/snapshot.json +318 -0
- package/dist/static/assets/{AuthProvider-BKc7q7ka.js → AuthProvider-Ds-c4CWc.js} +1 -1
- package/dist/static/assets/{ProtectedRoute-Clw5r4X-.js → ProtectedRoute-BTfjJdM-.js} +1 -1
- package/dist/static/assets/{dist-DiGJ7VFi.js → dist-Cartj9I0.js} +3 -3
- package/dist/static/assets/index-BD93fXJt.js +20 -0
- package/dist/static/assets/index-DNPVlDui.css +2 -0
- package/dist/static/assets/{login-pLhQHKNI.js → login-CKSjZM5v.js} +1 -1
- package/dist/static/assets/messages-BIF6nUZW.js +1 -0
- package/dist/static/assets/messages-BLphVEYK.js +1 -0
- package/dist/static/assets/messages-CuPsU53l.js +1 -0
- package/dist/static/assets/{projects-BVPr5gWf.js → projects-DH0K12HM.js} +1 -1
- package/dist/static/assets/routes-CzLZwWu9.js +1 -0
- package/dist/static/assets/session-CvxVXyyO.js +1 -0
- package/dist/static/assets/session-TzwkQ1Zv.js +12 -0
- package/dist/static/index.html +4 -4
- package/dist/static/sw.js +1 -1
- package/package.json +3 -1
- package/dist/static/assets/index-26yPYMZp.css +0 -2
- package/dist/static/assets/index-BO-D9mWo.js +0 -20
- package/dist/static/assets/messages-Cq0t_Ljz.js +0 -1
- package/dist/static/assets/messages-DJ70MfCl.js +0 -1
- package/dist/static/assets/messages-DRdgpO3i.js +0 -1
- package/dist/static/assets/routes-9aZugTrf.js +0 -1
- package/dist/static/assets/session-BkAg5Fs5.js +0 -1
- package/dist/static/assets/session-D-iyWO70.js +0 -8
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/AgentNameEntrySchema.ts", "../src/lib/conversation-schema/entry/AgentSettingEntrySchema.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/ToolReferenceContentSchema.ts", "../src/lib/conversation-schema/content/ToolUseContentSchema.ts", "../src/lib/conversation-schema/entry/BaseEntrySchema.ts", "../src/lib/conversation-schema/entry/CustomTitleEntrySchema.ts", "../src/lib/conversation-schema/entry/FileHIstorySnapshotEntrySchema.ts", "../src/lib/conversation-schema/entry/LastPromptEntrySchema.ts", "../src/lib/conversation-schema/entry/PrLinkEntrySchema.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/platform/services/ApplicationContext.ts", "../src/server/core/platform/services/CcvOptionsService.ts", "../src/server/core/platform/services/EnvService.ts", "../src/server/core/platform/schema.ts", "../src/server/core/project/functions/id.ts", "../src/server/core/session/functions/extractFirstUserText.ts", "../src/server/core/agent-session/presentation/AgentSessionController.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.ts\";\nimport { checkDeprecatedEnvs } from \"./core/platform/services/DeprecatedEnvDetector.ts\";\nimport { startServer } from \"./startServer.ts\";\n\nconst program = new Command();\n\nprogram.name(packageJson.name).version(packageJson.version).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(\"-v, --verbose\", \"enable verbose debug logging\")\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(\"--terminal-disabled\", \"disable the in-app terminal panel when enabled\")\n .option(\"--terminal-shell <path>\", \"shell executable for terminal sessions\")\n .option(\"--terminal-unrestricted\", \"disable restricted shell flags for bash sessions\")\n .option(\"--api-only\", \"run in API-only mode without Web UI\")\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 await program.parseAsync(process.argv);\n};\n\nmain().catch((error: unknown) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.7.0\",\n \"description\": \"A full-featured web-based Claude Code client that provides complete interactive functionality for managing Claude Code projects.\",\n \"homepage\": \"https://github.com/d-kimuson/claude-code-viewer\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/d-kimuson/claude-code-viewer.git\"\n },\n \"bin\": {\n \"claude-code-viewer\": \"./dist/main.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"run-p 'dev:*'\",\n \"dev:frontend\": \"vite\",\n \"dev:backend\": \"CCV_ENV=development node --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-p 'lint:*'\",\n \"lint:oxlint\": \"oxlint --ignore-path .gitignore\",\n \"lint:oxfmt\": \"pnpm fix:oxfmt --check\",\n \"fix\": \"run-p 'fix:*'\",\n \"fix:oxlint\": \"pnpm lint:oxlint --fix\",\n \"fix:oxfmt\": \"oxfmt --ignore-path .gitignore --no-error-on-unmatched-pattern\",\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.90\",\n \"@anthropic-ai/claude-code\": \"2.1.90\",\n \"@anthropic-ai/sdk\": \"0.82.0\",\n \"@effect/cluster\": \"0.58.0\",\n \"@effect/experimental\": \"0.60.0\",\n \"@effect/platform\": \"0.96.0\",\n \"@effect/platform-node\": \"0.106.0\",\n \"@effect/rpc\": \"0.75.0\",\n \"@effect/sql\": \"0.51.0\",\n \"@effect/workflow\": \"0.18.0\",\n \"@hono/node-server\": \"1.19.12\",\n \"@hono/zod-validator\": \"0.7.6\",\n \"@hookform/resolvers\": \"5.2.2\",\n \"@lingui/core\": \"5.9.4\",\n \"@lingui/react\": \"5.9.4\",\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.7.0\",\n \"@tailwindcss/vite\": \"4.2.2\",\n \"@tanstack/react-devtools\": \"0.10.1\",\n \"@tanstack/react-query\": \"5.96.1\",\n \"@tanstack/react-router\": \"1.168.10\",\n \"@tanstack/react-router-devtools\": \"1.166.11\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"cmdk\": \"1.1.1\",\n \"commander\": \"14.0.3\",\n \"date-fns\": \"4.1.0\",\n \"drizzle-orm\": \"1.0.0-beta.20\",\n \"effect\": \"3.21.0\",\n \"es-toolkit\": \"1.45.1\",\n \"hono\": \"4.12.9\",\n \"jotai\": \"2.19.0\",\n \"lucide-react\": \"1.7.0\",\n \"parse-git-diff\": \"0.0.20\",\n \"prexit\": \"2.3.0\",\n \"radix-ui\": \"1.4.3\",\n \"react\": \"19.2.4\",\n \"react-dom\": \"19.2.4\",\n \"react-error-boundary\": \"6.1.1\",\n \"react-hook-form\": \"7.72.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.5.0\",\n \"ulid\": \"3.0.2\",\n \"web-push\": \"^3.6.7\",\n \"ws\": \"8.20.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@effect/language-service\": \"0.84.2\",\n \"@effect/vitest\": \"^0.29.0\",\n \"@lingui/cli\": \"5.9.4\",\n \"@lingui/conf\": \"5.9.4\",\n \"@lingui/format-json\": \"5.9.4\",\n \"@lingui/loader\": \"5.9.4\",\n \"@lingui/vite-plugin\": \"5.9.4\",\n \"@tailwindcss/postcss\": \"4.2.2\",\n \"@tanstack/router-plugin\": \"1.167.12\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/node\": \"25.5.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@types/web-push\": \"^3.6.4\",\n \"@types/ws\": \"8.18.1\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260401.1\",\n \"@vitejs/plugin-react-swc\": \"4.3.0\",\n \"dotenv\": \"17.4.0\",\n \"drizzle-kit\": \"1.0.0-beta.20\",\n \"esbuild\": \"0.27.5\",\n \"gatecheck\": \"0.0.1-beta.5\",\n \"jsdom\": \"^29.0.1\",\n \"lefthook\": \"2.1.4\",\n \"npm-run-all2\": \"8.0.4\",\n \"oxfmt\": \"^0.43.0\",\n \"oxlint\": \"^1.58.0\",\n \"oxlint-tsgolint\": \"^0.19.0\",\n \"playwright\": \"1.59.1\",\n \"release-it\": \"19.2.4\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.2.2\",\n \"tw-animate-css\": \"1.4.0\",\n \"vite\": \"8.0.3\",\n \"vite-plugin-pwa\": \"^1.2.0\",\n \"vitest\": \"4.1.2\",\n \"workbox-build\": \"^7.4.0\",\n \"workbox-expiration\": \"^7.4.0\",\n \"workbox-precaching\": \"^7.4.0\",\n \"workbox-routing\": \"^7.4.0\",\n \"workbox-strategies\": \"^7.4.0\",\n \"workbox-window\": \"^7.4.0\"\n },\n \"engines\": {\n \"node\": \">=22.13.0\"\n },\n \"packageManager\": \"pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316\",\n \"pnpm\": {\n \"overrides\": {\n \"seroval\": \">=1.4.1\",\n \"tar\": \">=7.5.11\",\n \"undici\": \">=6.24.0\",\n \"serialize-javascript\": \">=7.0.3\",\n \"yaml\": \">=2.8.3\"\n }\n }\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\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:\n config.newEnv !== null\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:\n config.newEnv !== null\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(\" https://github.com/d-kimuson/claude-code-viewer#configuration\");\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 { FileSystem, Path } from \"@effect/platform\";\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/index.ts\";\nimport { AgentSessionController } from \"./core/agent-session/presentation/AgentSessionController.ts\";\nimport { CCVAskUserQuestionController } from \"./core/claude-code/presentation/CCVAskUserQuestionController.ts\";\nimport { ClaudeCodeController } from \"./core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { ClaudeCodePermissionController } from \"./core/claude-code/presentation/ClaudeCodePermissionController.ts\";\nimport { ClaudeCodeSessionProcessController } from \"./core/claude-code/presentation/ClaudeCodeSessionProcessController.ts\";\nimport { CCVAskUserQuestionService } from \"./core/claude-code/services/CCVAskUserQuestionService.ts\";\nimport { ClaudeCodeLifeCycleService } from \"./core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ClaudeCodePermissionService } from \"./core/claude-code/services/ClaudeCodePermissionService.ts\";\nimport { ClaudeCodeService } from \"./core/claude-code/services/ClaudeCodeService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"./core/claude-code/services/ClaudeCodeSessionProcessService.ts\";\nimport { SSEController } from \"./core/events/presentation/SSEController.ts\";\nimport { FileWatcherService } from \"./core/events/services/fileWatcher.ts\";\nimport { FeatureFlagController } from \"./core/feature-flag/presentation/FeatureFlagController.ts\";\nimport { FileSystemController } from \"./core/file-system/presentation/FileSystemController.ts\";\nimport { GitController } from \"./core/git/presentation/GitController.ts\";\nimport { GitService } from \"./core/git/services/GitService.ts\";\nimport { NotificationController } from \"./core/notification/presentation/NotificationController.ts\";\nimport { NotificationService } from \"./core/notification/services/NotificationService.ts\";\nimport { isDevelopmentEnv } from \"./core/platform/ccvEnv.ts\";\nimport type { CliOptions } from \"./core/platform/services/CcvOptionsService.ts\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository.ts\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController.ts\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService.ts\";\nimport { RateLimitAutoScheduleService } from \"./core/rate-limit/services/RateLimitAutoScheduleService.ts\";\nimport { SchedulerConfigBaseDir } from \"./core/scheduler/config.ts\";\nimport { SchedulerService } from \"./core/scheduler/domain/Scheduler.ts\";\nimport { SchedulerController } from \"./core/scheduler/presentation/SchedulerController.ts\";\nimport { SearchController } from \"./core/search/presentation/SearchController.ts\";\nimport { SearchService } from \"./core/search/services/SearchService.ts\";\nimport { SessionRepository } from \"./core/session/infrastructure/SessionRepository.ts\";\nimport { SessionController } from \"./core/session/presentation/SessionController.ts\";\nimport { SessionMetaService } from \"./core/session/services/SessionMetaService.ts\";\nimport { SyncService } from \"./core/sync/services/SyncService.ts\";\nimport { TasksController } from \"./core/tasks/presentation/TasksController.ts\";\nimport { TasksService } from \"./core/tasks/services/TasksService.ts\";\nimport { TerminalService } from \"./core/terminal/TerminalService.ts\";\nimport { honoApp } from \"./hono/app.ts\";\nimport { InitializeService } from \"./hono/initialize.ts\";\nimport { AuthMiddleware } from \"./hono/middleware/auth.middleware.ts\";\nimport { routes } from \"./hono/routes/index.ts\";\nimport { DrizzleService } from \"./lib/db/DrizzleService.ts\";\nimport { platformLayer } from \"./lib/effect/layers.ts\";\nimport { serverLoggerLayer, withServerLogLevel } from \"./logging.ts\";\nimport { setupTerminalWebSocket } from \"./terminal/terminalWebSocket.ts\";\n\nexport const startServer = async (options: CliOptions) => {\n const runWithLogger = <A, E>(effect: Effect.Effect<A, E, never>) =>\n Effect.runPromise(\n effect.pipe(withServerLogLevel(options.verbose), Effect.provide(serverLoggerLayer)),\n );\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const isDevelopment = isDevelopmentEnv(process.env.CCV_ENV);\n const apiOnly = options.apiOnly === true;\n\n if (!isDevelopment && !apiOnly) {\n const staticPath = await Effect.runPromise(\n Effect.gen(function* () {\n const path = yield* Path.Path;\n return path.resolve(import.meta.dirname, \"static\");\n }).pipe(Effect.provide(NodeContext.layer)),\n );\n await runWithLogger(Effect.logInfo(`Serving static files from ${staticPath}`));\n const indexHtml = await Effect.runPromise(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* fs.readFileString(path.resolve(staticPath, \"index.html\"));\n }).pipe(Effect.provide(NodeContext.layer)),\n );\n\n honoApp.use(\n \"/*\",\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 return c.html(indexHtml);\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 if (!apiOnly) {\n yield* setupTerminalWebSocket(server);\n }\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\n (process.env.DEV_BE_PORT ?? \"3401\")\n : // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n (options.port ?? process.env.PORT ?? \"3000\");\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\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 = typeof info === \"object\" && info !== null ? info.port : port;\n const mode = apiOnly ? \" (API-only mode)\" : \"\";\n void runWithLogger(\n Effect.logInfo(`Server is running on http://${hostname}:${serverPort}${mode}`),\n );\n });\n};\n\nconst PlatformLayer = Layer.mergeAll(platformLayer, NodeContext.layer);\n\nconst InfraBasics = Layer.mergeAll(ProjectMetaService.Live, SessionMetaService.Live).pipe(\n Layer.provideMerge(SyncService.Live),\n Layer.provideMerge(DrizzleService.Live),\n);\n\nconst InfraRepos = Layer.mergeAll(ProjectRepository.Live, SessionRepository.Live).pipe(\n Layer.provideMerge(InfraBasics),\n);\n\nconst InfraLayer = AgentSessionLayer.pipe(Layer.provideMerge(InfraRepos));\n\nconst DomainBase = Layer.mergeAll(\n CCVAskUserQuestionService.Live,\n ClaudeCodePermissionService.Live,\n ClaudeCodeSessionProcessService.Live,\n ClaudeCodeService.Live,\n GitService.Live,\n NotificationService.Live,\n SchedulerService.Live,\n SchedulerConfigBaseDir.Live,\n SearchService.Live,\n TasksService.Live,\n);\n\nconst DomainLayer = ClaudeCodeLifeCycleService.Live.pipe(Layer.provideMerge(DomainBase));\n\nconst AppServices = Layer.mergeAll(\n FileWatcherService.Live,\n RateLimitAutoScheduleService.Live,\n AuthMiddleware.Live,\n TerminalService.Live,\n);\n\nconst ApplicationLayer = InitializeService.Live.pipe(Layer.provideMerge(AppServices));\n\nconst PresentationLayer = Layer.mergeAll(\n ProjectController.Live,\n SessionController.Live,\n AgentSessionController.Live,\n GitController.Live,\n ClaudeCodeController.Live,\n ClaudeCodeSessionProcessController.Live,\n CCVAskUserQuestionController.Live,\n ClaudeCodePermissionController.Live,\n FileSystemController.Live,\n SSEController.Live,\n NotificationController.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.ts\";\n\nexport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository.ts\";\nexport { AgentSessionController } from \"./presentation/AgentSessionController.ts\";\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 { z } from \"zod\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../project/functions/id.ts\";\nimport { extractFirstUserText } from \"../../session/functions/extractFirstUserText.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\n\nconst SAFE_AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const appContext = yield* ApplicationContext;\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 // Validate agentId to prevent path traversal\n if (!SAFE_AGENT_ID_PATTERN.test(agentId)) {\n return yield* Effect.fail(new Error(\"Invalid agent ID: contains disallowed characters\"));\n }\n\n const projectPath = decodeProjectId(projectId);\n\n // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\n // Try new path if sessionId is provided\n if (sessionId !== undefined && sessionId !== \"\") {\n const newPath = path.resolve(projectPath, sessionId, \"subagents\", `agent-${agentId}.jsonl`);\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 /**\n * List all agent sessions for a given session.\n * Scans both legacy root directory and new subagents directory.\n */\n const listAgentSessionsForSession = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<{ agentId: string; firstMessage: string | null }[], Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n const results: { agentId: string; firstMessage: string | null }[] = [];\n\n const extractAgentId = (filename: string): string | null => {\n const match = /^agent-(.+)\\.jsonl$/.exec(filename);\n return match ? (match[1] ?? null) : null;\n };\n\n const processFile = (filePath: string, filename: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const agentId = extractAgentId(filename);\n if (agentId === null) return;\n\n const content = yield* fs.readFileString(filePath);\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") return;\n\n try {\n const conversations = parseJsonl(firstLine);\n const firstConv = conversations[0];\n const firstMessage = firstConv ? extractFirstUserText(firstConv) : null;\n results.push({ agentId, firstMessage });\n } catch {\n results.push({ agentId, firstMessage: null });\n }\n });\n\n // Check subagents directory: {project}/{sessionId}/subagents/\n const subagentsDir = path.join(projectPath, sessionId, \"subagents\");\n const subagentsDirExists = yield* fs.exists(subagentsDir);\n\n if (subagentsDirExists) {\n const entries = yield* fs\n .readDirectory(subagentsDir)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n const agentFiles = entries.filter((f) => f.startsWith(\"agent-\") && f.endsWith(\".jsonl\"));\n\n for (const filename of agentFiles) {\n yield* processFile(path.join(subagentsDir, filename), filename).pipe(\n Effect.catchAll(() => Effect.void),\n );\n }\n }\n\n // Check legacy root directory\n const rootEntries = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n const rootAgentFiles = rootEntries.filter(\n (f) => f.startsWith(\"agent-\") && f.endsWith(\".jsonl\"),\n );\n\n for (const filename of rootAgentFiles) {\n const filePath = path.join(projectPath, filename);\n // Only include if the first line's sessionId matches\n const content = yield* fs\n .readFileString(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") continue;\n\n try {\n const parsed: unknown = JSON.parse(firstLine);\n const sessionIdResult = z.object({ sessionId: z.string() }).safeParse(parsed);\n if (sessionIdResult.success && sessionIdResult.data.sessionId === sessionId) {\n yield* processFile(filePath, filename).pipe(Effect.catchAll(() => Effect.void));\n }\n } catch {\n // skip invalid files\n }\n }\n\n return results;\n });\n\n return {\n getAgentSessionByAgentId,\n listAgentSessionsForSession,\n };\n});\n\nexport class AgentSessionRepository extends Context.Tag(\"AgentSessionRepository\")<\n AgentSessionRepository,\n {\n readonly getAgentSessionByAgentId: (\n projectId: string,\n agentId: string,\n sessionId?: string,\n ) => Effect.Effect<ExtendedConversation[] | null, Error>;\n readonly listAgentSessionsForSession: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<{ agentId: string; firstMessage: string | null }[], Error>;\n }\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n\nexport type IAgentSessionRepository = Context.Tag.Service<typeof AgentSessionRepository>;\n", "import { z } from \"zod\";\nimport { AgentNameEntrySchema } from \"./entry/AgentNameEntrySchema.ts\";\nimport { AgentSettingEntrySchema } from \"./entry/AgentSettingEntrySchema.ts\";\nimport { type AssistantEntry, AssistantEntrySchema } from \"./entry/AssistantEntrySchema.ts\";\nimport { CustomTitleEntrySchema } from \"./entry/CustomTitleEntrySchema.ts\";\nimport { FileHistorySnapshotEntrySchema } from \"./entry/FileHIstorySnapshotEntrySchema.ts\";\nimport { LastPromptEntrySchema } from \"./entry/LastPromptEntrySchema.ts\";\nimport { PrLinkEntrySchema } from \"./entry/PrLinkEntrySchema.ts\";\nimport { ProgressEntrySchema } from \"./entry/ProgressEntrySchema.ts\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema.ts\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema.ts\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema.ts\";\nimport { type UserEntry, UserEntrySchema } from \"./entry/UserEntrySchema.ts\";\n\nexport const ConversationSchema = z.union([\n UserEntrySchema,\n AssistantEntrySchema,\n SummaryEntrySchema,\n SystemEntrySchema,\n FileHistorySnapshotEntrySchema,\n QueueOperationEntrySchema,\n ProgressEntrySchema,\n CustomTitleEntrySchema,\n AgentNameEntrySchema,\n AgentSettingEntrySchema,\n PrLinkEntrySchema,\n LastPromptEntrySchema,\n]);\n\nexport type Conversation = z.infer<typeof ConversationSchema>;\nexport type SidechainConversation = UserEntry | AssistantEntry | SystemEntry;\n", "import { z } from \"zod\";\n\nexport const AgentNameEntrySchema = z.object({\n type: z.literal(\"agent-name\"),\n agentName: z.string(),\n sessionId: z.string(),\n});\n\nexport type AgentNameEntry = z.infer<typeof AgentNameEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const AgentSettingEntrySchema = z.object({\n type: z.literal(\"agent-setting\"),\n agentSetting: z.string(),\n sessionId: z.string(),\n});\n\nexport type AgentSettingEntry = z.infer<typeof AgentSettingEntrySchema>;\n", "import { z } from \"zod\";\nimport { AssistantMessageSchema } from \"../message/AssistantMessageSchema.ts\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ThinkingContentSchema } from \"../content/ThinkingContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\nimport { ToolUseContentSchema } from \"../content/ToolUseContentSchema.ts\";\n\nconst AssistantMessageContentSchema = z.union([\n ThinkingContentSchema,\n TextContentSchema,\n ToolUseContentSchema,\n ToolResultContentSchema,\n]);\n\nexport type AssistantMessageContent = z.infer<typeof AssistantMessageContentSchema>;\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.ts\";\nimport { TextContentSchema } from \"./TextContentSchema.ts\";\nimport { ToolReferenceContentSchema } from \"./ToolReferenceContentSchema.ts\";\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, ToolReferenceContentSchema])),\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 ToolReferenceContentSchema = z.object({\n type: z.literal(\"tool_reference\"),\n tool_name: z.string(),\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 CustomTitleEntrySchema = z.object({\n type: z.literal(\"custom-title\"),\n customTitle: z.string(),\n sessionId: z.string(),\n});\n\nexport type CustomTitleEntry = z.infer<typeof CustomTitleEntrySchema>;\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<typeof FileHistorySnapshotEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const LastPromptEntrySchema = z.object({\n type: z.literal(\"last-prompt\"),\n lastPrompt: z.string(),\n sessionId: z.string(),\n});\n\nexport type LastPromptEntry = z.infer<typeof LastPromptEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const PrLinkEntrySchema = z.object({\n type: z.literal(\"pr-link\"),\n sessionId: z.string(),\n prNumber: z.number(),\n prUrl: z.string(),\n prRepository: z.string(),\n timestamp: z.iso.datetime(),\n});\n\nexport type PrLinkEntry = z.infer<typeof PrLinkEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema.ts\";\nimport { TextContentSchema } from \"../content/TextContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\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\n .union([z.string(), z.array(z.union([z.string(), QueueOperationContentSchema]))])\n .optional(),\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.uuid(),\n});\n\nexport type SummaryEntry = z.infer<typeof SummaryEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema.ts\";\nimport { TextContentSchema } from \"../content/TextContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\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([z.string(), z.array(z.union([z.string(), UserMessageContentSchema]))]),\n});\n", "import { ConversationSchema } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { ErrorJsonl, ExtendedConversation } from \"../../types.ts\";\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 // First, try to parse the JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n // Then validate with Zod schema\n const result = ConversationSchema.safeParse(parsed);\n if (!result.success) {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n return result.data;\n });\n};\n", "import { Path } from \"@effect/platform\";\nimport { Effect, Context as EffectContext, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { CcvOptionsService } from \"./CcvOptionsService.ts\";\nimport { EnvService } from \"./EnvService.ts\";\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 const envService = yield* EnvService;\n\n const claudeCodePaths = Effect.gen(function* () {\n const cliClaudeDir = yield* ccvOptionsService.getCcvOptions(\"claudeDir\");\n const homeDirectory = yield* envService.getEnv(\"HOME\");\n const globalClaudeDirectoryPath =\n cliClaudeDir === undefined\n ? path.resolve(homeDirectory ?? \"/\", \".claude\")\n : path.resolve(cliClaudeDir);\n\n return {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(globalClaudeDirectoryPath, \"commands\"),\n claudeSkillsDirPath: path.resolve(globalClaudeDirectoryPath, \"skills\"),\n claudeProjectsDirPath: path.resolve(globalClaudeDirectoryPath, \"projects\"),\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.ts\";\n\nexport type CliOptions = {\n port: string;\n hostname: string;\n verbose?: boolean | undefined;\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 apiOnly?: boolean | undefined;\n};\n\nexport type CcvOptions = {\n port: number;\n hostname: string;\n verbose?: boolean | undefined;\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 apiOnly?: boolean | undefined;\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n return process.env[key] ?? undefined;\n};\n\nconst isFlagEnabled = (value: string | undefined) => {\n if (value === undefined || value === \"\") return false;\n return value === \"1\" || value.toLowerCase() === \"true\";\n};\n\nconst toCcvOptions = (cliOptions?: CliOptions): CcvOptions => {\n return {\n port: Number.parseInt(cliOptions?.port ?? getOptionalEnv(\"PORT\") ?? \"3000\", 10),\n hostname: cliOptions?.hostname ?? getOptionalEnv(\"HOSTNAME\") ?? \"localhost\",\n verbose:\n cliOptions?.verbose ?? (isFlagEnabled(getOptionalEnv(\"CCV_VERBOSE\")) ? true : undefined),\n password: cliOptions?.password ?? getOptionalEnv(\"CCV_PASSWORD\") ?? undefined,\n executable: cliOptions?.executable ?? getOptionalEnv(\"CCV_CC_EXECUTABLE_PATH\") ?? undefined,\n claudeDir: cliOptions?.claudeDir ?? getOptionalEnv(\"CCV_GLOBAL_CLAUDE_DIR\"),\n terminalDisabled:\n cliOptions?.terminalDisabled ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_DISABLED\")) ? true : undefined),\n terminalShell: cliOptions?.terminalShell ?? getOptionalEnv(\"CCV_TERMINAL_SHELL\") ?? undefined,\n terminalUnrestricted:\n cliOptions?.terminalUnrestricted ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_UNRESTRICTED\")) ? true : undefined),\n apiOnly:\n cliOptions?.apiOnly ?? (isFlagEnabled(getOptionalEnv(\"CCV_API_ONLY\")) ? true : undefined),\n };\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvOptionsRef = yield* Ref.make<CcvOptions>(toCcvOptions());\n\n const loadCliOptions = (cliOptions: CliOptions) => {\n return Effect.gen(function* () {\n yield* Ref.update(ccvOptionsRef, () => toCcvOptions(cliOptions));\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 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 { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { type EnvSchema, envSchema } from \"../schema.ts\";\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const parsed = envSchema.safeParse(process.env);\n if (!parsed.success) {\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>(key: Key): 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(\"Unexpected error: Environment variables are not loaded\");\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\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\")<EnvService, IEnvService>() {\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.enum([\"development\", \"production\", \"test\"]).optional().default(\"development\"),\n NEXT_PHASE: z.string().optional(),\n HOME: 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", "const toPosixPath = (filePath: string): string => filePath.replaceAll(\"\\\\\", \"/\");\n\nconst getDirname = (filePath: string): string => {\n const normalized = toPosixPath(filePath);\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n if (lastSlashIndex === -1) {\n return \".\";\n }\n if (lastSlashIndex === 0) {\n return \"/\";\n }\n return normalized.slice(0, lastSlashIndex);\n};\n\nconst normalizeAbsolutePath = (inputPath: string): string => {\n const normalizedInput = toPosixPath(inputPath);\n const isAbsolute = normalizedInput.startsWith(\"/\");\n const rawSegments = normalizedInput.split(\"/\");\n const resolvedSegments: string[] = [];\n\n for (const segment of rawSegments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (resolvedSegments.length > 0) {\n resolvedSegments.pop();\n }\n continue;\n }\n resolvedSegments.push(segment);\n }\n\n const normalized = `${isAbsolute ? \"/\" : \"\"}${resolvedSegments.join(\"/\")}`;\n if (normalized === \"\") {\n return isAbsolute ? \"/\" : \".\";\n }\n return normalized;\n};\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(getDirname(sessionFilePath));\n};\n\n/**\n * Validates that a decoded project path is within the Claude projects directory.\n * Prevents path traversal attacks via crafted projectId values.\n */\nexport const validateProjectPath = (\n decodedPath: string,\n claudeProjectsDirPath: string,\n): boolean => {\n const normalizedPath = normalizeAbsolutePath(decodedPath);\n const normalizedBase = normalizeAbsolutePath(claudeProjectsDirPath);\n return normalizedPath.startsWith(`${normalizedBase}/`) || normalizedPath === normalizedBase;\n};\n", "import type { ExtendedConversation } from \"../../types.ts\";\n\nexport const extractFirstUserText = (conversation: ExtendedConversation): 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 { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { AgentSessionRepository } from \"../infrastructure/AgentSessionRepository.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const repository = yield* AgentSessionRepository;\n\n /**\n * Get agent session by agentId.\n * Directly reads agent-${agentId}.jsonl file without mapping service.\n */\n const getAgentSession = (params: { projectId: string; agentId: string; sessionId?: string }) =>\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 /**\n * List agent sessions for a given session.\n */\n const listAgentSessions = (params: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = params;\n const agentSessions = yield* repository.listAgentSessionsForSession(projectId, sessionId);\n\n return {\n status: 200,\n response: {\n agentSessions,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getAgentSession,\n listAgentSessions,\n };\n});\n\nexport type IAgentSessionController = InferEffect<typeof LayerImpl>;\n\nexport class AgentSessionController extends Context.Tag(\"AgentSessionController\")<\n AgentSessionController,\n IAgentSessionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { QuestionResponse } from \"../../../../types/question.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { CCVAskUserQuestionService } from \"../services/CCVAskUserQuestionService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvAskUserQuestionService = yield* CCVAskUserQuestionService;\n\n const questionResponse = (options: { questionResponse: QuestionResponse }) =>\n Effect.sync(() => {\n Effect.runFork(ccvAskUserQuestionService.respondToQuestion(options.questionResponse));\n\n return {\n status: 200,\n response: {\n message: \"Question response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n const getPendingQuestionRequests = () =>\n Effect.gen(function* () {\n const questionRequests = yield* ccvAskUserQuestionService.getPendingQuestionRequests;\n\n return {\n status: 200,\n response: {\n questionRequests,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n questionResponse,\n getPendingQuestionRequests,\n };\n});\n\nexport type ICCVAskUserQuestionController = InferEffect<typeof LayerImpl>;\nexport class CCVAskUserQuestionController extends Context.Tag(\"CCVAskUserQuestionController\")<\n CCVAskUserQuestionController,\n ICCVAskUserQuestionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import {\n createSdkMcpServer,\n type McpSdkServerConfigWithInstance,\n tool,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Deferred, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport { z } from \"zod\";\nimport type { QuestionRequest, QuestionResponse } from \"../../../../types/question.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingQuestionsRef = yield* Ref.make<Map<string, QuestionRequest>>(new Map());\n const deferredsRef = yield* Ref.make<Map<string, Deferred.Deferred<QuestionResponse, never>>>(\n new Map(),\n );\n const eventBus = yield* EventBus;\n\n const waitQuestionResponse = (request: QuestionRequest) =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<QuestionResponse, never>();\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.set(request.id, deferred);\n return next;\n });\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.set(request.id, request);\n return next;\n });\n\n yield* eventBus.emit(\"questionRequested\", {\n questionRequest: request,\n });\n\n const response = yield* Deferred.await(deferred);\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.delete(request.id);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.delete(request.id);\n return next;\n });\n\n return response;\n });\n\n const respondToQuestion = (response: QuestionResponse): Effect.Effect<void> =>\n Effect.gen(function* () {\n const deferreds = yield* Ref.get(deferredsRef);\n const deferred = deferreds.get(response.questionRequestId);\n\n if (deferred !== undefined) {\n // Look up the sessionId before deleting from the map\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n const request = pendingQuestions.get(response.questionRequestId);\n\n yield* Deferred.succeed(deferred, response);\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.delete(response.questionRequestId);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n next.delete(response.questionRequestId);\n return next;\n });\n\n if (request !== undefined) {\n yield* eventBus.emit(\"questionResolved\", {\n sessionId: request.sessionId,\n });\n }\n }\n });\n\n const createMcpServer = (options: {\n turnId: string;\n projectId: string;\n sessionId: string;\n }): McpSdkServerConfigWithInstance => {\n const { turnId, projectId, sessionId } = options;\n\n const questionInputSchema = {\n questions: z\n .array(\n z.object({\n question: z.string().describe(\"The question to ask\"),\n header: z.string().max(12).describe(\"Short label (max 12 chars)\"),\n options: z\n .array(\n z.object({\n label: z.string().describe(\"Display text (1-5 words)\"),\n description: z.string().describe(\"What this option means\"),\n preview: z.string().optional().describe(\"Optional preview content\"),\n }),\n )\n .min(2)\n .max(4),\n multiSelect: z.boolean().default(false),\n }),\n )\n .min(1)\n .max(4),\n };\n\n const ccvAskUserQuestionTool = tool(\n \"CCVAskUserQuestion\",\n \"Ask the user questions through the Claude Code Viewer web interface. This tool replaces AskUserQuestion for web-based sessions. Use this to:\\n1. Gather user preferences or requirements\\n2. Clarify ambiguous instructions\\n3. Get decisions on implementation choices\\n4. Offer choices about what direction to take.\\n\\nUsers can select from provided options or type custom input. Use multiSelect: true to allow multiple answers.\",\n questionInputSchema,\n async (args) => {\n const questionRequest: QuestionRequest = {\n id: ulid(),\n turnId,\n projectId,\n sessionId,\n questions: args.questions.map((q) => ({\n question: q.question,\n header: q.header,\n options: q.options.map((o) => ({\n label: o.label,\n description: o.description,\n preview: o.preview,\n })),\n multiSelect: q.multiSelect,\n })),\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(waitQuestionResponse(questionRequest));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(response.answers),\n },\n ],\n };\n },\n );\n\n return createSdkMcpServer({\n name: \"ccv-ask-user-question\",\n tools: [ccvAskUserQuestionTool],\n });\n };\n\n const cancelPendingRequests = (sessionId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n const deferreds = yield* Ref.get(deferredsRef);\n\n const matchingRequestIds: string[] = [];\n for (const [id, request] of pendingQuestions) {\n if (request.sessionId === sessionId) {\n matchingRequestIds.push(id);\n const deferred = deferreds.get(id);\n if (deferred !== undefined) {\n const emptyResponse: QuestionResponse = {\n questionRequestId: request.id,\n answers: {},\n annotations: {},\n };\n yield* Deferred.succeed(deferred, emptyResponse);\n }\n }\n }\n\n if (matchingRequestIds.length > 0) {\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n }\n });\n\n const getPendingQuestionRequests = Effect.gen(function* () {\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n return [...pendingQuestions.values()];\n });\n\n return {\n waitQuestionResponse,\n respondToQuestion,\n createMcpServer,\n cancelPendingRequests,\n getPendingQuestionRequests,\n };\n});\n\nexport type ICCVAskUserQuestionService = InferEffect<typeof LayerImpl>;\n\nexport class CCVAskUserQuestionService extends Context.Tag(\"CCVAskUserQuestionService\")<\n CCVAskUserQuestionService,\n ICCVAskUserQuestionService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration.ts\";\n\ntype Listener<T> = (data: T) => void | Promise<void>;\n\nconst layerImpl = Effect.sync(() => {\n const listenersMap = new Map<keyof InternalEventDeclaration, Set<Listener<unknown>>>();\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- map guarantees correct type via event key\n return listenersMap.get(event) as Set<Listener<InternalEventDeclaration[EventName]>>;\n };\n\n const emit = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n data: InternalEventDeclaration[EventName],\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n\n void Promise.allSettled(\n Array.from(listeners).map(async (listener) => {\n await listener(data);\n }),\n ).then((results) => {\n for (const r of results) {\n if (r.status === \"rejected\") {\n Effect.runFork(\n Effect.logError(`[EventBus] listener error for \"${event}\": ${String(r.reason)}`),\n );\n }\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport {\n type CommandInfo,\n scanCommandFilesWithMetadata,\n scanSkillFilesWithMetadata,\n} from \"../functions/scanCommandFiles.ts\";\nimport * as ClaudeCodeVersion from \"../models/ClaudeCodeVersion.ts\";\nimport { ClaudeCodeService } from \"../services/ClaudeCodeService.ts\";\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((yield* context.claudeCodePaths).claudeSkillsDirPath)\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- Object.entries preserves key type\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 { FileSystem } from \"@effect/platform\";\nimport { desc } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport type { Project } from \"../../types.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../functions/id.ts\";\nimport { ProjectMetaService } from \"../services/ProjectMetaService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const projectMetaService = yield* ProjectMetaService;\n const context = yield* ApplicationContext;\n const { db } = yield* DrizzleService;\n\n const getProject = (projectId: string) =>\n Effect.gen(function* () {\n const fullPath = decodeProjectId(projectId);\n\n // Validate that the decoded path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* context.claudeCodePaths;\n if (!validateProjectPath(fullPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\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 // Fetch all projects from DB ordered by dirMtimeMs DESC\n const rows = db.select().from(projects).orderBy(desc(projects.dirMtimeMs)).all();\n\n if (rows.length === 0) {\n return { projects: [] };\n }\n\n const projectsList: Project[] = yield* Effect.all(\n rows.map((row) =>\n Effect.gen(function* () {\n const meta = yield* projectMetaService.getProjectMeta(row.id);\n return {\n id: row.id,\n claudeProjectPath: row.path ?? decodeProjectId(row.id),\n lastModifiedAt: new Date(row.dirMtimeMs),\n meta,\n } satisfies Project;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return { projects: projectsList };\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", "/* oxlint-disable no-restricted-imports */\n/* Exception: node:sqlite is required by drizzle node-sqlite driver. */\nimport { DatabaseSync } from \"node:sqlite\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { drizzle, type NodeSQLiteDatabase } from \"drizzle-orm/node-sqlite\";\nimport { migrate } from \"drizzle-orm/node-sqlite/migrator\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport * as schema from \"./schema.ts\";\n\nconst migrationsFolder = new URL(\"./migrations\", import.meta.url).pathname;\nconst FTS5_DDL = `\n CREATE VIRTUAL TABLE IF NOT EXISTS session_messages_fts USING fts5(\n session_id UNINDEXED,\n project_id UNINDEXED,\n role UNINDEXED,\n content,\n conversation_index UNINDEXED,\n tokenize='trigram'\n )\n`;\n\nconst initDbAtPath = (cacheDbPath: string): { db: DrizzleDb; rawDb: DatabaseSync } => {\n const sqlite = new DatabaseSync(cacheDbPath);\n sqlite.exec(\"PRAGMA journal_mode = WAL\");\n sqlite.exec(\"PRAGMA foreign_keys = ON\");\n\n const db = drizzle({ client: sqlite, schema });\n migrate(db, { migrationsFolder });\n sqlite.exec(FTS5_DDL);\n\n return { db, rawDb: sqlite };\n};\n\nexport type DrizzleDb = NodeSQLiteDatabase<typeof schema>;\n\nexport class DrizzleService extends Context.Tag(\"DrizzleService\")<\n DrizzleService,\n { readonly db: DrizzleDb; readonly rawDb: DatabaseSync }\n>() {\n static readonly Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const context = yield* ApplicationContext;\n const claudeCodePaths = yield* context.claudeCodePaths;\n\n const homeDirectory = path.dirname(claudeCodePaths.globalClaudeDirectoryPath);\n const dbDirPath = path.resolve(homeDirectory, \".claude-code-viewer\");\n const dbPath = path.resolve(dbDirPath, \"cache.db\");\n\n yield* fs.makeDirectory(dbDirPath, { recursive: true });\n\n const dbResult = yield* Effect.either(\n Effect.try({\n try: () => initDbAtPath(dbPath),\n catch: (error) => error,\n }),\n );\n\n if (dbResult._tag === \"Right\") {\n return dbResult.right;\n }\n\n const error = dbResult.left;\n yield* Effect.logWarning(\n `[DrizzleService] Migration failed, recreating cache DB: ${error instanceof Error ? error.message : String(error)}`,\n );\n\n try {\n new DatabaseSync(dbPath).close();\n } catch {\n // ignore\n }\n\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n yield* fs\n .remove(`${dbPath}${suffix}`, { force: true })\n .pipe(Effect.catchAll(() => Effect.void));\n }\n\n return initDbAtPath(dbPath);\n }),\n );\n}\n", "import { index, integer, real, sqliteTable, text } from \"drizzle-orm/sqlite-core\";\n\n// ---------------------------------------------------------------------------\n// projects\n// ---------------------------------------------------------------------------\n\nexport const projects = sqliteTable(\"projects\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\"),\n path: text(\"path\"),\n sessionCount: integer(\"session_count\").notNull().default(0),\n dirMtimeMs: integer(\"dir_mtime_ms\").notNull(),\n syncedAt: integer(\"synced_at\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// sessions\n// ---------------------------------------------------------------------------\n\nexport const sessions = sqliteTable(\n \"sessions\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n filePath: text(\"file_path\").notNull().unique(),\n messageCount: integer(\"message_count\").notNull().default(0),\n firstUserMessageJson: text(\"first_user_message_json\"),\n customTitle: text(\"custom_title\"),\n totalCostUsd: real(\"total_cost_usd\").notNull().default(0),\n costBreakdownJson: text(\"cost_breakdown_json\"),\n tokenUsageJson: text(\"token_usage_json\"),\n modelName: text(\"model_name\"),\n prLinksJson: text(\"pr_links_json\"),\n fileMtimeMs: integer(\"file_mtime_ms\").notNull(),\n lastModifiedAt: text(\"last_modified_at\").notNull(),\n syncedAt: integer(\"synced_at\").notNull(),\n },\n (table) => [\n index(\"idx_sessions_project_id\").on(table.projectId),\n index(\"idx_sessions_file_mtime\").on(table.fileMtimeMs),\n ],\n);\n\n// ---------------------------------------------------------------------------\n// sync_state\n// ---------------------------------------------------------------------------\n\nexport const syncState = sqliteTable(\"sync_state\", {\n key: text(\"key\").primaryKey(),\n value: text(\"value\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// Inferred row types (for use outside drizzle query builder)\n// ---------------------------------------------------------------------------\n\nexport type ProjectRow = typeof projects.$inferSelect;\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type SyncStateRow = typeof syncState.$inferSelect;\n", "import { Path } from \"@effect/platform\";\nimport { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { type ProjectRow, projects } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { ProjectMeta } from \"../../types.ts\";\n\nconst rowToProjectMeta = (row: ProjectRow, baseName: string): ProjectMeta => {\n const projectPath = row.path;\n const projectName = projectPath !== null ? baseName : null;\n\n return {\n projectName,\n projectPath,\n sessionCount: row.sessionCount,\n };\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n const path = yield* Path.Path;\n\n const getProjectMeta = (projectId: string): Effect.Effect<ProjectMeta, Error> =>\n Effect.gen(function* () {\n const row = db.select().from(projects).where(eq(projects.id, projectId)).get();\n\n if (row === undefined) {\n // Not in DB yet \u2014 sync and retry\n yield* syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\n\n const retryRow = db.select().from(projects).where(eq(projects.id, projectId)).get();\n\n if (retryRow === undefined) {\n return yield* Effect.fail(new Error(`Project not found: ${projectId}`));\n }\n\n const baseName = retryRow.path !== null ? path.basename(retryRow.path) : \"\";\n return rowToProjectMeta(retryRow, baseName);\n }\n\n const baseName = row.path !== null ? path.basename(row.path) : \"\";\n return rowToProjectMeta(row, baseName);\n });\n\n const invalidateProject = (projectId: string): Effect.Effect<void> =>\n syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\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);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { count, eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { z } from \"zod\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects, sessions } from \"../../../lib/db/schema.ts\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, encodeProjectId } from \"../../project/functions/id.ts\";\nimport { extractSearchableText } from \"../../search/functions/extractSearchableText.ts\";\nimport { aggregateTokenUsageAndCost } from \"../../session/functions/aggregateTokenUsageAndCost.ts\";\nimport { getAgentSessionFilesForSession } from \"../../session/functions/getAgentSessionFilesForSession.ts\";\nimport { decodeSessionId, encodeSessionId } from \"../../session/functions/id.ts\";\nimport { isRegularSessionFile } from \"../../session/functions/isRegularSessionFile.ts\";\nimport { extractFirstUserMessage } from \"../../session/functions/isValidFirstMessage.ts\";\n\n// ---------------------------------------------------------------------------\n// SyncService interface\n// ---------------------------------------------------------------------------\n\nexport type ISyncService = {\n readonly fullSync: () => Effect.Effect<void, Error>;\n readonly syncSession: (projectId: string, sessionId: string) => Effect.Effect<void, Error>;\n readonly syncProjectList: (projectId: string) => Effect.Effect<void, Error>;\n};\n\n// ---------------------------------------------------------------------------\n// Helper: extract actualSessionId from the first line of a JSONL file\n// ---------------------------------------------------------------------------\n\nconst extractActualSessionId = (content: string): string | undefined => {\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(firstLine);\n const result = z.object({ sessionId: z.string() }).safeParse(parsed);\n if (result.success) {\n return result.data.sessionId;\n }\n } catch {\n // ignore parse errors\n }\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Helper: extract project cwd from JSONL content\n// The cwd field in JSONL entries represents the actual project working\n// directory, which is distinct from the Claude projects log directory.\n// ---------------------------------------------------------------------------\n\nconst extractCwdFromContent = (content: string): string | null => {\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\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 conversation.type === \"custom-title\" ||\n conversation.type === \"agent-name\" ||\n conversation.type === \"agent-setting\" ||\n conversation.type === \"pr-link\" ||\n conversation.type === \"last-prompt\"\n ) {\n continue;\n }\n\n return conversation.cwd;\n }\n\n return null;\n};\n\n// ---------------------------------------------------------------------------\n// LayerImpl\n// ---------------------------------------------------------------------------\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const drizzleService = yield* DrizzleService;\n const appContext = yield* ApplicationContext;\n\n const { db, rawDb } = drizzleService;\n\n // -------------------------------------------------------------------------\n // Internal helper: extract project cwd\n // Tries sessions-index.json first (fast), falls back to parsing JSONL.\n // -------------------------------------------------------------------------\n\n const extractProjectCwd = (\n projectDirPath: string,\n sessionFileNames: string[],\n ): Effect.Effect<string | null, Error> =>\n Effect.gen(function* () {\n // 1. Try sessions-index.json (available in recent Claude Code versions)\n const indexPath = path.join(projectDirPath, \"sessions-index.json\");\n const indexContent = yield* fs\n .readFileString(indexPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (indexContent !== \"\") {\n try {\n const parsed: unknown = JSON.parse(indexContent);\n const indexSchema = z.object({\n entries: z.array(z.looseObject({ projectPath: z.string() })),\n });\n const indexResult = indexSchema.safeParse(parsed);\n if (indexResult.success) {\n for (const entry of indexResult.data.entries) {\n return entry.projectPath;\n }\n }\n } catch {\n // ignore parse errors, fall through to JSONL parsing\n }\n }\n\n // 2. Fallback: parse JSONL files (oldest first) for cwd field\n const fileEntries: Array<{ fullPath: string; mtimeMs: number }> = [];\n for (const fileName of sessionFileNames) {\n const fullPath = path.join(projectDirPath, fileName);\n const stat = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (stat) {\n const mtimeMs = Option.getOrElse(stat.mtime, () => new Date(0)).getTime();\n fileEntries.push({ fullPath, mtimeMs });\n }\n }\n\n fileEntries.sort((a, b) => a.mtimeMs - b.mtimeMs);\n\n for (const entry of fileEntries) {\n const content = yield* fs\n .readFileString(entry.fullPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n if (content === \"\") continue;\n\n const cwd = extractCwdFromContent(content);\n if (cwd !== null) {\n return cwd;\n }\n }\n\n return null;\n });\n\n // -------------------------------------------------------------------------\n // Internal helper: parse a JSONL file and upsert into DB\n // -------------------------------------------------------------------------\n\n const parseAndUpsertSession = (\n projectId: string,\n sessionId: string,\n filePath: string,\n fileMtimeMs: number,\n ): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const content = yield* fs\n .readFileString(filePath)\n .pipe(\n Effect.mapError(\n (e) => new Error(`Failed to read session file ${filePath}: ${e.message}`),\n ),\n );\n const conversations = parseJsonl(content);\n\n // Extract firstUserMessage\n let firstUserMessage = null;\n for (const conversation of conversations) {\n const msg = extractFirstUserMessage(conversation);\n if (msg !== undefined) {\n firstUserMessage = msg;\n break;\n }\n }\n\n // Extract custom title and PR links\n let customTitle: string | null = null;\n const prLinksMap = new Map<\n string,\n { prNumber: number; prUrl: string; prRepository: string }\n >();\n\n for (const conversation of conversations) {\n if (conversation.type === \"custom-title\") {\n customTitle = conversation.customTitle;\n }\n if (conversation.type === \"pr-link\") {\n const key = `${conversation.prRepository}#${conversation.prNumber}`;\n prLinksMap.set(key, {\n prNumber: conversation.prNumber,\n prUrl: conversation.prUrl,\n prRepository: conversation.prRepository,\n });\n }\n }\n const prLinks = [...prLinksMap.values()];\n\n // Extract actual sessionId from file content to find agent sessions\n const actualSessionId = extractActualSessionId(content);\n const projectPath = path.dirname(filePath);\n\n // Discover agent session files\n const agentFilePaths =\n actualSessionId !== undefined\n ? yield* getAgentSessionFilesForSession(projectPath, actualSessionId).pipe(\n Effect.provide(Layer.succeed(FileSystem.FileSystem, fs)),\n Effect.provide(Layer.succeed(Path.Path, path)),\n Effect.catchAll(() => Effect.succeed([] as string[])),\n )\n : [];\n\n // Read agent file contents\n const agentContents: string[] = [];\n for (const agentPath of agentFilePaths) {\n const agentContent = yield* fs\n .readFileString(agentPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n if (agentContent !== \"\") {\n agentContents.push(agentContent);\n }\n }\n\n // Aggregate token usage and cost\n const { totalCost, modelName } = aggregateTokenUsageAndCost([content, ...agentContents]);\n\n const messageCount = content.split(\"\\n\").filter((line) => line.trim() !== \"\").length;\n\n const now = Date.now();\n\n // Get project directory mtime for updating project row\n const projectStat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n const projectDirMtimeMs = projectStat\n ? Option.getOrElse(projectStat.mtime, () => new Date(0)).getTime()\n : 0;\n\n // Build searchable texts for FTS\n const ftsEntries: Array<{\n role: string;\n content: string;\n index: number;\n }> = [];\n for (let i = 0; i < conversations.length; i++) {\n const conversation = conversations[i];\n if (conversation === undefined) continue;\n const text = extractSearchableText(conversation);\n if (text !== null && text.trim() !== \"\") {\n ftsEntries.push({\n role: conversation.type,\n content: text,\n index: i,\n });\n }\n }\n\n // Upsert within a transaction\n db.transaction((tx) => {\n // Upsert session row\n tx.insert(sessions)\n .values({\n id: sessionId,\n projectId,\n filePath,\n messageCount,\n firstUserMessageJson:\n firstUserMessage !== null ? JSON.stringify(firstUserMessage) : null,\n customTitle,\n totalCostUsd: totalCost.totalUsd,\n costBreakdownJson: JSON.stringify(totalCost.breakdown),\n tokenUsageJson: JSON.stringify(totalCost.tokenUsage),\n modelName,\n prLinksJson: prLinks.length > 0 ? JSON.stringify(prLinks) : null,\n fileMtimeMs,\n lastModifiedAt: new Date(fileMtimeMs).toISOString(),\n syncedAt: now,\n })\n .onConflictDoUpdate({\n target: sessions.id,\n set: {\n projectId,\n filePath,\n messageCount,\n firstUserMessageJson:\n firstUserMessage !== null ? JSON.stringify(firstUserMessage) : null,\n customTitle,\n totalCostUsd: totalCost.totalUsd,\n costBreakdownJson: JSON.stringify(totalCost.breakdown),\n tokenUsageJson: JSON.stringify(totalCost.tokenUsage),\n modelName,\n prLinksJson: prLinks.length > 0 ? JSON.stringify(prLinks) : null,\n fileMtimeMs,\n lastModifiedAt: new Date(fileMtimeMs).toISOString(),\n syncedAt: now,\n },\n })\n .run();\n\n // Delete old FTS entries for this session\n rawDb.prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\").run(sessionId);\n\n // Insert new FTS entries\n for (const entry of ftsEntries) {\n rawDb\n .prepare(\n `INSERT INTO session_messages_fts (session_id, project_id, role, content, conversation_index)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(sessionId, projectId, entry.role, entry.content, entry.index);\n }\n\n // Update project dir_mtime_ms\n tx.update(projects)\n .set({ dirMtimeMs: projectDirMtimeMs, syncedAt: now })\n .where(eq(projects.id, projectId))\n .run();\n });\n });\n\n // -------------------------------------------------------------------------\n // Internal helper: update project session_count\n // -------------------------------------------------------------------------\n\n const updateProjectSessionCount = (projectId: string): void => {\n const result = db\n .select({ cnt: count() })\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .get();\n const cnt = result?.cnt ?? 0;\n db.update(projects).set({ sessionCount: cnt }).where(eq(projects.id, projectId)).run();\n };\n\n // -------------------------------------------------------------------------\n // fullSync\n // -------------------------------------------------------------------------\n\n const fullSync = (): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n\n // Skip if projects directory doesn't exist\n const dirExists = yield* fs\n .exists(claudeProjectsDirPath)\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (!dirExists) {\n return;\n }\n\n // List project directories\n const projectDirs = yield* fs\n .readDirectory(claudeProjectsDirPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n // Get known projects from DB\n const knownProjects = db.select().from(projects).all();\n const knownProjectIds = new Set(knownProjects.map((p) => p.id));\n const seenProjectIds = new Set<string>();\n\n for (const dirName of projectDirs) {\n const projectPath = path.join(claudeProjectsDirPath, dirName);\n\n // Check if this is a directory\n const dirStat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!dirStat || dirStat.type !== \"Directory\") {\n continue;\n }\n\n const projectId = encodeProjectId(projectPath);\n seenProjectIds.add(projectId);\n\n const dirMtimeMs = Option.getOrElse(dirStat.mtime, () => new Date(0)).getTime();\n\n // Get current session file list from filesystem\n const fileNames = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n const sessionFiles = fileNames.filter(isRegularSessionFile);\n\n // Ensure project row exists\n const existingProject = knownProjects.find((p) => p.id === projectId);\n if (!existingProject) {\n // Extract actual project cwd from the earliest session file\n const projectCwd = yield* extractProjectCwd(projectPath, sessionFiles);\n\n db.insert(projects)\n .values({\n id: projectId,\n name: projectCwd !== null ? path.basename(projectCwd) : null,\n path: projectCwd,\n sessionCount: 0,\n dirMtimeMs,\n syncedAt: Date.now(),\n })\n .onConflictDoNothing()\n .run();\n }\n\n // Get known sessions for this project from DB\n const knownSessions = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .all();\n const knownSessionPaths = new Set(knownSessions.map((s) => s.filePath));\n const seenFilePaths = new Set<string>();\n\n for (const fileName of sessionFiles) {\n const filePath = path.join(projectPath, fileName);\n seenFilePaths.add(filePath);\n\n const fileStat = yield* fs\n .stat(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) continue;\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n\n // Check if new file or mtime changed\n const knownSession = knownSessions.find((s) => s.filePath === filePath);\n const isNew = !knownSessionPaths.has(filePath);\n const isModified = knownSession !== undefined && fileMtimeMs > knownSession.fileMtimeMs;\n\n if (isNew || isModified) {\n const sessionId = encodeSessionId(filePath);\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(\n `[SyncService] Failed to upsert session ${filePath}: ${String(e)}`,\n ),\n );\n return Effect.void;\n }),\n );\n }\n }\n\n // Delete sessions whose files no longer exist\n for (const knownSession of knownSessions) {\n if (!seenFilePaths.has(knownSession.filePath)) {\n db.delete(sessions).where(eq(sessions.filePath, knownSession.filePath)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\")\n .run(knownSession.id);\n }\n }\n\n updateProjectSessionCount(projectId);\n\n // Update project dir_mtime_ms and synced_at\n db.update(projects)\n .set({ dirMtimeMs, syncedAt: Date.now() })\n .where(eq(projects.id, projectId))\n .run();\n }\n\n // Delete projects that no longer exist on filesystem\n for (const knownProjectId of knownProjectIds) {\n if (!seenProjectIds.has(knownProjectId)) {\n db.delete(sessions).where(eq(sessions.projectId, knownProjectId)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE project_id = ?\")\n .run(knownProjectId);\n db.delete(projects).where(eq(projects.id, knownProjectId)).run();\n }\n }\n });\n\n // -------------------------------------------------------------------------\n // syncSession\n // -------------------------------------------------------------------------\n\n const syncSession = (projectId: string, sessionId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const filePath = decodeSessionId(projectId, sessionId);\n\n const fileStat = yield* fs.stat(filePath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) {\n // File no longer exists \u2014 remove from DB\n db.delete(sessions).where(eq(sessions.id, sessionId)).run();\n rawDb.prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\").run(sessionId);\n updateProjectSessionCount(projectId);\n return;\n }\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n\n // Check stored mtime\n const stored = db\n .select({ fileMtimeMs: sessions.fileMtimeMs })\n .from(sessions)\n .where(eq(sessions.id, sessionId))\n .get();\n\n if (stored !== undefined && fileMtimeMs <= stored.fileMtimeMs) {\n // No changes\n return;\n }\n\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs);\n updateProjectSessionCount(projectId);\n });\n\n // -------------------------------------------------------------------------\n // syncProjectList\n // -------------------------------------------------------------------------\n\n const syncProjectList = (projectId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n const dirExists = yield* fs\n .exists(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (!dirExists) {\n return;\n }\n\n const fileNames = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n const sessionFiles = fileNames.filter(isRegularSessionFile);\n\n const knownSessions = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .all();\n const knownSessionPaths = new Set(knownSessions.map((s) => s.filePath));\n const seenFilePaths = new Set<string>();\n\n for (const fileName of sessionFiles) {\n const filePath = path.join(projectPath, fileName);\n seenFilePaths.add(filePath);\n\n if (!knownSessionPaths.has(filePath)) {\n // New file\n const fileStat = yield* fs\n .stat(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) continue;\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n const sessionId = encodeSessionId(filePath);\n\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(`[SyncService] Failed to upsert session ${filePath}: ${String(e)}`),\n );\n return Effect.void;\n }),\n );\n }\n }\n\n // Delete sessions whose files no longer exist\n for (const knownSession of knownSessions) {\n if (!seenFilePaths.has(knownSession.filePath)) {\n db.delete(sessions).where(eq(sessions.filePath, knownSession.filePath)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\")\n .run(knownSession.id);\n }\n }\n\n updateProjectSessionCount(projectId);\n });\n\n return {\n fullSync,\n syncSession,\n syncProjectList,\n } satisfies ISyncService;\n});\n\n// ---------------------------------------------------------------------------\n// SyncService Tag\n// ---------------------------------------------------------------------------\n\nexport class SyncService extends Context.Tag(\"SyncService\")<SyncService, ISyncService>() {\n static readonly Live = Layer.effect(this, LayerImpl);\n}\n", "import type { Conversation } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\n\n/**\n * Extracts searchable text from a conversation entry.\n * Returns the user prompt or assistant response text.\n */\nexport const extractSearchableText = (conversation: ExtendedConversation): 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 if (conversation.type === \"custom-title\") {\n return conversation.customTitle;\n }\n\n if (conversation.type === \"agent-name\") {\n return null;\n }\n\n if (conversation.type === \"agent-setting\") {\n return null;\n }\n\n return null;\n};\n\nconst extractUserText = (entry: Extract<Conversation, { type: \"user\" }>): 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 = (entry: Extract<Conversation, { type: \"assistant\" }>): 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", "/**\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 = 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.ts\";\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 const 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 */\nconst 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 const calculateTokenCost = (usage: TokenUsage, modelName: string): 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 = (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 = 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.ts\";\nimport { calculateTokenCost, type TokenUsage } from \"./calculateSessionCost.ts\";\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 + totalOutputTokensUsd + totalCacheCreationUsd + 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 === undefined || firstLine.trim() === \"\") {\n return false;\n }\n\n try {\n const firstLineData: unknown = 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 if (!(\"sessionId\" in firstLineData)) return false;\n const sid: unknown = firstLineData.sessionId;\n return sid === expectedSessionId;\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) => 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) => 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 { decodeProjectId } from \"../../project/functions/id.ts\";\n\nconst SESSION_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nconst toPosixPath = (filePath: string): string => filePath.replaceAll(\"\\\\\", \"/\");\n\nconst getBasename = (filePath: string): string => {\n const normalized = toPosixPath(filePath);\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n return lastSlashIndex === -1 ? normalized : normalized.slice(lastSlashIndex + 1);\n};\n\nconst stripExtension = (fileName: string): string => {\n const lastDotIndex = fileName.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n return fileName;\n }\n return fileName.slice(0, lastDotIndex);\n};\n\nconst joinPath = (basePath: string, childPath: string): string => {\n const normalizedBase = toPosixPath(basePath).replace(/\\/+$/u, \"\");\n if (normalizedBase === \"\") {\n return `/${childPath}`;\n }\n return `${normalizedBase}/${childPath}`;\n};\n\nexport const encodeSessionId = (jsonlFilePath: string) => {\n return stripExtension(getBasename(jsonlFilePath));\n};\n\n/**\n * Validates that a sessionId contains only safe characters (alphanumeric, hyphens, underscores).\n * Prevents path traversal attacks via crafted sessionId values.\n */\nexport const validateSessionId = (sessionId: string): boolean => {\n return SESSION_ID_PATTERN.test(sessionId);\n};\n\nexport const decodeSessionId = (projectId: string, sessionId: string) => {\n const projectPath = decodeProjectId(projectId);\n return joinPath(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 { 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((match) => match.tag === \"command-name\")?.content;\n const commandArgs = matches.find((match) => match.tag === \"command-args\")?.content;\n const commandMessage = matches.find((match) => match.tag === \"command-message\")?.content;\n const localCommandStdout = matches.find((match) => match.tag === \"local-command-stdout\")?.content;\n\n // oxlint-disable-next-line typescript-eslint/switch-exhaustiveness-check -- switch(true) pattern with default case\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 {\n type ParsedUserMessage,\n parseUserMessage,\n} from \"../../claude-code/functions/parseUserMessage.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\nimport { extractFirstUserText } from \"./extractFirstUserText.ts\";\n\nconst ignoreCommands = [\"/clear\", \"/login\", \"/logout\", \"/exit\", \"/mcp\", \"/memory\"];\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 = /<local-command-caveat>[\\s\\S]*?<\\/local-command-caveat>/;\n\nexport const isLocalCommandCaveat = (text: string) => {\n return text === localCommandCaveatText || localCommandCaveatPattern.test(text);\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 (command.kind === \"command\" && ignoreCommands.includes(command.commandName)) {\n return undefined;\n }\n\n if (command.kind === \"local-command\" && command.stdout.trim() === \"\") {\n return undefined;\n }\n\n return command;\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] === undefined || 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(/^description:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m);\n const description = descriptionMatch?.[1]?.trim() ?? null;\n\n // Extract argument-hint field\n const argumentHintMatch = frontmatter.match(/^argument-hint:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m);\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 = (filePath: string, baseDir: string): string => {\n // Normalize base directory by removing trailing slash\n const normalizedBaseDir = baseDir.endsWith(\"/\") ? baseDir.slice(0, -1) : 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<string[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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<CommandInfo[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 } = 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<string[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 ? `${relativePath}/${item}` : 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<CommandInfo[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 } = 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 ? `${relativePath}/${item}` : 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) => [data.major, data.minor, data.patch].every((value) => !Number.isNaN(value)));\n\nexport type ClaudeCodeVersion = z.infer<typeof versionSchema>;\n\nexport const fromCLIString = (versionOutput: string): 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 && (a.minor > b.minor || (a.minor === b.minor && a.patch > b.patch)));\n\nexport const greaterThanOrEqual = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n equals(a, b) || greaterThan(a, b);\n", "import { Context, Data, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { parseMcpListOutput } from \"../functions/parseMcpListOutput.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\n\nclass ProjectPathNotFoundError extends Data.TaggedError(\"ProjectPathNotFoundError\")<{\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(config.claudeCodeVersion);\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(project.meta.projectPath);\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 type 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.ts\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion.ts\";\n\ntype AgentSdkQuery = typeof agentSdk.query;\ntype AgentSdkPrompt = Parameters<AgentSdkQuery>[0][\"prompt\"];\ntype AgentSdkQueryOptions = NonNullable<Parameters<AgentSdkQuery>[0][\"options\"]>;\n\nconst npxCacheRegExp = /_npx[/\\\\].*node_modules[\\\\/]\\.bin/;\nconst localNodeModulesBinRegExp = new RegExp(`${process.cwd()}/node_modules/.bin`);\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(\"ClaudeCodePathNotFoundError\")<{\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 = 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(Command.make(\"which\", \"-a\", \"claude\")).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(claudeCodeExecutablePath, \"mcp\", \"list\").pipe(\n Command.workingDirectory(projectCwd),\n ),\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 = (prompt: AgentSdkPrompt, options: AgentSdkQueryOptions) => {\n const {\n canUseTool,\n permissionMode,\n hooks: _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 !== undefined ? { systemPrompt } : {}),\n ...(settingSources !== undefined ? { settingSources } : {}),\n pathToClaudeCodeExecutable: claudeCodeExecutablePath,\n disallowedTools: [\"AskUserQuestion\", ...(baseOptions.disallowedTools ?? [])], // 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.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ClaudeCodePermissionService } from \"../services/ClaudeCodePermissionService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodePermissionService = yield* ClaudeCodePermissionService;\n\n const permissionResponse = (options: { permissionResponse: PermissionResponse }) =>\n Effect.sync(() => {\n const { permissionResponse } = options;\n\n Effect.runFork(claudeCodePermissionService.respondToPermissionRequest(permissionResponse));\n\n return {\n status: 200,\n response: {\n message: \"Permission response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n const getPendingPermissionRequests = () =>\n Effect.gen(function* () {\n const permissionRequests = yield* claudeCodePermissionService.getPendingPermissionRequests;\n\n return {\n status: 200,\n response: {\n permissionRequests,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n permissionResponse,\n getPendingPermissionRequests,\n };\n});\n\nexport type IClaudeCodePermissionController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodePermissionController extends Context.Tag(\"ClaudeCodePermissionController\")<\n ClaudeCodePermissionController,\n IClaudeCodePermissionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import type { CanUseTool, PermissionMode } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Deferred, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { PermissionRequest, PermissionResponse } from \"../../../../types/permissions.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingPermissionRequestsRef = yield* Ref.make<Map<string, PermissionRequest>>(new Map());\n const deferredsRef = yield* Ref.make<Map<string, Deferred.Deferred<PermissionResponse, never>>>(\n new Map(),\n );\n const eventBus = yield* EventBus;\n\n const waitPermissionResponse = (request: PermissionRequest) =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<PermissionResponse, never>();\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.set(request.id, deferred);\n return next;\n });\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.set(request.id, request);\n return next;\n });\n\n yield* eventBus.emit(\"permissionRequested\", {\n permissionRequest: request,\n });\n\n const response = yield* Deferred.await(deferred);\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.delete(request.id);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.delete(request.id);\n return next;\n });\n\n return response;\n });\n\n const createCanUseToolRelatedOptions = (options: {\n turnId: string;\n projectId: string;\n permissionMode?: PermissionMode;\n sessionId: string;\n }) => {\n const { turnId, projectId, sessionId } = options;\n const permissionMode = options.permissionMode ?? \"default\";\n\n return Effect.gen(function* () {\n const claudeCodeConfig = yield* ClaudeCode.Config;\n\n if (!ClaudeCode.getAvailableFeatures(claudeCodeConfig.claudeCodeVersion).canUseTool) {\n return {\n permissionMode: \"bypassPermissions\",\n } as const;\n }\n\n const canUseTool: CanUseTool = async (toolName, toolInput, _options) => {\n if (permissionMode !== \"default\") {\n // Convert Claude Code permission modes to canUseTool behaviors\n if (permissionMode === \"bypassPermissions\" || permissionMode === \"acceptEdits\") {\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 projectId,\n sessionId,\n toolName,\n toolInput,\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(waitPermissionResponse(permissionRequest));\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,\n } as const;\n });\n };\n\n const respondToPermissionRequest = (response: PermissionResponse): Effect.Effect<void> =>\n Effect.gen(function* () {\n const deferreds = yield* Ref.get(deferredsRef);\n const deferred = deferreds.get(response.permissionRequestId);\n\n if (deferred !== undefined) {\n // Look up the sessionId before deleting from the map\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n const request = pendingRequests.get(response.permissionRequestId);\n\n yield* Deferred.succeed(deferred, response);\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.delete(response.permissionRequestId);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n next.delete(response.permissionRequestId);\n return next;\n });\n\n if (request !== undefined) {\n yield* eventBus.emit(\"permissionResolved\", {\n sessionId: request.sessionId,\n });\n }\n }\n });\n\n const cancelPendingRequests = (sessionId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n const deferreds = yield* Ref.get(deferredsRef);\n\n const matchingRequestIds: string[] = [];\n for (const [id, request] of pendingRequests) {\n if (request.sessionId === sessionId) {\n matchingRequestIds.push(id);\n const deferred = deferreds.get(id);\n if (deferred !== undefined) {\n const denyResponse: PermissionResponse = {\n permissionRequestId: request.id,\n decision: \"deny\",\n };\n yield* Deferred.succeed(deferred, denyResponse);\n }\n }\n }\n\n if (matchingRequestIds.length > 0) {\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n }\n });\n\n const getPendingPermissionRequests = Effect.gen(function* () {\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n return [...pendingRequests.values()];\n });\n\n return {\n createCanUseToolRelatedOptions,\n respondToPermissionRequest,\n cancelPendingRequests,\n getPendingPermissionRequests,\n };\n});\n\nexport type IClaudeCodePermissionService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodePermissionService extends Context.Tag(\"ClaudeCodePermissionService\")<\n ClaudeCodePermissionService,\n IClaudeCodePermissionService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PublicSessionProcess } from \"../../../../types/session-process.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../services/ClaudeCodeLifeCycleService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n\n const getSessionProcesses = () =>\n Effect.gen(function* () {\n const publicSessionProcesses = 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 sessionId: string;\n input: UserMessageInput;\n resume: boolean;\n ccOptions?: CCTurn.CCOptions;\n }) =>\n Effect.gen(function* () {\n const { projectId, sessionId, input, resume, ccOptions } = 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 as const,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.startSessionProcess({\n projectId,\n cwd: project.meta.projectPath,\n sessionId,\n resume,\n input,\n ccOptions,\n });\n\n return {\n status: 201 as const,\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId,\n sessionId: result.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 type { SDKMessage, SDKUserMessage } 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 type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport type { CcvOptionsService } from \"../../platform/services/CcvOptionsService.ts\";\nimport type { EnvService } from \"../../platform/services/EnvService.ts\";\nimport type { SessionMetaService } from \"../../session/services/SessionMetaService.ts\";\nimport {\n createMessageGenerator,\n type UserMessageInput,\n} from \"../functions/createMessageGenerator.ts\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport { CCVAskUserQuestionService } from \"./CCVAskUserQuestionService.ts\";\nimport { ClaudeCodePermissionService } from \"./ClaudeCodePermissionService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"./ClaudeCodeSessionProcessService.ts\";\n\nexport type MessageGenerator = () => AsyncGenerator<SDKUserMessage, void, unknown>;\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBusService = yield* EventBus;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const permissionService = yield* ClaudeCodePermissionService;\n const ccvAskUserQuestionService = yield* CCVAskUserQuestionService;\n\n const runtime = yield* Effect.runtime<\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor\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 } = yield* sessionProcessService.continueSessionProcess({\n sessionProcessId,\n turnDef: {\n type: \"continue\",\n sessionId: baseSessionId,\n baseSessionId: baseSessionId,\n turnId: ulid(),\n },\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 sessionId: string;\n resume: boolean;\n ccOptions?: CCTurn.CCOptions;\n }) => {\n const { projectId, cwd, input, sessionId, resume, ccOptions } = options;\n\n return Effect.gen(function* () {\n const {\n generateMessages,\n setNextMessage,\n setHooks: setMessageGeneratorHooks,\n } = createMessageGenerator();\n\n const turnDef: CCTurn.NewClaudeCodeTurnDef | CCTurn.ResumeClaudeCodeTurnDef = !resume\n ? {\n type: \"new\",\n turnId: ulid(),\n sessionId,\n ccOptions,\n }\n : {\n type: \"resume\",\n turnId: ulid(),\n sessionId,\n baseSessionId: sessionId,\n ccOptions,\n };\n\n const { sessionProcess, task } = yield* sessionProcessService.startSessionProcess({\n sessionDef: {\n projectId,\n cwd,\n abortController: new AbortController(),\n setNextMessage,\n sessionProcessId: ulid(),\n },\n turnDef,\n });\n\n setMessageGeneratorHooks({\n onNewUserMessageResolved: (input) => {\n Effect.runFork(\n sessionProcessService.updateRawUserMessage({\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 return yield* Effect.die(new Error(\"Illegal state: paused is not expected\"));\n }\n\n if (\n message.type === \"system\" &&\n message.subtype === \"init\" &&\n processState.type === \"starting\"\n ) {\n yield* sessionProcessService.toInitializedState({\n sessionProcessId: processState.def.sessionProcessId,\n initContext: {\n initMessage: message,\n },\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 (message.type === \"assistant\" && processState.type === \"initialized\") {\n yield* sessionProcessService.toFileCreatedState({\n sessionProcessId: processState.def.sessionProcessId,\n });\n }\n\n if (message.type === \"result\") {\n if (processState.type === \"file_created\" || processState.type === \"initialized\") {\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 await Runtime.runPromise(runtime)(\n Effect.logInfo(\n `[SessionProcessDaemon] Starting daemon for ${sessionProcess.def.sessionProcessId} (${task.def.type})`,\n ),\n );\n const messageIter = await Runtime.runPromise(runtime)(\n Effect.gen(function* () {\n const permissionOptions = yield* permissionService.createCanUseToolRelatedOptions({\n turnId: task.def.turnId,\n projectId: sessionProcess.def.projectId,\n permissionMode:\n task.def.type !== \"continue\" ? task.def.ccOptions?.permissionMode : undefined,\n sessionId: task.def.type === \"new\" ? task.def.sessionId : task.def.baseSessionId,\n });\n\n const ccvMcpServer = ccvAskUserQuestionService.createMcpServer({\n turnId: task.def.turnId,\n projectId: sessionProcess.def.projectId,\n sessionId: task.def.type === \"new\" ? task.def.sessionId : task.def.baseSessionId,\n });\n\n const baseOptions = {\n ...(task.def.type === \"continue\" ? {} : task.def.ccOptions),\n ...permissionOptions,\n cwd: sessionProcess.def.cwd,\n abortController: sessionProcess.def.abortController,\n mcpServers: {\n ccv: ccvMcpServer,\n },\n };\n\n const sdkOptions: Parameters<typeof ClaudeCode.query>[1] =\n task.def.type === \"new\"\n ? { ...baseOptions, sessionId: task.def.sessionId }\n : {\n ...baseOptions,\n resume: task.def.baseSessionId,\n };\n\n return yield* ClaudeCode.query(generateMessages(), sdkOptions);\n }),\n );\n\n setNextMessage(input);\n\n try {\n for await (const message of messageIter) {\n const result = await Runtime.runPromise(runtime)(handleMessage(message)).catch(\n (error: unknown) => {\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,\n },\n }),\n );\n\n return \"continue\" as const;\n },\n );\n\n if (result === \"break\") {\n break;\n } else {\n }\n }\n } catch (error) {\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(async (error: unknown) => {\n await Runtime.runPromise(runtime)(\n Effect.logError(`Error occur in task daemon process: ${String(error)}`),\n );\n throw error;\n })\n .finally(() => {\n Effect.runFork(\n Effect.gen(function* () {\n const currentProcess = 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 immediately with the known sessionId\n return {\n sessionProcess,\n task,\n daemonPromise,\n sessionId: turnDef.sessionId,\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 = yield* sessionProcessService.getSessionProcess(sessionProcessId);\n\n yield* permissionService.cancelPendingRequests(currentProcess.sessionId);\n yield* ccvAskUserQuestionService.cancelPendingRequests(currentProcess.sessionId);\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(\"ClaudeCodeLifeCycleService\")<\n ClaudeCodeLifeCycleService,\n IClaudeCodeLifeCycleService\n>() {\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 // oxlint-disable-next-line no-unsafe-type-assertion -- Partially initialized, fields set before return\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 type { SDKMessage, SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { DocumentBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise.ts\";\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<SDKUserMessage, void, unknown>;\n\nexport const createMessageGenerator = (): {\n generateMessages: MessageGenerator;\n setNextMessage: (input: UserMessageInput) => void;\n setHooks: (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (input: UserMessageInput) => void | Promise<void>;\n }) => void;\n} => {\n let sendMessagePromise = controllablePromise<UserMessageInput>();\n let registeredHooks: {\n onNextMessageSet: ((input: UserMessageInput) => void | Promise<void>)[];\n onNewUserMessageResolved: ((input: UserMessageInput) => 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 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 parent_tool_use_id: null,\n } satisfies SDKUserMessage;\n };\n\n const generateMessages = async function* (): 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(async (hook) => {\n await hook(message);\n }),\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(async (hook) => {\n await hook(input);\n }),\n );\n };\n\n const setHooks = (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (input: UserMessageInput) => void | Promise<void>;\n }) => {\n registeredHooks = {\n onNextMessageSet: [\n ...(hooks?.onNextMessageSet ? [hooks.onNextMessageSet] : []),\n ...registeredHooks.onNextMessageSet,\n ],\n onNewUserMessageResolved: [\n ...(hooks?.onNewUserMessageResolved ? [hooks.onNewUserMessageResolved] : []),\n ...registeredHooks.onNewUserMessageResolved,\n ],\n };\n };\n\n return {\n generateMessages,\n setNextMessage,\n setHooks,\n };\n};\n", "import type { UserMessageInput } from \"../functions/createMessageGenerator.ts\";\nimport type { InitMessageContext } from \"../types.ts\";\nimport type * as CCTurn from \"./ClaudeCodeTurn.ts\";\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 CCSessionProcessStartingState = CCSessionProcessStateBase & {\n type: \"starting\" /* SDK process started, waiting for init message */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n};\n\nexport type CCSessionProcessInitializedState = CCSessionProcessStateBase & {\n type: \"initialized\" /* init message received */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessFileCreatedState = CCSessionProcessStateBase & {\n type: \"file_created\" /* file has been created */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessPausedState = CCSessionProcessStateBase & {\n type: \"paused\" /* task completed, ready for next task */;\n sessionId: string;\n};\n\nexport type CCSessionProcessCompletedState = CCSessionProcessStateBase & {\n type: \"completed\" /* paused or running task was aborted. Cannot resume */;\n sessionId: string;\n};\n\nexport type CCSessionProcessStatePublic =\n | CCSessionProcessStartingState\n | CCSessionProcessInitializedState\n | CCSessionProcessFileCreatedState\n | CCSessionProcessPausedState;\n\nexport type CCSessionProcessState = CCSessionProcessStatePublic | CCSessionProcessCompletedState;\n\nexport const isPublic = (\n process: CCSessionProcessState,\n): process is CCSessionProcessStatePublic => {\n return (\n process.type === \"starting\" ||\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((task) => task.status === \"pending\" || task.status === \"running\");\n};\n", "import { Context, Data, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport type { InitMessageContext } from \"../types.ts\";\n\nclass SessionProcessNotFoundError extends Data.TaggedError(\"SessionProcessNotFoundError\")<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessNotPausedError extends Data.TaggedError(\"SessionProcessNotPausedError\")<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessAlreadyAliveError extends Data.TaggedError(\"SessionProcessAlreadyAliveError\")<{\n sessionProcessId: string;\n aliveTaskId: string;\n aliveTaskSessionId?: string;\n}> {}\n\nclass IllegalStateChangeError extends Data.TaggedError(\"IllegalStateChangeError\")<{\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<CCSessionProcess.CCSessionProcessState[]>([]);\n const eventBus = yield* EventBus;\n\n const emitSessionProcessChanged = (changed: CCSessionProcess.CCSessionProcessState) =>\n Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const publicProcesses = processes.filter(CCSessionProcess.isPublic).map((process) => ({\n id: process.def.sessionProcessId,\n projectId: process.def.projectId,\n sessionId: process.sessionId,\n status: process.type === \"paused\" ? (\"paused\" as const) : (\"running\" as const),\n }));\n\n yield* eventBus.emit(\"sessionProcessChanged\", {\n processes: publicProcesses,\n changed,\n });\n });\n\n const startSessionProcess = (options: {\n sessionDef: CCSessionProcess.CCSessionProcessDef;\n turnDef: CCTurn.NewClaudeCodeTurnDef | CCTurn.ResumeClaudeCodeTurnDef;\n }) => {\n const { sessionDef, turnDef } = options;\n\n return Effect.gen(function* () {\n const task: CCTurn.RunningClaudeCodeTurnState = {\n def: turnDef,\n status: \"running\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessStartingState = {\n def: sessionDef,\n type: \"starting\",\n sessionId: turnDef.sessionId,\n tasks: [task],\n currentTask: task,\n rawUserMessage: \"\", // Will be set when message is resolved\n };\n\n yield* Ref.update(processesRef, (processes) => [...processes, newProcess]);\n\n yield* emitSessionProcessChanged(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: firstAliveTask.def.sessionId,\n }),\n );\n }\n\n const newTask: CCTurn.RunningClaudeCodeTurnState = {\n def: options.turnDef,\n status: \"running\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessStartingState = {\n def: process.def,\n type: \"starting\",\n sessionId: process.sessionId,\n tasks: [...process.tasks, newTask],\n currentTask: newTask,\n rawUserMessage: \"\", // Will be set when message is resolved\n };\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) => (p.def.sessionProcessId === sessionProcessId ? newProcess : p));\n });\n\n yield* emitSessionProcessChanged(newProcess);\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((p) => p.def.sessionProcessId === sessionProcessId);\n if (result === undefined) {\n return yield* Effect.fail(new SessionProcessNotFoundError({ sessionProcessId }));\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((p) => p.def.sessionProcessId === sessionProcessId);\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.filter(CCSessionProcess.isPublic).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 yield* Effect.logDebug(\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) => (t.def.turnId === task.def.turnId ? { ...nextTask } : t)),\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- generic task type is narrowed by caller\n return updated.task as T;\n });\n };\n\n const updateRawUserMessage = (options: { sessionProcessId: string; rawUserMessage: string }) => {\n const { sessionProcessId, rawUserMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"starting\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"starting\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n ...currentProcess,\n rawUserMessage,\n },\n });\n\n return {\n sessionProcess: newProcess,\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 !== \"starting\") {\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: currentProcess.sessionId,\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: {\n session_id: string;\n };\n }) => {\n const { sessionProcessId, resultMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"file_created\" && currentProcess.type !== \"initialized\") {\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: { sessionProcessId: string; error?: unknown }) => {\n const { sessionProcessId, error } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n const currentTask =\n currentProcess.type === \"starting\" ||\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) => (t.def.turnId === newTask.def.turnId ? newTask : t))\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 updateRawUserMessage,\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(\"ClaudeCodeSessionProcessService\")<\n ClaudeCodeSessionProcessService,\n IClaudeCodeSessionProcessService\n>() {\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.ts\";\nimport { adaptInternalEventToSSE } from \"../functions/adaptInternalEventToSSE.ts\";\nimport { TypeSafeSSE } from \"../functions/typeSafeSSE.ts\";\nimport { EventBus } from \"../services/EventBus.ts\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration.ts\";\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 = (event: InternalEventDeclaration[\"sessionListChanged\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionListChanged\", {\n projectId: event.projectId,\n }),\n );\n };\n\n const onSessionChanged = (event: InternalEventDeclaration[\"sessionChanged\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionChanged\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onAgentSessionChanged = (event: InternalEventDeclaration[\"agentSessionChanged\"]) => {\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 = (event: InternalEventDeclaration[\"permissionRequested\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionRequested\", {\n sessionId: event.permissionRequest.sessionId,\n }),\n );\n };\n\n const onPermissionResolved = (event: InternalEventDeclaration[\"permissionResolved\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionResolved\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onQuestionRequested = (event: InternalEventDeclaration[\"questionRequested\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"questionRequested\", {\n sessionId: event.questionRequest.sessionId,\n }),\n );\n };\n\n const onQuestionResolved = (event: InternalEventDeclaration[\"questionResolved\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"questionResolved\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onNotificationCreated = (event: InternalEventDeclaration[\"notificationCreated\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"notificationCreated\", {\n notification: event.notification,\n }),\n );\n };\n\n const onNotificationConsumed = (event: InternalEventDeclaration[\"notificationConsumed\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"notificationConsumed\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onSchedulerJobsChanged = () => {\n Effect.runFork(typeSafeSSE.writeSSE(\"schedulerJobsChanged\", {}));\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(\"permissionResolved\", onPermissionResolved);\n yield* eventBus.on(\"questionRequested\", onQuestionRequested);\n yield* eventBus.on(\"questionResolved\", onQuestionResolved);\n yield* eventBus.on(\"notificationCreated\", onNotificationCreated);\n yield* eventBus.on(\"notificationConsumed\", onNotificationConsumed);\n yield* eventBus.on(\"schedulerJobsChanged\", onSchedulerJobsChanged);\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(\"sessionProcessChanged\", onSessionProcessChanged);\n yield* eventBus.off(\"heartbeat\", onHeartbeat);\n yield* eventBus.off(\"permissionRequested\", onPermissionRequested);\n yield* eventBus.off(\"permissionResolved\", onPermissionResolved);\n yield* eventBus.off(\"questionRequested\", onQuestionRequested);\n yield* eventBus.off(\"questionResolved\", onQuestionResolved);\n yield* eventBus.off(\"notificationCreated\", onNotificationCreated);\n yield* eventBus.off(\"notificationConsumed\", onNotificationConsumed);\n yield* eventBus.off(\"schedulerJobsChanged\", onSchedulerJobsChanged);\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\")<SSEController, ISSEController>() {\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 void 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.ts\";\n\ntype 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\")<TypeSafeSSE, TypeSafeSSEService>() {\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Fiber, Layer, Ref, Stream } from \"effect\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { encodeProjectIdFromSessionFilePath } from \"../../project/functions/id.ts\";\nimport { parseSessionFilePath } from \"../functions/parseSessionFilePath.ts\";\nimport { EventBus } from \"./EventBus.ts\";\n\ntype 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 fs = yield* FileSystem.FileSystem;\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 watcherFiberRef = yield* Ref.make<Fiber.RuntimeFiber<void, unknown> | null>(null);\n const debounceTimersRef = yield* Ref.make<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const clearDebounceTimer = (debounceKey: string) =>\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n const timer = timers.get(debounceKey);\n if (timer !== undefined) {\n clearTimeout(timer);\n timers.delete(debounceKey);\n yield* Ref.set(debounceTimersRef, timers);\n }\n });\n\n const scheduleDebouncedEmit = (\n debounceKey: string,\n payload:\n | { type: \"agent\"; projectId: string; agentSessionId: string }\n | { type: \"session\"; projectId: string; sessionId: string },\n ) =>\n Effect.gen(function* () {\n yield* clearDebounceTimer(debounceKey);\n\n const timers = yield* Ref.get(debounceTimersRef);\n const timer = setTimeout(() => {\n if (payload.type === \"agent\") {\n Effect.runFork(\n eventBus.emit(\"agentSessionChanged\", {\n projectId: payload.projectId,\n agentSessionId: payload.agentSessionId,\n }),\n );\n } else {\n Effect.runFork(\n eventBus.emit(\"sessionChanged\", {\n projectId: payload.projectId,\n sessionId: payload.sessionId,\n }),\n );\n Effect.runFork(\n eventBus.emit(\"sessionListChanged\", {\n projectId: payload.projectId,\n }),\n );\n }\n\n void Effect.runPromise(clearDebounceTimer(debounceKey));\n }, 100);\n\n timers.set(debounceKey, timer);\n yield* Ref.set(debounceTimersRef, timers);\n });\n\n const handleWatchEvent = (claudeProjectsDirPath: string, changedPath: string) =>\n Effect.gen(function* () {\n const relativePath = changedPath.startsWith(claudeProjectsDirPath)\n ? path.relative(claudeProjectsDirPath, changedPath)\n : changedPath;\n const parsed = parseSessionFilePath(relativePath);\n if (parsed === null) {\n return;\n }\n\n const fullPath = path.isAbsolute(changedPath)\n ? changedPath\n : path.join(claudeProjectsDirPath, changedPath);\n const encodedProjectId = encodeProjectIdFromSessionFilePath(fullPath);\n\n if (parsed.type === \"agent\") {\n const debounceKey = `${encodedProjectId}/agent-${parsed.agentSessionId}`;\n yield* scheduleDebouncedEmit(debounceKey, {\n type: \"agent\",\n projectId: encodedProjectId,\n agentSessionId: parsed.agentSessionId,\n });\n return;\n }\n\n const debounceKey = `${encodedProjectId}/${parsed.sessionId}`;\n yield* scheduleDebouncedEmit(debounceKey, {\n type: \"session\",\n projectId: encodedProjectId,\n sessionId: parsed.sessionId,\n });\n });\n\n const startWatching = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const isWatching = yield* Ref.get(isWatchingRef);\n if (isWatching) {\n return;\n }\n\n const claudeCodePaths = yield* context.claudeCodePaths;\n const claudeProjectsDirPath = claudeCodePaths.claudeProjectsDirPath;\n\n yield* Effect.logInfo(`Starting file watcher on: ${claudeProjectsDirPath}`);\n\n const watcherFiber = yield* fs.watch(claudeProjectsDirPath, { recursive: true }).pipe(\n Stream.runForEach((event) => handleWatchEvent(claudeProjectsDirPath, event.path)),\n Effect.forkDaemon,\n );\n\n yield* Ref.set(watcherFiberRef, watcherFiber);\n yield* Ref.set(isWatchingRef, true);\n yield* Effect.logInfo(\"File watcher initialization completed\");\n }).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Failed to start file watching: ${String(error)}`));\n return 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.values()) {\n clearTimeout(timer);\n }\n yield* Ref.set(debounceTimersRef, new Map());\n\n const watcherFiber = yield* Ref.get(watcherFiberRef);\n if (watcherFiber !== null) {\n yield* Fiber.interrupt(watcherFiber);\n yield* Ref.set(watcherFiberRef, null);\n }\n\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 = /(?<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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ClaudeCodeService } from \"../../claude-code/services/ClaudeCodeService.ts\";\nimport type { Flag } from \"../models/flag.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodeService = yield* ClaudeCodeService;\n\n const getFlags = () =>\n Effect.gen(function* () {\n const claudeCodeFeatures = 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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { getDirectoryListing } from \"../functions/getDirectoryListing.ts\";\nimport { getFileCompletion } from \"../functions/getFileCompletion.ts\";\nimport { getFileContentEffect } from \"../functions/getFileContent.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const fs = yield* FileSystem.FileSystem;\n const context = yield* ApplicationContext;\n const projectRepository = yield* ProjectRepository;\n\n const getFileCompletionRoute = (options: { projectId: string; basePath: string }) =>\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 const result = yield* Effect.either(\n getFileCompletion(projectPath, basePath).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\n ),\n );\n if (Either.isLeft(result)) {\n yield* Effect.logError(`File completion error: ${String(result.left)}`);\n return {\n response: { error: \"Failed to get file completion\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result.right,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getDirectoryListingRoute = (options: {\n currentPath?: string | undefined;\n showHidden?: boolean | undefined;\n }) =>\n Effect.gen(function* () {\n const { currentPath, showHidden = false } = options;\n const claudeCodePaths = yield* context.claudeCodePaths;\n\n const rootPath = path.dirname(claudeCodePaths.globalClaudeDirectoryPath);\n const defaultPath = rootPath;\n\n const targetPath = currentPath ?? defaultPath;\n const relativePath = targetPath.startsWith(rootPath)\n ? targetPath.slice(rootPath.length)\n : targetPath;\n const result = yield* Effect.either(\n getDirectoryListing(rootPath, relativePath, showHidden).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\n ),\n );\n\n if (Either.isLeft(result)) {\n yield* Effect.logError(`Directory listing error: ${String(result.left)}`);\n return {\n response: { error: \"Failed to list directory\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result.right,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getFileContentRoute = (options: { projectId: string; filePath: string }) =>\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: \"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* getFileContentEffect(projectPath, filePath).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\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 { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 = (\n rootPath: string,\n basePath = \"/\",\n showHidden = false,\n): Effect.Effect<\n DirectoryListingResult,\n Error | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const normalizedBasePath =\n basePath === \"/\" ? \"\" : basePath.startsWith(\"/\") ? basePath.slice(1) : basePath;\n const resolvedRootPath = path.resolve(rootPath);\n const targetPath = path.resolve(rootPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolvedRootPath)) {\n return yield* Effect.fail(new Error(\"Invalid path: outside root directory\"));\n }\n\n const exists = yield* fs.exists(targetPath);\n if (!exists) {\n return {\n entries: [],\n basePath: \"/\",\n currentPath: rootPath,\n };\n }\n\n const filenames = yield* fs.readDirectory(targetPath).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Error reading directory: ${String(error)}`));\n return Effect.succeed([] as string[]);\n }),\n );\n\n const entries: DirectoryEntry[] = [];\n\n if (normalizedBasePath !== \"\") {\n const parentPath = path.dirname(normalizedBasePath);\n entries.push({\n name: \"..\",\n type: \"directory\",\n path: parentPath === \".\" ? \"\" : parentPath,\n });\n }\n\n for (const filename of filenames) {\n if (!showHidden && filename.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = path.join(targetPath, filename);\n const fileInfo = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (fileInfo === null) {\n continue;\n }\n\n const entryPath = normalizedBasePath ? path.join(normalizedBasePath, filename) : filename;\n\n if (fileInfo.type === \"Directory\") {\n entries.push({\n name: filename,\n type: \"directory\",\n path: entryPath,\n });\n } else if (fileInfo.type === \"File\") {\n entries.push({\n name: filename,\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 });\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 = (\n projectPath: string,\n basePath = \"/\",\n): Effect.Effect<FileCompletionResult, Error | PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const normalizedBasePath = basePath.startsWith(\"/\") ? basePath.slice(1) : basePath;\n const resolvedProjectPath = path.resolve(projectPath);\n const targetPath = path.resolve(projectPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolvedProjectPath)) {\n return yield* Effect.fail(new Error(\"Invalid path: outside project directory\"));\n }\n\n const exists = yield* fs.exists(targetPath);\n if (!exists) {\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n\n const filenames = yield* fs.readDirectory(targetPath).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Error reading directory: ${String(error)}`));\n return Effect.succeed([] as string[]);\n }),\n );\n\n const entries: FileCompletionEntry[] = [];\n\n for (const filename of filenames) {\n if (filename.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = path.join(targetPath, filename);\n const fileInfo = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (fileInfo === null) {\n continue;\n }\n\n const entryPath =\n normalizedBasePath === \"\" ? filename : path.join(normalizedBasePath, filename);\n\n if (fileInfo.type === \"Directory\") {\n entries.push({\n name: filename,\n type: \"directory\",\n path: entryPath,\n });\n } else if (fileInfo.type === \"File\") {\n entries.push({\n name: filename,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\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 });\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 extensionIndex = filePath.lastIndexOf(\".\");\n const ext = extensionIndex === -1 ? \"\" : filePath.slice(extensionIndex + 1).toLowerCase();\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 extensionIndex = filePath.lastIndexOf(\".\");\n const ext = extensionIndex === -1 ? \"\" : filePath.slice(extensionIndex + 1).toLowerCase();\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: Uint8Array): 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 path: Path.Path,\n projectRoot: string,\n filePath: string,\n): { valid: true; resolvedPath: string } | { 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 = path.resolve(projectRoot);\n let resolvedPath: string;\n\n // Handle absolute paths\n if (filePath.startsWith(\"/\")) {\n resolvedPath = path.normalize(filePath);\n } else {\n // Handle relative paths\n const normalizedPath = path.normalize(filePath);\n resolvedPath = path.resolve(projectRoot, normalizedPath);\n }\n\n // Ensure the resolved path is within the project root\n if (!resolvedPath.startsWith(`${resolvedRoot}/`) && resolvedPath !== resolvedRoot) {\n return { valid: false, message: \"Path is outside the project root\" };\n }\n\n return { valid: true, resolvedPath };\n};\n\nexport const getFileContentEffect = (\n projectRoot: string,\n filePath: string,\n options: GetFileContentOptions = {},\n): Effect.Effect<FileContentResult, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const { maxFileSize = DEFAULT_MAX_FILE_SIZE } = options;\n\n const validation = validateFilePath(path, 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 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 const readFileResult = yield* Effect.either(fs.readFile(resolvedPath));\n if (readFileResult._tag === \"Left\") {\n const error = readFileResult.left;\n if (error._tag === \"SystemError\") {\n if (error.reason === \"NotFound\" || error.reason === \"BadResource\") {\n return {\n success: false,\n error: \"NOT_FOUND\",\n message: \"File not found\",\n filePath,\n };\n }\n }\n\n return {\n success: false,\n error: \"READ_ERROR\",\n message: error.message,\n filePath,\n };\n }\n\n const buffer = readFileResult.right;\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 const truncated = buffer.length > maxFileSize;\n const contentBuffer = truncated ? buffer.subarray(0, maxFileSize) : buffer;\n const content = new TextDecoder(\"utf-8\").decode(contentBuffer);\n const language = detectLanguage(filePath);\n\n return {\n success: true,\n content,\n filePath,\n truncated,\n language,\n };\n });\n", "import { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { PushErrorCode } from \"../schema.ts\";\nimport { GitService } from \"../services/GitService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const gitService = yield* GitService;\n const projectRepository = yield* ProjectRepository;\n\n const getGitDiff = (options: { projectId: string; fromRef: string; toRef: string }) =>\n Effect.gen(function* () {\n const { projectId, fromRef, toRef } = 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 const diffResult = yield* Effect.either(gitService.getDiff(projectPath, fromRef, toRef));\n\n if (Either.isLeft(diffResult)) {\n return {\n response: {\n success: false,\n error: parseDiffError(diffResult.left),\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: {\n success: true,\n data: diffResult.right,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const commitFiles = (options: { projectId: string; files: string[]; message: string }) =>\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 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 const stageResult = yield* Effect.either(gitService.stageFiles(projectPath, files));\n if (Either.isLeft(stageResult)) {\n return {\n response: {\n success: false,\n error: \"Failed to stage files\",\n errorCode: \"GIT_COMMAND_ERROR\",\n details: stageResult.left.message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const commitResult = yield* Effect.either(gitService.commit(projectPath, message));\n if (Either.isLeft(commitResult)) {\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 ? \"HOOK_FAILED\" : \"GIT_COMMAND_ERROR\",\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\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 const { project } = yield* projectRepository.getProject(projectId);\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 const pushResult = yield* Effect.either(gitService.push(projectPath));\n\n if (Either.isLeft(pushResult)) {\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 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: { projectId: string; files: string[]; message: string }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n // First, commit\n const commitResult = yield* commitFiles({ projectId, files, message });\n\n if (commitResult.status !== 200 || !commitResult.response.success) {\n return commitResult; // Return commit error\n }\n\n const commitSha = commitResult.response.commitSha;\n\n // Then, push\n const pushResult = yield* pushCommits({ projectId });\n\n if (pushResult.status !== 200 || !pushResult.response.success) {\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 // 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(gitService.getCurrentBranch(projectPath));\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(gitService.getBranches(projectPath));\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((branch) => branch.name === currentBranch);\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((branch) => branch.name === baseBranchName);\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(projectPath, baseBranchHash, \"HEAD\"),\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(gitService.getBranches(projectPath));\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(gitService.getCurrentBranch(projectPath));\n\n const currentBranch = Either.isRight(currentBranchResult) ? currentBranchResult.right : 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(gitService.checkout(projectPath, branchName));\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\nconst parsePushError = (stderr: string): PushErrorCode => {\n if (stderr.includes(\"no upstream\") || stderr.includes(\"has no upstream\")) {\n return \"NO_UPSTREAM\";\n }\n if (stderr.includes(\"non-fast-forward\") || stderr.includes(\"failed to push some refs\")) {\n return \"NON_FAST_FORWARD\";\n }\n if (stderr.includes(\"Authentication failed\") || stderr.includes(\"Permission denied\")) {\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\nconst getPushErrorMessage = (code: PushErrorCode): string => {\n const messages: Record<PushErrorCode, string> = {\n NO_UPSTREAM: \"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: \"Authentication failed. Check your SSH keys or HTTPS credentials.\",\n NETWORK_ERROR: \"Network error. Check your internet connection.\",\n TIMEOUT: \"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\nconst parseDiffError = (error: unknown) => {\n if (typeof error === \"object\" && error !== null && \"_tag\" in error) {\n const tag = String(error._tag);\n\n if (tag === \"NotARepositoryError\") {\n const message =\n \"cwd\" in error && typeof error.cwd === \"string\"\n ? `Not a git repository: ${error.cwd}`\n : \"Not a git repository\";\n return {\n code: \"NOT_A_REPOSITORY\" as const,\n message,\n };\n }\n\n if (tag === \"GitInvalidRefError\" || tag === \"GitInvalidDiffRefError\") {\n return {\n code: \"BRANCH_NOT_FOUND\" as const,\n message: \"Branch or commit not found\",\n };\n }\n\n if (tag === \"GitDiffParseError\") {\n const message =\n \"reason\" in error && typeof error.reason === \"string\"\n ? `Failed to parse diff: ${error.reason}`\n : \"Failed to parse diff\";\n return {\n code: \"PARSE_ERROR\" as const,\n message,\n };\n }\n\n if (tag === \"GitCommandError\") {\n return {\n code: \"COMMAND_FAILED\" as const,\n message: \"Git command failed\",\n command:\n \"command\" in error && typeof error.command === \"string\" ? error.command : undefined,\n };\n }\n }\n\n return {\n code: \"COMMAND_FAILED\" as const,\n message: \"Git command failed\",\n };\n};\n\nexport type IGitController = InferEffect<typeof LayerImpl>;\nexport class GitController extends Context.Tag(\"GitController\")<GitController, IGitController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Command, FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Duration, Effect, Either, Layer } from \"effect\";\nimport parseGitDiff, { type AnyChunk, type AnyFileChange } from \"parse-git-diff\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EnvService } from \"../../platform/services/EnvService.ts\";\nimport { parseGitBranchesOutput } from \"../functions/parseGitBranchesOutput.ts\";\nimport { parseGitCommitsOutput } from \"../functions/parseGitCommitsOutput.ts\";\nimport { parseLines, stripAnsiColors } from \"../functions/text.ts\";\nimport type {\n GitComparisonResult,\n GitDiff,\n GitDiffFile,\n GitDiffHunk,\n GitDiffLine,\n} from \"../types.ts\";\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\nclass GitInvalidRefError extends Data.TaggedError(\"GitInvalidRefError\")<{\n ref: string;\n}> {}\n\nclass GitInvalidDiffRefError extends Data.TaggedError(\"GitInvalidDiffRefError\")<{\n refText: string;\n}> {}\n\nclass GitDiffParseError extends Data.TaggedError(\"GitDiffParseError\")<{\n reason: string;\n}> {}\n\n/** Validates that a git ref (branch name, hash, etc.) is safe to pass as a command argument */\nconst isValidGitRef = (ref: string): boolean =>\n ref.length > 0 && !ref.startsWith(\"-\") && !ref.includes(\"\\0\");\n\nconst validateGitRef = (ref: string) =>\n isValidGitRef(ref) ? Effect.void : Effect.fail(new GitInvalidRefError({ ref }));\n\nconst extractDiffRef = (refText: string) =>\n Effect.gen(function* () {\n const [group, ref] = refText.split(\":\");\n\n if (group !== undefined && ref !== undefined) {\n return ref;\n }\n\n if (refText === \"HEAD\") {\n return \"HEAD\";\n }\n\n if (refText === \"working\") {\n return undefined;\n }\n\n return yield* Effect.fail(new GitInvalidDiffRefError({ refText }));\n });\n\nconst 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 filePath = \"\";\n status = \"modified\";\n }\n\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\nconst convertToGitDiffHunk = (chunk: AnyChunk): GitDiffHunk => {\n if (chunk.type !== \"Chunk\") {\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 line = {\n type: \"context\",\n content: change.content,\n };\n break;\n default:\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 !== undefined && chunk.context !== \"\" ? ` ${chunk.context}` : \"\"}`,\n lines,\n };\n};\n\nconst parseFallbackDiffFiles = (\n diffOutput: string,\n fileStats: Map<string, { additions: number; deletions: number }>,\n): GitDiffFile[] => {\n const sections = diffOutput\n .split(/^diff --git /m)\n .map((section) => section.trim())\n .filter((section) => section !== \"\");\n\n return sections.flatMap((section) => {\n const lines = section.split(\"\\n\");\n const header = lines[0];\n if (header === undefined) {\n return [];\n }\n\n const headerMatch = header.match(/^a\\/(.+?) b\\/(.+)$/);\n if (!headerMatch) {\n return [];\n }\n\n const oldPathFromHeader = headerMatch[1];\n const newPathFromHeader = headerMatch[2];\n if (oldPathFromHeader === undefined || newPathFromHeader === undefined) {\n return [];\n }\n\n const renameFromLine = lines.find((line) => line.startsWith(\"rename from \"));\n const renameToLine = lines.find((line) => line.startsWith(\"rename to \"));\n const deleted = lines.some((line) => line.startsWith(\"deleted file mode\"));\n const added = lines.some((line) => line.startsWith(\"new file mode\"));\n\n const oldPath =\n renameFromLine !== undefined ? renameFromLine.replace(\"rename from \", \"\") : oldPathFromHeader;\n const filePath =\n renameToLine !== undefined ? renameToLine.replace(\"rename to \", \"\") : newPathFromHeader;\n\n const status: GitDiffFile[\"status\"] = deleted\n ? \"deleted\"\n : renameFromLine !== undefined && renameToLine !== undefined\n ? \"renamed\"\n : added\n ? \"added\"\n : \"modified\";\n\n const stats = fileStats.get(filePath) ??\n fileStats.get(oldPath) ?? { additions: 0, deletions: 0 };\n\n return [\n {\n filePath,\n status,\n additions: stats.additions,\n deletions: stats.deletions,\n ...(status === \"renamed\" ? { oldPath } : {}),\n },\n ];\n });\n};\n\nconst createUntrackedFileDiff = (filePath: string, content: string): GitDiff => {\n const lines = content.split(\"\\n\");\n\n const diffLines: GitDiffLine[] = lines.map((line, index) => ({\n type: \"added\",\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};\n\nconst createEmptyComparisonResult = (): GitComparisonResult => {\n return {\n diffs: [],\n files: [],\n summary: {\n totalFiles: 0,\n totalAdditions: 0,\n totalDeletions: 0,\n },\n };\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(new NotARepositoryError({ cwd: absoluteCwd }));\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([\"branch\", \"--show-current\"], cwd).pipe(\n Effect.map((result) => result.trim()),\n );\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 yield* validateGitRef(branchName);\n const result = yield* Effect.either(execGitCommand([\"branch\", \"--exists\", branchName], cwd));\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 [\"log\", \"--oneline\", \"-n\", \"20\", \"--format=%H|%s|%an|%ad\", \"--date=iso\"],\n cwd,\n );\n return parseGitCommitsOutput(result);\n });\n\n const getUntrackedFiles = (cwd: string) =>\n Effect.gen(function* () {\n const statusOutput = yield* execGitCommand(\n [\"status\", \"--untracked-files=all\", \"--short\"],\n cwd,\n );\n return parseLines(statusOutput)\n .map((line) => stripAnsiColors(line))\n .filter((line) => line.startsWith(\"??\"))\n .map((line) => line.slice(3));\n });\n\n const getDiff = (cwd: string, fromRefText: string, toRefText: string) =>\n Effect.gen(function* () {\n const fromRef = yield* extractDiffRef(fromRefText);\n const toRef = yield* extractDiffRef(toRefText);\n\n if (fromRef === toRef) {\n return createEmptyComparisonResult();\n }\n\n if (fromRef === undefined) {\n return yield* Effect.fail(new GitInvalidDiffRefError({ refText: fromRefText }));\n }\n\n yield* validateGitRef(fromRef);\n if (toRef !== undefined) {\n yield* validateGitRef(toRef);\n }\n\n const commandArgs = toRef === undefined ? [fromRef] : [fromRef, toRef];\n\n const numstatOutput = yield* execGitCommand([\"diff\", \"--numstat\", ...commandArgs, \"--\"], cwd);\n const diffOutput = yield* execGitCommand([\"diff\", \"--unified=5\", ...commandArgs, \"--\"], cwd);\n\n try {\n const fileStats = new Map<string, { additions: number; deletions: number }>();\n const numstatLines = parseLines(numstatOutput);\n\n for (const line of numstatLines) {\n const parts = line.split(\"\\t\");\n if (\n parts.length >= 3 &&\n parts[0] !== undefined &&\n parts[0] !== \"\" &&\n parts[1] !== undefined &&\n parts[1] !== \"\" &&\n parts[2] !== undefined &&\n parts[2] !== \"\"\n ) {\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 const parsedDiff = parseGitDiff(diffOutput);\n const fallbackFiles = parseFallbackDiffFiles(diffOutput, fileStats);\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 const file = convertToGitDiffFile(fileChange, fileStats);\n files.push(file);\n\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 for (const fallbackFile of fallbackFiles) {\n const alreadyIncluded = files.some(\n (file) =>\n file.filePath === fallbackFile.filePath && file.oldPath === fallbackFile.oldPath,\n );\n if (alreadyIncluded) {\n continue;\n }\n\n files.push(fallbackFile);\n diffs.push({\n file: fallbackFile,\n hunks: [],\n });\n totalAdditions += fallbackFile.additions;\n totalDeletions += fallbackFile.deletions;\n }\n\n if (toRef === undefined) {\n const untrackedFiles = yield* getUntrackedFiles(cwd);\n\n for (const untrackedFile of untrackedFiles) {\n const fullPath = path.resolve(cwd, untrackedFile);\n const fileContentResult = yield* Effect.either(fs.readFileString(fullPath));\n\n if (Either.isLeft(fileContentResult)) {\n continue;\n }\n\n const untrackedDiff = createUntrackedFileDiff(untrackedFile, fileContentResult.right);\n files.push(untrackedDiff.file);\n diffs.push(untrackedDiff);\n totalAdditions += untrackedDiff.file.additions;\n }\n }\n\n return {\n files,\n diffs,\n summary: {\n totalFiles: files.length,\n totalAdditions,\n totalDeletions,\n },\n };\n } catch (error) {\n return yield* Effect.fail(\n new GitDiffParseError({\n reason: error instanceof Error ? error.message : \"Unknown error\",\n }),\n );\n }\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 const result = yield* execGitCommand([\"commit\", \"-m\", trimmedMessage], cwd);\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 yield* Effect.logDebug(`[GitService.commit] SHA match: ${shaMatch?.[1] ?? \"none\"}`);\n if (shaMatch?.[1] !== undefined && shaMatch[1] !== \"\") {\n return shaMatch[1];\n }\n\n // Fallback: Get SHA from git log\n yield* Effect.logDebug(\"[GitService.commit] Falling back to rev-parse HEAD\");\n const sha = yield* execGitCommand([\"rev-parse\", \"HEAD\"], cwd);\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 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\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\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git push origin HEAD - ${stderr}`,\n }),\n );\n }\n\n return { branch, output: \"success\" };\n });\n\n const getBranchHash = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(branchName);\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 yield* validateGitRef(hash);\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 = (cwd: string, targetHash: string, compareHash: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(targetHash);\n yield* validateGitRef(compareHash);\n const aheadResult = yield* execGitCommand([\"rev-list\", `${targetHash}..${compareHash}`], cwd);\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 = (cwd: string, options: { offset: number; limit: number }) =>\n Effect.gen(function* () {\n const { offset, limit } = options;\n const result = yield* execGitCommand(\n [\"log\", \"-n\", String(limit), \"--skip\", String(offset), \"--graph\", \"--pretty=format:%h %p\"],\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 (\n match?.groups?.current !== undefined &&\n match.groups.current !== \"\" &&\n match.groups.parent !== undefined &&\n match.groups.parent !== \"\"\n ) {\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(cwd, commit.current);\n\n if (!branchNames.includes(targetBranch)) {\n continue;\n }\n\n const otherBranchNames = branchNames.filter((branchName) => branchName !== targetBranch);\n\n if (otherBranchNames.length === 0) {\n continue;\n }\n\n for (const branchName of otherBranchNames) {\n const comparison = yield* compareCommitHash(cwd, targetBranch, branchName);\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 = (cwd: string, baseBranch: string, targetBranch: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(baseBranch);\n yield* validateGitRef(targetBranch);\n const result = yield* execGitCommand(\n [\"log\", `${baseBranch}..${targetBranch}`, \"--format=%H|%s|%an|%ad\", \"--date=iso\"],\n cwd,\n );\n\n return parseGitCommitsOutput(result);\n });\n\n const checkout = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(branchName);\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 getDiff,\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\")<GitService, IGitService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export const parseLines = (output: string): string[] => {\n return output\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n};\n\nexport const stripAnsiColors = (text: string): string => {\n // ANSI escape sequence pattern: \\x1B[...m\n // biome-ignore lint/suspicious/noControlCharactersInRegex: this is a valid regex\n // oxlint-disable-next-line no-control-regex -- intentional ANSI escape sequence matching\n return text.replace(/\\x1B\\[[0-9;]*m/g, \"\");\n};\n", "import type { GitBranch } from \"../types.ts\";\nimport { parseLines } from \"./text.ts\";\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(/^(\\*?\\s*)([^\\s]+)\\s+([a-f0-9]+)(?:\\s+\\[([^\\]]+)\\])?\\s*(.*)/);\n if (!match) continue;\n\n const [, prefix, name, commit, tracking] = match;\n if (prefix === undefined || name === undefined || commit === undefined) 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 !== undefined && tracking !== \"\") {\n const remoteMatch = tracking.match(/^([^:]+)/);\n if (remoteMatch?.[1] !== undefined && 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] !== undefined && aheadMatch[1] !== \"\")\n ahead = parseInt(aheadMatch[1], 10);\n if (behindMatch?.[1] !== undefined && behindMatch[1] !== \"\")\n 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 type { GitCommit } from \"../types.ts\";\nimport { parseLines } from \"./text.ts\";\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 = parts[0];\n const date = parts.at(-1);\n const author = parts.at(-2);\n const messageParts = parts.slice(1, -2);\n const message = messageParts.join(\"|\");\n if (sha === undefined || message === undefined || author === undefined || date === undefined)\n continue;\n if (sha.trim() === \"\" || message.trim() === \"\" || author.trim() === \"\" || date.trim() === \"\") {\n continue;\n }\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 { Context, Effect, Layer } from \"effect\";\nimport type { SessionNotificationType } from \"../../../../types/notification.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { NotificationService } from \"../services/NotificationService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const notificationService = yield* NotificationService;\n\n const getNotifications = () =>\n Effect.gen(function* () {\n const notifications = yield* notificationService.getNotifications();\n\n return {\n response: { notifications },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const consumeNotifications = (params: { sessionId: string; types?: SessionNotificationType[] }) =>\n Effect.gen(function* () {\n yield* notificationService.consumeNotifications(params.sessionId, {\n types: params.types,\n });\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getVapidPublicKey = () =>\n Effect.gen(function* () {\n const publicKey = yield* notificationService.getVapidPublicKey();\n\n return {\n response: { publicKey },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const subscribePush = (params: {\n subscription: {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n };\n }) =>\n Effect.gen(function* () {\n yield* notificationService.subscribePush(params.subscription);\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getNotifications,\n consumeNotifications,\n getVapidPublicKey,\n subscribePush,\n } as const;\n});\n\nexport type INotificationController = InferEffect<typeof LayerImpl>;\n\nexport class NotificationController extends Context.Tag(\"NotificationController\")<\n NotificationController,\n INotificationController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport webpush from \"web-push\";\nimport { z } from \"zod\";\nimport type {\n SessionNotification,\n SessionNotificationType,\n} from \"../../../../types/notification.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { formatPushError, shouldDropSubscriptionForPushError } from \"./pushError.ts\";\n\ntype PushSubscriptionRecord = {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n};\n\nconst vapidKeysSchema = z.object({\n publicKey: z.string(),\n privateKey: z.string(),\n});\n\ntype VapidKeys = z.infer<typeof vapidKeysSchema>;\n\nconst VAPID_KEYS_FILENAME = \".claude-code-viewer/vapid-keys.json\";\nconst DEFAULT_VAPID_SUBJECT = \"mailto:noreply@example.com\";\n\nconst getVapidKeysPath = (fs: FileSystem.FileSystem) =>\n Effect.gen(function* () {\n // biome-ignore lint/style/noProcessEnv: required for home directory\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"/tmp\";\n const dirPath = `${home}/.claude-code-viewer`;\n\n const dirExists = yield* fs.exists(dirPath);\n if (!dirExists) {\n yield* fs.makeDirectory(dirPath, { recursive: true });\n }\n\n return `${home}/${VAPID_KEYS_FILENAME}`;\n });\n\nconst loadOrCreateVapidKeys = (fs: FileSystem.FileSystem) =>\n Effect.gen(function* () {\n const keysPath = yield* getVapidKeysPath(fs);\n const exists = yield* fs.exists(keysPath);\n\n if (exists) {\n const content = yield* fs.readFileString(keysPath);\n return vapidKeysSchema.parse(JSON.parse(content));\n }\n\n const keys = webpush.generateVAPIDKeys();\n const vapidKeys: VapidKeys = {\n publicKey: keys.publicKey,\n privateKey: keys.privateKey,\n };\n\n yield* fs.writeFileString(keysPath, JSON.stringify(vapidKeys, null, 2));\n\n return vapidKeys;\n });\n\nconst LayerImpl = Effect.gen(function* () {\n const notificationsRef = yield* Ref.make<SessionNotification[]>([]);\n const pushSubscriptionsRef = yield* Ref.make<PushSubscriptionRecord[]>([]);\n const eventBus = yield* EventBus;\n const fs = yield* FileSystem.FileSystem;\n\n // Load or generate VAPID keys\n const vapidKeys = yield* loadOrCreateVapidKeys(fs).pipe(\n Effect.catchAll((error) => {\n return Effect.gen(function* () {\n yield* Effect.logWarning(\n `Failed to load VAPID keys, generating in-memory: ${String(error)}`,\n );\n const keys = webpush.generateVAPIDKeys();\n return {\n publicKey: keys.publicKey,\n privateKey: keys.privateKey,\n };\n });\n }),\n );\n webpush.setVapidDetails(DEFAULT_VAPID_SUBJECT, vapidKeys.publicKey, vapidKeys.privateKey);\n\n // Subscribe to session process state changes to auto-create notifications\n yield* eventBus.on(\"sessionProcessChanged\", (event) => {\n const { changed } = event;\n\n if (changed.type === \"paused\" || changed.type === \"completed\") {\n const notificationType: SessionNotificationType =\n changed.type === \"paused\" ? \"session_paused\" : \"session_completed\";\n\n Effect.runFork(\n createNotification({\n projectId: changed.def.projectId,\n sessionId: changed.sessionId,\n type: notificationType,\n }),\n );\n }\n });\n\n // Subscribe to permission requests\n yield* eventBus.on(\"permissionRequested\", (event) => {\n Effect.runFork(\n createNotification({\n projectId: event.permissionRequest.projectId,\n sessionId: event.permissionRequest.sessionId,\n type: \"permission_requested\",\n }),\n );\n });\n\n // Subscribe to question requests\n yield* eventBus.on(\"questionRequested\", (event) => {\n Effect.runFork(\n createNotification({\n projectId: event.questionRequest.projectId,\n sessionId: event.questionRequest.sessionId,\n type: \"question_asked\",\n }),\n );\n });\n\n const getNotifications = (): Effect.Effect<SessionNotification[]> => Ref.get(notificationsRef);\n\n const createNotification = (params: {\n projectId: string;\n sessionId: string;\n type: SessionNotificationType;\n }): Effect.Effect<SessionNotification> =>\n Effect.gen(function* () {\n const notification: SessionNotification = {\n id: ulid(),\n projectId: params.projectId,\n sessionId: params.sessionId,\n type: params.type,\n createdAt: new Date().toISOString(),\n };\n\n yield* Ref.update(notificationsRef, (notifications) => [...notifications, notification]);\n\n yield* eventBus.emit(\"notificationCreated\", { notification });\n\n // Send push notifications to all subscribed clients\n yield* sendPushNotifications(notification);\n\n return notification;\n });\n\n const consumeNotifications = (\n sessionId: string,\n options?: { types?: SessionNotificationType[] },\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const notifications = yield* Ref.get(notificationsRef);\n const types = options?.types;\n\n const shouldConsume = (n: SessionNotification) =>\n n.sessionId === sessionId && (types === undefined || types.includes(n.type));\n\n const hasMatch = notifications.some(shouldConsume);\n\n if (!hasMatch) {\n return;\n }\n\n yield* Ref.update(notificationsRef, (notifications) =>\n notifications.filter((n) => !shouldConsume(n)),\n );\n\n yield* eventBus.emit(\"notificationConsumed\", { sessionId });\n });\n\n const getVapidPublicKey = (): Effect.Effect<string> => Effect.succeed(vapidKeys.publicKey);\n\n const subscribePush = (subscription: PushSubscriptionRecord): Effect.Effect<void> =>\n Ref.update(pushSubscriptionsRef, (subscriptions) => {\n // Avoid duplicates by endpoint\n const filtered = subscriptions.filter((s) => s.endpoint !== subscription.endpoint);\n return [...filtered, subscription];\n });\n\n const sendPushNotifications = (notification: SessionNotification): Effect.Effect<void> =>\n Effect.gen(function* () {\n const subscriptions = yield* Ref.get(pushSubscriptionsRef);\n if (subscriptions.length === 0) return;\n\n const titleMap: Record<SessionNotificationType, string> = {\n session_paused: \"Session Paused\",\n session_completed: \"Session Completed\",\n permission_requested: \"Permission Required\",\n question_asked: \"Question from Claude\",\n };\n const title = titleMap[notification.type];\n\n const body = `Session ${notification.sessionId.slice(0, 8)}...`;\n const url = `/projects/${notification.projectId}/session?sessionId=${notification.sessionId}`;\n\n const payload = JSON.stringify({ title, body, url });\n\n // Send to all subscriptions, remove invalid ones\n const invalidEndpoints: string[] = [];\n\n yield* Effect.forEach(\n subscriptions,\n (sub) =>\n Effect.tryPromise({\n try: () =>\n webpush.sendNotification(\n {\n endpoint: sub.endpoint,\n keys: sub.keys,\n },\n payload,\n ),\n catch: (error) => {\n return error;\n },\n }).pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logWarning(\n `WebPush send failed for endpoint ${sub.endpoint}: ${formatPushError(error)}`,\n );\n if (shouldDropSubscriptionForPushError(error)) {\n invalidEndpoints.push(sub.endpoint);\n }\n }),\n ),\n ),\n { concurrency: \"unbounded\" },\n );\n\n // Clean up invalid subscriptions\n if (invalidEndpoints.length > 0) {\n yield* Ref.update(pushSubscriptionsRef, (subs) =>\n subs.filter((s) => !invalidEndpoints.includes(s.endpoint)),\n );\n }\n });\n\n return {\n getNotifications,\n createNotification,\n consumeNotifications,\n getVapidPublicKey,\n subscribePush,\n } as const;\n});\n\nexport type INotificationService = InferEffect<typeof LayerImpl>;\n\nexport class NotificationService extends Context.Tag(\"NotificationService\")<\n NotificationService,\n INotificationService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "type PushErrorDetails = {\n statusCode: number | undefined;\n body: string | undefined;\n message: string | undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst getString = (value: unknown): string | undefined => {\n if (typeof value === \"string\") return value;\n return undefined;\n};\n\nconst getNumber = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n return undefined;\n};\n\nconst extractPushErrorDetails = (error: unknown): PushErrorDetails => {\n if (!isRecord(error)) {\n return {\n statusCode: undefined,\n body: undefined,\n message: getString(error),\n };\n }\n\n return {\n statusCode: getNumber(error.statusCode),\n body: getString(error.body),\n message: getString(error.message),\n };\n};\n\nexport const shouldDropSubscriptionForPushError = (error: unknown): boolean => {\n const { statusCode } = extractPushErrorDetails(error);\n return statusCode === 404 || statusCode === 410;\n};\n\nexport const formatPushError = (error: unknown): string => {\n const details = extractPushErrorDetails(error);\n\n if (details.statusCode !== undefined || details.body !== undefined) {\n const status = details.statusCode ?? \"unknown\";\n const body = details.body ?? \"empty\";\n return `status=${status}, body=${body}`;\n }\n\n return `message=${details.message ?? \"unknown\"}`;\n};\n", "export const isDevelopmentEnv = (ccvEnv: string | undefined): boolean => ccvEnv === \"development\";\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { computeClaudeProjectFilePath } from \"../../claude-code/functions/computeClaudeProjectFilePath.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService.ts\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository.ts\";\nimport { encodeProjectId } from \"../functions/id.ts\";\nimport { ProjectRepository } from \"../infrastructure/ProjectRepository.ts\";\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 !== undefined) {\n // Keep the session with the latest modification date\n if (session.lastModifiedAt > existingSession.lastModifiedAt) {\n sessionMap.set(title, session);\n }\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).claudeProjectsDirPath,\n });\n const projectId = encodeProjectId(claudeProjectFilePath);\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 sessionId: crypto.randomUUID(),\n resume: false,\n input: {\n text: claudeMdExists ? \"describe this project\" : \"/init\",\n },\n });\n\n const { sessionId } = result;\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(claudeProjectsDirPath, projectPath.replace(/\\/$/, \"\").replace(/\\//g, \"-\"));\n });\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport { DEFAULT_LOCALE } from \"../../../../lib/i18n/localeDetection.ts\";\nimport type { UserConfig } from \"../../../lib/config/config.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\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 locale: DEFAULT_LOCALE,\n theme: \"system\",\n searchHotkey: \"command-k\",\n findHotkey: \"command-f\",\n autoScheduleContinueOnRateLimit: false,\n modelChoices: [\"default\", \"haiku\", \"sonnet\", \"opus\"],\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.ts\";\n\nexport const DEFAULT_LOCALE: SupportedLocale = \"en\";\n\nconst normalizeTag = (tag?: string): SupportedLocale | undefined => {\n if (tag === undefined || 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 === undefined || 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.map((param) => param.trim()).find((param) => param.startsWith(\"q=\"));\n const quality = qParam !== undefined ? 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 = (nav?: NavigatorLike): SupportedLocale | undefined => {\n if (!nav) {\n return undefined;\n }\n\n let languages: readonly string[];\n if (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 { FileSystem } from \"@effect/platform\";\nimport { desc, eq, sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects, sessions } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../project/functions/id.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { Session, SessionDetail } from \"../../types.ts\";\nimport { decodeSessionId, validateSessionId } from \"../functions/id.ts\";\nimport { SessionMetaService } from \"../services/SessionMetaService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const sessionMetaService = yield* SessionMetaService;\n const appContext = yield* ApplicationContext;\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n\n const getSession = (projectId: string, sessionId: string) =>\n Effect.gen(function* () {\n // Validate sessionId contains only safe characters\n if (!validateSessionId(sessionId)) {\n return yield* Effect.fail(new Error(\"Invalid session ID: contains unsafe characters\"));\n }\n\n // Validate that the project path is within the Claude projects directory\n const projectPath = decodeProjectId(projectId);\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\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 { session: null };\n }\n\n const sessionDetail = yield* 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(projectId, sessionId);\n\n const sessionDetail: SessionDetail = {\n id: sessionId,\n jsonlFilePath: sessionPath,\n meta,\n conversations,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n\n return sessionDetail;\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 // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(claudeProjectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\n // Ensure project is synced in DB\n const projectExists = db\n .select({ one: sql<number>`1` })\n .from(projects)\n .where(eq(projects.id, projectId))\n .get();\n if (!projectExists) {\n yield* syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\n }\n\n // Fetch all sessions for project ordered by lastModifiedAt DESC\n const rows = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .orderBy(desc(sessions.lastModifiedAt))\n .all();\n\n if (rows.length === 0) {\n return { sessions: [] };\n }\n\n // Cursor-based pagination\n const startIndex =\n cursor !== undefined\n ? (() => {\n const idx = rows.findIndex((r) => r.id === cursor);\n return idx === -1 ? 0 : idx + 1;\n })()\n : 0;\n\n const sessionsToReturn = rows.slice(startIndex, startIndex + maxCount);\n\n const sessionsResult: Session[] = yield* Effect.all(\n sessionsToReturn.map((row) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(projectId, row.id);\n return {\n id: row.id,\n jsonlFilePath: row.filePath,\n lastModifiedAt: new Date(row.lastModifiedAt),\n meta,\n } satisfies Session;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return { sessions: sessionsResult };\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 { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { z } from \"zod\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { type SessionRow, sessions } from \"../../../lib/db/schema.ts\";\nimport { parsedUserMessageSchema } from \"../../claude-code/functions/parseUserMessage.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { SessionMeta } from \"../../types.ts\";\n\nconst parsedUserMessageOrNullSchema = parsedUserMessageSchema.nullable();\n\nconst costBreakdownSchema = z.object({\n inputTokensUsd: z.number(),\n outputTokensUsd: z.number(),\n cacheCreationUsd: z.number(),\n cacheReadUsd: z.number(),\n});\n\nconst tokenUsageSchema = z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n cacheCreationTokens: z.number(),\n cacheReadTokens: z.number(),\n});\n\nconst prLinksSchema = z.array(\n z.object({\n prNumber: z.number(),\n prUrl: z.string(),\n prRepository: z.string(),\n }),\n);\n\nconst defaultBreakdown = {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n};\n\nconst defaultTokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n};\n\nconst rowToSessionMeta = (row: SessionRow): SessionMeta => {\n const firstUserMessage =\n row.firstUserMessageJson !== null\n ? parsedUserMessageOrNullSchema.parse(JSON.parse(row.firstUserMessageJson))\n : null;\n\n const breakdown =\n row.costBreakdownJson !== null\n ? costBreakdownSchema.parse(JSON.parse(row.costBreakdownJson))\n : defaultBreakdown;\n\n const tokenUsage =\n row.tokenUsageJson !== null\n ? tokenUsageSchema.parse(JSON.parse(row.tokenUsageJson))\n : defaultTokenUsage;\n\n const prLinks = row.prLinksJson !== null ? prLinksSchema.parse(JSON.parse(row.prLinksJson)) : [];\n\n return {\n messageCount: row.messageCount,\n firstUserMessage,\n customTitle: row.customTitle,\n cost: {\n totalUsd: row.totalCostUsd,\n breakdown,\n tokenUsage,\n },\n modelName: row.modelName,\n prLinks,\n };\n};\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: (projectId: string, sessionId: string) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n\n const getSessionMeta = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<SessionMeta, Error> =>\n Effect.gen(function* () {\n const row = db.select().from(sessions).where(eq(sessions.id, sessionId)).get();\n\n if (row === undefined) {\n // Not in DB yet \u2014 sync and retry\n yield* syncService\n .syncSession(projectId, sessionId)\n .pipe(Effect.catchAll(() => Effect.void));\n\n const retryRow = db.select().from(sessions).where(eq(sessions.id, sessionId)).get();\n\n if (retryRow === undefined) {\n return yield* Effect.fail(new Error(`Session not found: ${sessionId}`));\n }\n\n return rowToSessionMeta(retryRow);\n }\n\n return rowToSessionMeta(row);\n });\n\n const invalidateSession = (projectId: string, sessionId: string): Effect.Effect<void> =>\n syncService.syncSession(projectId, sessionId).pipe(Effect.catchAll(() => Effect.void));\n\n return {\n getSessionMeta,\n invalidateSession,\n };\n }),\n );\n}\n\nexport type ISessionMetaService = Context.Tag.Service<typeof SessionMetaService>;\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"../../claude-code/services/ClaudeCodeSessionProcessService.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport type { InternalEventDeclaration } from \"../../events/types/InternalEventDeclaration.ts\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService.ts\";\nimport { decodeProjectId } from \"../../project/functions/id.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { SchedulerConfigBaseDir } from \"../../scheduler/config.ts\";\nimport { SchedulerService } from \"../../scheduler/domain/Scheduler.ts\";\nimport { detectRateLimitFromLastLine } from \"../functions/detectRateLimitFromLastLine.ts\";\nimport { parseRateLimitResetTime } from \"../functions/parseRateLimitResetTime.ts\";\nimport { readLastLine } from \"../functions/readLastLine.ts\";\n\ntype SessionChangedListener = (event: InternalEventDeclaration[\"sessionChanged\"]) => 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 = (sessionId: string): 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.resume &&\n job.message.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 = (event: InternalEventDeclaration[\"sessionChanged\"]) =>\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(projectPath, `${sessionId}.jsonl`);\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 sessionId,\n resume: true,\n },\n enabled: true,\n })\n .pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(\n `[RateLimitAutoScheduleService] Failed to add job for session ${sessionId}: ${String(error)}`,\n ),\n );\n return Effect.void;\n }),\n );\n\n yield* Effect.logInfo(\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(handleSessionChanged(event).pipe(Effect.provide(runtimeLayer)));\n };\n\n yield* Ref.set(listenerRef, listener);\n yield* eventBus.on(\"sessionChanged\", listener);\n\n yield* Effect.logInfo(\"[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 yield* Effect.logInfo(\"[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(\"RateLimitAutoScheduleService\")<\n RateLimitAutoScheduleService,\n IRateLimitAutoScheduleService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { EnvService } from \"../platform/services/EnvService.ts\";\nimport { type SchedulerConfig, schedulerConfigSchema } from \"./schema.ts\";\n\nclass ConfigFileNotFoundError extends Data.TaggedError(\"ConfigFileNotFoundError\")<{\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(\"SchedulerConfigBaseDir\")<\n SchedulerConfigBaseDir,\n string\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const envService = yield* EnvService;\n const path = yield* Path.Path;\n const homeDirectory = yield* envService.getEnv(\"HOME\");\n return path.resolve(homeDirectory ?? \"/\", \".claude-code-viewer\");\n }),\n );\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(new ConfigFileNotFoundError({ path: configPath }));\n }\n\n const content = yield* fs.readFileString(configPath);\n\n const jsonResult: unknown = yield* Effect.try({\n try: (): unknown => 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 sessionId: z.uuid(),\n resume: z.boolean(),\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.iso.datetime(),\n lastRunAt: z.iso.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 { Context, Cron, Data, Duration, Effect, Fiber, Layer, Ref, Schedule } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { initializeConfig, readConfig, writeConfig } from \"../config.ts\";\nimport type {\n NewSchedulerJob,\n SchedulerConfig,\n SchedulerJob,\n UpdateSchedulerJob,\n} from \"../schema.ts\";\nimport { calculateReservedDelay, executeJob } from \"./Job.ts\";\n\nclass SchedulerJobNotFoundError extends Data.TaggedError(\"SchedulerJobNotFoundError\")<{\n readonly jobId: string;\n}> {}\n\nclass InvalidCronExpressionError extends Data.TaggedError(\"InvalidCronExpressionError\")<{\n readonly expression: string;\n readonly cause: unknown;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const fibersRef = yield* Ref.make<Map<string, Fiber.RuntimeFiber<unknown, unknown>>>(new Map());\n const runningJobsRef = yield* Ref.make<Set<string>>(new Set());\n\n const emitSchedulerJobsChanged = eventBus.emit(\"schedulerJobsChanged\", {});\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) => new Map(fibers).set(job.id, fiber));\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(runJobWithConcurrencyControl(job), delayDuration).pipe(\n Effect.forkDaemon,\n );\n\n yield* Ref.update(fibersRef, (fibers) => new Map(fibers).set(job.id, fiber));\n }\n });\n\n const runJobWithConcurrencyControl = (job: SchedulerJob) =>\n Effect.gen(function* () {\n // Check concurrency policy (only for cron jobs)\n if (job.schedule.type === \"cron\" && job.schedule.concurrencyPolicy === \"skip\") {\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: () => {\n return Effect.logInfo(`[Scheduler] Reserved job ${job.id} executed successfully`);\n },\n onFailure: (error) => {\n return Effect.logError(`[Scheduler] Reserved job ${job.id} failed: ${String(error)}`);\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 // Delete reserved job after execution (skip fiber stop, just delete from config)\n yield* deleteJobFromConfig(job.id).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(\n `[Scheduler] Failed to delete reserved job ${job.id}: ${String(error)}`,\n ),\n );\n return Effect.void;\n }),\n );\n\n yield* emitSchedulerJobsChanged;\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 Effect.logInfo(`[Scheduler] Job ${job.id} executed successfully`).pipe(\n Effect.zipRight(updateJobStatus(job.id, \"success\", new Date().toISOString())),\n ),\n onFailure: (error) =>\n Effect.logError(`[Scheduler] Job ${job.id} failed: ${String(error)}`).pipe(\n Effect.zipRight(updateJobStatus(job.id, \"failed\", new Date().toISOString())),\n ),\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 = (jobId: string, status: \"success\" | \"failed\", runAt: string) =>\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { SchedulerJob } from \"../schema.ts\";\n\nexport const executeJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n\n const { message } = job;\n const { project } = yield* projectRepository.getProject(message.projectId);\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 sessionId: message.sessionId,\n resume: message.resume,\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 = (job: SchedulerJob, now: Date): 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, RateLimitEntrySchema } from \"../schema.ts\";\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 = (jsonLine: string): 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 = /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 (hoursStr === undefined || meridiem === undefined || timezone === undefined) {\n return getFallbackTime();\n }\n\n const hours = Number.parseInt(hoursStr, 10);\n const minutes = 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(parts.find((p) => p.type === \"hour\")?.value ?? \"0\", 10),\n minute: Number.parseInt(parts.find((p) => p.type === \"minute\")?.value ?? \"0\", 10),\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 = 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 = (hours: number, minutes: number, timezone: string): 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 === undefined || month === undefined || day === undefined) {\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(baseDate.getTime() + totalUtcMinutes * 60 * 1000);\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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SchedulerService } from \"../domain/Scheduler.ts\";\nimport type { NewSchedulerJob, UpdateSchedulerJob } from \"../schema.ts\";\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(Effect.catchTag(\"SchedulerJobNotFoundError\", () => Effect.succeed(null)));\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\", () => Effect.succeed(false)),\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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SearchService } from \"../services/SearchService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const searchService = yield* SearchService;\n\n const search = (options: { query: string; limit?: number; projectId?: string }) =>\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(query.trim(), limit, projectId);\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 { sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\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\n// FTS5 query result row type (raw SQL returns snake_case)\ntype SearchJoinRow = {\n session_id: string;\n project_id: string;\n project_name: string | null;\n role: string;\n content: string;\n conversation_index: number;\n rank: number;\n last_modified_at: string | null;\n};\n\n/**\n * Escape user input for FTS5 MATCH queries.\n * When using trigram tokenizer, queries are treated as plain strings,\n * but special characters like double quotes or parentheses can cause\n * parse errors. Wrap the entire input in double quotes and escape\n * internal double quotes.\n */\nconst escapeFtsQuery = (query: string): string => {\n const escaped = query.replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n};\n\nconst isValidRole = (role: string): role is \"user\" | \"assistant\" =>\n role === \"user\" || role === \"assistant\";\n\nconst LayerImpl = Effect.gen(function* () {\n const drizzleService = yield* DrizzleService;\n const { db } = drizzleService;\n\n const search = (query: string, limit = 20, projectId?: string) =>\n Effect.gen(function* () {\n if (!query.trim()) {\n return { results: [] as SearchResult[] };\n }\n\n const ftsQuery = escapeFtsQuery(query);\n\n let drizzleQuery = sql`\n SELECT\n fts.session_id,\n fts.project_id,\n p.name as project_name,\n fts.role,\n fts.content,\n CAST(fts.conversation_index AS INTEGER) as conversation_index,\n fts.rank,\n s.last_modified_at\n FROM session_messages_fts fts\n LEFT JOIN projects p ON p.id = fts.project_id\n LEFT JOIN sessions s ON s.id = fts.session_id\n WHERE session_messages_fts MATCH ${ftsQuery}\n `;\n\n if (projectId !== undefined) {\n drizzleQuery = sql`${drizzleQuery} AND fts.project_id = ${projectId}`;\n }\n\n // rank sorts by BM25 score (lower = more relevant)\n // Fetch extra rows to allow for role filtering\n drizzleQuery = sql`${drizzleQuery} ORDER BY rank LIMIT ${limit * 2}`;\n\n const rows = yield* Effect.try({\n try: () => db.all<SearchJoinRow>(drizzleQuery),\n catch: (err) =>\n new Error(`FTS5 query failed: ${err instanceof Error ? err.message : String(err)}`),\n });\n\n const results: SearchResult[] = [];\n for (const row of rows) {\n if (results.length >= limit) break;\n\n if (!isValidRole(row.role)) continue;\n\n const text = row.content;\n const queryLower = query.toLowerCase();\n const textLower = text.toLowerCase();\n const matchIndex = textLower.indexOf(queryLower);\n const snippetLength = 150;\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 ? \"...\" : \"\") + text.slice(start, end) + (end < text.length ? \"...\" : \"\");\n } else {\n snippet = text.slice(0, snippetLength) + (text.length > snippetLength ? \"...\" : \"\");\n }\n\n // FTS5 rank is negative (BM25): larger absolute value = more relevant\n // Boost user messages\n const score = row.role === \"user\" ? -row.rank * 1.2 : -row.rank;\n\n results.push({\n projectId: row.project_id,\n projectName: row.project_name ?? \"\",\n sessionId: row.session_id,\n conversationIndex: row.conversation_index,\n type: row.role,\n snippet,\n timestamp: row.last_modified_at ?? \"\",\n score,\n });\n }\n\n return { results };\n }).pipe(\n Effect.catchAll((err) => {\n return Effect.logError(`SearchService.search error: ${String(err)}`).pipe(\n Effect.zipRight(Effect.succeed({ results: [] as SearchResult[] })),\n );\n }),\n );\n\n // FTS5 always reads latest data, so invalidation is a no-op\n const invalidateIndex = () => Effect.void;\n\n return {\n search,\n invalidateIndex,\n };\n});\n\nexport type ISearchService = InferEffect<typeof LayerImpl>;\nexport class SearchService extends Context.Tag(\"SearchService\")<SearchService, ISearchService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { AgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository.ts\";\nimport { decodeSessionId } from \"../functions/id.ts\";\nimport { generateSessionHtml } from \"../services/ExportService.ts\";\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(projectId, sessionId);\n\n return {\n status: 200,\n response: { session },\n } as const satisfies ControllerResponse;\n });\n\n const exportSessionHtml = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(projectId, sessionId);\n\n if (session === null) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n const html = yield* generateSessionHtml(session, projectId, agentSessionRepository);\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 { ToolResultContent } from \"../../../../lib/conversation-schema/content/ToolResultContentSchema.ts\";\nimport type { Conversation } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { IAgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository.ts\";\nimport type { SessionDetail } from \"../../types.ts\";\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.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\").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, langRaw, codeRaw) => {\n const lang = typeof langRaw === \"string\" ? langRaw : undefined;\n const code = typeof codeRaw === \"string\" ? codeRaw : \"\";\n const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`\n <div class=\"code-block\">\n ${lang !== undefined ? `<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?)+/gm, (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 === undefined ||\n separatorRow === undefined ||\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 // Escape HTML for remaining content (except already processed tables)\n // We need to escape only non-processed parts\n processedContent = processedContent\n .split(/(<table class=\"markdown-table\">[\\s\\S]*?<\\/table>|__CODE_BLOCK_\\d+__)/)\n .map((part) => {\n if (part.startsWith('<table class=\"markdown-table\">') || /^__CODE_BLOCK_\\d+__$/.test(part)) {\n return part;\n }\n return escapeHtml(part);\n })\n .join(\"\");\n\n // Blockquotes (multi-line support)\n processedContent = processedContent.replace(/(?:^> .+$\\n?)+/gm, (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 // 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(/(?:^- \\[([ xX])\\] .+$\\n?)+/gm, (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 // Unordered lists\n processedContent = processedContent.replace(/(?:^[-*+] .+$\\n?)+/gm, (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 // Ordered lists\n processedContent = processedContent.replace(/(?:^\\d+\\. .+$\\n?)+/gm, (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 // Strikethrough\n processedContent = processedContent.replace(/~~(.+?)~~/g, '<del class=\"markdown-del\">$1</del>');\n\n // Inline code\n processedContent = processedContent.replace(/`([^`]+)`/g, '<code class=\"inline-code\">$1</code>');\n\n // Bold\n processedContent = processedContent.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\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(/^### (.+)$/gm, '<h3 class=\"markdown-h3\">$1</h3>');\n processedContent = processedContent.replace(/^## (.+)$/gm, '<h2 class=\"markdown-h2\">$1</h2>');\n processedContent = processedContent.replace(/^# (.+)$/gm, '<h1 class=\"markdown-h1\">$1</h1>');\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(`__CODE_BLOCK_${i}__`, codeBlock);\n }\n }\n\n return processedContent;\n};\n\n/**\n * Renders a user message entry\n */\nconst renderUserEntry = (entry: Extract<Conversation, { type: \"user\" }>): 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<string, Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\n // Map from agentId to root conversation\n agentIdToRoot: Map<string, Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\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 = (toolUseResult: unknown): 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 = (conversations: Array<Conversation>): SidechainData => {\n // Filter sidechain conversations\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- type narrowing via filter conditions is safe here\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.type !== \"custom-title\" &&\n conv.type !== \"agent-name\" &&\n conv.type !== \"agent-setting\" &&\n conv.type !== \"pr-link\" &&\n conv.type !== \"last-prompt\" &&\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(sidechainConversations.map((conv) => [conv.uuid, conv] as const));\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((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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\" ? entry.content : \"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 = 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 !== undefined && 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) => renderSidechainEntry(conv, toolResultMap, sidechainData))\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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 = (entry: Extract<Conversation, { type: \"system\" }>): 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 = (entry: Extract<Conversation, { type: \"system\" }>): 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<Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>>;\n}> => {\n const grouped: Array<{\n type: \"grouped\" | \"single\";\n entries: Array<Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>>;\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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.type !== \"custom-title\" &&\n conv.type !== \"agent-name\" &&\n conv.type !== \"agent-setting\" &&\n conv.type !== \"pr-link\" &&\n conv.type !== \"last-prompt\" &&\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((id) => !existingAgentIds.has(id));\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(projectId, agentId, session.id),\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\" || c.type === \"assistant\" || 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((conv): conv is Conversation => conv.type !== \"x-error\"),\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 const assistantEntries = group.entries.filter(\n (entry): entry is Extract<Conversation, { type: \"assistant\" }> =>\n entry.type === \"assistant\",\n );\n return renderGroupedAssistantEntries(assistantEntries, toolResultMap, sidechainData);\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.ts\";\nimport { TasksService } from \"../services/TasksService.ts\";\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 = (projectPath: string, task: TaskCreate, specificSessionId?: string) =>\n service.createTask(projectPath, task, specificSessionId);\n\n const updateTask = (projectPath: string, task: TaskUpdate, 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", "// oxlint-disable-next-line jsdoc/check-tag-names -- effect-diagnostics is a valid Effect-TS directive\n/** @effect-diagnostics globalErrorInEffectFailure:skip-file */\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { z } from \"zod\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { type Task, type TaskCreate, TaskSchema, type TaskUpdate } from \"../schema.ts\";\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: (projectPath: string, specificSessionId?: string) => 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 const appContext = yield* ApplicationContext;\n\n // Helper to find the Global Claude Directory\n const getClaudeDir = () =>\n appContext.claudeCodePaths.pipe(Effect.map((paths) => paths.globalClaudeDirectoryPath));\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 !== undefined && specificSessionId !== \"\") {\n const sessionTasksDir = path.join(claudeDir, TASKS_DIR_NAME, specificSessionId);\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(path.join(CLAUDE_DIR_NAME, PROJECTS_DIR_NAME)) &&\n projectPath.split(path.sep).pop()?.startsWith(\"-\");\n\n let projectMetaDir: string;\n\n if (isMetadataPath === true && (yield* fs.exists(projectPath))) {\n projectMetaDir = projectPath;\n } else {\n const identifier = normalizeProjectPath(projectPath);\n projectMetaDir = path.join(claudeDir, PROJECTS_DIR_NAME, identifier);\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 = /^[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(projectPath, specificSessionId);\n\n if (Option.isNone(uuidOption)) {\n if (specificSessionId !== undefined && specificSessionId !== \"\") {\n return yield* Effect.fail(\n new Error(`Requested session ${specificSessionId} has no tasks directory`),\n );\n }\n const claudeDir = yield* getClaudeDir();\n const identifier = normalizeProjectPath(projectPath);\n const projectMetaDir = path.join(claudeDir, PROJECTS_DIR_NAME, identifier);\n return yield* Effect.fail(\n new Error(`Project metadata directory not found or no UUID: ${projectMetaDir}`),\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(projectPath, specificSessionId);\n\n return Option.map(uuidOption, (uuid) => path.join(claudeDir, TASKS_DIR_NAME, uuid));\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(projectPath, specificSessionId);\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(projectPath, specificSessionId);\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: unknown = 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 Effect.runFork(\n Effect.logWarning(`Invalid task file ${file}: ${parsed.error.message}`),\n );\n // Create a fallback task for invalid schema\n const fallbackSchema = z.object({\n id: z.string().optional(),\n subject: z.string().optional(),\n title: z.string().optional(),\n status: z.enum([\"pending\", \"in_progress\", \"completed\", \"failed\"]).optional(),\n });\n const fallbackParsed = fallbackSchema.safeParse(task);\n const fb = fallbackParsed.success ? fallbackParsed.data : {};\n const taskId = fb.id ?? file.replace(\".json\", \"\");\n const taskSubject = fb.subject ?? fb.title ?? \"Invalid Task Schema\";\n const validStatus = fb.status ?? \"failed\";\n const fallbackTask: Task = {\n id: taskId,\n subject: taskSubject,\n description: `Validation Error: ${JSON.stringify(z.treeifyError(parsed.error))}. Raw: ${JSON.stringify(task)}`,\n status: validStatus,\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n } catch (e) {\n Effect.runFork(Effect.logError(`Failed to parse task file ${file}: ${String(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 = (projectPath: string, turnId: string, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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: unknown = JSON.parse(content);\n return yield* Effect.try(() => TaskSchema.parse(task));\n });\n\n const createTask = (projectPath: string, turnDef: TaskCreate, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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 = (projectPath: string, update: TaskUpdate, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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(new Error(`Task ${update.taskId} not found`));\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(filePath, JSON.stringify(updatedTask, null, 2));\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([\"pending\", \"in_progress\", \"completed\", \"failed\"]);\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.ts\";\nimport { CcvOptionsService } from \"../platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../platform/services/EnvService.ts\";\nimport { normalizePtyChunk } from \"./normalizePtyChunk.ts\";\nimport {\n createRusptySession,\n type RusptyModule,\n type TerminalPtyProcess,\n} from \"./rusptyAdapter.ts\";\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 !== true && 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 === undefined || 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) => new Error(`Failed to load @replit/ruspty: ${String(error)}`),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n Effect.runFork(Effect.logWarning(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 (session.bufferBytes > MAX_BUFFER_BYTES && session.buffer.length > 0) {\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(options.shell, options.fallbackShell, options.unrestrictedFlag);\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 === undefined || sessionId === \"\") return undefined;\n return sessions.get(sessionId);\n };\n\n const getOrCreateSession = (sessionId: string | undefined, cwdOverride?: string) =>\n Effect.gen(function* () {\n const terminalDisabledEnv = yield* envService.getEnv(\"CCV_TERMINAL_DISABLED\");\n const terminalDisabledOption = yield* ccvOptionsService.getCcvOptions(\"terminalDisabled\");\n const terminalDisabled = terminalDisabledOption ?? isFlagEnabled(terminalDisabledEnv);\n if (terminalDisabled) {\n return yield* Effect.fail(\n new Error(\"Terminal support is unavailable (CCV_TERMINAL_DISABLED is enabled).\"),\n );\n }\n const cwd = cwdOverride ?? process.cwd();\n const terminalShellOption = yield* ccvOptionsService.getCcvOptions(\"terminalShell\");\n const shell = terminalShellOption ?? (yield* envService.getEnv(\"CCV_TERMINAL_SHELL\"));\n const fallbackShell = yield* envService.getEnv(\"SHELL\");\n const terminalUnrestrictedOption =\n yield* ccvOptionsService.getCcvOptions(\"terminalUnrestricted\");\n const terminalUnrestrictedEnv = yield* envService.getEnv(\"CCV_TERMINAL_UNRESTRICTED\");\n const unrestrictedFlag = 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 Effect.runFork(Effect.logDebug(`[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\n// oxlint-disable-next-line typescript-eslint/consistent-type-imports -- dynamic import type needed for optional dependency\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 = (ruspty: RusptyModule, options: PtyOptions): 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.ts\";\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref, Schedule } from \"effect\";\nimport { ClaudeCodeLifeCycleService } from \"../core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { EventBus } from \"../core/events/services/EventBus.ts\";\nimport { FileWatcherService } from \"../core/events/services/fileWatcher.ts\";\nimport type { InternalEventDeclaration } from \"../core/events/types/InternalEventDeclaration.ts\";\nimport { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository.ts\";\nimport { ProjectMetaService } from \"../core/project/services/ProjectMetaService.ts\";\nimport { RateLimitAutoScheduleService } from \"../core/rate-limit/services/RateLimitAutoScheduleService.ts\";\nimport { SchedulerConfigBaseDir } from \"../core/scheduler/config.ts\";\nimport { SchedulerService } from \"../core/scheduler/domain/Scheduler.ts\";\nimport { SessionMetaService } from \"../core/session/services/SessionMetaService.ts\";\nimport { SyncService } from \"../core/sync/services/SyncService.ts\";\n\ntype 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 projectMetaService = yield* ProjectMetaService;\n const sessionMetaService = yield* SessionMetaService;\n const rateLimitAutoScheduleService = yield* RateLimitAutoScheduleService;\n const schedulerService = yield* SchedulerService;\n const syncService = yield* SyncService;\n\n // Capture dependencies for startScheduler (which requires runtime services)\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const schedulerConfigBaseDir = yield* SchedulerConfigBaseDir;\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n const schedulerRuntimeLayer = Layer.mergeAll(\n Layer.succeed(FileSystem.FileSystem, fs),\n Layer.succeed(Path.Path, pathService),\n Layer.succeed(SchedulerConfigBaseDir, schedulerConfigBaseDir),\n Layer.succeed(ClaudeCodeLifeCycleService, lifeCycleService),\n Layer.succeed(ProjectRepository, projectRepository),\n );\n\n // \u72B6\u614B\u7BA1\u7406\u7528\u306E Ref\n const listenersRef = yield* Ref.make<{\n sessionChanged?: ((event: InternalEventDeclaration[\"sessionChanged\"]) => void) | null;\n sessionListChanged?:\n | ((event: InternalEventDeclaration[\"sessionListChanged\"]) => void)\n | null;\n }>({});\n\n const startInitialization = (): Effect.Effect<void> => {\n return Effect.gen(function* () {\n // Run full sync to populate SQLite cache\n yield* Effect.logInfo(\"Starting fullSync...\");\n yield* syncService.fullSync().pipe(\n Effect.catchAll((e) => {\n Effect.runFork(Effect.logError(`[InitializeService] fullSync failed: ${String(e)}`));\n return Effect.void;\n }),\n );\n yield* Effect.logInfo(\"fullSync completed\");\n\n // \u30D5\u30A1\u30A4\u30EB\u30A6\u30A9\u30C3\u30C1\u30E3\u30FC\u3092\u958B\u59CB\n yield* fileWatcher.startWatching();\n\n // Start all enabled scheduled jobs\n yield* schedulerService.startScheduler.pipe(\n Effect.provide(schedulerRuntimeLayer),\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] startScheduler failed: ${String(error)}`),\n );\n return Effect.void;\n }),\n );\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 yield* Effect.logInfo(\"start heartbeat\");\n yield* Effect.forkDaemon(daemon);\n yield* Effect.logInfo(\"after starting heartbeat fork\");\n\n // sessionChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionChanged = (event: InternalEventDeclaration[\"sessionChanged\"]) => {\n Effect.runFork(projectMetaService.invalidateProject(event.projectId));\n\n Effect.runFork(sessionMetaService.invalidateSession(event.projectId, event.sessionId));\n };\n\n // sessionListChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionListChanged = (event: InternalEventDeclaration[\"sessionListChanged\"]) => {\n Effect.runFork(\n syncService.syncProjectList(event.projectId).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] syncProjectList failed: ${String(e)}`),\n );\n return Effect.void;\n }),\n ),\n );\n };\n\n yield* Ref.set(listenersRef, {\n sessionChanged: onSessionChanged,\n sessionListChanged: onSessionListChanged,\n });\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"sessionListChanged\", onSessionListChanged);\n }).pipe(Effect.withSpan(\"start-initialization\"));\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 if (listeners.sessionListChanged) {\n yield* eventBus.off(\"sessionListChanged\", listeners.sessionListChanged);\n }\n\n yield* Ref.set(listenersRef, {});\n yield* schedulerService.stopScheduler.pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] stopScheduler failed: ${String(error)}`),\n );\n return Effect.void;\n }),\n );\n yield* rateLimitAutoScheduleService.stop();\n yield* fileWatcher.stop();\n });\n\n return {\n startInitialization,\n stopCleanup,\n } satisfies InitializeServiceInterface;\n }),\n );\n}\n", "import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { Context, Effect, Layer, Runtime } from \"effect\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService.ts\";\nimport type { InferEffect } from \"../../lib/effect/types.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\n/**\n * Compare two strings in constant time to prevent timing attacks.\n * Returns false immediately if lengths differ (length is already leaked by nature).\n */\nconst safeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a, \"utf-8\"), Buffer.from(b, \"utf-8\"));\n};\n\n// Generate a cryptographically random session token (not derived from password)\nconst generateSessionToken = (password: string | undefined): string => {\n if (password === undefined || password === \"\") return \"\";\n return randomBytes(32).toString(\"hex\");\n};\n\nconst getBearerToken = (authorization: string | undefined) => {\n if (authorization === undefined || authorization === \"\") return undefined;\n const [scheme, token] = authorization.split(\" \");\n if (scheme === undefined || scheme === \"\" || token === undefined || token === \"\")\n 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 =\n sessionToken !== undefined &&\n validSessionToken !== \"\" &&\n safeEqual(sessionToken, validSessionToken);\n const bearerAuthorized =\n authPassword !== undefined &&\n bearerToken !== undefined &&\n safeEqual(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 // Cache the session token so it remains stable across calls (generated once on first access)\n let cachedSessionToken: string | undefined;\n\n const getAuthState = Effect.gen(function* () {\n const authPassword = yield* ccvOptionsService.getCcvOptions(\"password\");\n const authEnabled = authPassword !== undefined;\n cachedSessionToken ??= generateSessionToken(authPassword);\n return { authEnabled, authPassword, validSessionToken: cachedSessionToken };\n });\n\n const authRequiredMiddleware = createMiddleware<HonoContext>(async (c, next) => {\n if (!c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n const { authEnabled, validSessionToken, authPassword } = await runPromise(getAuthState);\n\n return createAuthRequiredMiddleware(authEnabled, validSessionToken, authPassword)(c, next);\n });\n\n return {\n getAuthState,\n authRequiredMiddleware,\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 { createMiddleware } from \"hono/factory\";\nimport prexit from \"prexit\";\nimport packageJson from \"../../../../package.json\" with { type: \"json\" };\nimport {\n CcvOptionsService,\n type CliOptions,\n} from \"../../core/platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../../core/platform/services/EnvService.ts\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService.ts\";\nimport { userConfigSchema } from \"../../lib/config/config.ts\";\nimport type { HonoAppType, HonoContext } from \"../app.ts\";\nimport { InitializeService } from \"../initialize.ts\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware.ts\";\nimport { configMiddleware } from \"../middleware/config.middleware.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\nimport { authRoutes } from \"./authRoutes.ts\";\nimport { claudeCodeRoutes } from \"./claudeCodeRoutes.ts\";\nimport { featureFlagRoutes } from \"./featureFlagRoutes.ts\";\nimport { fileSystemRoutes } from \"./fileSystemRoutes.ts\";\nimport { notificationRoutes } from \"./notificationRoutes.ts\";\nimport { projectRoutes } from \"./projectRoutes.ts\";\nimport { schedulerRoutes } from \"./schedulerRoutes.ts\";\nimport { searchRoutes } from \"./searchRoutes.ts\";\nimport { sseRoutes } from \"./sseRoutes.ts\";\nimport { tasksRoutes } from \"./tasksRoutes.ts\";\n\nconst API_ONLY_ALLOWED_PREFIXES = [\n \"/api/version\",\n \"/api/config\",\n \"/api/projects\",\n \"/api/claude-code\",\n \"/api/search\",\n \"/api/notifications\",\n \"/api/sse\",\n];\n\nconst createApiOnlyMiddleware = (apiOnly: boolean) =>\n createMiddleware<HonoContext>(async (c, next) => {\n if (apiOnly) {\n const path = c.req.path;\n const allowed = API_ONLY_ALLOWED_PREFIXES.some(\n (prefix) => path === prefix || path.startsWith(`${prefix}/`),\n );\n if (!allowed) {\n return c.json({ error: \"Not Found\" }, 404);\n }\n }\n return next();\n });\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 const apiOnly = (yield* ccvOptionsService.getCcvOptions(\"apiOnly\")) === true;\n const apiOnlyMiddleware = createApiOnlyMiddleware(apiOnly);\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(apiOnlyMiddleware)\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\", (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\", (c) => {\n return c.json({\n config: c.get(\"userConfig\"),\n });\n })\n .put(\"/api/config\", zValidator(\"json\", userConfigSchema), (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/notifications\", yield* notificationRoutes)\n .route(\"/api/sse\", yield* sseRoutes)\n );\n });\n\nexport type RouteType =\n ReturnType<typeof routes> extends Effect.Effect<infer A, unknown, unknown> ? A : never;\n", "import z from \"zod\";\nimport { localeSchema } from \"../i18n/schema.ts\";\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 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 findHotkey: z.enum([\"ctrl-f\", \"command-f\"]).optional().default(\"command-f\"),\n autoScheduleContinueOnRateLimit: z.boolean().optional().default(false),\n modelChoices: z.array(z.string()).optional().default([\"default\", \"haiku\", \"sonnet\", \"opus\"]),\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.ts\";\nimport { defaultUserConfig, type UserConfig } from \"../../lib/config/config.ts\";\nimport { parseUserConfig } from \"../../lib/config/parseUserConfig.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\nexport const configMiddleware = createMiddleware<HonoContext>(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\")) ?? 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", "import { userConfigSchema } from \"./config.ts\";\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.ts\";\nimport type { ApplicationContext } from \"../core/platform/services/ApplicationContext.ts\";\nimport type { CcvOptionsService } from \"../core/platform/services/CcvOptionsService.ts\";\nimport type { EnvService } from \"../core/platform/services/EnvService.ts\";\nimport type { UserConfigService } from \"../core/platform/services/UserConfigService.ts\";\nimport type { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository.ts\";\nimport type { SchedulerConfigBaseDir } from \"../core/scheduler/config.ts\";\nimport type { SessionMetaService } from \"../core/session/services/SessionMetaService.ts\";\n\nexport type HonoRuntime =\n | CcvOptionsService\n | EnvService\n | SessionMetaService\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor.CommandExecutor\n | UserConfigService\n | ClaudeCodeLifeCycleService\n | ProjectRepository\n | SchedulerConfigBaseDir\n | ApplicationContext;\n\nexport const getHonoRuntime = Effect.runtime<HonoRuntime>();\n", "import { timingSafeEqual } from \"node:crypto\";\nimport { 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.ts\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware.ts\";\n\n/**\n * Compare two strings in constant time to prevent timing attacks.\n * Returns false immediately if lengths differ (length is already leaked by nature).\n */\nconst safeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a, \"utf-8\"), Buffer.from(b, \"utf-8\"));\n};\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(\"/login\", zValidator(\"json\", z.object({ password: z.string() })), (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 (authPassword === undefined || !safeEqual(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 .post(\"/logout\", (c) => {\n deleteCookie(c, \"ccv-session\", { path: \"/\" });\n return c.json({ success: true });\n })\n\n .get(\"/check\", (c) => {\n const sessionToken = getCookie(c, \"ccv-session\");\n const isAuthenticated = authEnabled\n ? sessionToken !== undefined &&\n validSessionToken !== \"\" &&\n safeEqual(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.ts\";\nimport { CCVAskUserQuestionController } from \"../../core/claude-code/presentation/CCVAskUserQuestionController.ts\";\nimport { ClaudeCodeController } from \"../../core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { ClaudeCodePermissionController } from \"../../core/claude-code/presentation/ClaudeCodePermissionController.ts\";\nimport { ClaudeCodeSessionProcessController } from \"../../core/claude-code/presentation/ClaudeCodeSessionProcessController.ts\";\nimport { ccOptionsSchema, userMessageInputSchema } from \"../../core/claude-code/schema.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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 type: document.type,\n source: document.source,\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 = yield* ClaudeCodeSessionProcessController;\n const ccvAskUserQuestionController = yield* CCVAskUserQuestionController;\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.getAvailableFeatures().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 sessionId: z.uuid(),\n input: userMessageInputSchema,\n resume: z.boolean(),\n ccOptions: ccOptionsSchema.optional(),\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.createSessionProcess({\n ...body,\n input,\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 (c) => {\n const { sessionProcessId } = c.req.param();\n void Effect.runFork(claudeCodeLifeCycleService.abortTask(sessionProcessId));\n return c.json({ message: \"Task aborted\" });\n },\n )\n .get(\"/pending-permission-requests\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodePermissionController.getPendingPermissionRequests(),\n );\n return response;\n })\n .get(\"/pending-question-requests\", async (c) => {\n const response = await effectToResponse(\n c,\n ccvAskUserQuestionController.getPendingQuestionRequests(),\n );\n return response;\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 .post(\n \"/question-response\",\n zValidator(\n \"json\",\n z.object({\n questionRequestId: z.string(),\n answers: z.record(z.string(), z.string()),\n annotations: z.record(\n z.string(),\n z.object({\n notes: z.string().optional(),\n preview: z.string().optional(),\n }),\n ),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n ccvAskUserQuestionController.questionResponse({\n questionResponse: 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([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]);\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 effort: z.enum([\"low\", \"medium\", \"high\", \"max\"]).optional(),\n permissionMode: z.enum([\"acceptEdits\", \"bypassPermissions\", \"default\", \"plan\"]).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.ts\";\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>(s: S, t: T) =>\n dummyCtx.json(t, s);\ntype ResponseType<S extends ContentfulStatusCode, T extends object> = ReturnType<\n typeof dummyJson<S, T>\n>;\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 // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- complex Hono response type inference requires this cast\n return result2 as Ret;\n};\n", "import { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { FeatureFlagController } from \"../../core/feature-flag/presentation/FeatureFlagController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\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(\"/\"),\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 { NotificationController } from \"../../core/notification/presentation/NotificationController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\nconst pushSubscriptionSchema = z.object({\n endpoint: z.string(),\n keys: z.object({\n p256dh: z.string(),\n auth: z.string(),\n }),\n});\n\nconst notificationRoutes = Effect.gen(function* () {\n const notificationController = yield* NotificationController;\n\n return new Hono<HonoContext>()\n .get(\"/\", async (c) => {\n const response = await effectToResponse(c, notificationController.getNotifications());\n return response;\n })\n .post(\n \"/:sessionId/consume\",\n zValidator(\n \"json\",\n z\n .object({\n types: z\n .array(\n z.enum([\n \"session_paused\",\n \"session_completed\",\n \"permission_requested\",\n \"question_asked\",\n ]),\n )\n .optional(),\n })\n .optional(),\n ),\n async (c) => {\n const { sessionId } = c.req.param();\n const body = c.req.valid(\"json\");\n const response = await effectToResponse(\n c,\n notificationController.consumeNotifications({\n sessionId,\n types: body?.types,\n }),\n );\n return response;\n },\n )\n .get(\"/vapid-public-key\", async (c) => {\n const response = await effectToResponse(c, notificationController.getVapidPublicKey());\n return response;\n })\n .post(\"/push-subscription\", zValidator(\"json\", pushSubscriptionSchema), async (c) => {\n const subscription = c.req.valid(\"json\");\n const response = await effectToResponse(\n c,\n notificationController.subscribePush({ subscription }),\n );\n return response;\n });\n});\n\nexport { notificationRoutes };\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.ts\";\nimport { ClaudeCodeController } from \"../../core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { FileSystemController } from \"../../core/file-system/presentation/FileSystemController.ts\";\nimport { GitController } from \"../../core/git/presentation/GitController.ts\";\nimport { CommitRequestSchema } from \"../../core/git/schema.ts\";\nimport { ProjectController } from \"../../core/project/presentation/ProjectController.ts\";\nimport { SessionController } from \"../../core/session/presentation/SessionController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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(c, projectController.getProjects());\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.getSession({ projectId, sessionId }).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.deleteSession({ projectId, sessionId }).pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .get(\"/:projectId/sessions/:sessionId/agent-sessions\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const sessionId = c.req.param(\"sessionId\");\n const response = await effectToResponse(\n c,\n agentSessionController.listAgentSessions({\n projectId,\n sessionId,\n }),\n );\n return response;\n })\n\n /**\n * agent sessions\n */\n .get(\n \"/:projectId/agent-sessions/:agentId\",\n zValidator(\"query\", z.object({ sessionId: z.string().optional() })),\n async (c) => {\n const projectId = c.req.param(\"projectId\");\n const agentId = c.req.param(\"agentId\");\n const { sessionId } = c.req.valid(\"query\");\n const response = await effectToResponse(\n c,\n agentSessionController.getAgentSession({\n projectId,\n agentId,\n sessionId,\n }),\n );\n return response;\n },\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(\"/:projectId/git/commit\", zValidator(\"json\", CommitRequestSchema), 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 .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<typeof CommitAndPushResultSuccessSchema>;\nexport type CommitAndPushResultError = z.infer<typeof CommitAndPushResultErrorSchema>;\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.ts\";\nimport { newSchedulerJobSchema, updateSchedulerJobSchema } from \"../../core/scheduler/schema.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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(\"/jobs/:id\", zValidator(\"json\", updateSchedulerJobSchema), 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 .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.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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 !== undefined && 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.search({ query: q, limit, projectId }).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.ts\";\nimport { SSEController } from \"../../core/events/presentation/SSEController.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\n\nconst sseRoutes = Effect.gen(function* () {\n const sseController = yield* SSEController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>().get(\"/\", (c) => {\n return streamSSE(\n c,\n async (rawStream) => {\n await Runtime.runPromise(runtime)(\n sseController.handleSSE(rawStream).pipe(Effect.provide(TypeSafeSSE.make(rawStream))),\n );\n },\n async (err) => {\n await Runtime.runPromise(runtime)(Effect.logError(`Streaming error: ${String(err)}`));\n },\n );\n });\n});\n\nexport { sseRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { z } from \"zod\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../core/project/functions/id.ts\";\nimport { TasksController } from \"../../core/tasks/presentation/TasksController.ts\";\nimport { TaskCreateSchema, TaskUpdateSchema } from \"../../core/tasks/schema.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\n\nconst getClaudeProjectsDirPath = Effect.gen(function* () {\n const applicationContext = yield* ApplicationContext;\n const claudeCodePaths = yield* applicationContext.claudeCodePaths;\n return claudeCodePaths.claudeProjectsDirPath;\n});\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\n\n const response = await effectToResponse(\n c,\n tasksController.updateTask(projectPath, { ...body, taskId }, sessionId).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.ts\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../../core/platform/services/EnvService.ts\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService.ts\";\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 Effect, LogLevel, Logger } from \"effect\";\n\nexport const resolveLogLevel = (verbose: boolean | undefined) =>\n verbose === true ? LogLevel.Debug : LogLevel.Info;\n\nexport const serverLoggerLayer = Logger.replace(Logger.defaultLogger, Logger.prettyLogger());\n\nexport const withServerLogLevel =\n (verbose: boolean | undefined) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(Logger.withMinimumLogLevel(resolveLogLevel(verbose)));\n", "import type { IncomingMessage } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport type { ServerType } from \"@hono/node-server\";\nimport { Effect, Runtime } from \"effect\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { z } from \"zod\";\nimport { TerminalService } from \"../core/terminal/TerminalService.ts\";\nimport { AuthMiddleware } from \"../hono/middleware/auth.middleware.ts\";\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 === undefined || cookieHeader === \"\") return result;\n const parts = cookieHeader.split(\";\");\n for (const part of parts) {\n const [rawKey, ...rest] = part.trim().split(\"=\");\n if (rawKey === undefined || rawKey === \"\") continue;\n result[rawKey] = rest.join(\"=\");\n }\n return result;\n};\n\nconst clientMessageSchema = z.union([\n z.object({ type: z.literal(\"input\"), data: z.string() }),\n z.object({ type: z.literal(\"resize\"), cols: z.number(), rows: z.number() }),\n z.object({ type: z.literal(\"signal\"), name: z.string() }),\n z.object({ type: z.literal(\"sync\"), lastSeq: z.number() }),\n z.object({ type: z.literal(\"ping\") }),\n]);\n\nconst parseClientMessage = (payload: string): ClientMessage | undefined => {\n try {\n const result = clientMessageSchema.safeParse(JSON.parse(payload));\n return result.success ? result.data : undefined;\n } catch {\n return undefined;\n }\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: IncomingMessage, socket: Duplex, head: Buffer) => {\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 !== null && sessionIdParam.length > 0 ? sessionIdParam : undefined;\n const cwdParam = url.searchParams.get(\"cwd\");\n const cwd = cwdParam !== null && 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(terminalService.registerClient(session.id, ws)).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 === undefined || text === \"\") return;\n const message = parseClientMessage(text);\n if (!message) return;\n if (message.type === \"input\") {\n void runPromise(terminalService.writeInput(session.id, message.data));\n return;\n }\n if (message.type === \"resize\") {\n void runPromise(terminalService.resize(session.id, message.cols, message.rows));\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(terminalService.snapshotSince(session.id, message.lastSeq)).then(\n (snapshot) => {\n if (!snapshot) return;\n sendJson(ws, {\n type: \"snapshot\",\n seq: snapshot.seq,\n data: snapshot.data,\n });\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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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
|
|
6
|
-
"names": ["Command", "Effect", "FileSystem", "Path", "NodeContext", "Effect", "Layer", "Layer", "Path", "Context", "Effect", "Layer", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "index", "Effect", "Layer", "Effect", "getOptionalEnv", "Context", "Effect", "Layer", "Ref", "z", "LayerImpl", "Effect", "Ref", "Context", "Layer", "LayerImpl", "Effect", "Layer", "LayerImpl", "Effect", "Path", "content", "z", "Context", "Layer", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "
|
|
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/AgentNameEntrySchema.ts", "../src/lib/conversation-schema/entry/AgentSettingEntrySchema.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/ToolReferenceContentSchema.ts", "../src/lib/conversation-schema/content/ToolUseContentSchema.ts", "../src/lib/conversation-schema/entry/BaseEntrySchema.ts", "../src/lib/conversation-schema/entry/CustomTitleEntrySchema.ts", "../src/lib/conversation-schema/entry/FileHIstorySnapshotEntrySchema.ts", "../src/lib/conversation-schema/entry/LastPromptEntrySchema.ts", "../src/lib/conversation-schema/entry/PermissionModeEntrySchema.ts", "../src/lib/conversation-schema/entry/PrLinkEntrySchema.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/platform/services/ApplicationContext.ts", "../src/server/core/platform/services/CcvOptionsService.ts", "../src/server/core/platform/services/EnvService.ts", "../src/server/core/platform/schema.ts", "../src/server/core/project/functions/id.ts", "../src/server/core/session/functions/extractFirstUserText.ts", "../src/server/core/agent-session/presentation/AgentSessionController.ts", "../src/server/core/claude-code/infrastructure/SessionAllowlistRepository.ts", "../src/server/lib/db/DrizzleService.ts", "../src/server/lib/db/schema.ts", "../src/server/core/claude-code/presentation/CCVAskUserQuestionController.ts", "../src/server/core/claude-code/services/CCVAskUserQuestionService.ts", "../src/server/core/events/services/EventBus.ts", "../src/server/core/claude-code/presentation/ClaudeCodeController.ts", "../src/server/core/project/infrastructure/ProjectRepository.ts", "../src/server/core/project/services/ProjectMetaService.ts", "../src/server/core/sync/services/SyncService.ts", "../src/server/core/search/functions/extractSearchableText.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/id.ts", "../src/server/core/session/functions/isRegularSessionFile.ts", "../src/lib/claude-code/parseUserMessage.ts", "../src/server/core/session/functions/isValidFirstMessage.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/functions/permissionRule.ts", "../src/server/core/claude-code/services/ClaudeCodePermissionService.ts", "../src/server/core/claude-code/services/ProjectSettingsService.ts", "../src/server/core/claude-code/presentation/ClaudeCodeSessionProcessController.ts", "../src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts", "../src/lib/controllablePromise.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/services/GitService.ts", "../src/server/core/git/functions/text.ts", "../src/server/core/git/functions/parseGitBranchesOutput.ts", "../src/server/core/git/functions/parseGitCommitsOutput.ts", "../src/server/core/notification/presentation/NotificationController.ts", "../src/server/core/notification/services/NotificationService.ts", "../src/server/core/notification/services/pushError.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/platform/services/UserConfigService.ts", "../src/lib/i18n/localeDetection.ts", "../src/server/core/session/infrastructure/SessionRepository.ts", "../src/server/core/session/services/SessionMetaService.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/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/lib/config/userConfig.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/notificationRoutes.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/logging.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.ts\";\nimport { checkDeprecatedEnvs } from \"./core/platform/services/DeprecatedEnvDetector.ts\";\nimport { startServer } from \"./startServer.ts\";\n\nconst program = new Command();\n\nprogram.name(packageJson.name).version(packageJson.version).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(\"-v, --verbose\", \"enable verbose debug logging\")\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(\"--terminal-disabled\", \"disable the in-app terminal panel when enabled\")\n .option(\"--terminal-shell <path>\", \"shell executable for terminal sessions\")\n .option(\"--terminal-unrestricted\", \"disable restricted shell flags for bash sessions\")\n .option(\"--api-only\", \"run in API-only mode without Web UI\")\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 await program.parseAsync(process.argv);\n};\n\nmain().catch((error: unknown) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n", "{\n \"name\": \"@kimuson/claude-code-viewer\",\n \"version\": \"0.7.2\",\n \"description\": \"A full-featured web-based Claude Code client that provides complete interactive functionality for managing Claude Code projects.\",\n \"homepage\": \"https://github.com/d-kimuson/claude-code-viewer\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/d-kimuson/claude-code-viewer.git\"\n },\n \"bin\": {\n \"claude-code-viewer\": \"./dist/main.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"run-p 'dev:*'\",\n \"dev:frontend\": \"vite\",\n \"dev:backend\": \"CCV_ENV=development node --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-p 'lint:*'\",\n \"lint:oxlint\": \"oxlint --ignore-path .gitignore\",\n \"lint:oxfmt\": \"pnpm fix:oxfmt --check\",\n \"fix\": \"run-p 'fix:*'\",\n \"fix:oxlint\": \"pnpm lint:oxlint --fix\",\n \"fix:oxfmt\": \"oxfmt --ignore-path .gitignore --no-error-on-unmatched-pattern\",\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.90\",\n \"@anthropic-ai/claude-code\": \"2.1.90\",\n \"@anthropic-ai/sdk\": \"0.82.0\",\n \"@effect/cluster\": \"0.58.0\",\n \"@effect/experimental\": \"0.60.0\",\n \"@effect/platform\": \"0.96.0\",\n \"@effect/platform-node\": \"0.106.0\",\n \"@effect/rpc\": \"0.75.0\",\n \"@effect/sql\": \"0.51.0\",\n \"@effect/workflow\": \"0.18.0\",\n \"@hono/node-server\": \"1.19.12\",\n \"@hono/zod-validator\": \"0.7.6\",\n \"@hookform/resolvers\": \"5.2.2\",\n \"@lingui/core\": \"5.9.4\",\n \"@lingui/react\": \"5.9.4\",\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.7.0\",\n \"@tailwindcss/vite\": \"4.2.2\",\n \"@tanstack/react-devtools\": \"0.10.1\",\n \"@tanstack/react-query\": \"5.96.1\",\n \"@tanstack/react-router\": \"1.168.10\",\n \"@tanstack/react-router-devtools\": \"1.166.11\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"cmdk\": \"1.1.1\",\n \"commander\": \"14.0.3\",\n \"date-fns\": \"4.1.0\",\n \"drizzle-orm\": \"1.0.0-beta.20\",\n \"effect\": \"3.21.0\",\n \"es-toolkit\": \"1.45.1\",\n \"hono\": \"4.12.9\",\n \"jotai\": \"2.19.0\",\n \"lucide-react\": \"1.7.0\",\n \"parse-git-diff\": \"0.0.20\",\n \"picomatch\": \"^4.0.4\",\n \"prexit\": \"2.3.0\",\n \"radix-ui\": \"1.4.3\",\n \"react\": \"19.2.4\",\n \"react-dom\": \"19.2.4\",\n \"react-error-boundary\": \"6.1.1\",\n \"react-hook-form\": \"7.72.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"remark-gfm\": \"4.0.1\",\n \"sonner\": \"2.0.7\",\n \"tailwind-merge\": \"3.5.0\",\n \"ulid\": \"3.0.2\",\n \"web-push\": \"^3.6.7\",\n \"ws\": \"8.20.0\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@effect/language-service\": \"0.84.2\",\n \"@effect/vitest\": \"^0.29.0\",\n \"@lingui/cli\": \"5.9.4\",\n \"@lingui/conf\": \"5.9.4\",\n \"@lingui/format-json\": \"5.9.4\",\n \"@lingui/loader\": \"5.9.4\",\n \"@lingui/vite-plugin\": \"5.9.4\",\n \"@tailwindcss/postcss\": \"4.2.2\",\n \"@tanstack/router-plugin\": \"1.167.12\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/node\": \"25.5.0\",\n \"@types/picomatch\": \"^4.0.3\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@types/web-push\": \"^3.6.4\",\n \"@types/ws\": \"8.18.1\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260401.1\",\n \"@vitejs/plugin-react-swc\": \"4.3.0\",\n \"dotenv\": \"17.4.0\",\n \"drizzle-kit\": \"1.0.0-beta.20\",\n \"esbuild\": \"0.27.5\",\n \"gatecheck\": \"0.0.1-beta.5\",\n \"jsdom\": \"^29.0.1\",\n \"lefthook\": \"2.1.4\",\n \"npm-run-all2\": \"8.0.4\",\n \"oxfmt\": \"^0.43.0\",\n \"oxlint\": \"^1.58.0\",\n \"oxlint-tsgolint\": \"^0.19.0\",\n \"playwright\": \"1.59.1\",\n \"release-it\": \"19.2.4\",\n \"release-it-pnpm\": \"4.6.6\",\n \"tailwindcss\": \"4.2.2\",\n \"tw-animate-css\": \"1.4.0\",\n \"vite\": \"8.0.3\",\n \"vite-plugin-pwa\": \"^1.2.0\",\n \"vitest\": \"4.1.2\",\n \"workbox-build\": \"^7.4.0\",\n \"workbox-expiration\": \"^7.4.0\",\n \"workbox-precaching\": \"^7.4.0\",\n \"workbox-routing\": \"^7.4.0\",\n \"workbox-strategies\": \"^7.4.0\",\n \"workbox-window\": \"^7.4.0\"\n },\n \"engines\": {\n \"node\": \">=22.13.0\"\n },\n \"packageManager\": \"pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316\",\n \"pnpm\": {\n \"overrides\": {\n \"seroval\": \">=1.4.1\",\n \"tar\": \">=7.5.11\",\n \"undici\": \">=6.24.0\",\n \"serialize-javascript\": \">=7.0.3\",\n \"yaml\": \">=2.8.3\"\n }\n }\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\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:\n config.newEnv !== null\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:\n config.newEnv !== null\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(\" https://github.com/d-kimuson/claude-code-viewer#configuration\");\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 { FileSystem, Path } from \"@effect/platform\";\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/index.ts\";\nimport { AgentSessionController } from \"./core/agent-session/presentation/AgentSessionController.ts\";\nimport { SessionAllowlistRepository } from \"./core/claude-code/infrastructure/SessionAllowlistRepository.ts\";\nimport { CCVAskUserQuestionController } from \"./core/claude-code/presentation/CCVAskUserQuestionController.ts\";\nimport { ClaudeCodeController } from \"./core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { ClaudeCodePermissionController } from \"./core/claude-code/presentation/ClaudeCodePermissionController.ts\";\nimport { ClaudeCodeSessionProcessController } from \"./core/claude-code/presentation/ClaudeCodeSessionProcessController.ts\";\nimport { CCVAskUserQuestionService } from \"./core/claude-code/services/CCVAskUserQuestionService.ts\";\nimport { ClaudeCodeLifeCycleService } from \"./core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ClaudeCodePermissionService } from \"./core/claude-code/services/ClaudeCodePermissionService.ts\";\nimport { ClaudeCodeService } from \"./core/claude-code/services/ClaudeCodeService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"./core/claude-code/services/ClaudeCodeSessionProcessService.ts\";\nimport { ProjectSettingsService } from \"./core/claude-code/services/ProjectSettingsService.ts\";\nimport { SSEController } from \"./core/events/presentation/SSEController.ts\";\nimport { FileWatcherService } from \"./core/events/services/fileWatcher.ts\";\nimport { FeatureFlagController } from \"./core/feature-flag/presentation/FeatureFlagController.ts\";\nimport { FileSystemController } from \"./core/file-system/presentation/FileSystemController.ts\";\nimport { GitController } from \"./core/git/presentation/GitController.ts\";\nimport { GitService } from \"./core/git/services/GitService.ts\";\nimport { NotificationController } from \"./core/notification/presentation/NotificationController.ts\";\nimport { NotificationService } from \"./core/notification/services/NotificationService.ts\";\nimport { isDevelopmentEnv } from \"./core/platform/ccvEnv.ts\";\nimport type { CliOptions } from \"./core/platform/services/CcvOptionsService.ts\";\nimport { ProjectRepository } from \"./core/project/infrastructure/ProjectRepository.ts\";\nimport { ProjectController } from \"./core/project/presentation/ProjectController.ts\";\nimport { ProjectMetaService } from \"./core/project/services/ProjectMetaService.ts\";\nimport { RateLimitAutoScheduleService } from \"./core/rate-limit/services/RateLimitAutoScheduleService.ts\";\nimport { SchedulerConfigBaseDir } from \"./core/scheduler/config.ts\";\nimport { SchedulerService } from \"./core/scheduler/domain/Scheduler.ts\";\nimport { SchedulerController } from \"./core/scheduler/presentation/SchedulerController.ts\";\nimport { SearchController } from \"./core/search/presentation/SearchController.ts\";\nimport { SearchService } from \"./core/search/services/SearchService.ts\";\nimport { SessionRepository } from \"./core/session/infrastructure/SessionRepository.ts\";\nimport { SessionController } from \"./core/session/presentation/SessionController.ts\";\nimport { SessionMetaService } from \"./core/session/services/SessionMetaService.ts\";\nimport { SyncService } from \"./core/sync/services/SyncService.ts\";\nimport { TasksController } from \"./core/tasks/presentation/TasksController.ts\";\nimport { TasksService } from \"./core/tasks/services/TasksService.ts\";\nimport { TerminalService } from \"./core/terminal/TerminalService.ts\";\nimport { honoApp } from \"./hono/app.ts\";\nimport { InitializeService } from \"./hono/initialize.ts\";\nimport { AuthMiddleware } from \"./hono/middleware/auth.middleware.ts\";\nimport { routes } from \"./hono/routes/index.ts\";\nimport { DrizzleService } from \"./lib/db/DrizzleService.ts\";\nimport { platformLayer } from \"./lib/effect/layers.ts\";\nimport { serverLoggerLayer, withServerLogLevel } from \"./logging.ts\";\nimport { setupTerminalWebSocket } from \"./terminal/terminalWebSocket.ts\";\n\nexport const startServer = async (options: CliOptions) => {\n const runWithLogger = <A, E>(effect: Effect.Effect<A, E, never>) =>\n Effect.runPromise(\n effect.pipe(withServerLogLevel(options.verbose), Effect.provide(serverLoggerLayer)),\n );\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const isDevelopment = isDevelopmentEnv(process.env.CCV_ENV);\n const apiOnly = options.apiOnly === true;\n\n if (!isDevelopment && !apiOnly) {\n const staticPath = await Effect.runPromise(\n Effect.gen(function* () {\n const path = yield* Path.Path;\n return path.resolve(import.meta.dirname, \"static\");\n }).pipe(Effect.provide(NodeContext.layer)),\n );\n await runWithLogger(Effect.logInfo(`Serving static files from ${staticPath}`));\n const indexHtml = await Effect.runPromise(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* fs.readFileString(path.resolve(staticPath, \"index.html\"));\n }).pipe(Effect.provide(NodeContext.layer)),\n );\n\n honoApp.use(\n \"/*\",\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 return c.html(indexHtml);\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 if (!apiOnly) {\n yield* setupTerminalWebSocket(server);\n }\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\n (process.env.DEV_BE_PORT ?? \"3401\")\n : // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n (options.port ?? process.env.PORT ?? \"3000\");\n\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\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 = typeof info === \"object\" && info !== null ? info.port : port;\n const mode = apiOnly ? \" (API-only mode)\" : \"\";\n void runWithLogger(\n Effect.logInfo(`Server is running on http://${hostname}:${serverPort}${mode}`),\n );\n });\n};\n\nconst PlatformLayer = Layer.mergeAll(platformLayer, NodeContext.layer);\n\nconst InfraBasics = Layer.mergeAll(\n ProjectMetaService.Live,\n SessionMetaService.Live,\n SessionAllowlistRepository.Live,\n).pipe(Layer.provideMerge(SyncService.Live), Layer.provideMerge(DrizzleService.Live));\n\nconst InfraRepos = Layer.mergeAll(ProjectRepository.Live, SessionRepository.Live).pipe(\n Layer.provideMerge(InfraBasics),\n);\n\nconst InfraLayer = AgentSessionLayer.pipe(Layer.provideMerge(InfraRepos));\n\nconst DomainBase = Layer.mergeAll(\n CCVAskUserQuestionService.Live,\n ClaudeCodePermissionService.Live,\n ClaudeCodeSessionProcessService.Live,\n ClaudeCodeService.Live,\n GitService.Live,\n NotificationService.Live,\n SchedulerService.Live,\n SchedulerConfigBaseDir.Live,\n SearchService.Live,\n TasksService.Live,\n).pipe(Layer.provideMerge(ProjectSettingsService.Live));\n\nconst DomainLayer = ClaudeCodeLifeCycleService.Live.pipe(Layer.provideMerge(DomainBase));\n\nconst AppServices = Layer.mergeAll(\n FileWatcherService.Live,\n RateLimitAutoScheduleService.Live,\n AuthMiddleware.Live,\n TerminalService.Live,\n);\n\nconst ApplicationLayer = InitializeService.Live.pipe(Layer.provideMerge(AppServices));\n\nconst PresentationLayer = Layer.mergeAll(\n ProjectController.Live,\n SessionController.Live,\n AgentSessionController.Live,\n GitController.Live,\n ClaudeCodeController.Live,\n ClaudeCodeSessionProcessController.Live,\n CCVAskUserQuestionController.Live,\n ClaudeCodePermissionController.Live,\n FileSystemController.Live,\n SSEController.Live,\n NotificationController.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.ts\";\n\nexport { AgentSessionRepository } from \"./infrastructure/AgentSessionRepository.ts\";\nexport { AgentSessionController } from \"./presentation/AgentSessionController.ts\";\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 { z } from \"zod\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../project/functions/id.ts\";\nimport { extractFirstUserText } from \"../../session/functions/extractFirstUserText.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\n\nconst SAFE_AGENT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const appContext = yield* ApplicationContext;\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 // Validate agentId to prevent path traversal\n if (!SAFE_AGENT_ID_PATTERN.test(agentId)) {\n return yield* Effect.fail(new Error(\"Invalid agent ID: contains disallowed characters\"));\n }\n\n const projectPath = decodeProjectId(projectId);\n\n // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\n // Try new path if sessionId is provided\n if (sessionId !== undefined && sessionId !== \"\") {\n const newPath = path.resolve(projectPath, sessionId, \"subagents\", `agent-${agentId}.jsonl`);\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 /**\n * List all agent sessions for a given session.\n * Scans both legacy root directory and new subagents directory.\n */\n const listAgentSessionsForSession = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<{ agentId: string; firstMessage: string | null }[], Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n const results: { agentId: string; firstMessage: string | null }[] = [];\n\n const extractAgentId = (filename: string): string | null => {\n const match = /^agent-(.+)\\.jsonl$/.exec(filename);\n return match ? (match[1] ?? null) : null;\n };\n\n const processFile = (filePath: string, filename: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const agentId = extractAgentId(filename);\n if (agentId === null) return;\n\n const content = yield* fs.readFileString(filePath);\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") return;\n\n try {\n const conversations = parseJsonl(firstLine);\n const firstConv = conversations[0];\n const firstMessage = firstConv ? extractFirstUserText(firstConv) : null;\n results.push({ agentId, firstMessage });\n } catch {\n results.push({ agentId, firstMessage: null });\n }\n });\n\n // Check subagents directory: {project}/{sessionId}/subagents/\n const subagentsDir = path.join(projectPath, sessionId, \"subagents\");\n const subagentsDirExists = yield* fs.exists(subagentsDir);\n\n if (subagentsDirExists) {\n const entries = yield* fs\n .readDirectory(subagentsDir)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n const agentFiles = entries.filter((f) => f.startsWith(\"agent-\") && f.endsWith(\".jsonl\"));\n\n for (const filename of agentFiles) {\n yield* processFile(path.join(subagentsDir, filename), filename).pipe(\n Effect.catchAll(() => Effect.void),\n );\n }\n }\n\n // Check legacy root directory\n const rootEntries = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n const rootAgentFiles = rootEntries.filter(\n (f) => f.startsWith(\"agent-\") && f.endsWith(\".jsonl\"),\n );\n\n for (const filename of rootAgentFiles) {\n const filePath = path.join(projectPath, filename);\n // Only include if the first line's sessionId matches\n const content = yield* fs\n .readFileString(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") continue;\n\n try {\n const parsed: unknown = JSON.parse(firstLine);\n const sessionIdResult = z.object({ sessionId: z.string() }).safeParse(parsed);\n if (sessionIdResult.success && sessionIdResult.data.sessionId === sessionId) {\n yield* processFile(filePath, filename).pipe(Effect.catchAll(() => Effect.void));\n }\n } catch {\n // skip invalid files\n }\n }\n\n return results;\n });\n\n return {\n getAgentSessionByAgentId,\n listAgentSessionsForSession,\n };\n});\n\nexport class AgentSessionRepository extends Context.Tag(\"AgentSessionRepository\")<\n AgentSessionRepository,\n {\n readonly getAgentSessionByAgentId: (\n projectId: string,\n agentId: string,\n sessionId?: string,\n ) => Effect.Effect<ExtendedConversation[] | null, Error>;\n readonly listAgentSessionsForSession: (\n projectId: string,\n sessionId: string,\n ) => Effect.Effect<{ agentId: string; firstMessage: string | null }[], Error>;\n }\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n\nexport type IAgentSessionRepository = Context.Tag.Service<typeof AgentSessionRepository>;\n", "import { z } from \"zod\";\nimport { AgentNameEntrySchema } from \"./entry/AgentNameEntrySchema.ts\";\nimport { AgentSettingEntrySchema } from \"./entry/AgentSettingEntrySchema.ts\";\nimport { type AssistantEntry, AssistantEntrySchema } from \"./entry/AssistantEntrySchema.ts\";\nimport { CustomTitleEntrySchema } from \"./entry/CustomTitleEntrySchema.ts\";\nimport { FileHistorySnapshotEntrySchema } from \"./entry/FileHIstorySnapshotEntrySchema.ts\";\nimport { LastPromptEntrySchema } from \"./entry/LastPromptEntrySchema.ts\";\nimport { PermissionModeEntrySchema } from \"./entry/PermissionModeEntrySchema.ts\";\nimport { PrLinkEntrySchema } from \"./entry/PrLinkEntrySchema.ts\";\nimport { ProgressEntrySchema } from \"./entry/ProgressEntrySchema.ts\";\nimport { QueueOperationEntrySchema } from \"./entry/QueueOperationEntrySchema.ts\";\nimport { SummaryEntrySchema } from \"./entry/SummaryEntrySchema.ts\";\nimport { type SystemEntry, SystemEntrySchema } from \"./entry/SystemEntrySchema.ts\";\nimport { type UserEntry, UserEntrySchema } from \"./entry/UserEntrySchema.ts\";\n\nexport const ConversationSchema = z.union([\n UserEntrySchema,\n AssistantEntrySchema,\n SummaryEntrySchema,\n SystemEntrySchema,\n FileHistorySnapshotEntrySchema,\n QueueOperationEntrySchema,\n ProgressEntrySchema,\n CustomTitleEntrySchema,\n AgentNameEntrySchema,\n AgentSettingEntrySchema,\n PermissionModeEntrySchema,\n PrLinkEntrySchema,\n LastPromptEntrySchema,\n]);\n\nexport type Conversation = z.infer<typeof ConversationSchema>;\nexport type SidechainConversation = UserEntry | AssistantEntry | SystemEntry;\n", "import { z } from \"zod\";\n\nexport const AgentNameEntrySchema = z.object({\n type: z.literal(\"agent-name\"),\n agentName: z.string(),\n sessionId: z.string(),\n});\n\nexport type AgentNameEntry = z.infer<typeof AgentNameEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const AgentSettingEntrySchema = z.object({\n type: z.literal(\"agent-setting\"),\n agentSetting: z.string(),\n sessionId: z.string(),\n});\n\nexport type AgentSettingEntry = z.infer<typeof AgentSettingEntrySchema>;\n", "import { z } from \"zod\";\nimport { AssistantMessageSchema } from \"../message/AssistantMessageSchema.ts\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ThinkingContentSchema } from \"../content/ThinkingContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\nimport { ToolUseContentSchema } from \"../content/ToolUseContentSchema.ts\";\n\nconst AssistantMessageContentSchema = z.union([\n ThinkingContentSchema,\n TextContentSchema,\n ToolUseContentSchema,\n ToolResultContentSchema,\n]);\n\nexport type AssistantMessageContent = z.infer<typeof AssistantMessageContentSchema>;\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.ts\";\nimport { TextContentSchema } from \"./TextContentSchema.ts\";\nimport { ToolReferenceContentSchema } from \"./ToolReferenceContentSchema.ts\";\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, ToolReferenceContentSchema])),\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 ToolReferenceContentSchema = z.object({\n type: z.literal(\"tool_reference\"),\n tool_name: z.string(),\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 CustomTitleEntrySchema = z.object({\n type: z.literal(\"custom-title\"),\n customTitle: z.string(),\n sessionId: z.string(),\n});\n\nexport type CustomTitleEntry = z.infer<typeof CustomTitleEntrySchema>;\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<typeof FileHistorySnapshotEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const LastPromptEntrySchema = z.object({\n type: z.literal(\"last-prompt\"),\n lastPrompt: z.string(),\n sessionId: z.string(),\n});\n\nexport type LastPromptEntry = z.infer<typeof LastPromptEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const PermissionModeEntrySchema = z.object({\n type: z.literal(\"permission-mode\"),\n permissionMode: z.string(),\n sessionId: z.string(),\n});\n\nexport type PermissionModeEntry = z.infer<typeof PermissionModeEntrySchema>;\n", "import { z } from \"zod\";\n\nexport const PrLinkEntrySchema = z.object({\n type: z.literal(\"pr-link\"),\n sessionId: z.string(),\n prNumber: z.number(),\n prUrl: z.string(),\n prRepository: z.string(),\n timestamp: z.iso.datetime(),\n});\n\nexport type PrLinkEntry = z.infer<typeof PrLinkEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema.ts\";\nimport { TextContentSchema } from \"../content/TextContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\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\n .union([z.string(), z.array(z.union([z.string(), QueueOperationContentSchema]))])\n .optional(),\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.uuid(),\n});\n\nexport type SummaryEntry = z.infer<typeof SummaryEntrySchema>;\n", "import { z } from \"zod\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { BaseEntrySchema } from \"./BaseEntrySchema.ts\";\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.ts\";\nimport { ImageContentSchema } from \"../content/ImageContentSchema.ts\";\nimport { TextContentSchema } from \"../content/TextContentSchema.ts\";\nimport { ToolResultContentSchema } from \"../content/ToolResultContentSchema.ts\";\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([z.string(), z.array(z.union([z.string(), UserMessageContentSchema]))]),\n});\n", "import { ConversationSchema } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { ErrorJsonl, ExtendedConversation } from \"../../types.ts\";\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 // First, try to parse the JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n // Then validate with Zod schema\n const result = ConversationSchema.safeParse(parsed);\n if (!result.success) {\n const errorData: ErrorJsonl = {\n type: \"x-error\",\n line,\n lineNumber: index + 1,\n };\n return errorData;\n }\n\n return result.data;\n });\n};\n", "import { Path } from \"@effect/platform\";\nimport { Effect, Context as EffectContext, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { CcvOptionsService } from \"./CcvOptionsService.ts\";\nimport { EnvService } from \"./EnvService.ts\";\n\nexport type ClaudeCodePaths = {\n globalClaudeDirectoryPath: string;\n claudeCommandsDirPath: string;\n claudeSkillsDirPath: string;\n claudeAgentsDirPath: string;\n claudeProjectsDirPath: string;\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const ccvOptionsService = yield* CcvOptionsService;\n const envService = yield* EnvService;\n\n const claudeCodePaths = Effect.gen(function* () {\n const cliClaudeDir = yield* ccvOptionsService.getCcvOptions(\"claudeDir\");\n const homeDirectory = yield* envService.getEnv(\"HOME\");\n const globalClaudeDirectoryPath =\n cliClaudeDir === undefined\n ? path.resolve(homeDirectory ?? \"/\", \".claude\")\n : path.resolve(cliClaudeDir);\n\n return {\n globalClaudeDirectoryPath,\n claudeCommandsDirPath: path.resolve(globalClaudeDirectoryPath, \"commands\"),\n claudeSkillsDirPath: path.resolve(globalClaudeDirectoryPath, \"skills\"),\n claudeAgentsDirPath: path.resolve(globalClaudeDirectoryPath, \"agents\"),\n claudeProjectsDirPath: path.resolve(globalClaudeDirectoryPath, \"projects\"),\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.ts\";\n\nexport type CliOptions = {\n port: string;\n hostname: string;\n verbose?: boolean | undefined;\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 apiOnly?: boolean | undefined;\n};\n\nexport type CcvOptions = {\n port: number;\n hostname: string;\n verbose?: boolean | undefined;\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 apiOnly?: boolean | undefined;\n};\n\nconst getOptionalEnv = (key: string): string | undefined => {\n // biome-ignore lint/style/noProcessEnv: allow only here\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n return process.env[key] ?? undefined;\n};\n\nconst isFlagEnabled = (value: string | undefined) => {\n if (value === undefined || value === \"\") return false;\n return value === \"1\" || value.toLowerCase() === \"true\";\n};\n\nconst toCcvOptions = (cliOptions?: CliOptions): CcvOptions => {\n return {\n port: Number.parseInt(cliOptions?.port ?? getOptionalEnv(\"PORT\") ?? \"3000\", 10),\n hostname: cliOptions?.hostname ?? getOptionalEnv(\"HOSTNAME\") ?? \"localhost\",\n verbose:\n cliOptions?.verbose ?? (isFlagEnabled(getOptionalEnv(\"CCV_VERBOSE\")) ? true : undefined),\n password: cliOptions?.password ?? getOptionalEnv(\"CCV_PASSWORD\") ?? undefined,\n executable: cliOptions?.executable ?? getOptionalEnv(\"CCV_CC_EXECUTABLE_PATH\") ?? undefined,\n claudeDir: cliOptions?.claudeDir ?? getOptionalEnv(\"CCV_GLOBAL_CLAUDE_DIR\"),\n terminalDisabled:\n cliOptions?.terminalDisabled ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_DISABLED\")) ? true : undefined),\n terminalShell: cliOptions?.terminalShell ?? getOptionalEnv(\"CCV_TERMINAL_SHELL\") ?? undefined,\n terminalUnrestricted:\n cliOptions?.terminalUnrestricted ??\n (isFlagEnabled(getOptionalEnv(\"CCV_TERMINAL_UNRESTRICTED\")) ? true : undefined),\n apiOnly:\n cliOptions?.apiOnly ?? (isFlagEnabled(getOptionalEnv(\"CCV_API_ONLY\")) ? true : undefined),\n };\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvOptionsRef = yield* Ref.make<CcvOptions>(toCcvOptions());\n\n const loadCliOptions = (cliOptions: CliOptions) => {\n return Effect.gen(function* () {\n yield* Ref.update(ccvOptionsRef, () => toCcvOptions(cliOptions));\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 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 { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { type EnvSchema, envSchema } from \"../schema.ts\";\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const parsed = envSchema.safeParse(process.env);\n if (!parsed.success) {\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>(key: Key): 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(\"Unexpected error: Environment variables are not loaded\");\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 // oxlint-disable-next-line node/no-process-env -- configuration boundary\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\")<EnvService, IEnvService>() {\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.enum([\"development\", \"production\", \"test\"]).optional().default(\"development\"),\n NEXT_PHASE: z.string().optional(),\n HOME: 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", "const toPosixPath = (filePath: string): string => filePath.replaceAll(\"\\\\\", \"/\");\n\nconst getDirname = (filePath: string): string => {\n const normalized = toPosixPath(filePath);\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n if (lastSlashIndex === -1) {\n return \".\";\n }\n if (lastSlashIndex === 0) {\n return \"/\";\n }\n return normalized.slice(0, lastSlashIndex);\n};\n\nconst normalizeAbsolutePath = (inputPath: string): string => {\n const normalizedInput = toPosixPath(inputPath);\n const isAbsolute = normalizedInput.startsWith(\"/\");\n const rawSegments = normalizedInput.split(\"/\");\n const resolvedSegments: string[] = [];\n\n for (const segment of rawSegments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (resolvedSegments.length > 0) {\n resolvedSegments.pop();\n }\n continue;\n }\n resolvedSegments.push(segment);\n }\n\n const normalized = `${isAbsolute ? \"/\" : \"\"}${resolvedSegments.join(\"/\")}`;\n if (normalized === \"\") {\n return isAbsolute ? \"/\" : \".\";\n }\n return normalized;\n};\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(getDirname(sessionFilePath));\n};\n\n/**\n * Validates that a decoded project path is within the Claude projects directory.\n * Prevents path traversal attacks via crafted projectId values.\n */\nexport const validateProjectPath = (\n decodedPath: string,\n claudeProjectsDirPath: string,\n): boolean => {\n const normalizedPath = normalizeAbsolutePath(decodedPath);\n const normalizedBase = normalizeAbsolutePath(claudeProjectsDirPath);\n return normalizedPath.startsWith(`${normalizedBase}/`) || normalizedPath === normalizedBase;\n};\n", "import type { ExtendedConversation } from \"../../types.ts\";\n\nexport const extractFirstUserText = (conversation: ExtendedConversation): 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 { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { AgentSessionRepository } from \"../infrastructure/AgentSessionRepository.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const repository = yield* AgentSessionRepository;\n\n /**\n * Get agent session by agentId.\n * Directly reads agent-${agentId}.jsonl file without mapping service.\n */\n const getAgentSession = (params: { projectId: string; agentId: string; sessionId?: string }) =>\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 /**\n * List agent sessions for a given session.\n */\n const listAgentSessions = (params: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = params;\n const agentSessions = yield* repository.listAgentSessionsForSession(projectId, sessionId);\n\n return {\n status: 200,\n response: {\n agentSessions,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n getAgentSession,\n listAgentSessions,\n };\n});\n\nexport type IAgentSessionController = InferEffect<typeof LayerImpl>;\n\nexport class AgentSessionController extends Context.Tag(\"AgentSessionController\")<\n AgentSessionController,\n IAgentSessionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { z } from \"zod\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { sessions } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\n\nconst allowlistSchema = z.array(z.string());\n\nconst LayerImpl = Effect.gen(function* () {\n const { db } = yield* DrizzleService;\n\n const getAllowlist = (sessionId: string): Effect.Effect<readonly string[]> =>\n Effect.sync(() => {\n const row = db\n .select({ permissionAllowlistJson: sessions.permissionAllowlistJson })\n .from(sessions)\n .where(eq(sessions.id, sessionId))\n .get();\n\n if (row === undefined || row.permissionAllowlistJson === null) {\n return [];\n }\n\n try {\n const parsed = allowlistSchema.safeParse(JSON.parse(row.permissionAllowlistJson));\n return parsed.success ? parsed.data : [];\n } catch {\n return [];\n }\n });\n\n const addRule = (sessionId: string, rule: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n const current = yield* getAllowlist(sessionId);\n\n if (current.includes(rule)) {\n return;\n }\n\n const updated = [...current, rule];\n\n db.update(sessions)\n .set({ permissionAllowlistJson: JSON.stringify(updated) })\n .where(eq(sessions.id, sessionId))\n .run();\n });\n\n return {\n getAllowlist,\n addRule,\n };\n});\n\nexport type ISessionAllowlistRepository = InferEffect<typeof LayerImpl>;\n\nexport class SessionAllowlistRepository extends Context.Tag(\"SessionAllowlistRepository\")<\n SessionAllowlistRepository,\n ISessionAllowlistRepository\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "/* oxlint-disable no-restricted-imports */\n/* Exception: node:sqlite is required by drizzle node-sqlite driver. */\nimport { DatabaseSync } from \"node:sqlite\";\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { drizzle, type NodeSQLiteDatabase } from \"drizzle-orm/node-sqlite\";\nimport { migrate } from \"drizzle-orm/node-sqlite/migrator\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport * as schema from \"./schema.ts\";\n\nconst migrationsFolder = new URL(\"./migrations\", import.meta.url).pathname;\nconst FTS5_DDL = `\n CREATE VIRTUAL TABLE IF NOT EXISTS session_messages_fts USING fts5(\n session_id UNINDEXED,\n project_id UNINDEXED,\n role UNINDEXED,\n content,\n conversation_index UNINDEXED,\n tokenize='trigram'\n )\n`;\n\nconst initDbAtPath = (cacheDbPath: string): { db: DrizzleDb; rawDb: DatabaseSync } => {\n const sqlite = new DatabaseSync(cacheDbPath);\n sqlite.exec(\"PRAGMA journal_mode = WAL\");\n sqlite.exec(\"PRAGMA foreign_keys = ON\");\n\n const db = drizzle({ client: sqlite, schema });\n migrate(db, { migrationsFolder });\n sqlite.exec(FTS5_DDL);\n\n return { db, rawDb: sqlite };\n};\n\nexport type DrizzleDb = NodeSQLiteDatabase<typeof schema>;\n\nexport class DrizzleService extends Context.Tag(\"DrizzleService\")<\n DrizzleService,\n { readonly db: DrizzleDb; readonly rawDb: DatabaseSync }\n>() {\n static readonly Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const context = yield* ApplicationContext;\n const claudeCodePaths = yield* context.claudeCodePaths;\n\n const homeDirectory = path.dirname(claudeCodePaths.globalClaudeDirectoryPath);\n const dbDirPath = path.resolve(homeDirectory, \".claude-code-viewer\");\n const dbPath = path.resolve(dbDirPath, \"cache.db\");\n\n yield* fs.makeDirectory(dbDirPath, { recursive: true });\n\n const dbResult = yield* Effect.either(\n Effect.try({\n try: () => initDbAtPath(dbPath),\n catch: (error) => error,\n }),\n );\n\n if (dbResult._tag === \"Right\") {\n return dbResult.right;\n }\n\n const error = dbResult.left;\n yield* Effect.logWarning(\n `[DrizzleService] Migration failed, recreating cache DB: ${error instanceof Error ? error.message : String(error)}`,\n );\n\n try {\n new DatabaseSync(dbPath).close();\n } catch {\n // ignore\n }\n\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n yield* fs\n .remove(`${dbPath}${suffix}`, { force: true })\n .pipe(Effect.catchAll(() => Effect.void));\n }\n\n return initDbAtPath(dbPath);\n }),\n );\n}\n", "import { index, integer, real, sqliteTable, text } from \"drizzle-orm/sqlite-core\";\n\n// ---------------------------------------------------------------------------\n// projects\n// ---------------------------------------------------------------------------\n\nexport const projects = sqliteTable(\"projects\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\"),\n path: text(\"path\"),\n sessionCount: integer(\"session_count\").notNull().default(0),\n dirMtimeMs: integer(\"dir_mtime_ms\").notNull(),\n syncedAt: integer(\"synced_at\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// sessions\n// ---------------------------------------------------------------------------\n\nexport const sessions = sqliteTable(\n \"sessions\",\n {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n filePath: text(\"file_path\").notNull().unique(),\n messageCount: integer(\"message_count\").notNull().default(0),\n firstUserMessageJson: text(\"first_user_message_json\"),\n customTitle: text(\"custom_title\"),\n totalCostUsd: real(\"total_cost_usd\").notNull().default(0),\n costBreakdownJson: text(\"cost_breakdown_json\"),\n tokenUsageJson: text(\"token_usage_json\"),\n modelName: text(\"model_name\"),\n prLinksJson: text(\"pr_links_json\"),\n fileMtimeMs: integer(\"file_mtime_ms\").notNull(),\n lastModifiedAt: text(\"last_modified_at\").notNull(),\n syncedAt: integer(\"synced_at\").notNull(),\n permissionAllowlistJson: text(\"permission_allowlist_json\"),\n },\n (table) => [\n index(\"idx_sessions_project_id\").on(table.projectId),\n index(\"idx_sessions_file_mtime\").on(table.fileMtimeMs),\n ],\n);\n\n// ---------------------------------------------------------------------------\n// sync_state\n// ---------------------------------------------------------------------------\n\nexport const syncState = sqliteTable(\"sync_state\", {\n key: text(\"key\").primaryKey(),\n value: text(\"value\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// Inferred row types (for use outside drizzle query builder)\n// ---------------------------------------------------------------------------\n\nexport type ProjectRow = typeof projects.$inferSelect;\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type SyncStateRow = typeof syncState.$inferSelect;\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { QuestionResponse } from \"../../../../types/question.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { CCVAskUserQuestionService } from \"../services/CCVAskUserQuestionService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const ccvAskUserQuestionService = yield* CCVAskUserQuestionService;\n\n const questionResponse = (options: { questionResponse: QuestionResponse }) =>\n Effect.sync(() => {\n Effect.runFork(ccvAskUserQuestionService.respondToQuestion(options.questionResponse));\n\n return {\n status: 200,\n response: {\n message: \"Question response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n const getPendingQuestionRequests = () =>\n Effect.gen(function* () {\n const questionRequests = yield* ccvAskUserQuestionService.getPendingQuestionRequests;\n\n return {\n status: 200,\n response: {\n questionRequests,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n questionResponse,\n getPendingQuestionRequests,\n };\n});\n\nexport type ICCVAskUserQuestionController = InferEffect<typeof LayerImpl>;\nexport class CCVAskUserQuestionController extends Context.Tag(\"CCVAskUserQuestionController\")<\n CCVAskUserQuestionController,\n ICCVAskUserQuestionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import {\n createSdkMcpServer,\n type McpSdkServerConfigWithInstance,\n tool,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { Context, Deferred, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport { z } from \"zod\";\nimport type { QuestionRequest, QuestionResponse } from \"../../../../types/question.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingQuestionsRef = yield* Ref.make<Map<string, QuestionRequest>>(new Map());\n const deferredsRef = yield* Ref.make<Map<string, Deferred.Deferred<QuestionResponse, never>>>(\n new Map(),\n );\n const eventBus = yield* EventBus;\n\n const waitQuestionResponse = (request: QuestionRequest) =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<QuestionResponse, never>();\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.set(request.id, deferred);\n return next;\n });\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.set(request.id, request);\n return next;\n });\n\n yield* eventBus.emit(\"questionRequested\", {\n questionRequest: request,\n });\n\n const response = yield* Deferred.await(deferred);\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.delete(request.id);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.delete(request.id);\n return next;\n });\n\n return response;\n });\n\n const respondToQuestion = (response: QuestionResponse): Effect.Effect<void> =>\n Effect.gen(function* () {\n const deferreds = yield* Ref.get(deferredsRef);\n const deferred = deferreds.get(response.questionRequestId);\n\n if (deferred !== undefined) {\n // Look up the sessionId before deleting from the map\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n const request = pendingQuestions.get(response.questionRequestId);\n\n yield* Deferred.succeed(deferred, response);\n\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n next.delete(response.questionRequestId);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n next.delete(response.questionRequestId);\n return next;\n });\n\n if (request !== undefined) {\n yield* eventBus.emit(\"questionResolved\", {\n sessionId: request.sessionId,\n });\n }\n }\n });\n\n const createMcpServer = (options: {\n turnId: string;\n projectId: string;\n sessionId: string;\n }): McpSdkServerConfigWithInstance => {\n const { turnId, projectId, sessionId } = options;\n\n const questionInputSchema = {\n questions: z\n .array(\n z.object({\n question: z.string().describe(\"The question to ask\"),\n header: z.string().max(12).describe(\"Short label (max 12 chars)\"),\n options: z\n .array(\n z.object({\n label: z.string().describe(\"Display text (1-5 words)\"),\n description: z.string().describe(\"What this option means\"),\n preview: z.string().optional().describe(\"Optional preview content\"),\n }),\n )\n .min(2)\n .max(4),\n multiSelect: z.boolean().default(false),\n }),\n )\n .min(1)\n .max(4),\n };\n\n const ccvAskUserQuestionTool = tool(\n \"CCVAskUserQuestion\",\n \"Ask the user questions through the Claude Code Viewer web interface. This tool replaces AskUserQuestion for web-based sessions. Use this to:\\n1. Gather user preferences or requirements\\n2. Clarify ambiguous instructions\\n3. Get decisions on implementation choices\\n4. Offer choices about what direction to take.\\n\\nUsers can select from provided options or type custom input. Use multiSelect: true to allow multiple answers.\",\n questionInputSchema,\n async (args) => {\n const questionRequest: QuestionRequest = {\n id: ulid(),\n turnId,\n projectId,\n sessionId,\n questions: args.questions.map((q) => ({\n question: q.question,\n header: q.header,\n options: q.options.map((o) => ({\n label: o.label,\n description: o.description,\n preview: o.preview,\n })),\n multiSelect: q.multiSelect,\n })),\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(waitQuestionResponse(questionRequest));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(response.answers),\n },\n ],\n };\n },\n );\n\n return createSdkMcpServer({\n name: \"ccv-ask-user-question\",\n tools: [ccvAskUserQuestionTool],\n });\n };\n\n const cancelPendingRequests = (sessionId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n const deferreds = yield* Ref.get(deferredsRef);\n\n const matchingRequestIds: string[] = [];\n for (const [id, request] of pendingQuestions) {\n if (request.sessionId === sessionId) {\n matchingRequestIds.push(id);\n const deferred = deferreds.get(id);\n if (deferred !== undefined) {\n const emptyResponse: QuestionResponse = {\n questionRequestId: request.id,\n answers: {},\n annotations: {},\n };\n yield* Deferred.succeed(deferred, emptyResponse);\n }\n }\n }\n\n if (matchingRequestIds.length > 0) {\n yield* Ref.update(pendingQuestionsRef, (requests) => {\n const next = new Map(requests);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n }\n });\n\n const getPendingQuestionRequests = Effect.gen(function* () {\n const pendingQuestions = yield* Ref.get(pendingQuestionsRef);\n return [...pendingQuestions.values()];\n });\n\n return {\n waitQuestionResponse,\n respondToQuestion,\n createMcpServer,\n cancelPendingRequests,\n getPendingQuestionRequests,\n };\n});\n\nexport type ICCVAskUserQuestionService = InferEffect<typeof LayerImpl>;\n\nexport class CCVAskUserQuestionService extends Context.Tag(\"CCVAskUserQuestionService\")<\n CCVAskUserQuestionService,\n ICCVAskUserQuestionService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration.ts\";\n\ntype Listener<T> = (data: T) => void | Promise<void>;\n\nconst layerImpl = Effect.sync(() => {\n const listenersMap = new Map<keyof InternalEventDeclaration, Set<Listener<unknown>>>();\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- map guarantees correct type via event key\n return listenersMap.get(event) as Set<Listener<InternalEventDeclaration[EventName]>>;\n };\n\n const emit = <EventName extends keyof InternalEventDeclaration>(\n event: EventName,\n data: InternalEventDeclaration[EventName],\n ): Effect.Effect<void> =>\n Effect.sync(() => {\n const listeners = getListeners(event);\n\n void Promise.allSettled(\n Array.from(listeners).map(async (listener) => {\n await listener(data);\n }),\n ).then((results) => {\n for (const r of results) {\n if (r.status === \"rejected\") {\n Effect.runFork(\n Effect.logError(`[EventBus] listener error for \"${event}\": ${String(r.reason)}`),\n );\n }\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport {\n type CommandInfo,\n scanCommandFilesWithMetadata,\n scanSkillFilesWithMetadata,\n} from \"../functions/scanCommandFiles.ts\";\nimport * as ClaudeCodeVersion from \"../models/ClaudeCodeVersion.ts\";\nimport { ClaudeCodeService } from \"../services/ClaudeCodeService.ts\";\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((yield* context.claudeCodePaths).claudeSkillsDirPath)\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 globalAgents: CommandInfo[] = yield* scanCommandFilesWithMetadata(\n (yield* context.claudeCodePaths).claudeAgentsDirPath,\n );\n\n const projectAgents: CommandInfo[] =\n project.meta.projectPath === null\n ? []\n : yield* scanCommandFilesWithMetadata(\n path.resolve(project.meta.projectPath, \".claude\", \"agents\"),\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 globalAgents,\n projectAgents,\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- Object.entries preserves key type\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 { FileSystem } from \"@effect/platform\";\nimport { desc } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport type { Project } from \"../../types.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../functions/id.ts\";\nimport { ProjectMetaService } from \"../services/ProjectMetaService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const projectMetaService = yield* ProjectMetaService;\n const context = yield* ApplicationContext;\n const { db } = yield* DrizzleService;\n\n const getProject = (projectId: string) =>\n Effect.gen(function* () {\n const fullPath = decodeProjectId(projectId);\n\n // Validate that the decoded path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* context.claudeCodePaths;\n if (!validateProjectPath(fullPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\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 // Fetch all projects from DB ordered by dirMtimeMs DESC\n const rows = db.select().from(projects).orderBy(desc(projects.dirMtimeMs)).all();\n\n if (rows.length === 0) {\n return { projects: [] };\n }\n\n const projectsList: Project[] = yield* Effect.all(\n rows.map((row) =>\n Effect.gen(function* () {\n const meta = yield* projectMetaService.getProjectMeta(row.id);\n return {\n id: row.id,\n claudeProjectPath: row.path ?? decodeProjectId(row.id),\n lastModifiedAt: new Date(row.dirMtimeMs),\n meta,\n } satisfies Project;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return { projects: projectsList };\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 { Path } from \"@effect/platform\";\nimport { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { type ProjectRow, projects } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { ProjectMeta } from \"../../types.ts\";\n\nconst rowToProjectMeta = (row: ProjectRow, baseName: string): ProjectMeta => {\n const projectPath = row.path;\n const projectName = projectPath !== null ? baseName : null;\n\n return {\n projectName,\n projectPath,\n sessionCount: row.sessionCount,\n };\n};\n\nconst LayerImpl = Effect.gen(function* () {\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n const path = yield* Path.Path;\n\n const getProjectMeta = (projectId: string): Effect.Effect<ProjectMeta, Error> =>\n Effect.gen(function* () {\n const row = db.select().from(projects).where(eq(projects.id, projectId)).get();\n\n if (row === undefined) {\n // Not in DB yet \u2014 sync and retry\n yield* syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\n\n const retryRow = db.select().from(projects).where(eq(projects.id, projectId)).get();\n\n if (retryRow === undefined) {\n return yield* Effect.fail(new Error(`Project not found: ${projectId}`));\n }\n\n const baseName = retryRow.path !== null ? path.basename(retryRow.path) : \"\";\n return rowToProjectMeta(retryRow, baseName);\n }\n\n const baseName = row.path !== null ? path.basename(row.path) : \"\";\n return rowToProjectMeta(row, baseName);\n });\n\n const invalidateProject = (projectId: string): Effect.Effect<void> =>\n syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\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);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { count, eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { z } from \"zod\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects, sessions } from \"../../../lib/db/schema.ts\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, encodeProjectId } from \"../../project/functions/id.ts\";\nimport { extractSearchableText } from \"../../search/functions/extractSearchableText.ts\";\nimport { aggregateTokenUsageAndCost } from \"../../session/functions/aggregateTokenUsageAndCost.ts\";\nimport { getAgentSessionFilesForSession } from \"../../session/functions/getAgentSessionFilesForSession.ts\";\nimport { decodeSessionId, encodeSessionId } from \"../../session/functions/id.ts\";\nimport { isRegularSessionFile } from \"../../session/functions/isRegularSessionFile.ts\";\nimport { extractFirstUserMessage } from \"../../session/functions/isValidFirstMessage.ts\";\n\n// ---------------------------------------------------------------------------\n// SyncService interface\n// ---------------------------------------------------------------------------\n\nexport type ISyncService = {\n readonly fullSync: () => Effect.Effect<void, Error>;\n readonly syncSession: (projectId: string, sessionId: string) => Effect.Effect<void, Error>;\n readonly syncProjectList: (projectId: string) => Effect.Effect<void, Error>;\n};\n\n// ---------------------------------------------------------------------------\n// Helper: extract actualSessionId from the first line of a JSONL file\n// ---------------------------------------------------------------------------\n\nconst extractActualSessionId = (content: string): string | undefined => {\n const firstLine = content.split(\"\\n\")[0];\n if (firstLine === undefined || firstLine.trim() === \"\") {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(firstLine);\n const result = z.object({ sessionId: z.string() }).safeParse(parsed);\n if (result.success) {\n return result.data.sessionId;\n }\n } catch {\n // ignore parse errors\n }\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Helper: extract project cwd from JSONL content\n// The cwd field in JSONL entries represents the actual project working\n// directory, which is distinct from the Claude projects log directory.\n// ---------------------------------------------------------------------------\n\nconst extractCwdFromContent = (content: string): string | null => {\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const conversation = parseJsonl(line).at(0);\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 conversation.type === \"custom-title\" ||\n conversation.type === \"agent-name\" ||\n conversation.type === \"agent-setting\" ||\n conversation.type === \"pr-link\" ||\n conversation.type === \"last-prompt\" ||\n conversation.type === \"permission-mode\"\n ) {\n continue;\n }\n\n return conversation.cwd;\n }\n\n return null;\n};\n\n// ---------------------------------------------------------------------------\n// LayerImpl\n// ---------------------------------------------------------------------------\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const drizzleService = yield* DrizzleService;\n const appContext = yield* ApplicationContext;\n\n const { db, rawDb } = drizzleService;\n\n // -------------------------------------------------------------------------\n // Internal helper: extract project cwd\n // Tries sessions-index.json first (fast), falls back to parsing JSONL.\n // -------------------------------------------------------------------------\n\n const extractProjectCwd = (\n projectDirPath: string,\n sessionFileNames: string[],\n ): Effect.Effect<string | null, Error> =>\n Effect.gen(function* () {\n // 1. Try sessions-index.json (available in recent Claude Code versions)\n const indexPath = path.join(projectDirPath, \"sessions-index.json\");\n const indexContent = yield* fs\n .readFileString(indexPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (indexContent !== \"\") {\n try {\n const parsed: unknown = JSON.parse(indexContent);\n const indexSchema = z.object({\n entries: z.array(z.looseObject({ projectPath: z.string() })),\n });\n const indexResult = indexSchema.safeParse(parsed);\n if (indexResult.success) {\n for (const entry of indexResult.data.entries) {\n return entry.projectPath;\n }\n }\n } catch {\n // ignore parse errors, fall through to JSONL parsing\n }\n }\n\n // 2. Fallback: parse JSONL files (oldest first) for cwd field\n const fileEntries: Array<{ fullPath: string; mtimeMs: number }> = [];\n for (const fileName of sessionFileNames) {\n const fullPath = path.join(projectDirPath, fileName);\n const stat = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (stat) {\n const mtimeMs = Option.getOrElse(stat.mtime, () => new Date(0)).getTime();\n fileEntries.push({ fullPath, mtimeMs });\n }\n }\n\n fileEntries.sort((a, b) => a.mtimeMs - b.mtimeMs);\n\n for (const entry of fileEntries) {\n const content = yield* fs\n .readFileString(entry.fullPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n if (content === \"\") continue;\n\n const cwd = extractCwdFromContent(content);\n if (cwd !== null) {\n return cwd;\n }\n }\n\n return null;\n });\n\n // -------------------------------------------------------------------------\n // Internal helper: parse a JSONL file and upsert into DB\n // -------------------------------------------------------------------------\n\n const parseAndUpsertSession = (\n projectId: string,\n sessionId: string,\n filePath: string,\n fileMtimeMs: number,\n ): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const content = yield* fs\n .readFileString(filePath)\n .pipe(\n Effect.mapError(\n (e) => new Error(`Failed to read session file ${filePath}: ${e.message}`),\n ),\n );\n const conversations = parseJsonl(content);\n\n // Extract firstUserMessage\n let firstUserMessage = null;\n for (const conversation of conversations) {\n const msg = extractFirstUserMessage(conversation);\n if (msg !== undefined) {\n firstUserMessage = msg;\n break;\n }\n }\n\n // Extract custom title and PR links\n let customTitle: string | null = null;\n const prLinksMap = new Map<\n string,\n { prNumber: number; prUrl: string; prRepository: string }\n >();\n\n for (const conversation of conversations) {\n if (conversation.type === \"custom-title\") {\n customTitle = conversation.customTitle;\n }\n if (conversation.type === \"pr-link\") {\n const key = `${conversation.prRepository}#${conversation.prNumber}`;\n prLinksMap.set(key, {\n prNumber: conversation.prNumber,\n prUrl: conversation.prUrl,\n prRepository: conversation.prRepository,\n });\n }\n }\n const prLinks = [...prLinksMap.values()];\n\n // Extract actual sessionId from file content to find agent sessions\n const actualSessionId = extractActualSessionId(content);\n const projectPath = path.dirname(filePath);\n\n // Discover agent session files\n const agentFilePaths =\n actualSessionId !== undefined\n ? yield* getAgentSessionFilesForSession(projectPath, actualSessionId).pipe(\n Effect.provide(Layer.succeed(FileSystem.FileSystem, fs)),\n Effect.provide(Layer.succeed(Path.Path, path)),\n Effect.catchAll(() => Effect.succeed([] as string[])),\n )\n : [];\n\n // Read agent file contents\n const agentContents: string[] = [];\n for (const agentPath of agentFilePaths) {\n const agentContent = yield* fs\n .readFileString(agentPath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n if (agentContent !== \"\") {\n agentContents.push(agentContent);\n }\n }\n\n // Aggregate token usage and cost\n const { totalCost, modelName } = aggregateTokenUsageAndCost([content, ...agentContents]);\n\n const messageCount = content.split(\"\\n\").filter((line) => line.trim() !== \"\").length;\n\n const now = Date.now();\n\n // Get project directory mtime for updating project row\n const projectStat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n const projectDirMtimeMs = projectStat\n ? Option.getOrElse(projectStat.mtime, () => new Date(0)).getTime()\n : 0;\n\n // Build searchable texts for FTS\n const ftsEntries: Array<{\n role: string;\n content: string;\n index: number;\n }> = [];\n for (let i = 0; i < conversations.length; i++) {\n const conversation = conversations[i];\n if (conversation === undefined) continue;\n const text = extractSearchableText(conversation);\n if (text !== null && text.trim() !== \"\") {\n ftsEntries.push({\n role: conversation.type,\n content: text,\n index: i,\n });\n }\n }\n\n // Upsert within a transaction\n db.transaction((tx) => {\n // Upsert session row\n tx.insert(sessions)\n .values({\n id: sessionId,\n projectId,\n filePath,\n messageCount,\n firstUserMessageJson:\n firstUserMessage !== null ? JSON.stringify(firstUserMessage) : null,\n customTitle,\n totalCostUsd: totalCost.totalUsd,\n costBreakdownJson: JSON.stringify(totalCost.breakdown),\n tokenUsageJson: JSON.stringify(totalCost.tokenUsage),\n modelName,\n prLinksJson: prLinks.length > 0 ? JSON.stringify(prLinks) : null,\n fileMtimeMs,\n lastModifiedAt: new Date(fileMtimeMs).toISOString(),\n syncedAt: now,\n })\n .onConflictDoUpdate({\n target: sessions.id,\n set: {\n projectId,\n filePath,\n messageCount,\n firstUserMessageJson:\n firstUserMessage !== null ? JSON.stringify(firstUserMessage) : null,\n customTitle,\n totalCostUsd: totalCost.totalUsd,\n costBreakdownJson: JSON.stringify(totalCost.breakdown),\n tokenUsageJson: JSON.stringify(totalCost.tokenUsage),\n modelName,\n prLinksJson: prLinks.length > 0 ? JSON.stringify(prLinks) : null,\n fileMtimeMs,\n lastModifiedAt: new Date(fileMtimeMs).toISOString(),\n syncedAt: now,\n },\n })\n .run();\n\n // Delete old FTS entries for this session\n rawDb.prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\").run(sessionId);\n\n // Insert new FTS entries\n for (const entry of ftsEntries) {\n rawDb\n .prepare(\n `INSERT INTO session_messages_fts (session_id, project_id, role, content, conversation_index)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(sessionId, projectId, entry.role, entry.content, entry.index);\n }\n\n // Update project dir_mtime_ms\n tx.update(projects)\n .set({ dirMtimeMs: projectDirMtimeMs, syncedAt: now })\n .where(eq(projects.id, projectId))\n .run();\n });\n });\n\n // -------------------------------------------------------------------------\n // Internal helper: update project session_count\n // -------------------------------------------------------------------------\n\n const updateProjectSessionCount = (projectId: string): void => {\n const result = db\n .select({ cnt: count() })\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .get();\n const cnt = result?.cnt ?? 0;\n db.update(projects).set({ sessionCount: cnt }).where(eq(projects.id, projectId)).run();\n };\n\n // -------------------------------------------------------------------------\n // fullSync\n // -------------------------------------------------------------------------\n\n const fullSync = (): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n\n // Skip if projects directory doesn't exist\n const dirExists = yield* fs\n .exists(claudeProjectsDirPath)\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (!dirExists) {\n return;\n }\n\n // List project directories\n const projectDirs = yield* fs\n .readDirectory(claudeProjectsDirPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n\n // Get known projects from DB\n const knownProjects = db.select().from(projects).all();\n const knownProjectIds = new Set(knownProjects.map((p) => p.id));\n const seenProjectIds = new Set<string>();\n\n for (const dirName of projectDirs) {\n const projectPath = path.join(claudeProjectsDirPath, dirName);\n\n // Check if this is a directory\n const dirStat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!dirStat || dirStat.type !== \"Directory\") {\n continue;\n }\n\n const projectId = encodeProjectId(projectPath);\n seenProjectIds.add(projectId);\n\n const dirMtimeMs = Option.getOrElse(dirStat.mtime, () => new Date(0)).getTime();\n\n // Get current session file list from filesystem\n const fileNames = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n const sessionFiles = fileNames.filter(isRegularSessionFile);\n\n // Ensure project row exists\n const existingProject = knownProjects.find((p) => p.id === projectId);\n if (!existingProject) {\n // Extract actual project cwd from the earliest session file\n const projectCwd = yield* extractProjectCwd(projectPath, sessionFiles);\n\n db.insert(projects)\n .values({\n id: projectId,\n name: projectCwd !== null ? path.basename(projectCwd) : null,\n path: projectCwd,\n sessionCount: 0,\n dirMtimeMs,\n syncedAt: Date.now(),\n })\n .onConflictDoNothing()\n .run();\n }\n\n // Get known sessions for this project from DB\n const knownSessions = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .all();\n const knownSessionPaths = new Set(knownSessions.map((s) => s.filePath));\n const seenFilePaths = new Set<string>();\n\n for (const fileName of sessionFiles) {\n const filePath = path.join(projectPath, fileName);\n seenFilePaths.add(filePath);\n\n const fileStat = yield* fs\n .stat(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) continue;\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n\n // Check if new file or mtime changed\n const knownSession = knownSessions.find((s) => s.filePath === filePath);\n const isNew = !knownSessionPaths.has(filePath);\n const isModified = knownSession !== undefined && fileMtimeMs > knownSession.fileMtimeMs;\n\n if (isNew || isModified) {\n const sessionId = encodeSessionId(filePath);\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(\n `[SyncService] Failed to upsert session ${filePath}: ${String(e)}`,\n ),\n );\n return Effect.void;\n }),\n );\n }\n }\n\n // Delete sessions whose files no longer exist\n for (const knownSession of knownSessions) {\n if (!seenFilePaths.has(knownSession.filePath)) {\n db.delete(sessions).where(eq(sessions.filePath, knownSession.filePath)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\")\n .run(knownSession.id);\n }\n }\n\n updateProjectSessionCount(projectId);\n\n // Update project dir_mtime_ms and synced_at\n db.update(projects)\n .set({ dirMtimeMs, syncedAt: Date.now() })\n .where(eq(projects.id, projectId))\n .run();\n }\n\n // Delete projects that no longer exist on filesystem\n for (const knownProjectId of knownProjectIds) {\n if (!seenProjectIds.has(knownProjectId)) {\n db.delete(sessions).where(eq(sessions.projectId, knownProjectId)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE project_id = ?\")\n .run(knownProjectId);\n db.delete(projects).where(eq(projects.id, knownProjectId)).run();\n }\n }\n });\n\n // -------------------------------------------------------------------------\n // syncSession\n // -------------------------------------------------------------------------\n\n const syncSession = (projectId: string, sessionId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const filePath = decodeSessionId(projectId, sessionId);\n\n const fileStat = yield* fs.stat(filePath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) {\n // File no longer exists \u2014 remove from DB\n db.delete(sessions).where(eq(sessions.id, sessionId)).run();\n rawDb.prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\").run(sessionId);\n updateProjectSessionCount(projectId);\n return;\n }\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n\n // Check stored mtime\n const stored = db\n .select({ fileMtimeMs: sessions.fileMtimeMs })\n .from(sessions)\n .where(eq(sessions.id, sessionId))\n .get();\n\n if (stored !== undefined && fileMtimeMs <= stored.fileMtimeMs) {\n // No changes\n return;\n }\n\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs);\n updateProjectSessionCount(projectId);\n });\n\n // -------------------------------------------------------------------------\n // syncProjectList\n // -------------------------------------------------------------------------\n\n const syncProjectList = (projectId: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const projectPath = decodeProjectId(projectId);\n\n const dirExists = yield* fs\n .exists(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (!dirExists) {\n return;\n }\n\n const fileNames = yield* fs\n .readDirectory(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed([] as string[])));\n const sessionFiles = fileNames.filter(isRegularSessionFile);\n\n // Ensure project row exists (may be new since last fullSync)\n const existingProject = db.select().from(projects).where(eq(projects.id, projectId)).get();\n\n if (existingProject === undefined) {\n const projectCwd = yield* extractProjectCwd(projectPath, sessionFiles);\n\n const dirStat = yield* fs\n .stat(projectPath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n const dirMtimeMs = dirStat\n ? Option.getOrElse(dirStat.mtime, () => new Date(0)).getTime()\n : 0;\n\n db.insert(projects)\n .values({\n id: projectId,\n name: projectCwd !== null ? path.basename(projectCwd) : null,\n path: projectCwd,\n sessionCount: 0,\n dirMtimeMs,\n syncedAt: Date.now(),\n })\n .onConflictDoNothing()\n .run();\n }\n\n const knownSessions = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .all();\n const knownSessionPaths = new Set(knownSessions.map((s) => s.filePath));\n const seenFilePaths = new Set<string>();\n\n for (const fileName of sessionFiles) {\n const filePath = path.join(projectPath, fileName);\n seenFilePaths.add(filePath);\n\n if (!knownSessionPaths.has(filePath)) {\n // New file\n const fileStat = yield* fs\n .stat(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!fileStat) continue;\n\n const fileMtimeMs = Option.getOrElse(fileStat.mtime, () => new Date(0)).getTime();\n const sessionId = encodeSessionId(filePath);\n\n yield* parseAndUpsertSession(projectId, sessionId, filePath, fileMtimeMs).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(`[SyncService] Failed to upsert session ${filePath}: ${String(e)}`),\n );\n return Effect.void;\n }),\n );\n }\n }\n\n // Delete sessions whose files no longer exist\n for (const knownSession of knownSessions) {\n if (!seenFilePaths.has(knownSession.filePath)) {\n db.delete(sessions).where(eq(sessions.filePath, knownSession.filePath)).run();\n rawDb\n .prepare(\"DELETE FROM session_messages_fts WHERE session_id = ?\")\n .run(knownSession.id);\n }\n }\n\n updateProjectSessionCount(projectId);\n });\n\n return {\n fullSync,\n syncSession,\n syncProjectList,\n } satisfies ISyncService;\n});\n\n// ---------------------------------------------------------------------------\n// SyncService Tag\n// ---------------------------------------------------------------------------\n\nexport class SyncService extends Context.Tag(\"SyncService\")<SyncService, ISyncService>() {\n static readonly Live = Layer.effect(this, LayerImpl);\n}\n", "import type { Conversation } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\n\n/**\n * Extracts searchable text from a conversation entry.\n * Returns the user prompt or assistant response text.\n */\nexport const extractSearchableText = (conversation: ExtendedConversation): 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 if (conversation.type === \"custom-title\") {\n return conversation.customTitle;\n }\n\n if (conversation.type === \"agent-name\") {\n return null;\n }\n\n if (conversation.type === \"agent-setting\") {\n return null;\n }\n\n return null;\n};\n\nconst extractUserText = (entry: Extract<Conversation, { type: \"user\" }>): 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 = (entry: Extract<Conversation, { type: \"assistant\" }>): 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", "/**\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 = 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.ts\";\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 const 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 */\nconst 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 const calculateTokenCost = (usage: TokenUsage, modelName: string): 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 = (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 = 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.ts\";\nimport { calculateTokenCost, type TokenUsage } from \"./calculateSessionCost.ts\";\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 + totalOutputTokensUsd + totalCacheCreationUsd + 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 === undefined || firstLine.trim() === \"\") {\n return false;\n }\n\n try {\n const firstLineData: unknown = 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 if (!(\"sessionId\" in firstLineData)) return false;\n const sid: unknown = firstLineData.sessionId;\n return sid === expectedSessionId;\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) => 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) => 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 { decodeProjectId } from \"../../project/functions/id.ts\";\n\nconst SESSION_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nconst toPosixPath = (filePath: string): string => filePath.replaceAll(\"\\\\\", \"/\");\n\nconst getBasename = (filePath: string): string => {\n const normalized = toPosixPath(filePath);\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n return lastSlashIndex === -1 ? normalized : normalized.slice(lastSlashIndex + 1);\n};\n\nconst stripExtension = (fileName: string): string => {\n const lastDotIndex = fileName.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n return fileName;\n }\n return fileName.slice(0, lastDotIndex);\n};\n\nconst joinPath = (basePath: string, childPath: string): string => {\n const normalizedBase = toPosixPath(basePath).replace(/\\/+$/u, \"\");\n if (normalizedBase === \"\") {\n return `/${childPath}`;\n }\n return `${normalizedBase}/${childPath}`;\n};\n\nexport const encodeSessionId = (jsonlFilePath: string) => {\n return stripExtension(getBasename(jsonlFilePath));\n};\n\n/**\n * Validates that a sessionId contains only safe characters (alphanumeric, hyphens, underscores).\n * Prevents path traversal attacks via crafted sessionId values.\n */\nexport const validateSessionId = (sessionId: string): boolean => {\n return SESSION_ID_PATTERN.test(sessionId);\n};\n\nexport const decodeSessionId = (projectId: string, sessionId: string) => {\n const projectPath = decodeProjectId(projectId);\n return joinPath(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 { 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((match) => match.tag === \"command-name\")?.content;\n const commandArgs = matches.find((match) => match.tag === \"command-args\")?.content;\n const commandMessage = matches.find((match) => match.tag === \"command-message\")?.content;\n const localCommandStdout = matches.find((match) => match.tag === \"local-command-stdout\")?.content;\n\n // oxlint-disable-next-line typescript-eslint/switch-exhaustiveness-check -- switch(true) pattern with default case\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 {\n type ParsedUserMessage,\n parseUserMessage,\n} from \"../../claude-code/functions/parseUserMessage.ts\";\nimport type { ExtendedConversation } from \"../../types.ts\";\nimport { extractFirstUserText } from \"./extractFirstUserText.ts\";\n\nconst ignoreCommands = [\"/clear\", \"/login\", \"/logout\", \"/exit\", \"/mcp\", \"/memory\"];\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 = /<local-command-caveat>[\\s\\S]*?<\\/local-command-caveat>/;\n\nexport const isLocalCommandCaveat = (text: string) => {\n return text === localCommandCaveatText || localCommandCaveatPattern.test(text);\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 (command.kind === \"command\" && ignoreCommands.includes(command.commandName)) {\n return undefined;\n }\n\n if (command.kind === \"local-command\" && command.stdout.trim() === \"\") {\n return undefined;\n }\n\n return command;\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] === undefined || 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(/^description:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m);\n const description = descriptionMatch?.[1]?.trim() ?? null;\n\n // Extract argument-hint field\n const argumentHintMatch = frontmatter.match(/^argument-hint:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*$/m);\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 = (filePath: string, baseDir: string): string => {\n // Normalize base directory by removing trailing slash\n const normalizedBaseDir = baseDir.endsWith(\"/\") ? baseDir.slice(0, -1) : 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<string[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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<CommandInfo[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 } = 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<string[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 ? `${relativePath}/${item}` : 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<CommandInfo[], PlatformError, FileSystem.FileSystem | Path.Path> =>\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 } = 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 ? `${relativePath}/${item}` : 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) => [data.major, data.minor, data.patch].every((value) => !Number.isNaN(value)));\n\nexport type ClaudeCodeVersion = z.infer<typeof versionSchema>;\n\nexport const fromCLIString = (versionOutput: string): 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 && (a.minor > b.minor || (a.minor === b.minor && a.patch > b.patch)));\n\nexport const greaterThanOrEqual = (a: ClaudeCodeVersion, b: ClaudeCodeVersion) =>\n equals(a, b) || greaterThan(a, b);\n", "import { Context, Data, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { parseMcpListOutput } from \"../functions/parseMcpListOutput.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\n\nclass ProjectPathNotFoundError extends Data.TaggedError(\"ProjectPathNotFoundError\")<{\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(config.claudeCodeVersion);\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(project.meta.projectPath);\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 type 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.ts\";\nimport * as ClaudeCodeVersion from \"./ClaudeCodeVersion.ts\";\n\ntype AgentSdkQuery = typeof agentSdk.query;\ntype AgentSdkPrompt = Parameters<AgentSdkQuery>[0][\"prompt\"];\ntype AgentSdkQueryOptions = NonNullable<Parameters<AgentSdkQuery>[0][\"options\"]>;\n\nconst npxCacheRegExp = /_npx[/\\\\].*node_modules[\\\\/]\\.bin/;\nconst localNodeModulesBinRegExp = new RegExp(`${process.cwd()}/node_modules/.bin`);\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(\"ClaudeCodePathNotFoundError\")<{\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 = 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(Command.make(\"which\", \"-a\", \"claude\")).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(claudeCodeExecutablePath, \"mcp\", \"list\").pipe(\n Command.workingDirectory(projectCwd),\n ),\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 = (prompt: AgentSdkPrompt, options: AgentSdkQueryOptions) => {\n const {\n canUseTool,\n permissionMode,\n hooks: _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 !== undefined ? { systemPrompt } : {}),\n ...(settingSources !== undefined ? { settingSources } : {}),\n pathToClaudeCodeExecutable: claudeCodeExecutablePath,\n disallowedTools: [\"AskUserQuestion\", ...(baseOptions.disallowedTools ?? [])], // 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 { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { PermissionResponse } from \"../../../../types/permissions.ts\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects } from \"../../../lib/db/schema.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { generatePermissionRule } from \"../functions/permissionRule.ts\";\nimport { ClaudeCodePermissionService } from \"../services/ClaudeCodePermissionService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodePermissionService = yield* ClaudeCodePermissionService;\n const { db } = yield* DrizzleService;\n\n const permissionResponse = (options: { permissionResponse: PermissionResponse }) =>\n Effect.sync(() => {\n const { permissionResponse } = options;\n\n Effect.runFork(claudeCodePermissionService.respondToPermissionRequest(permissionResponse));\n\n return {\n status: 200,\n response: {\n message: \"Permission response received\",\n },\n } as const satisfies ControllerResponse;\n });\n\n const getPendingPermissionRequests = () =>\n Effect.gen(function* () {\n const permissionRequests = yield* claudeCodePermissionService.getPendingPermissionRequests;\n\n return {\n status: 200,\n response: {\n permissionRequests,\n },\n } as const satisfies ControllerResponse;\n });\n\n const generatePermissionRuleForTool = (options: {\n toolName: string;\n toolInput: Record<string, unknown>;\n projectId: string;\n }) =>\n Effect.sync(() => {\n const { toolName, toolInput, projectId } = options;\n\n // Resolve projectId to the actual project working directory\n const row = db\n .select({ path: projects.path })\n .from(projects)\n .where(eq(projects.id, projectId))\n .get();\n\n const projectCwd = row?.path ?? null;\n if (projectCwd === null) {\n // Can't relativize paths without project cwd, return tool name only as fallback\n return {\n status: 200,\n response: {\n rule: toolName,\n },\n } as const satisfies ControllerResponse;\n }\n const rule = generatePermissionRule(toolName, toolInput, projectCwd);\n\n return {\n status: 200,\n response: {\n rule,\n },\n } as const satisfies ControllerResponse;\n });\n\n return {\n permissionResponse,\n getPendingPermissionRequests,\n generatePermissionRuleForTool,\n };\n});\n\nexport type IClaudeCodePermissionController = InferEffect<typeof LayerImpl>;\nexport class ClaudeCodePermissionController extends Context.Tag(\"ClaudeCodePermissionController\")<\n ClaudeCodePermissionController,\n IClaudeCodePermissionController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import picomatch from \"picomatch\";\n\ntype ParsedRule = {\n readonly toolPattern: string;\n readonly specifier: string | undefined;\n};\n\nconst FILE_PATH_TOOLS = [\"Edit\", \"Write\", \"Read\", \"MultiEdit\"] as const;\n\nconst isFilePathTool = (toolName: string): boolean =>\n FILE_PATH_TOOLS.some((t) => t.toLowerCase() === toolName.toLowerCase());\n\n/**\n * Parse a permission rule string into its tool pattern and optional specifier.\n * Examples:\n * \"Bash\" \u2192 { toolPattern: \"Bash\", specifier: undefined }\n * \"Bash(git status)\" \u2192 { toolPattern: \"Bash\", specifier: \"git status\" }\n */\nexport const parsePermissionRule = (rule: string): ParsedRule => {\n const parenIndex = rule.indexOf(\"(\");\n if (parenIndex === -1) {\n return { toolPattern: rule, specifier: undefined };\n }\n const toolPattern = rule.slice(0, parenIndex);\n // Strip the trailing \")\"\n const specifier = rule.slice(parenIndex + 1, -1);\n return { toolPattern, specifier };\n};\n\n/**\n * Generate a permission rule string from a tool invocation.\n */\nexport const generatePermissionRule = (\n toolName: string,\n toolInput: Record<string, unknown>,\n projectCwd: string,\n): string => {\n if (toolName.toLowerCase() === \"bash\") {\n const command = toolInput[\"command\"];\n if (typeof command === \"string\" && command.length > 0) {\n return `${toolName}(${command})`;\n }\n return toolName;\n }\n\n if (isFilePathTool(toolName)) {\n const filePath = toolInput[\"file_path\"];\n if (typeof filePath === \"string\" && filePath.length > 0) {\n if (filePath.startsWith(projectCwd + \"/\")) {\n // File is inside project - make path relative to project root\n const relativePath = filePath.slice(projectCwd.length);\n return `${toolName}(${relativePath})`;\n }\n // File is outside project - use absolute path as-is\n return `${toolName}(${filePath})`;\n }\n return toolName;\n }\n\n // MCP tools and other generic tools: return tool name only\n return toolName;\n};\n\nconst getSpecifierValue = (\n toolName: string,\n toolInput: Record<string, unknown>,\n): string | undefined => {\n if (toolName.toLowerCase() === \"bash\") {\n const command = toolInput[\"command\"];\n return typeof command === \"string\" ? command : undefined;\n }\n\n if (isFilePathTool(toolName)) {\n const filePath = toolInput[\"file_path\"];\n if (typeof filePath === \"string\") {\n return filePath;\n }\n return undefined;\n }\n\n return undefined;\n};\n\n/**\n * Relativize a file path for matching against a rule specifier.\n * In-project files: strip project root to get \"/src/foo.ts\" form.\n * Out-of-project files: keep absolute path as-is \"/tmp/foo.ts\".\n */\nconst relativizeFilePath = (filePath: string, projectCwd: string): string => {\n if (filePath.startsWith(projectCwd + \"/\")) {\n return filePath.slice(projectCwd.length);\n }\n return filePath;\n};\n\n/**\n * Match a permission rule against a tool invocation.\n */\nexport const matchPermissionRule = (\n rule: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n projectCwd: string,\n): boolean => {\n const parsed = parsePermissionRule(rule);\n\n // Check tool name match (with glob support for MCP wildcards)\n const toolMatches = picomatch.isMatch(toolName, parsed.toolPattern, {\n nocase: true,\n });\n if (!toolMatches) {\n return false;\n }\n\n // No specifier means match all invocations of this tool\n if (parsed.specifier === undefined || parsed.specifier === \"*\") {\n return true;\n }\n\n // For file path tools, relativize and match\n if (isFilePathTool(toolName)) {\n const filePath = toolInput[\"file_path\"];\n if (typeof filePath !== \"string\") {\n return false;\n }\n const relativized = relativizeFilePath(filePath, projectCwd);\n return picomatch.isMatch(relativized, parsed.specifier, { dot: true });\n }\n\n // For Bash and other tools, match the specifier value directly\n const value = getSpecifierValue(toolName, toolInput);\n if (value === undefined) {\n return false;\n }\n\n return picomatch.isMatch(value, parsed.specifier);\n};\n\n/**\n * Check if any rule in the list matches the tool invocation.\n */\nexport const matchAnyRule = (\n rules: readonly string[],\n toolName: string,\n toolInput: Record<string, unknown>,\n projectCwd: string,\n): boolean => rules.some((rule) => matchPermissionRule(rule, toolName, toolInput, projectCwd));\n", "import type { CanUseTool, PermissionMode } from \"@anthropic-ai/claude-agent-sdk\";\nimport { eq } from \"drizzle-orm\";\nimport { Context, Deferred, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { PermissionRequest, PermissionResponse } from \"../../../../types/permissions.ts\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { matchAnyRule } from \"../functions/permissionRule.ts\";\nimport { SessionAllowlistRepository } from \"../infrastructure/SessionAllowlistRepository.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\nimport { ProjectSettingsService } from \"./ProjectSettingsService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const pendingPermissionRequestsRef = yield* Ref.make<Map<string, PermissionRequest>>(new Map());\n const deferredsRef = yield* Ref.make<Map<string, Deferred.Deferred<PermissionResponse, never>>>(\n new Map(),\n );\n const eventBus = yield* EventBus;\n const sessionAllowlistRepository = yield* SessionAllowlistRepository;\n const projectSettingsService = yield* ProjectSettingsService;\n const { db } = yield* DrizzleService;\n\n /**\n * Resolve a projectId to the actual project working directory path.\n * Returns null if the project is not found or has no path stored.\n */\n const resolveProjectCwd = (projectId: string): Effect.Effect<string | null> =>\n Effect.sync(() => {\n const row = db\n .select({ path: projects.path })\n .from(projects)\n .where(eq(projects.id, projectId))\n .get();\n return row?.path ?? null;\n });\n\n const waitPermissionResponse = (request: PermissionRequest) =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<PermissionResponse, never>();\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.set(request.id, deferred);\n return next;\n });\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.set(request.id, request);\n return next;\n });\n\n yield* eventBus.emit(\"permissionRequested\", {\n permissionRequest: request,\n });\n\n const response = yield* Deferred.await(deferred);\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.delete(request.id);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (deferreds) => {\n const next = new Map(deferreds);\n next.delete(request.id);\n return next;\n });\n\n return response;\n });\n\n const createCanUseToolRelatedOptions = (options: {\n turnId: string;\n projectId: string;\n permissionMode?: PermissionMode;\n sessionId: string;\n }) => {\n const { turnId, projectId, sessionId } = options;\n const permissionMode = options.permissionMode ?? \"default\";\n\n return Effect.gen(function* () {\n const claudeCodeConfig = yield* ClaudeCode.Config;\n\n if (!ClaudeCode.getAvailableFeatures(claudeCodeConfig.claudeCodeVersion).canUseTool) {\n return {\n permissionMode: \"bypassPermissions\",\n } as const;\n }\n\n const canUseTool: CanUseTool = async (toolName, toolInput, _options) => {\n if (permissionMode !== \"default\") {\n // Convert Claude Code permission modes to canUseTool behaviors\n if (permissionMode === \"bypassPermissions\" || permissionMode === \"acceptEdits\") {\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 // Check session allowlist for auto-approve before prompting the user\n const allowlist = await Effect.runPromise(\n sessionAllowlistRepository.getAllowlist(sessionId),\n );\n if (allowlist.length > 0) {\n const projectCwd = await Effect.runPromise(resolveProjectCwd(projectId));\n if (projectCwd !== null && matchAnyRule(allowlist, toolName, toolInput, projectCwd)) {\n return {\n behavior: \"allow\" as const,\n updatedInput: toolInput,\n };\n }\n }\n\n const permissionRequest: PermissionRequest = {\n id: ulid(),\n turnId,\n projectId,\n sessionId,\n toolName,\n toolInput,\n timestamp: Date.now(),\n };\n\n const response = await Effect.runPromise(waitPermissionResponse(permissionRequest));\n\n if (response.decision === \"allow\" || response.decision === \"always_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,\n } as const;\n });\n };\n\n const respondToPermissionRequest = (response: PermissionResponse): Effect.Effect<void> =>\n Effect.gen(function* () {\n const deferreds = yield* Ref.get(deferredsRef);\n const deferred = deferreds.get(response.permissionRequestId);\n\n if (deferred !== undefined) {\n // Look up the sessionId before deleting from the map\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n const request = pendingRequests.get(response.permissionRequestId);\n\n // Handle always_allow: persist the rule, then resolve as \"allow\"\n if (\n response.decision === \"always_allow\" &&\n request !== undefined &&\n response.alwaysAllowRule !== undefined\n ) {\n const rule = response.alwaysAllowRule;\n\n if (response.alwaysAllowScope === \"session\") {\n yield* sessionAllowlistRepository.addRule(request.sessionId, rule);\n } else if (response.alwaysAllowScope === \"project\") {\n const projectPath = yield* resolveProjectCwd(request.projectId);\n if (projectPath !== null) {\n yield* projectSettingsService.addProjectPermissionRule(projectPath, rule).pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logWarning(\n `Failed to persist project permission rule, falling back to session: ${String(error)}`,\n );\n yield* sessionAllowlistRepository.addRule(request.sessionId, rule);\n }),\n ),\n );\n } else {\n // Project path not found \u2014 fall back to session-level storage\n yield* sessionAllowlistRepository.addRule(request.sessionId, rule);\n }\n }\n }\n\n // Resolve the deferred \u2014 convert always_allow to allow for the SDK\n yield* Deferred.succeed(deferred, response);\n\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n next.delete(response.permissionRequestId);\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n next.delete(response.permissionRequestId);\n return next;\n });\n\n if (request !== undefined) {\n yield* eventBus.emit(\"permissionResolved\", {\n sessionId: request.sessionId,\n });\n }\n }\n });\n\n const cancelPendingRequests = (sessionId: string): Effect.Effect<void> =>\n Effect.gen(function* () {\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n const deferreds = yield* Ref.get(deferredsRef);\n\n const matchingRequestIds: string[] = [];\n for (const [id, request] of pendingRequests) {\n if (request.sessionId === sessionId) {\n matchingRequestIds.push(id);\n const deferred = deferreds.get(id);\n if (deferred !== undefined) {\n const denyResponse: PermissionResponse = {\n permissionRequestId: request.id,\n decision: \"deny\",\n };\n yield* Deferred.succeed(deferred, denyResponse);\n }\n }\n }\n\n if (matchingRequestIds.length > 0) {\n yield* Ref.update(pendingPermissionRequestsRef, (requests) => {\n const next = new Map(requests);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n\n yield* Ref.update(deferredsRef, (ds) => {\n const next = new Map(ds);\n for (const id of matchingRequestIds) {\n next.delete(id);\n }\n return next;\n });\n }\n });\n\n const getPendingPermissionRequests = Effect.gen(function* () {\n const pendingRequests = yield* Ref.get(pendingPermissionRequestsRef);\n return [...pendingRequests.values()];\n });\n\n return {\n createCanUseToolRelatedOptions,\n respondToPermissionRequest,\n cancelPendingRequests,\n getPendingPermissionRequests,\n };\n});\n\nexport type IClaudeCodePermissionService = InferEffect<typeof LayerImpl>;\n\nexport class ClaudeCodePermissionService extends Context.Tag(\"ClaudeCodePermissionService\")<\n ClaudeCodePermissionService,\n IClaudeCodePermissionService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const addProjectPermissionRule = (projectPath: string, rule: string) =>\n Effect.gen(function* () {\n const claudeDir = path.join(projectPath, \".claude\");\n const settingsPath = path.join(claudeDir, \"settings.local.json\");\n\n // Read existing file or start with empty object\n const data: Record<string, unknown> = yield* Effect.gen(function* () {\n const exists = yield* fs.exists(settingsPath);\n if (!exists) {\n return {};\n }\n\n const content = yield* fs.readFileString(settingsPath);\n const parsed: unknown = yield* Effect.try({\n try: (): unknown => JSON.parse(content),\n catch: () => undefined,\n }).pipe(Effect.catchAll(() => Effect.succeed(undefined)));\n\n if (isRecord(parsed)) {\n return { ...parsed };\n }\n return {};\n });\n\n // Navigate/create permissions object\n const permissions: Record<string, unknown> = isRecord(data.permissions)\n ? { ...data.permissions }\n : {};\n\n // Navigate/create allow array\n const allow: string[] = isStringArray(permissions.allow) ? [...permissions.allow] : [];\n\n // Check for duplicate\n if (allow.includes(rule)) {\n return;\n }\n\n // Append rule\n allow.push(rule);\n permissions.allow = allow;\n data.permissions = permissions;\n\n // Ensure .claude directory exists\n yield* fs.makeDirectory(claudeDir, { recursive: true });\n\n // Write back\n yield* fs.writeFileString(settingsPath, JSON.stringify(data, null, 2));\n });\n\n return {\n addProjectPermissionRule,\n };\n});\n\nexport type IProjectSettingsService = InferEffect<typeof LayerImpl>;\n\nexport class ProjectSettingsService extends Context.Tag(\"ProjectSettingsService\")<\n ProjectSettingsService,\n IProjectSettingsService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Context, Effect, Layer } from \"effect\";\nimport type { PublicSessionProcess } from \"../../../../types/session-process.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { UserMessageInput } from \"../functions/createMessageGenerator.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../services/ClaudeCodeLifeCycleService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const projectRepository = yield* ProjectRepository;\n const claudeCodeLifeCycleService = yield* ClaudeCodeLifeCycleService;\n\n const getSessionProcesses = () =>\n Effect.gen(function* () {\n const publicSessionProcesses = 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 sessionId: string;\n input: UserMessageInput;\n resume: boolean;\n ccOptions?: CCTurn.CCOptions;\n }) =>\n Effect.gen(function* () {\n const { projectId, sessionId, input, resume, ccOptions } = 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 as const,\n } as const satisfies ControllerResponse;\n }\n\n const result = yield* claudeCodeLifeCycleService.startSessionProcess({\n projectId,\n cwd: project.meta.projectPath,\n sessionId,\n resume,\n input,\n ccOptions,\n });\n\n return {\n status: 201 as const,\n response: {\n sessionProcess: {\n id: result.sessionProcess.def.sessionProcessId,\n projectId,\n sessionId: result.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 type { SDKMessage, SDKUserMessage } 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 type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport type { CcvOptionsService } from \"../../platform/services/CcvOptionsService.ts\";\nimport type { EnvService } from \"../../platform/services/EnvService.ts\";\nimport type { SessionMetaService } from \"../../session/services/SessionMetaService.ts\";\nimport {\n createMessageGenerator,\n type UserMessageInput,\n} from \"../functions/createMessageGenerator.ts\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess.ts\";\nimport * as ClaudeCode from \"../models/ClaudeCode.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport { CCVAskUserQuestionService } from \"./CCVAskUserQuestionService.ts\";\nimport { ClaudeCodePermissionService } from \"./ClaudeCodePermissionService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"./ClaudeCodeSessionProcessService.ts\";\n\nexport type MessageGenerator = () => AsyncGenerator<SDKUserMessage, void, unknown>;\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBusService = yield* EventBus;\n const sessionProcessService = yield* ClaudeCodeSessionProcessService;\n const permissionService = yield* ClaudeCodePermissionService;\n const ccvAskUserQuestionService = yield* CCVAskUserQuestionService;\n\n const runtime = yield* Effect.runtime<\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor\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 } = yield* sessionProcessService.continueSessionProcess({\n sessionProcessId,\n turnDef: {\n type: \"continue\",\n sessionId: baseSessionId,\n baseSessionId: baseSessionId,\n turnId: ulid(),\n },\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 sessionId: string;\n resume: boolean;\n ccOptions?: CCTurn.CCOptions;\n }) => {\n const { projectId, cwd, input, sessionId, resume, ccOptions } = options;\n\n return Effect.gen(function* () {\n const {\n generateMessages,\n setNextMessage,\n setHooks: setMessageGeneratorHooks,\n } = createMessageGenerator();\n\n const turnDef: CCTurn.NewClaudeCodeTurnDef | CCTurn.ResumeClaudeCodeTurnDef = !resume\n ? {\n type: \"new\",\n turnId: ulid(),\n sessionId,\n ccOptions,\n }\n : {\n type: \"resume\",\n turnId: ulid(),\n sessionId,\n baseSessionId: sessionId,\n ccOptions,\n };\n\n const { sessionProcess, task } = yield* sessionProcessService.startSessionProcess({\n sessionDef: {\n projectId,\n cwd,\n abortController: new AbortController(),\n setNextMessage,\n sessionProcessId: ulid(),\n },\n turnDef,\n });\n\n setMessageGeneratorHooks({\n onNewUserMessageResolved: (input) => {\n Effect.runFork(\n sessionProcessService.updateRawUserMessage({\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 return yield* Effect.die(new Error(\"Illegal state: paused is not expected\"));\n }\n\n if (\n message.type === \"system\" &&\n message.subtype === \"init\" &&\n processState.type === \"starting\"\n ) {\n yield* sessionProcessService.toInitializedState({\n sessionProcessId: processState.def.sessionProcessId,\n initContext: {\n initMessage: message,\n },\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 (message.type === \"assistant\" && processState.type === \"initialized\") {\n yield* sessionProcessService.toFileCreatedState({\n sessionProcessId: processState.def.sessionProcessId,\n });\n }\n\n if (message.type === \"result\") {\n if (processState.type === \"file_created\" || processState.type === \"initialized\") {\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 await Runtime.runPromise(runtime)(\n Effect.logInfo(\n `[SessionProcessDaemon] Starting daemon for ${sessionProcess.def.sessionProcessId} (${task.def.type})`,\n ),\n );\n const messageIter = await Runtime.runPromise(runtime)(\n Effect.gen(function* () {\n const permissionOptions = yield* permissionService.createCanUseToolRelatedOptions({\n turnId: task.def.turnId,\n projectId: sessionProcess.def.projectId,\n permissionMode:\n task.def.type !== \"continue\" ? task.def.ccOptions?.permissionMode : undefined,\n sessionId: task.def.type === \"new\" ? task.def.sessionId : task.def.baseSessionId,\n });\n\n const ccvMcpServer = ccvAskUserQuestionService.createMcpServer({\n turnId: task.def.turnId,\n projectId: sessionProcess.def.projectId,\n sessionId: task.def.type === \"new\" ? task.def.sessionId : task.def.baseSessionId,\n });\n\n const baseOptions = {\n ...(task.def.type === \"continue\" ? {} : task.def.ccOptions),\n ...permissionOptions,\n cwd: sessionProcess.def.cwd,\n abortController: sessionProcess.def.abortController,\n mcpServers: {\n ccv: ccvMcpServer,\n },\n };\n\n const sdkOptions: Parameters<typeof ClaudeCode.query>[1] =\n task.def.type === \"new\"\n ? { ...baseOptions, sessionId: task.def.sessionId }\n : {\n ...baseOptions,\n resume: task.def.baseSessionId,\n };\n\n return yield* ClaudeCode.query(generateMessages(), sdkOptions);\n }),\n );\n\n setNextMessage(input);\n\n try {\n for await (const message of messageIter) {\n const result = await Runtime.runPromise(runtime)(handleMessage(message)).catch(\n (error: unknown) => {\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,\n },\n }),\n );\n\n return \"continue\" as const;\n },\n );\n\n if (result === \"break\") {\n break;\n } else {\n }\n }\n } catch (error) {\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(async (error: unknown) => {\n await Runtime.runPromise(runtime)(\n Effect.logError(`Error occur in task daemon process: ${String(error)}`),\n );\n throw error;\n })\n .finally(() => {\n Effect.runFork(\n Effect.gen(function* () {\n const currentProcess = yield* sessionProcessService.getSessionProcess(\n sessionProcess.def.sessionProcessId,\n );\n\n // Skip if already completed (e.g., by abortTask) to avoid\n // overwriting abortedByUser flag\n if (currentProcess.type === \"completed\") {\n return;\n }\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n });\n }),\n );\n });\n\n // Return immediately with the known sessionId\n return {\n sessionProcess,\n task,\n daemonPromise,\n sessionId: turnDef.sessionId,\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 = yield* sessionProcessService.getSessionProcess(sessionProcessId);\n\n yield* permissionService.cancelPendingRequests(currentProcess.sessionId);\n yield* ccvAskUserQuestionService.cancelPendingRequests(currentProcess.sessionId);\n\n currentProcess.def.abortController.abort();\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: currentProcess.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n abortedByUser: true,\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* permissionService.cancelPendingRequests(process.sessionId);\n yield* ccvAskUserQuestionService.cancelPendingRequests(process.sessionId);\n process.def.abortController.abort();\n\n yield* sessionProcessService.toCompletedState({\n sessionProcessId: process.def.sessionProcessId,\n error: new Error(\"Task aborted\"),\n abortedByUser: true,\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(\"ClaudeCodeLifeCycleService\")<\n ClaudeCodeLifeCycleService,\n IClaudeCodeLifeCycleService\n>() {\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 // oxlint-disable-next-line no-unsafe-type-assertion -- Partially initialized, fields set before return\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 type { SDKMessage, SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { DocumentBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport { controllablePromise } from \"../../../../lib/controllablePromise.ts\";\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<SDKUserMessage, void, unknown>;\n\nexport const createMessageGenerator = (): {\n generateMessages: MessageGenerator;\n setNextMessage: (input: UserMessageInput) => void;\n setHooks: (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (input: UserMessageInput) => void | Promise<void>;\n }) => void;\n} => {\n let sendMessagePromise = controllablePromise<UserMessageInput>();\n let registeredHooks: {\n onNextMessageSet: ((input: UserMessageInput) => void | Promise<void>)[];\n onNewUserMessageResolved: ((input: UserMessageInput) => 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 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 parent_tool_use_id: null,\n } satisfies SDKUserMessage;\n };\n\n const generateMessages = async function* (): 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(async (hook) => {\n await hook(message);\n }),\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(async (hook) => {\n await hook(input);\n }),\n );\n };\n\n const setHooks = (hooks: {\n onNextMessageSet?: (input: UserMessageInput) => void | Promise<void>;\n onNewUserMessageResolved?: (input: UserMessageInput) => void | Promise<void>;\n }) => {\n registeredHooks = {\n onNextMessageSet: [\n ...(hooks?.onNextMessageSet ? [hooks.onNextMessageSet] : []),\n ...registeredHooks.onNextMessageSet,\n ],\n onNewUserMessageResolved: [\n ...(hooks?.onNewUserMessageResolved ? [hooks.onNewUserMessageResolved] : []),\n ...registeredHooks.onNewUserMessageResolved,\n ],\n };\n };\n\n return {\n generateMessages,\n setNextMessage,\n setHooks,\n };\n};\n", "import type { UserMessageInput } from \"../functions/createMessageGenerator.ts\";\nimport type { InitMessageContext } from \"../types.ts\";\nimport type * as CCTurn from \"./ClaudeCodeTurn.ts\";\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 CCSessionProcessStartingState = CCSessionProcessStateBase & {\n type: \"starting\" /* SDK process started, waiting for init message */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n};\n\nexport type CCSessionProcessInitializedState = CCSessionProcessStateBase & {\n type: \"initialized\" /* init message received */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessFileCreatedState = CCSessionProcessStateBase & {\n type: \"file_created\" /* file has been created */;\n sessionId: string;\n currentTask: CCTurn.RunningClaudeCodeTurnState;\n rawUserMessage: string;\n initContext: InitMessageContext;\n};\n\nexport type CCSessionProcessPausedState = CCSessionProcessStateBase & {\n type: \"paused\" /* task completed, ready for next task */;\n sessionId: string;\n};\n\nexport type CCSessionProcessCompletedState = CCSessionProcessStateBase & {\n type: \"completed\" /* paused or running task was aborted. Cannot resume */;\n sessionId: string;\n abortedByUser: boolean;\n};\n\nexport type CCSessionProcessStatePublic =\n | CCSessionProcessStartingState\n | CCSessionProcessInitializedState\n | CCSessionProcessFileCreatedState\n | CCSessionProcessPausedState;\n\nexport type CCSessionProcessState = CCSessionProcessStatePublic | CCSessionProcessCompletedState;\n\nexport const isPublic = (\n process: CCSessionProcessState,\n): process is CCSessionProcessStatePublic => {\n return (\n process.type === \"starting\" ||\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((task) => task.status === \"pending\" || task.status === \"running\");\n};\n", "import { Context, Data, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport * as CCSessionProcess from \"../models/CCSessionProcess.ts\";\nimport type * as CCTurn from \"../models/ClaudeCodeTurn.ts\";\nimport type { InitMessageContext } from \"../types.ts\";\n\nclass SessionProcessNotFoundError extends Data.TaggedError(\"SessionProcessNotFoundError\")<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessNotPausedError extends Data.TaggedError(\"SessionProcessNotPausedError\")<{\n sessionProcessId: string;\n}> {}\n\nclass SessionProcessAlreadyAliveError extends Data.TaggedError(\"SessionProcessAlreadyAliveError\")<{\n sessionProcessId: string;\n aliveTaskId: string;\n aliveTaskSessionId?: string;\n}> {}\n\nclass IllegalStateChangeError extends Data.TaggedError(\"IllegalStateChangeError\")<{\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<CCSessionProcess.CCSessionProcessState[]>([]);\n const eventBus = yield* EventBus;\n\n const emitSessionProcessChanged = (changed: CCSessionProcess.CCSessionProcessState) =>\n Effect.gen(function* () {\n const processes = yield* Ref.get(processesRef);\n const publicProcesses = processes.filter(CCSessionProcess.isPublic).map((process) => ({\n id: process.def.sessionProcessId,\n projectId: process.def.projectId,\n sessionId: process.sessionId,\n status: process.type === \"paused\" ? (\"paused\" as const) : (\"running\" as const),\n }));\n\n yield* eventBus.emit(\"sessionProcessChanged\", {\n processes: publicProcesses,\n changed,\n });\n });\n\n const startSessionProcess = (options: {\n sessionDef: CCSessionProcess.CCSessionProcessDef;\n turnDef: CCTurn.NewClaudeCodeTurnDef | CCTurn.ResumeClaudeCodeTurnDef;\n }) => {\n const { sessionDef, turnDef } = options;\n\n return Effect.gen(function* () {\n const task: CCTurn.RunningClaudeCodeTurnState = {\n def: turnDef,\n status: \"running\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessStartingState = {\n def: sessionDef,\n type: \"starting\",\n sessionId: turnDef.sessionId,\n tasks: [task],\n currentTask: task,\n rawUserMessage: \"\", // Will be set when message is resolved\n };\n\n yield* Ref.update(processesRef, (processes) => [...processes, newProcess]);\n\n yield* emitSessionProcessChanged(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: firstAliveTask.def.sessionId,\n }),\n );\n }\n\n const newTask: CCTurn.RunningClaudeCodeTurnState = {\n def: options.turnDef,\n status: \"running\",\n };\n\n const newProcess: CCSessionProcess.CCSessionProcessStartingState = {\n def: process.def,\n type: \"starting\",\n sessionId: process.sessionId,\n tasks: [...process.tasks, newTask],\n currentTask: newTask,\n rawUserMessage: \"\", // Will be set when message is resolved\n };\n\n yield* Ref.update(processesRef, (processes) => {\n return processes.map((p) => (p.def.sessionProcessId === sessionProcessId ? newProcess : p));\n });\n\n yield* emitSessionProcessChanged(newProcess);\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((p) => p.def.sessionProcessId === sessionProcessId);\n if (result === undefined) {\n return yield* Effect.fail(new SessionProcessNotFoundError({ sessionProcessId }));\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((p) => p.def.sessionProcessId === sessionProcessId);\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.filter(CCSessionProcess.isPublic).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 yield* Effect.logDebug(\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) => (t.def.turnId === task.def.turnId ? { ...nextTask } : t)),\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 // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- generic task type is narrowed by caller\n return updated.task as T;\n });\n };\n\n const updateRawUserMessage = (options: { sessionProcessId: string; rawUserMessage: string }) => {\n const { sessionProcessId, rawUserMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n\n if (currentProcess.type !== \"starting\") {\n return yield* Effect.fail(\n new IllegalStateChangeError({\n from: currentProcess.type,\n to: \"starting\",\n }),\n );\n }\n\n const newProcess = yield* dangerouslyChangeProcessState({\n sessionProcessId,\n nextState: {\n ...currentProcess,\n rawUserMessage,\n },\n });\n\n return {\n sessionProcess: newProcess,\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 !== \"starting\") {\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: currentProcess.sessionId,\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: {\n session_id: string;\n };\n }) => {\n const { sessionProcessId, resultMessage } = options;\n\n return Effect.gen(function* () {\n const currentProcess = yield* getSessionProcess(sessionProcessId);\n if (currentProcess.type !== \"file_created\" && currentProcess.type !== \"initialized\") {\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 abortedByUser?: boolean;\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 === \"starting\" ||\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) => (t.def.turnId === newTask.def.turnId ? newTask : t))\n : currentProcess.tasks,\n sessionId: currentProcess.sessionId,\n abortedByUser: options.abortedByUser ?? false,\n },\n });\n\n return {\n sessionProcess: newProcess,\n task: newTask,\n };\n });\n };\n\n return {\n // session\n startSessionProcess,\n continueSessionProcess,\n updateRawUserMessage,\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(\"ClaudeCodeSessionProcessService\")<\n ClaudeCodeSessionProcessService,\n IClaudeCodeSessionProcessService\n>() {\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.ts\";\nimport { adaptInternalEventToSSE } from \"../functions/adaptInternalEventToSSE.ts\";\nimport { TypeSafeSSE } from \"../functions/typeSafeSSE.ts\";\nimport { EventBus } from \"../services/EventBus.ts\";\nimport type { InternalEventDeclaration } from \"../types/InternalEventDeclaration.ts\";\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 = (event: InternalEventDeclaration[\"sessionListChanged\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionListChanged\", {\n projectId: event.projectId,\n }),\n );\n };\n\n const onSessionChanged = (event: InternalEventDeclaration[\"sessionChanged\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionChanged\", {\n projectId: event.projectId,\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onAgentSessionChanged = (event: InternalEventDeclaration[\"agentSessionChanged\"]) => {\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 const abortedByUser =\n event.changed.type === \"completed\" && event.changed.abortedByUser\n ? { sessionId: event.changed.sessionId }\n : undefined;\n\n Effect.runFork(\n typeSafeSSE.writeSSE(\"sessionProcessChanged\", {\n processes: event.processes,\n abortedByUser,\n }),\n );\n };\n\n const onPermissionRequested = (event: InternalEventDeclaration[\"permissionRequested\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionRequested\", {\n sessionId: event.permissionRequest.sessionId,\n }),\n );\n };\n\n const onPermissionResolved = (event: InternalEventDeclaration[\"permissionResolved\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"permissionResolved\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onQuestionRequested = (event: InternalEventDeclaration[\"questionRequested\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"questionRequested\", {\n sessionId: event.questionRequest.sessionId,\n }),\n );\n };\n\n const onQuestionResolved = (event: InternalEventDeclaration[\"questionResolved\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"questionResolved\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onNotificationCreated = (event: InternalEventDeclaration[\"notificationCreated\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"notificationCreated\", {\n notification: event.notification,\n }),\n );\n };\n\n const onNotificationConsumed = (event: InternalEventDeclaration[\"notificationConsumed\"]) => {\n Effect.runFork(\n typeSafeSSE.writeSSE(\"notificationConsumed\", {\n sessionId: event.sessionId,\n }),\n );\n };\n\n const onSchedulerJobsChanged = () => {\n Effect.runFork(typeSafeSSE.writeSSE(\"schedulerJobsChanged\", {}));\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(\"permissionResolved\", onPermissionResolved);\n yield* eventBus.on(\"questionRequested\", onQuestionRequested);\n yield* eventBus.on(\"questionResolved\", onQuestionResolved);\n yield* eventBus.on(\"notificationCreated\", onNotificationCreated);\n yield* eventBus.on(\"notificationConsumed\", onNotificationConsumed);\n yield* eventBus.on(\"schedulerJobsChanged\", onSchedulerJobsChanged);\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(\"sessionProcessChanged\", onSessionProcessChanged);\n yield* eventBus.off(\"heartbeat\", onHeartbeat);\n yield* eventBus.off(\"permissionRequested\", onPermissionRequested);\n yield* eventBus.off(\"permissionResolved\", onPermissionResolved);\n yield* eventBus.off(\"questionRequested\", onQuestionRequested);\n yield* eventBus.off(\"questionResolved\", onQuestionResolved);\n yield* eventBus.off(\"notificationCreated\", onNotificationCreated);\n yield* eventBus.off(\"notificationConsumed\", onNotificationConsumed);\n yield* eventBus.off(\"schedulerJobsChanged\", onSchedulerJobsChanged);\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\")<SSEController, ISSEController>() {\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 void 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.ts\";\n\ntype 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\")<TypeSafeSSE, TypeSafeSSEService>() {\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Fiber, Layer, Ref, Stream } from \"effect\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { encodeProjectIdFromSessionFilePath } from \"../../project/functions/id.ts\";\nimport { parseSessionFilePath } from \"../functions/parseSessionFilePath.ts\";\nimport { EventBus } from \"./EventBus.ts\";\n\ntype 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 fs = yield* FileSystem.FileSystem;\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 watcherFiberRef = yield* Ref.make<Fiber.RuntimeFiber<void, unknown> | null>(null);\n const debounceTimersRef = yield* Ref.make<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const clearDebounceTimer = (debounceKey: string) =>\n Effect.gen(function* () {\n const timers = yield* Ref.get(debounceTimersRef);\n const timer = timers.get(debounceKey);\n if (timer !== undefined) {\n clearTimeout(timer);\n timers.delete(debounceKey);\n yield* Ref.set(debounceTimersRef, timers);\n }\n });\n\n const scheduleDebouncedEmit = (\n debounceKey: string,\n payload:\n | { type: \"agent\"; projectId: string; agentSessionId: string }\n | { type: \"session\"; projectId: string; sessionId: string },\n ) =>\n Effect.gen(function* () {\n yield* clearDebounceTimer(debounceKey);\n\n const timers = yield* Ref.get(debounceTimersRef);\n const timer = setTimeout(() => {\n if (payload.type === \"agent\") {\n Effect.runFork(\n eventBus.emit(\"agentSessionChanged\", {\n projectId: payload.projectId,\n agentSessionId: payload.agentSessionId,\n }),\n );\n } else {\n Effect.runFork(\n eventBus.emit(\"sessionChanged\", {\n projectId: payload.projectId,\n sessionId: payload.sessionId,\n }),\n );\n Effect.runFork(\n eventBus.emit(\"sessionListChanged\", {\n projectId: payload.projectId,\n }),\n );\n }\n\n void Effect.runPromise(clearDebounceTimer(debounceKey));\n }, 100);\n\n timers.set(debounceKey, timer);\n yield* Ref.set(debounceTimersRef, timers);\n });\n\n const handleWatchEvent = (claudeProjectsDirPath: string, changedPath: string) =>\n Effect.gen(function* () {\n const relativePath = changedPath.startsWith(claudeProjectsDirPath)\n ? path.relative(claudeProjectsDirPath, changedPath)\n : changedPath;\n const parsed = parseSessionFilePath(relativePath);\n if (parsed === null) {\n return;\n }\n\n const fullPath = path.isAbsolute(changedPath)\n ? changedPath\n : path.join(claudeProjectsDirPath, changedPath);\n const encodedProjectId = encodeProjectIdFromSessionFilePath(fullPath);\n\n if (parsed.type === \"agent\") {\n const debounceKey = `${encodedProjectId}/agent-${parsed.agentSessionId}`;\n yield* scheduleDebouncedEmit(debounceKey, {\n type: \"agent\",\n projectId: encodedProjectId,\n agentSessionId: parsed.agentSessionId,\n });\n return;\n }\n\n const debounceKey = `${encodedProjectId}/${parsed.sessionId}`;\n yield* scheduleDebouncedEmit(debounceKey, {\n type: \"session\",\n projectId: encodedProjectId,\n sessionId: parsed.sessionId,\n });\n });\n\n const startWatching = (): Effect.Effect<void> =>\n Effect.gen(function* () {\n const isWatching = yield* Ref.get(isWatchingRef);\n if (isWatching) {\n return;\n }\n\n const claudeCodePaths = yield* context.claudeCodePaths;\n const claudeProjectsDirPath = claudeCodePaths.claudeProjectsDirPath;\n\n yield* Effect.logInfo(`Starting file watcher on: ${claudeProjectsDirPath}`);\n\n const watcherFiber = yield* fs.watch(claudeProjectsDirPath, { recursive: true }).pipe(\n Stream.runForEach((event) => handleWatchEvent(claudeProjectsDirPath, event.path)),\n Effect.forkDaemon,\n );\n\n yield* Ref.set(watcherFiberRef, watcherFiber);\n yield* Ref.set(isWatchingRef, true);\n yield* Effect.logInfo(\"File watcher initialization completed\");\n }).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Failed to start file watching: ${String(error)}`));\n return 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.values()) {\n clearTimeout(timer);\n }\n yield* Ref.set(debounceTimersRef, new Map());\n\n const watcherFiber = yield* Ref.get(watcherFiberRef);\n if (watcherFiber !== null) {\n yield* Fiber.interrupt(watcherFiber);\n yield* Ref.set(watcherFiberRef, null);\n }\n\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 = /(?<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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ClaudeCodeService } from \"../../claude-code/services/ClaudeCodeService.ts\";\nimport type { Flag } from \"../models/flag.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const claudeCodeService = yield* ClaudeCodeService;\n\n const getFlags = () =>\n Effect.gen(function* () {\n const claudeCodeFeatures = 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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { getDirectoryListing } from \"../functions/getDirectoryListing.ts\";\nimport { getFileCompletion } from \"../functions/getFileCompletion.ts\";\nimport { getFileContentEffect } from \"../functions/getFileContent.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const path = yield* Path.Path;\n const fs = yield* FileSystem.FileSystem;\n const context = yield* ApplicationContext;\n const projectRepository = yield* ProjectRepository;\n\n const getFileCompletionRoute = (options: { projectId: string; basePath: string }) =>\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 const result = yield* Effect.either(\n getFileCompletion(projectPath, basePath).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\n ),\n );\n if (Either.isLeft(result)) {\n yield* Effect.logError(`File completion error: ${String(result.left)}`);\n return {\n response: { error: \"Failed to get file completion\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result.right,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getDirectoryListingRoute = (options: {\n currentPath?: string | undefined;\n showHidden?: boolean | undefined;\n }) =>\n Effect.gen(function* () {\n const { currentPath, showHidden = false } = options;\n const claudeCodePaths = yield* context.claudeCodePaths;\n\n const rootPath = path.dirname(claudeCodePaths.globalClaudeDirectoryPath);\n const defaultPath = rootPath;\n\n const targetPath = currentPath ?? defaultPath;\n const relativePath = targetPath.startsWith(rootPath)\n ? targetPath.slice(rootPath.length)\n : targetPath;\n const result = yield* Effect.either(\n getDirectoryListing(rootPath, relativePath, showHidden).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\n ),\n );\n\n if (Either.isLeft(result)) {\n yield* Effect.logError(`Directory listing error: ${String(result.left)}`);\n return {\n response: { error: \"Failed to list directory\" },\n status: 500,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: result.right,\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getFileContentRoute = (options: { projectId: string; filePath: string }) =>\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: \"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* getFileContentEffect(projectPath, filePath).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fs),\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 { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 = (\n rootPath: string,\n basePath = \"/\",\n showHidden = false,\n): Effect.Effect<\n DirectoryListingResult,\n Error | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const normalizedBasePath =\n basePath === \"/\" ? \"\" : basePath.startsWith(\"/\") ? basePath.slice(1) : basePath;\n const resolvedRootPath = path.resolve(rootPath);\n const targetPath = path.resolve(rootPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolvedRootPath)) {\n return yield* Effect.fail(new Error(\"Invalid path: outside root directory\"));\n }\n\n const exists = yield* fs.exists(targetPath);\n if (!exists) {\n return {\n entries: [],\n basePath: \"/\",\n currentPath: rootPath,\n };\n }\n\n const filenames = yield* fs.readDirectory(targetPath).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Error reading directory: ${String(error)}`));\n return Effect.succeed([] as string[]);\n }),\n );\n\n const entries: DirectoryEntry[] = [];\n\n if (normalizedBasePath !== \"\") {\n const parentPath = path.dirname(normalizedBasePath);\n entries.push({\n name: \"..\",\n type: \"directory\",\n path: parentPath === \".\" ? \"\" : parentPath,\n });\n }\n\n for (const filename of filenames) {\n if (!showHidden && filename.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = path.join(targetPath, filename);\n const fileInfo = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (fileInfo === null) {\n continue;\n }\n\n const entryPath = normalizedBasePath ? path.join(normalizedBasePath, filename) : filename;\n\n if (fileInfo.type === \"Directory\") {\n entries.push({\n name: filename,\n type: \"directory\",\n path: entryPath,\n });\n } else if (fileInfo.type === \"File\") {\n entries.push({\n name: filename,\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 });\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 = (\n projectPath: string,\n basePath = \"/\",\n): Effect.Effect<FileCompletionResult, Error | PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const normalizedBasePath = basePath.startsWith(\"/\") ? basePath.slice(1) : basePath;\n const resolvedProjectPath = path.resolve(projectPath);\n const targetPath = path.resolve(projectPath, normalizedBasePath);\n\n if (!targetPath.startsWith(resolvedProjectPath)) {\n return yield* Effect.fail(new Error(\"Invalid path: outside project directory\"));\n }\n\n const exists = yield* fs.exists(targetPath);\n if (!exists) {\n return {\n entries: [],\n basePath: normalizedBasePath,\n projectPath,\n };\n }\n\n const filenames = yield* fs.readDirectory(targetPath).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(Effect.logError(`Error reading directory: ${String(error)}`));\n return Effect.succeed([] as string[]);\n }),\n );\n\n const entries: FileCompletionEntry[] = [];\n\n for (const filename of filenames) {\n if (filename.startsWith(\".\")) {\n continue;\n }\n\n const fullPath = path.join(targetPath, filename);\n const fileInfo = yield* fs.stat(fullPath).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (fileInfo === null) {\n continue;\n }\n\n const entryPath =\n normalizedBasePath === \"\" ? filename : path.join(normalizedBasePath, filename);\n\n if (fileInfo.type === \"Directory\") {\n entries.push({\n name: filename,\n type: \"directory\",\n path: entryPath,\n });\n } else if (fileInfo.type === \"File\") {\n entries.push({\n name: filename,\n type: \"file\",\n path: entryPath,\n });\n }\n }\n\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 });\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport type { PlatformError } from \"@effect/platform/Error\";\nimport { Effect } from \"effect\";\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 extensionIndex = filePath.lastIndexOf(\".\");\n const ext = extensionIndex === -1 ? \"\" : filePath.slice(extensionIndex + 1).toLowerCase();\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 extensionIndex = filePath.lastIndexOf(\".\");\n const ext = extensionIndex === -1 ? \"\" : filePath.slice(extensionIndex + 1).toLowerCase();\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: Uint8Array): 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 path: Path.Path,\n projectRoot: string,\n filePath: string,\n): { valid: true; resolvedPath: string } | { 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 = path.resolve(projectRoot);\n let resolvedPath: string;\n\n // Handle absolute paths\n if (filePath.startsWith(\"/\")) {\n resolvedPath = path.normalize(filePath);\n } else {\n // Handle relative paths\n const normalizedPath = path.normalize(filePath);\n resolvedPath = path.resolve(projectRoot, normalizedPath);\n }\n\n // Ensure the resolved path is within the project root\n if (!resolvedPath.startsWith(`${resolvedRoot}/`) && resolvedPath !== resolvedRoot) {\n return { valid: false, message: \"Path is outside the project root\" };\n }\n\n return { valid: true, resolvedPath };\n};\n\nexport const getFileContentEffect = (\n projectRoot: string,\n filePath: string,\n options: GetFileContentOptions = {},\n): Effect.Effect<FileContentResult, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const { maxFileSize = DEFAULT_MAX_FILE_SIZE } = options;\n\n const validation = validateFilePath(path, 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 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 const readFileResult = yield* Effect.either(fs.readFile(resolvedPath));\n if (readFileResult._tag === \"Left\") {\n const error = readFileResult.left;\n if (error._tag === \"SystemError\") {\n if (error.reason === \"NotFound\" || error.reason === \"BadResource\") {\n return {\n success: false,\n error: \"NOT_FOUND\",\n message: \"File not found\",\n filePath,\n };\n }\n }\n\n return {\n success: false,\n error: \"READ_ERROR\",\n message: error.message,\n filePath,\n };\n }\n\n const buffer = readFileResult.right;\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 const truncated = buffer.length > maxFileSize;\n const contentBuffer = truncated ? buffer.subarray(0, maxFileSize) : buffer;\n const content = new TextDecoder(\"utf-8\").decode(contentBuffer);\n const language = detectLanguage(filePath);\n\n return {\n success: true,\n content,\n filePath,\n truncated,\n language,\n };\n });\n", "import { Context, Effect, Either, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { PushErrorCode } from \"../schema.ts\";\nimport { GitService } from \"../services/GitService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const gitService = yield* GitService;\n const projectRepository = yield* ProjectRepository;\n\n const getGitDiff = (options: { projectId: string; fromRef: string; toRef: string }) =>\n Effect.gen(function* () {\n const { projectId, fromRef, toRef } = 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 const diffResult = yield* Effect.either(gitService.getDiff(projectPath, fromRef, toRef));\n\n if (Either.isLeft(diffResult)) {\n return {\n response: {\n success: false,\n error: parseDiffError(diffResult.left),\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n return {\n response: {\n success: true,\n data: diffResult.right,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const commitFiles = (options: { projectId: string; files: string[]; message: string }) =>\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 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 const stageResult = yield* Effect.either(gitService.stageFiles(projectPath, files));\n if (Either.isLeft(stageResult)) {\n return {\n response: {\n success: false,\n error: \"Failed to stage files\",\n errorCode: \"GIT_COMMAND_ERROR\",\n details: stageResult.left.message,\n },\n status: 200,\n } as const satisfies ControllerResponse;\n }\n\n const commitResult = yield* Effect.either(gitService.commit(projectPath, message));\n if (Either.isLeft(commitResult)) {\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 ? \"HOOK_FAILED\" : \"GIT_COMMAND_ERROR\",\n details: errorMessage,\n },\n status: 200,\n } as const satisfies ControllerResponse;\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 const { project } = yield* projectRepository.getProject(projectId);\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 const pushResult = yield* Effect.either(gitService.push(projectPath));\n\n if (Either.isLeft(pushResult)) {\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 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: { projectId: string; files: string[]; message: string }) =>\n Effect.gen(function* () {\n const { projectId, files, message } = options;\n\n // First, commit\n const commitResult = yield* commitFiles({ projectId, files, message });\n\n if (commitResult.status !== 200 || !commitResult.response.success) {\n return commitResult; // Return commit error\n }\n\n const commitSha = commitResult.response.commitSha;\n\n // Then, push\n const pushResult = yield* pushCommits({ projectId });\n\n if (pushResult.status !== 200 || !pushResult.response.success) {\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 // 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(gitService.getCurrentBranch(projectPath));\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(gitService.getBranches(projectPath));\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((branch) => branch.name === currentBranch);\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((branch) => branch.name === baseBranchName);\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(projectPath, baseBranchHash, \"HEAD\"),\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(gitService.getBranches(projectPath));\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(gitService.getCurrentBranch(projectPath));\n\n const currentBranch = Either.isRight(currentBranchResult) ? currentBranchResult.right : 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(gitService.checkout(projectPath, branchName));\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\nconst parsePushError = (stderr: string): PushErrorCode => {\n if (stderr.includes(\"no upstream\") || stderr.includes(\"has no upstream\")) {\n return \"NO_UPSTREAM\";\n }\n if (stderr.includes(\"non-fast-forward\") || stderr.includes(\"failed to push some refs\")) {\n return \"NON_FAST_FORWARD\";\n }\n if (stderr.includes(\"Authentication failed\") || stderr.includes(\"Permission denied\")) {\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\nconst getPushErrorMessage = (code: PushErrorCode): string => {\n const messages: Record<PushErrorCode, string> = {\n NO_UPSTREAM: \"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: \"Authentication failed. Check your SSH keys or HTTPS credentials.\",\n NETWORK_ERROR: \"Network error. Check your internet connection.\",\n TIMEOUT: \"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\nconst parseDiffError = (error: unknown) => {\n if (typeof error === \"object\" && error !== null && \"_tag\" in error) {\n const tag = String(error._tag);\n\n if (tag === \"NotARepositoryError\") {\n const message =\n \"cwd\" in error && typeof error.cwd === \"string\"\n ? `Not a git repository: ${error.cwd}`\n : \"Not a git repository\";\n return {\n code: \"NOT_A_REPOSITORY\" as const,\n message,\n };\n }\n\n if (tag === \"GitInvalidRefError\" || tag === \"GitInvalidDiffRefError\") {\n return {\n code: \"BRANCH_NOT_FOUND\" as const,\n message: \"Branch or commit not found\",\n };\n }\n\n if (tag === \"GitDiffParseError\") {\n const message =\n \"reason\" in error && typeof error.reason === \"string\"\n ? `Failed to parse diff: ${error.reason}`\n : \"Failed to parse diff\";\n return {\n code: \"PARSE_ERROR\" as const,\n message,\n };\n }\n\n if (tag === \"GitCommandError\") {\n return {\n code: \"COMMAND_FAILED\" as const,\n message: \"Git command failed\",\n command:\n \"command\" in error && typeof error.command === \"string\" ? error.command : undefined,\n };\n }\n }\n\n return {\n code: \"COMMAND_FAILED\" as const,\n message: \"Git command failed\",\n };\n};\n\nexport type IGitController = InferEffect<typeof LayerImpl>;\nexport class GitController extends Context.Tag(\"GitController\")<GitController, IGitController>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { Command, FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Duration, Effect, Either, Layer } from \"effect\";\nimport parseGitDiff, { type AnyChunk, type AnyFileChange } from \"parse-git-diff\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EnvService } from \"../../platform/services/EnvService.ts\";\nimport { parseGitBranchesOutput } from \"../functions/parseGitBranchesOutput.ts\";\nimport { parseGitCommitsOutput } from \"../functions/parseGitCommitsOutput.ts\";\nimport { parseLines, stripAnsiColors } from \"../functions/text.ts\";\nimport type {\n GitComparisonResult,\n GitDiff,\n GitDiffFile,\n GitDiffHunk,\n GitDiffLine,\n} from \"../types.ts\";\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\nclass GitInvalidRefError extends Data.TaggedError(\"GitInvalidRefError\")<{\n ref: string;\n}> {}\n\nclass GitInvalidDiffRefError extends Data.TaggedError(\"GitInvalidDiffRefError\")<{\n refText: string;\n}> {}\n\nclass GitDiffParseError extends Data.TaggedError(\"GitDiffParseError\")<{\n reason: string;\n}> {}\n\n/** Validates that a git ref (branch name, hash, etc.) is safe to pass as a command argument */\nconst isValidGitRef = (ref: string): boolean =>\n ref.length > 0 && !ref.startsWith(\"-\") && !ref.includes(\"\\0\");\n\nconst validateGitRef = (ref: string) =>\n isValidGitRef(ref) ? Effect.void : Effect.fail(new GitInvalidRefError({ ref }));\n\nconst extractDiffRef = (refText: string) =>\n Effect.gen(function* () {\n const [group, ref] = refText.split(\":\");\n\n if (group !== undefined && ref !== undefined) {\n return ref;\n }\n\n if (refText === \"HEAD\") {\n return \"HEAD\";\n }\n\n if (refText === \"working\") {\n return undefined;\n }\n\n return yield* Effect.fail(new GitInvalidDiffRefError({ refText }));\n });\n\nconst 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 filePath = \"\";\n status = \"modified\";\n }\n\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\nconst convertToGitDiffHunk = (chunk: AnyChunk): GitDiffHunk => {\n if (chunk.type !== \"Chunk\") {\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 line = {\n type: \"context\",\n content: change.content,\n };\n break;\n default:\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 !== undefined && chunk.context !== \"\" ? ` ${chunk.context}` : \"\"}`,\n lines,\n };\n};\n\nconst parseFallbackDiffFiles = (\n diffOutput: string,\n fileStats: Map<string, { additions: number; deletions: number }>,\n): GitDiffFile[] => {\n const sections = diffOutput\n .split(/^diff --git /m)\n .map((section) => section.trim())\n .filter((section) => section !== \"\");\n\n return sections.flatMap((section) => {\n const lines = section.split(\"\\n\");\n const header = lines[0];\n if (header === undefined) {\n return [];\n }\n\n const headerMatch = header.match(/^a\\/(.+?) b\\/(.+)$/);\n if (!headerMatch) {\n return [];\n }\n\n const oldPathFromHeader = headerMatch[1];\n const newPathFromHeader = headerMatch[2];\n if (oldPathFromHeader === undefined || newPathFromHeader === undefined) {\n return [];\n }\n\n const renameFromLine = lines.find((line) => line.startsWith(\"rename from \"));\n const renameToLine = lines.find((line) => line.startsWith(\"rename to \"));\n const deleted = lines.some((line) => line.startsWith(\"deleted file mode\"));\n const added = lines.some((line) => line.startsWith(\"new file mode\"));\n\n const oldPath =\n renameFromLine !== undefined ? renameFromLine.replace(\"rename from \", \"\") : oldPathFromHeader;\n const filePath =\n renameToLine !== undefined ? renameToLine.replace(\"rename to \", \"\") : newPathFromHeader;\n\n const status: GitDiffFile[\"status\"] = deleted\n ? \"deleted\"\n : renameFromLine !== undefined && renameToLine !== undefined\n ? \"renamed\"\n : added\n ? \"added\"\n : \"modified\";\n\n const stats = fileStats.get(filePath) ??\n fileStats.get(oldPath) ?? { additions: 0, deletions: 0 };\n\n return [\n {\n filePath,\n status,\n additions: stats.additions,\n deletions: stats.deletions,\n ...(status === \"renamed\" ? { oldPath } : {}),\n },\n ];\n });\n};\n\nconst createUntrackedFileDiff = (filePath: string, content: string): GitDiff => {\n const lines = content.split(\"\\n\");\n\n const diffLines: GitDiffLine[] = lines.map((line, index) => ({\n type: \"added\",\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};\n\nconst createEmptyComparisonResult = (): GitComparisonResult => {\n return {\n diffs: [],\n files: [],\n summary: {\n totalFiles: 0,\n totalAdditions: 0,\n totalDeletions: 0,\n },\n };\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(new NotARepositoryError({ cwd: absoluteCwd }));\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([\"branch\", \"--show-current\"], cwd).pipe(\n Effect.map((result) => result.trim()),\n );\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 yield* validateGitRef(branchName);\n const result = yield* Effect.either(execGitCommand([\"branch\", \"--exists\", branchName], cwd));\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 [\"log\", \"--oneline\", \"-n\", \"20\", \"--format=%H|%s|%an|%ad\", \"--date=iso\"],\n cwd,\n );\n return parseGitCommitsOutput(result);\n });\n\n const getUntrackedFiles = (cwd: string) =>\n Effect.gen(function* () {\n const statusOutput = yield* execGitCommand(\n [\"status\", \"--untracked-files=all\", \"--short\"],\n cwd,\n );\n return parseLines(statusOutput)\n .map((line) => stripAnsiColors(line))\n .filter((line) => line.startsWith(\"??\"))\n .map((line) => line.slice(3));\n });\n\n const getDiff = (cwd: string, fromRefText: string, toRefText: string) =>\n Effect.gen(function* () {\n const fromRef = yield* extractDiffRef(fromRefText);\n const toRef = yield* extractDiffRef(toRefText);\n\n if (fromRef === toRef) {\n return createEmptyComparisonResult();\n }\n\n if (fromRef === undefined) {\n return yield* Effect.fail(new GitInvalidDiffRefError({ refText: fromRefText }));\n }\n\n yield* validateGitRef(fromRef);\n if (toRef !== undefined) {\n yield* validateGitRef(toRef);\n }\n\n const commandArgs = toRef === undefined ? [fromRef] : [fromRef, toRef];\n\n const numstatOutput = yield* execGitCommand([\"diff\", \"--numstat\", ...commandArgs, \"--\"], cwd);\n const diffOutput = yield* execGitCommand([\"diff\", \"--unified=5\", ...commandArgs, \"--\"], cwd);\n\n try {\n const fileStats = new Map<string, { additions: number; deletions: number }>();\n const numstatLines = parseLines(numstatOutput);\n\n for (const line of numstatLines) {\n const parts = line.split(\"\\t\");\n if (\n parts.length >= 3 &&\n parts[0] !== undefined &&\n parts[0] !== \"\" &&\n parts[1] !== undefined &&\n parts[1] !== \"\" &&\n parts[2] !== undefined &&\n parts[2] !== \"\"\n ) {\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 const parsedDiff = parseGitDiff(diffOutput);\n const fallbackFiles = parseFallbackDiffFiles(diffOutput, fileStats);\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 const file = convertToGitDiffFile(fileChange, fileStats);\n files.push(file);\n\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 for (const fallbackFile of fallbackFiles) {\n const alreadyIncluded = files.some(\n (file) =>\n file.filePath === fallbackFile.filePath && file.oldPath === fallbackFile.oldPath,\n );\n if (alreadyIncluded) {\n continue;\n }\n\n files.push(fallbackFile);\n diffs.push({\n file: fallbackFile,\n hunks: [],\n });\n totalAdditions += fallbackFile.additions;\n totalDeletions += fallbackFile.deletions;\n }\n\n if (toRef === undefined) {\n const untrackedFiles = yield* getUntrackedFiles(cwd);\n\n for (const untrackedFile of untrackedFiles) {\n const fullPath = path.resolve(cwd, untrackedFile);\n const fileContentResult = yield* Effect.either(fs.readFileString(fullPath));\n\n if (Either.isLeft(fileContentResult)) {\n continue;\n }\n\n const untrackedDiff = createUntrackedFileDiff(untrackedFile, fileContentResult.right);\n files.push(untrackedDiff.file);\n diffs.push(untrackedDiff);\n totalAdditions += untrackedDiff.file.additions;\n }\n }\n\n return {\n files,\n diffs,\n summary: {\n totalFiles: files.length,\n totalAdditions,\n totalDeletions,\n },\n };\n } catch (error) {\n return yield* Effect.fail(\n new GitDiffParseError({\n reason: error instanceof Error ? error.message : \"Unknown error\",\n }),\n );\n }\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 const result = yield* execGitCommand([\"commit\", \"-m\", trimmedMessage], cwd);\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 yield* Effect.logDebug(`[GitService.commit] SHA match: ${shaMatch?.[1] ?? \"none\"}`);\n if (shaMatch?.[1] !== undefined && shaMatch[1] !== \"\") {\n return shaMatch[1];\n }\n\n // Fallback: Get SHA from git log\n yield* Effect.logDebug(\"[GitService.commit] Falling back to rev-parse HEAD\");\n const sha = yield* execGitCommand([\"rev-parse\", \"HEAD\"], cwd);\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 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\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\n return yield* Effect.fail(\n new GitCommandError({\n cwd: absoluteCwd,\n command: `git push origin HEAD - ${stderr}`,\n }),\n );\n }\n\n return { branch, output: \"success\" };\n });\n\n const getBranchHash = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(branchName);\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 yield* validateGitRef(hash);\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 = (cwd: string, targetHash: string, compareHash: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(targetHash);\n yield* validateGitRef(compareHash);\n const aheadResult = yield* execGitCommand([\"rev-list\", `${targetHash}..${compareHash}`], cwd);\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 = (cwd: string, options: { offset: number; limit: number }) =>\n Effect.gen(function* () {\n const { offset, limit } = options;\n const result = yield* execGitCommand(\n [\"log\", \"-n\", String(limit), \"--skip\", String(offset), \"--graph\", \"--pretty=format:%h %p\"],\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 (\n match?.groups?.current !== undefined &&\n match.groups.current !== \"\" &&\n match.groups.parent !== undefined &&\n match.groups.parent !== \"\"\n ) {\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(cwd, commit.current);\n\n if (!branchNames.includes(targetBranch)) {\n continue;\n }\n\n const otherBranchNames = branchNames.filter((branchName) => branchName !== targetBranch);\n\n if (otherBranchNames.length === 0) {\n continue;\n }\n\n for (const branchName of otherBranchNames) {\n const comparison = yield* compareCommitHash(cwd, targetBranch, branchName);\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 = (cwd: string, baseBranch: string, targetBranch: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(baseBranch);\n yield* validateGitRef(targetBranch);\n const result = yield* execGitCommand(\n [\"log\", `${baseBranch}..${targetBranch}`, \"--format=%H|%s|%an|%ad\", \"--date=iso\"],\n cwd,\n );\n\n return parseGitCommitsOutput(result);\n });\n\n const checkout = (cwd: string, branchName: string) =>\n Effect.gen(function* () {\n yield* validateGitRef(branchName);\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 getDiff,\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\")<GitService, IGitService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "export const parseLines = (output: string): string[] => {\n return output\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\");\n};\n\nexport const stripAnsiColors = (text: string): string => {\n // ANSI escape sequence pattern: \\x1B[...m\n // biome-ignore lint/suspicious/noControlCharactersInRegex: this is a valid regex\n // oxlint-disable-next-line no-control-regex -- intentional ANSI escape sequence matching\n return text.replace(/\\x1B\\[[0-9;]*m/g, \"\");\n};\n", "import type { GitBranch } from \"../types.ts\";\nimport { parseLines } from \"./text.ts\";\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(/^(\\*?\\s*)([^\\s]+)\\s+([a-f0-9]+)(?:\\s+\\[([^\\]]+)\\])?\\s*(.*)/);\n if (!match) continue;\n\n const [, prefix, name, commit, tracking] = match;\n if (prefix === undefined || name === undefined || commit === undefined) 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 !== undefined && tracking !== \"\") {\n const remoteMatch = tracking.match(/^([^:]+)/);\n if (remoteMatch?.[1] !== undefined && 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] !== undefined && aheadMatch[1] !== \"\")\n ahead = parseInt(aheadMatch[1], 10);\n if (behindMatch?.[1] !== undefined && behindMatch[1] !== \"\")\n 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 type { GitCommit } from \"../types.ts\";\nimport { parseLines } from \"./text.ts\";\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 = parts[0];\n const date = parts.at(-1);\n const author = parts.at(-2);\n const messageParts = parts.slice(1, -2);\n const message = messageParts.join(\"|\");\n if (sha === undefined || message === undefined || author === undefined || date === undefined)\n continue;\n if (sha.trim() === \"\" || message.trim() === \"\" || author.trim() === \"\" || date.trim() === \"\") {\n continue;\n }\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 { Context, Effect, Layer } from \"effect\";\nimport type { SessionNotificationType } from \"../../../../types/notification.ts\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { NotificationService } from \"../services/NotificationService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const notificationService = yield* NotificationService;\n\n const getNotifications = () =>\n Effect.gen(function* () {\n const notifications = yield* notificationService.getNotifications();\n\n return {\n response: { notifications },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const consumeNotifications = (params: { sessionId: string; types?: SessionNotificationType[] }) =>\n Effect.gen(function* () {\n yield* notificationService.consumeNotifications(params.sessionId, {\n types: params.types,\n });\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const getVapidPublicKey = () =>\n Effect.gen(function* () {\n const publicKey = yield* notificationService.getVapidPublicKey();\n\n return {\n response: { publicKey },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n const subscribePush = (params: {\n subscription: {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n };\n }) =>\n Effect.gen(function* () {\n yield* notificationService.subscribePush(params.subscription);\n\n return {\n response: { success: true },\n status: 200,\n } as const satisfies ControllerResponse;\n });\n\n return {\n getNotifications,\n consumeNotifications,\n getVapidPublicKey,\n subscribePush,\n } as const;\n});\n\nexport type INotificationController = InferEffect<typeof LayerImpl>;\n\nexport class NotificationController extends Context.Tag(\"NotificationController\")<\n NotificationController,\n INotificationController\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { ulid } from \"ulid\";\nimport webpush from \"web-push\";\nimport { z } from \"zod\";\nimport type {\n SessionNotification,\n SessionNotificationType,\n} from \"../../../../types/notification.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { formatPushError, shouldDropSubscriptionForPushError } from \"./pushError.ts\";\n\ntype PushSubscriptionRecord = {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n};\n\nconst vapidKeysSchema = z.object({\n publicKey: z.string(),\n privateKey: z.string(),\n});\n\ntype VapidKeys = z.infer<typeof vapidKeysSchema>;\n\nconst VAPID_KEYS_FILENAME = \".claude-code-viewer/vapid-keys.json\";\nconst DEFAULT_VAPID_SUBJECT = \"mailto:noreply@example.com\";\n\nconst getVapidKeysPath = (fs: FileSystem.FileSystem) =>\n Effect.gen(function* () {\n // biome-ignore lint/style/noProcessEnv: required for home directory\n // oxlint-disable-next-line node/no-process-env -- configuration boundary\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"/tmp\";\n const dirPath = `${home}/.claude-code-viewer`;\n\n const dirExists = yield* fs.exists(dirPath);\n if (!dirExists) {\n yield* fs.makeDirectory(dirPath, { recursive: true });\n }\n\n return `${home}/${VAPID_KEYS_FILENAME}`;\n });\n\nconst loadOrCreateVapidKeys = (fs: FileSystem.FileSystem) =>\n Effect.gen(function* () {\n const keysPath = yield* getVapidKeysPath(fs);\n const exists = yield* fs.exists(keysPath);\n\n if (exists) {\n const content = yield* fs.readFileString(keysPath);\n return vapidKeysSchema.parse(JSON.parse(content));\n }\n\n const keys = webpush.generateVAPIDKeys();\n const vapidKeys: VapidKeys = {\n publicKey: keys.publicKey,\n privateKey: keys.privateKey,\n };\n\n yield* fs.writeFileString(keysPath, JSON.stringify(vapidKeys, null, 2));\n\n return vapidKeys;\n });\n\nconst LayerImpl = Effect.gen(function* () {\n const notificationsRef = yield* Ref.make<SessionNotification[]>([]);\n const pushSubscriptionsRef = yield* Ref.make<PushSubscriptionRecord[]>([]);\n const eventBus = yield* EventBus;\n const fs = yield* FileSystem.FileSystem;\n\n // Load or generate VAPID keys\n const vapidKeys = yield* loadOrCreateVapidKeys(fs).pipe(\n Effect.catchAll((error) => {\n return Effect.gen(function* () {\n yield* Effect.logWarning(\n `Failed to load VAPID keys, generating in-memory: ${String(error)}`,\n );\n const keys = webpush.generateVAPIDKeys();\n return {\n publicKey: keys.publicKey,\n privateKey: keys.privateKey,\n };\n });\n }),\n );\n webpush.setVapidDetails(DEFAULT_VAPID_SUBJECT, vapidKeys.publicKey, vapidKeys.privateKey);\n\n // Subscribe to session process state changes to auto-create notifications\n yield* eventBus.on(\"sessionProcessChanged\", (event) => {\n const { changed } = event;\n\n if (changed.type === \"paused\") {\n Effect.runFork(\n createNotification({\n projectId: changed.def.projectId,\n sessionId: changed.sessionId,\n type: \"session_paused\",\n }),\n );\n }\n });\n\n // Subscribe to permission requests\n yield* eventBus.on(\"permissionRequested\", (event) => {\n Effect.runFork(\n createNotification({\n projectId: event.permissionRequest.projectId,\n sessionId: event.permissionRequest.sessionId,\n type: \"permission_requested\",\n }),\n );\n });\n\n // Subscribe to question requests\n yield* eventBus.on(\"questionRequested\", (event) => {\n Effect.runFork(\n createNotification({\n projectId: event.questionRequest.projectId,\n sessionId: event.questionRequest.sessionId,\n type: \"question_asked\",\n }),\n );\n });\n\n const getNotifications = (): Effect.Effect<SessionNotification[]> => Ref.get(notificationsRef);\n\n const createNotification = (params: {\n projectId: string;\n sessionId: string;\n type: SessionNotificationType;\n }): Effect.Effect<SessionNotification> =>\n Effect.gen(function* () {\n const notification: SessionNotification = {\n id: ulid(),\n projectId: params.projectId,\n sessionId: params.sessionId,\n type: params.type,\n createdAt: new Date().toISOString(),\n };\n\n yield* Ref.update(notificationsRef, (notifications) => [...notifications, notification]);\n\n yield* eventBus.emit(\"notificationCreated\", { notification });\n\n // Send push notifications to all subscribed clients\n yield* sendPushNotifications(notification);\n\n return notification;\n });\n\n const consumeNotifications = (\n sessionId: string,\n options?: { types?: SessionNotificationType[] },\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const notifications = yield* Ref.get(notificationsRef);\n const types = options?.types;\n\n const shouldConsume = (n: SessionNotification) =>\n n.sessionId === sessionId && (types === undefined || types.includes(n.type));\n\n const hasMatch = notifications.some(shouldConsume);\n\n if (!hasMatch) {\n return;\n }\n\n yield* Ref.update(notificationsRef, (notifications) =>\n notifications.filter((n) => !shouldConsume(n)),\n );\n\n yield* eventBus.emit(\"notificationConsumed\", { sessionId });\n });\n\n const getVapidPublicKey = (): Effect.Effect<string> => Effect.succeed(vapidKeys.publicKey);\n\n const subscribePush = (subscription: PushSubscriptionRecord): Effect.Effect<void> =>\n Ref.update(pushSubscriptionsRef, (subscriptions) => {\n // Avoid duplicates by endpoint\n const filtered = subscriptions.filter((s) => s.endpoint !== subscription.endpoint);\n return [...filtered, subscription];\n });\n\n const sendPushNotifications = (notification: SessionNotification): Effect.Effect<void> =>\n Effect.gen(function* () {\n const subscriptions = yield* Ref.get(pushSubscriptionsRef);\n if (subscriptions.length === 0) return;\n\n const titleMap: Record<SessionNotificationType, string> = {\n session_paused: \"Session Paused\",\n session_completed: \"Session Completed\",\n permission_requested: \"Permission Required\",\n question_asked: \"Question from Claude\",\n };\n const title = titleMap[notification.type];\n\n const body = `Session ${notification.sessionId.slice(0, 8)}...`;\n const url = `/projects/${notification.projectId}/session?sessionId=${notification.sessionId}`;\n\n const payload = JSON.stringify({ title, body, url });\n\n // Send to all subscriptions, remove invalid ones\n const invalidEndpoints: string[] = [];\n\n yield* Effect.forEach(\n subscriptions,\n (sub) =>\n Effect.tryPromise({\n try: () =>\n webpush.sendNotification(\n {\n endpoint: sub.endpoint,\n keys: sub.keys,\n },\n payload,\n ),\n catch: (error) => {\n return error;\n },\n }).pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logWarning(\n `WebPush send failed for endpoint ${sub.endpoint}: ${formatPushError(error)}`,\n );\n if (shouldDropSubscriptionForPushError(error)) {\n invalidEndpoints.push(sub.endpoint);\n }\n }),\n ),\n ),\n { concurrency: \"unbounded\" },\n );\n\n // Clean up invalid subscriptions\n if (invalidEndpoints.length > 0) {\n yield* Ref.update(pushSubscriptionsRef, (subs) =>\n subs.filter((s) => !invalidEndpoints.includes(s.endpoint)),\n );\n }\n });\n\n return {\n getNotifications,\n createNotification,\n consumeNotifications,\n getVapidPublicKey,\n subscribePush,\n } as const;\n});\n\nexport type INotificationService = InferEffect<typeof LayerImpl>;\n\nexport class NotificationService extends Context.Tag(\"NotificationService\")<\n NotificationService,\n INotificationService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "type PushErrorDetails = {\n statusCode: number | undefined;\n body: string | undefined;\n message: string | undefined;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst getString = (value: unknown): string | undefined => {\n if (typeof value === \"string\") return value;\n return undefined;\n};\n\nconst getNumber = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n return undefined;\n};\n\nconst extractPushErrorDetails = (error: unknown): PushErrorDetails => {\n if (!isRecord(error)) {\n return {\n statusCode: undefined,\n body: undefined,\n message: getString(error),\n };\n }\n\n return {\n statusCode: getNumber(error.statusCode),\n body: getString(error.body),\n message: getString(error.message),\n };\n};\n\nexport const shouldDropSubscriptionForPushError = (error: unknown): boolean => {\n const { statusCode } = extractPushErrorDetails(error);\n return statusCode === 404 || statusCode === 410;\n};\n\nexport const formatPushError = (error: unknown): string => {\n const details = extractPushErrorDetails(error);\n\n if (details.statusCode !== undefined || details.body !== undefined) {\n const status = details.statusCode ?? \"unknown\";\n const body = details.body ?? \"empty\";\n return `status=${status}, body=${body}`;\n }\n\n return `message=${details.message ?? \"unknown\"}`;\n};\n", "export const isDevelopmentEnv = (ccvEnv: string | undefined): boolean => ccvEnv === \"development\";\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { computeClaudeProjectFilePath } from \"../../claude-code/functions/computeClaudeProjectFilePath.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService.ts\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository.ts\";\nimport { encodeProjectId } from \"../functions/id.ts\";\nimport { ProjectRepository } from \"../infrastructure/ProjectRepository.ts\";\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 !== undefined) {\n // Keep the session with the latest modification date\n if (session.lastModifiedAt > existingSession.lastModifiedAt) {\n sessionMap.set(title, session);\n }\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).claudeProjectsDirPath,\n });\n const projectId = encodeProjectId(claudeProjectFilePath);\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 sessionId: crypto.randomUUID(),\n resume: false,\n input: {\n text: claudeMdExists ? \"describe this project\" : \"/init\",\n },\n });\n\n const { sessionId } = result;\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(claudeProjectsDirPath, projectPath.replace(/\\/$/, \"\").replace(/\\//g, \"-\"));\n });\n", "import { Context, Effect, Layer, Ref } from \"effect\";\nimport { DEFAULT_LOCALE } from \"../../../../lib/i18n/localeDetection.ts\";\nimport type { UserConfig } from \"../../../lib/config/config.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\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 locale: DEFAULT_LOCALE,\n theme: \"system\",\n searchHotkey: \"command-k\",\n findHotkey: \"command-f\",\n autoScheduleContinueOnRateLimit: false,\n modelChoices: [\"default\", \"haiku\", \"sonnet\", \"opus\"],\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.ts\";\n\nexport const DEFAULT_LOCALE: SupportedLocale = \"en\";\n\nconst normalizeTag = (tag?: string): SupportedLocale | undefined => {\n if (tag === undefined || 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 === undefined || 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.map((param) => param.trim()).find((param) => param.startsWith(\"q=\"));\n const quality = qParam !== undefined ? 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 = (nav?: NavigatorLike): SupportedLocale | undefined => {\n if (!nav) {\n return undefined;\n }\n\n let languages: readonly string[];\n if (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 { FileSystem } from \"@effect/platform\";\nimport { desc, eq, sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { projects, sessions } from \"../../../lib/db/schema.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { parseJsonl } from \"../../claude-code/functions/parseJsonl.ts\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../project/functions/id.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { Session, SessionDetail } from \"../../types.ts\";\nimport { decodeSessionId, validateSessionId } from \"../functions/id.ts\";\nimport { SessionMetaService } from \"../services/SessionMetaService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const sessionMetaService = yield* SessionMetaService;\n const appContext = yield* ApplicationContext;\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n\n const getSession = (projectId: string, sessionId: string) =>\n Effect.gen(function* () {\n // Validate sessionId contains only safe characters\n if (!validateSessionId(sessionId)) {\n return yield* Effect.fail(new Error(\"Invalid session ID: contains unsafe characters\"));\n }\n\n // Validate that the project path is within the Claude projects directory\n const projectPath = decodeProjectId(projectId);\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\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 { session: null };\n }\n\n const sessionDetail = yield* 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(projectId, sessionId);\n\n const sessionDetail: SessionDetail = {\n id: sessionId,\n jsonlFilePath: sessionPath,\n meta,\n conversations,\n lastModifiedAt: Option.getOrElse(stat.mtime, () => new Date()),\n };\n\n return sessionDetail;\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 // Validate that the project path is within the Claude projects directory\n const { claudeProjectsDirPath } = yield* appContext.claudeCodePaths;\n if (!validateProjectPath(claudeProjectPath, claudeProjectsDirPath)) {\n return yield* Effect.fail(new Error(\"Invalid project path: outside allowed directory\"));\n }\n\n // Ensure project is synced in DB\n const projectExists = db\n .select({ one: sql<number>`1` })\n .from(projects)\n .where(eq(projects.id, projectId))\n .get();\n if (!projectExists) {\n yield* syncService.syncProjectList(projectId).pipe(Effect.catchAll(() => Effect.void));\n }\n\n // Fetch all sessions for project ordered by lastModifiedAt DESC\n const rows = db\n .select()\n .from(sessions)\n .where(eq(sessions.projectId, projectId))\n .orderBy(desc(sessions.lastModifiedAt))\n .all();\n\n if (rows.length === 0) {\n return { sessions: [] };\n }\n\n // Cursor-based pagination\n const startIndex =\n cursor !== undefined\n ? (() => {\n const idx = rows.findIndex((r) => r.id === cursor);\n return idx === -1 ? 0 : idx + 1;\n })()\n : 0;\n\n const sessionsToReturn = rows.slice(startIndex, startIndex + maxCount);\n\n const sessionsResult: Session[] = yield* Effect.all(\n sessionsToReturn.map((row) =>\n Effect.gen(function* () {\n const meta = yield* sessionMetaService.getSessionMeta(projectId, row.id);\n return {\n id: row.id,\n jsonlFilePath: row.filePath,\n lastModifiedAt: new Date(row.lastModifiedAt),\n meta,\n } satisfies Session;\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n\n return { sessions: sessionsResult };\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 { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { z } from \"zod\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport { type SessionRow, sessions } from \"../../../lib/db/schema.ts\";\nimport { parsedUserMessageSchema } from \"../../claude-code/functions/parseUserMessage.ts\";\nimport { SyncService } from \"../../sync/services/SyncService.ts\";\nimport type { SessionMeta } from \"../../types.ts\";\n\nconst parsedUserMessageOrNullSchema = parsedUserMessageSchema.nullable();\n\nconst costBreakdownSchema = z.object({\n inputTokensUsd: z.number(),\n outputTokensUsd: z.number(),\n cacheCreationUsd: z.number(),\n cacheReadUsd: z.number(),\n});\n\nconst tokenUsageSchema = z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n cacheCreationTokens: z.number(),\n cacheReadTokens: z.number(),\n});\n\nconst prLinksSchema = z.array(\n z.object({\n prNumber: z.number(),\n prUrl: z.string(),\n prRepository: z.string(),\n }),\n);\n\nconst defaultBreakdown = {\n inputTokensUsd: 0,\n outputTokensUsd: 0,\n cacheCreationUsd: 0,\n cacheReadUsd: 0,\n};\n\nconst defaultTokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n};\n\nconst rowToSessionMeta = (row: SessionRow): SessionMeta => {\n const firstUserMessage =\n row.firstUserMessageJson !== null\n ? parsedUserMessageOrNullSchema.parse(JSON.parse(row.firstUserMessageJson))\n : null;\n\n const breakdown =\n row.costBreakdownJson !== null\n ? costBreakdownSchema.parse(JSON.parse(row.costBreakdownJson))\n : defaultBreakdown;\n\n const tokenUsage =\n row.tokenUsageJson !== null\n ? tokenUsageSchema.parse(JSON.parse(row.tokenUsageJson))\n : defaultTokenUsage;\n\n const prLinks = row.prLinksJson !== null ? prLinksSchema.parse(JSON.parse(row.prLinksJson)) : [];\n\n return {\n messageCount: row.messageCount,\n firstUserMessage,\n customTitle: row.customTitle,\n cost: {\n totalUsd: row.totalCostUsd,\n breakdown,\n tokenUsage,\n },\n modelName: row.modelName,\n prLinks,\n };\n};\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: (projectId: string, sessionId: string) => Effect.Effect<void>;\n }\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const { db } = yield* DrizzleService;\n const syncService = yield* SyncService;\n\n const getSessionMeta = (\n projectId: string,\n sessionId: string,\n ): Effect.Effect<SessionMeta, Error> =>\n Effect.gen(function* () {\n const row = db.select().from(sessions).where(eq(sessions.id, sessionId)).get();\n\n if (row === undefined) {\n // Not in DB yet \u2014 sync and retry\n yield* syncService\n .syncSession(projectId, sessionId)\n .pipe(Effect.catchAll(() => Effect.void));\n\n const retryRow = db.select().from(sessions).where(eq(sessions.id, sessionId)).get();\n\n if (retryRow === undefined) {\n return yield* Effect.fail(new Error(`Session not found: ${sessionId}`));\n }\n\n return rowToSessionMeta(retryRow);\n }\n\n return rowToSessionMeta(row);\n });\n\n const invalidateSession = (projectId: string, sessionId: string): Effect.Effect<void> =>\n syncService.syncSession(projectId, sessionId).pipe(Effect.catchAll(() => Effect.void));\n\n return {\n getSessionMeta,\n invalidateSession,\n };\n }),\n );\n}\n\nexport type ISessionMetaService = Context.Tag.Service<typeof SessionMetaService>;\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { ClaudeCodeSessionProcessService } from \"../../claude-code/services/ClaudeCodeSessionProcessService.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport type { InternalEventDeclaration } from \"../../events/types/InternalEventDeclaration.ts\";\nimport { UserConfigService } from \"../../platform/services/UserConfigService.ts\";\nimport { decodeProjectId } from \"../../project/functions/id.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport { SchedulerConfigBaseDir } from \"../../scheduler/config.ts\";\nimport { SchedulerService } from \"../../scheduler/domain/Scheduler.ts\";\nimport { detectRateLimitFromLastLine } from \"../functions/detectRateLimitFromLastLine.ts\";\nimport { parseRateLimitResetTime } from \"../functions/parseRateLimitResetTime.ts\";\nimport { readLastLine } from \"../functions/readLastLine.ts\";\n\ntype SessionChangedListener = (event: InternalEventDeclaration[\"sessionChanged\"]) => 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 = (sessionId: string): 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.resume &&\n job.message.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 = (event: InternalEventDeclaration[\"sessionChanged\"]) =>\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(projectPath, `${sessionId}.jsonl`);\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 sessionId,\n resume: true,\n },\n enabled: true,\n })\n .pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(\n `[RateLimitAutoScheduleService] Failed to add job for session ${sessionId}: ${String(error)}`,\n ),\n );\n return Effect.void;\n }),\n );\n\n yield* Effect.logInfo(\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(handleSessionChanged(event).pipe(Effect.provide(runtimeLayer)));\n };\n\n yield* Ref.set(listenerRef, listener);\n yield* eventBus.on(\"sessionChanged\", listener);\n\n yield* Effect.logInfo(\"[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 yield* Effect.logInfo(\"[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(\"RateLimitAutoScheduleService\")<\n RateLimitAutoScheduleService,\n IRateLimitAutoScheduleService\n>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { EnvService } from \"../platform/services/EnvService.ts\";\nimport { type SchedulerConfig, schedulerConfigSchema } from \"./schema.ts\";\n\nclass ConfigFileNotFoundError extends Data.TaggedError(\"ConfigFileNotFoundError\")<{\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(\"SchedulerConfigBaseDir\")<\n SchedulerConfigBaseDir,\n string\n>() {\n static Live = Layer.effect(\n this,\n Effect.gen(function* () {\n const envService = yield* EnvService;\n const path = yield* Path.Path;\n const homeDirectory = yield* envService.getEnv(\"HOME\");\n return path.resolve(homeDirectory ?? \"/\", \".claude-code-viewer\");\n }),\n );\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(new ConfigFileNotFoundError({ path: configPath }));\n }\n\n const content = yield* fs.readFileString(configPath);\n\n const jsonResult: unknown = yield* Effect.try({\n try: (): unknown => 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 sessionId: z.uuid(),\n resume: z.boolean(),\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.iso.datetime(),\n lastRunAt: z.iso.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 { Context, Cron, Data, Duration, Effect, Fiber, Layer, Ref, Schedule } from \"effect\";\nimport { ulid } from \"ulid\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { initializeConfig, readConfig, writeConfig } from \"../config.ts\";\nimport type {\n NewSchedulerJob,\n SchedulerConfig,\n SchedulerJob,\n UpdateSchedulerJob,\n} from \"../schema.ts\";\nimport { calculateReservedDelay, executeJob } from \"./Job.ts\";\n\nclass SchedulerJobNotFoundError extends Data.TaggedError(\"SchedulerJobNotFoundError\")<{\n readonly jobId: string;\n}> {}\n\nclass InvalidCronExpressionError extends Data.TaggedError(\"InvalidCronExpressionError\")<{\n readonly expression: string;\n readonly cause: unknown;\n}> {}\n\nconst LayerImpl = Effect.gen(function* () {\n const eventBus = yield* EventBus;\n const fibersRef = yield* Ref.make<Map<string, Fiber.RuntimeFiber<unknown, unknown>>>(new Map());\n const runningJobsRef = yield* Ref.make<Set<string>>(new Set());\n\n const emitSchedulerJobsChanged = eventBus.emit(\"schedulerJobsChanged\", {});\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) => new Map(fibers).set(job.id, fiber));\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(runJobWithConcurrencyControl(job), delayDuration).pipe(\n Effect.forkDaemon,\n );\n\n yield* Ref.update(fibersRef, (fibers) => new Map(fibers).set(job.id, fiber));\n }\n });\n\n const runJobWithConcurrencyControl = (job: SchedulerJob) =>\n Effect.gen(function* () {\n // Check concurrency policy (only for cron jobs)\n if (job.schedule.type === \"cron\" && job.schedule.concurrencyPolicy === \"skip\") {\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: () => {\n return Effect.logInfo(`[Scheduler] Reserved job ${job.id} executed successfully`);\n },\n onFailure: (error) => {\n return Effect.logError(`[Scheduler] Reserved job ${job.id} failed: ${String(error)}`);\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 // Delete reserved job after execution (skip fiber stop, just delete from config)\n yield* deleteJobFromConfig(job.id).pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(\n `[Scheduler] Failed to delete reserved job ${job.id}: ${String(error)}`,\n ),\n );\n return Effect.void;\n }),\n );\n\n yield* emitSchedulerJobsChanged;\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 Effect.logInfo(`[Scheduler] Job ${job.id} executed successfully`).pipe(\n Effect.zipRight(updateJobStatus(job.id, \"success\", new Date().toISOString())),\n ),\n onFailure: (error) =>\n Effect.logError(`[Scheduler] Job ${job.id} failed: ${String(error)}`).pipe(\n Effect.zipRight(updateJobStatus(job.id, \"failed\", new Date().toISOString())),\n ),\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 = (jobId: string, status: \"success\" | \"failed\", runAt: string) =>\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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: () => initializeConfig.pipe(Effect.map(() => ({ jobs: [] }))),\n ConfigParseError: () => 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 yield* emitSchedulerJobsChanged;\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.ts\";\nimport { ProjectRepository } from \"../../project/infrastructure/ProjectRepository.ts\";\nimport type { SchedulerJob } from \"../schema.ts\";\n\nexport const executeJob = (job: SchedulerJob) =>\n Effect.gen(function* () {\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n\n const { message } = job;\n const { project } = yield* projectRepository.getProject(message.projectId);\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 sessionId: message.sessionId,\n resume: message.resume,\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 = (job: SchedulerJob, now: Date): 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, RateLimitEntrySchema } from \"../schema.ts\";\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 = (jsonLine: string): 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 = /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 (hoursStr === undefined || meridiem === undefined || timezone === undefined) {\n return getFallbackTime();\n }\n\n const hours = Number.parseInt(hoursStr, 10);\n const minutes = 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(parts.find((p) => p.type === \"hour\")?.value ?? \"0\", 10),\n minute: Number.parseInt(parts.find((p) => p.type === \"minute\")?.value ?? \"0\", 10),\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 = 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 = (hours: number, minutes: number, timezone: string): 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 === undefined || month === undefined || day === undefined) {\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(baseDate.getTime() + totalUtcMinutes * 60 * 1000);\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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SchedulerService } from \"../domain/Scheduler.ts\";\nimport type { NewSchedulerJob, UpdateSchedulerJob } from \"../schema.ts\";\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(Effect.catchTag(\"SchedulerJobNotFoundError\", () => Effect.succeed(null)));\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\", () => Effect.succeed(false)),\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.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { SearchService } from \"../services/SearchService.ts\";\n\nconst LayerImpl = Effect.gen(function* () {\n const searchService = yield* SearchService;\n\n const search = (options: { query: string; limit?: number; projectId?: string }) =>\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(query.trim(), limit, projectId);\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 { sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DrizzleService } from \"../../../lib/db/DrizzleService.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\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\n// FTS5 query result row type (raw SQL returns snake_case)\ntype SearchJoinRow = {\n session_id: string;\n project_id: string;\n project_name: string | null;\n role: string;\n content: string;\n conversation_index: number;\n rank: number;\n last_modified_at: string | null;\n};\n\n/**\n * Escape user input for FTS5 MATCH queries.\n * When using trigram tokenizer, queries are treated as plain strings,\n * but special characters like double quotes or parentheses can cause\n * parse errors. Wrap the entire input in double quotes and escape\n * internal double quotes.\n */\nconst escapeFtsQuery = (query: string): string => {\n const escaped = query.replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n};\n\nconst isValidRole = (role: string): role is \"user\" | \"assistant\" =>\n role === \"user\" || role === \"assistant\";\n\nconst LayerImpl = Effect.gen(function* () {\n const drizzleService = yield* DrizzleService;\n const { db } = drizzleService;\n\n const search = (query: string, limit = 20, projectId?: string) =>\n Effect.gen(function* () {\n if (!query.trim()) {\n return { results: [] as SearchResult[] };\n }\n\n const ftsQuery = escapeFtsQuery(query);\n\n let drizzleQuery = sql`\n SELECT\n fts.session_id,\n fts.project_id,\n p.name as project_name,\n fts.role,\n fts.content,\n CAST(fts.conversation_index AS INTEGER) as conversation_index,\n fts.rank,\n s.last_modified_at\n FROM session_messages_fts fts\n LEFT JOIN projects p ON p.id = fts.project_id\n LEFT JOIN sessions s ON s.id = fts.session_id\n WHERE session_messages_fts MATCH ${ftsQuery}\n `;\n\n if (projectId !== undefined) {\n drizzleQuery = sql`${drizzleQuery} AND fts.project_id = ${projectId}`;\n }\n\n // rank sorts by BM25 score (lower = more relevant)\n // Fetch extra rows to allow for role filtering\n drizzleQuery = sql`${drizzleQuery} ORDER BY rank LIMIT ${limit * 2}`;\n\n const rows = yield* Effect.try({\n try: () => db.all<SearchJoinRow>(drizzleQuery),\n catch: (err) =>\n new Error(`FTS5 query failed: ${err instanceof Error ? err.message : String(err)}`),\n });\n\n const results: SearchResult[] = [];\n for (const row of rows) {\n if (results.length >= limit) break;\n\n if (!isValidRole(row.role)) continue;\n\n const text = row.content;\n const queryLower = query.toLowerCase();\n const textLower = text.toLowerCase();\n const matchIndex = textLower.indexOf(queryLower);\n const snippetLength = 150;\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 ? \"...\" : \"\") + text.slice(start, end) + (end < text.length ? \"...\" : \"\");\n } else {\n snippet = text.slice(0, snippetLength) + (text.length > snippetLength ? \"...\" : \"\");\n }\n\n // FTS5 rank is negative (BM25): larger absolute value = more relevant\n // Boost user messages\n const score = row.role === \"user\" ? -row.rank * 1.2 : -row.rank;\n\n results.push({\n projectId: row.project_id,\n projectName: row.project_name ?? \"\",\n sessionId: row.session_id,\n conversationIndex: row.conversation_index,\n type: row.role,\n snippet,\n timestamp: row.last_modified_at ?? \"\",\n score,\n });\n }\n\n return { results };\n }).pipe(\n Effect.catchAll((err) => {\n return Effect.logError(`SearchService.search error: ${String(err)}`).pipe(\n Effect.zipRight(Effect.succeed({ results: [] as SearchResult[] })),\n );\n }),\n );\n\n // FTS5 always reads latest data, so invalidation is a no-op\n const invalidateIndex = () => Effect.void;\n\n return {\n search,\n invalidateIndex,\n };\n});\n\nexport type ISearchService = InferEffect<typeof LayerImpl>;\nexport class SearchService extends Context.Tag(\"SearchService\")<SearchService, ISearchService>() {\n static Live = Layer.effect(this, LayerImpl);\n}\n", "import { FileSystem } from \"@effect/platform\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { ControllerResponse } from \"../../../lib/effect/toEffectResponse.ts\";\nimport type { InferEffect } from \"../../../lib/effect/types.ts\";\nimport { AgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository.ts\";\nimport { EventBus } from \"../../events/services/EventBus.ts\";\nimport { SessionRepository } from \"../../session/infrastructure/SessionRepository.ts\";\nimport { decodeSessionId } from \"../functions/id.ts\";\nimport { generateSessionHtml } from \"../services/ExportService.ts\";\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(projectId, sessionId);\n\n return {\n status: 200,\n response: { session },\n } as const satisfies ControllerResponse;\n });\n\n const exportSessionHtml = (options: { projectId: string; sessionId: string }) =>\n Effect.gen(function* () {\n const { projectId, sessionId } = options;\n\n const { session } = yield* sessionRepository.getSession(projectId, sessionId);\n\n if (session === null) {\n return {\n status: 404,\n response: { error: \"Session not found\" },\n } as const satisfies ControllerResponse;\n }\n\n const html = yield* generateSessionHtml(session, projectId, agentSessionRepository);\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 { ToolResultContent } from \"../../../../lib/conversation-schema/content/ToolResultContentSchema.ts\";\nimport type { Conversation } from \"../../../../lib/conversation-schema/index.ts\";\nimport type { IAgentSessionRepository } from \"../../agent-session/infrastructure/AgentSessionRepository.ts\";\nimport type { SessionDetail } from \"../../types.ts\";\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.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\").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, langRaw, codeRaw) => {\n const lang = typeof langRaw === \"string\" ? langRaw : undefined;\n const code = typeof codeRaw === \"string\" ? codeRaw : \"\";\n const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`\n <div class=\"code-block\">\n ${lang !== undefined ? `<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?)+/gm, (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 === undefined ||\n separatorRow === undefined ||\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 // Escape HTML for remaining content (except already processed tables)\n // We need to escape only non-processed parts\n processedContent = processedContent\n .split(/(<table class=\"markdown-table\">[\\s\\S]*?<\\/table>|__CODE_BLOCK_\\d+__)/)\n .map((part) => {\n if (part.startsWith('<table class=\"markdown-table\">') || /^__CODE_BLOCK_\\d+__$/.test(part)) {\n return part;\n }\n return escapeHtml(part);\n })\n .join(\"\");\n\n // Blockquotes (multi-line support)\n processedContent = processedContent.replace(/(?:^> .+$\\n?)+/gm, (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 // 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(/(?:^- \\[([ xX])\\] .+$\\n?)+/gm, (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 // Unordered lists\n processedContent = processedContent.replace(/(?:^[-*+] .+$\\n?)+/gm, (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 // Ordered lists\n processedContent = processedContent.replace(/(?:^\\d+\\. .+$\\n?)+/gm, (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 // Strikethrough\n processedContent = processedContent.replace(/~~(.+?)~~/g, '<del class=\"markdown-del\">$1</del>');\n\n // Inline code\n processedContent = processedContent.replace(/`([^`]+)`/g, '<code class=\"inline-code\">$1</code>');\n\n // Bold\n processedContent = processedContent.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\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(/^### (.+)$/gm, '<h3 class=\"markdown-h3\">$1</h3>');\n processedContent = processedContent.replace(/^## (.+)$/gm, '<h2 class=\"markdown-h2\">$1</h2>');\n processedContent = processedContent.replace(/^# (.+)$/gm, '<h1 class=\"markdown-h1\">$1</h1>');\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(`__CODE_BLOCK_${i}__`, codeBlock);\n }\n }\n\n return processedContent;\n};\n\n/**\n * Renders a user message entry\n */\nconst renderUserEntry = (entry: Extract<Conversation, { type: \"user\" }>): 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<string, Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\n // Map from agentId to root conversation\n agentIdToRoot: Map<string, Extract<Conversation, { type: \"user\" | \"assistant\" | \"system\" }>>;\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 = (toolUseResult: unknown): 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 = (conversations: Array<Conversation>): SidechainData => {\n // Filter sidechain conversations\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- type narrowing via filter conditions is safe here\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.type !== \"custom-title\" &&\n conv.type !== \"agent-name\" &&\n conv.type !== \"agent-setting\" &&\n conv.type !== \"pr-link\" &&\n conv.type !== \"last-prompt\" &&\n conv.type !== \"permission-mode\" &&\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(sidechainConversations.map((conv) => [conv.uuid, conv] as const));\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((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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\" ? entry.content : \"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 = 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 !== undefined && 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) => renderSidechainEntry(conv, toolResultMap, sidechainData))\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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 = (entry: Extract<Conversation, { type: \"system\" }>): 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 = (entry: Extract<Conversation, { type: \"system\" }>): 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<Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>>;\n}> => {\n const grouped: Array<{\n type: \"grouped\" | \"single\";\n entries: Array<Extract<Conversation, { type: \"assistant\" | \"user\" | \"system\" }>>;\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 if (msg.thinking === \"\") {\n return \"\";\n }\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\" || msg.name === \"Agent\") {\n return renderTaskTool(msg.id, msg.input, toolResult, sidechainData, toolResultMap);\n }\n\n const inputKeys = Object.keys(msg.input).length;\n const toolResultHtml = toolResult ? renderToolResultContent(toolResult) : \"\";\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.type !== \"custom-title\" &&\n conv.type !== \"agent-name\" &&\n conv.type !== \"agent-setting\" &&\n conv.type !== \"pr-link\" &&\n conv.type !== \"last-prompt\" &&\n conv.type !== \"permission-mode\" &&\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((id) => !existingAgentIds.has(id));\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(projectId, agentId, session.id),\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\" || c.type === \"assistant\" || 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((conv): conv is Conversation => conv.type !== \"x-error\"),\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 const assistantEntries = group.entries.filter(\n (entry): entry is Extract<Conversation, { type: \"assistant\" }> =>\n entry.type === \"assistant\",\n );\n return renderGroupedAssistantEntries(assistantEntries, toolResultMap, sidechainData);\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.ts\";\nimport { TasksService } from \"../services/TasksService.ts\";\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 = (projectPath: string, task: TaskCreate, specificSessionId?: string) =>\n service.createTask(projectPath, task, specificSessionId);\n\n const updateTask = (projectPath: string, task: TaskUpdate, 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", "// oxlint-disable-next-line jsdoc/check-tag-names -- effect-diagnostics is a valid Effect-TS directive\n/** @effect-diagnostics globalErrorInEffectFailure:skip-file */\nimport { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Option } from \"effect\";\nimport { z } from \"zod\";\nimport { ApplicationContext } from \"../../platform/services/ApplicationContext.ts\";\nimport { type Task, type TaskCreate, TaskSchema, type TaskUpdate } from \"../schema.ts\";\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: (projectPath: string, specificSessionId?: string) => 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 const appContext = yield* ApplicationContext;\n\n // Helper to find the Global Claude Directory\n const getClaudeDir = () =>\n appContext.claudeCodePaths.pipe(Effect.map((paths) => paths.globalClaudeDirectoryPath));\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 !== undefined && specificSessionId !== \"\") {\n const sessionTasksDir = path.join(claudeDir, TASKS_DIR_NAME, specificSessionId);\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(path.join(CLAUDE_DIR_NAME, PROJECTS_DIR_NAME)) &&\n projectPath.split(path.sep).pop()?.startsWith(\"-\");\n\n let projectMetaDir: string;\n\n if (isMetadataPath === true && (yield* fs.exists(projectPath))) {\n projectMetaDir = projectPath;\n } else {\n const identifier = normalizeProjectPath(projectPath);\n projectMetaDir = path.join(claudeDir, PROJECTS_DIR_NAME, identifier);\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 = /^[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(projectPath, specificSessionId);\n\n if (Option.isNone(uuidOption)) {\n if (specificSessionId !== undefined && specificSessionId !== \"\") {\n return yield* Effect.fail(\n new Error(`Requested session ${specificSessionId} has no tasks directory`),\n );\n }\n const claudeDir = yield* getClaudeDir();\n const identifier = normalizeProjectPath(projectPath);\n const projectMetaDir = path.join(claudeDir, PROJECTS_DIR_NAME, identifier);\n return yield* Effect.fail(\n new Error(`Project metadata directory not found or no UUID: ${projectMetaDir}`),\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(projectPath, specificSessionId);\n\n return Option.map(uuidOption, (uuid) => path.join(claudeDir, TASKS_DIR_NAME, uuid));\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(projectPath, specificSessionId);\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(projectPath, specificSessionId);\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: unknown = 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 Effect.runFork(\n Effect.logWarning(`Invalid task file ${file}: ${parsed.error.message}`),\n );\n // Create a fallback task for invalid schema\n const fallbackSchema = z.object({\n id: z.string().optional(),\n subject: z.string().optional(),\n title: z.string().optional(),\n status: z.enum([\"pending\", \"in_progress\", \"completed\", \"failed\"]).optional(),\n });\n const fallbackParsed = fallbackSchema.safeParse(task);\n const fb = fallbackParsed.success ? fallbackParsed.data : {};\n const taskId = fb.id ?? file.replace(\".json\", \"\");\n const taskSubject = fb.subject ?? fb.title ?? \"Invalid Task Schema\";\n const validStatus = fb.status ?? \"failed\";\n const fallbackTask: Task = {\n id: taskId,\n subject: taskSubject,\n description: `Validation Error: ${JSON.stringify(z.treeifyError(parsed.error))}. Raw: ${JSON.stringify(task)}`,\n status: validStatus,\n blocks: [],\n blockedBy: [],\n };\n tasks.push(fallbackTask);\n }\n } catch (e) {\n Effect.runFork(Effect.logError(`Failed to parse task file ${file}: ${String(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 = (projectPath: string, turnId: string, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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: unknown = JSON.parse(content);\n return yield* Effect.try(() => TaskSchema.parse(task));\n });\n\n const createTask = (projectPath: string, turnDef: TaskCreate, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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 = (projectPath: string, update: TaskUpdate, specificSessionId?: string) =>\n Effect.gen(function* () {\n const tasksDir = yield* getTasksDirOrFail(projectPath, specificSessionId);\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(new Error(`Task ${update.taskId} not found`));\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(filePath, JSON.stringify(updatedTask, null, 2));\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([\"pending\", \"in_progress\", \"completed\", \"failed\"]);\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.ts\";\nimport { CcvOptionsService } from \"../platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../platform/services/EnvService.ts\";\nimport { normalizePtyChunk } from \"./normalizePtyChunk.ts\";\nimport {\n createRusptySession,\n type RusptyModule,\n type TerminalPtyProcess,\n} from \"./rusptyAdapter.ts\";\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 !== true && 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 === undefined || 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) => new Error(`Failed to load @replit/ruspty: ${String(error)}`),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n Effect.runFork(Effect.logWarning(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 (session.bufferBytes > MAX_BUFFER_BYTES && session.buffer.length > 0) {\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(options.shell, options.fallbackShell, options.unrestrictedFlag);\n const ptyEnv = { ...options.env };\n const hasUtf8 = (v: string | undefined): boolean => v !== undefined && /utf-?8/i.test(v);\n if (!hasUtf8(ptyEnv.LANG)) {\n ptyEnv.LANG = \"C.UTF-8\";\n }\n if (!hasUtf8(ptyEnv.LC_CTYPE)) {\n ptyEnv.LC_CTYPE = \"C.UTF-8\";\n }\n const { process: ptyProcess, read } = createRusptySession(ruspty, {\n command: shell.command,\n args: shell.args,\n envs: ptyEnv,\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 === undefined || sessionId === \"\") return undefined;\n return sessions.get(sessionId);\n };\n\n const getOrCreateSession = (sessionId: string | undefined, cwdOverride?: string) =>\n Effect.gen(function* () {\n const terminalDisabledEnv = yield* envService.getEnv(\"CCV_TERMINAL_DISABLED\");\n const terminalDisabledOption = yield* ccvOptionsService.getCcvOptions(\"terminalDisabled\");\n const terminalDisabled = terminalDisabledOption ?? isFlagEnabled(terminalDisabledEnv);\n if (terminalDisabled) {\n return yield* Effect.fail(\n new Error(\"Terminal support is unavailable (CCV_TERMINAL_DISABLED is enabled).\"),\n );\n }\n const cwd = cwdOverride ?? process.cwd();\n const terminalShellOption = yield* ccvOptionsService.getCcvOptions(\"terminalShell\");\n const shell = terminalShellOption ?? (yield* envService.getEnv(\"CCV_TERMINAL_SHELL\"));\n const fallbackShell = yield* envService.getEnv(\"SHELL\");\n const terminalUnrestrictedOption =\n yield* ccvOptionsService.getCcvOptions(\"terminalUnrestricted\");\n const terminalUnrestrictedEnv = yield* envService.getEnv(\"CCV_TERMINAL_UNRESTRICTED\");\n const unrestrictedFlag = 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 Effect.runFork(Effect.logDebug(`[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\n// oxlint-disable-next-line typescript-eslint/consistent-type-imports -- dynamic import type needed for optional dependency\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 = (ruspty: RusptyModule, options: PtyOptions): 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.ts\";\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 { FileSystem, Path } from \"@effect/platform\";\nimport { Context, Effect, Layer, Ref, Schedule } from \"effect\";\nimport { ClaudeCodeLifeCycleService } from \"../core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { EventBus } from \"../core/events/services/EventBus.ts\";\nimport { FileWatcherService } from \"../core/events/services/fileWatcher.ts\";\nimport type { InternalEventDeclaration } from \"../core/events/types/InternalEventDeclaration.ts\";\nimport { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository.ts\";\nimport { ProjectMetaService } from \"../core/project/services/ProjectMetaService.ts\";\nimport { RateLimitAutoScheduleService } from \"../core/rate-limit/services/RateLimitAutoScheduleService.ts\";\nimport { SchedulerConfigBaseDir } from \"../core/scheduler/config.ts\";\nimport { SchedulerService } from \"../core/scheduler/domain/Scheduler.ts\";\nimport { SessionMetaService } from \"../core/session/services/SessionMetaService.ts\";\nimport { SyncService } from \"../core/sync/services/SyncService.ts\";\n\ntype 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 projectMetaService = yield* ProjectMetaService;\n const sessionMetaService = yield* SessionMetaService;\n const rateLimitAutoScheduleService = yield* RateLimitAutoScheduleService;\n const schedulerService = yield* SchedulerService;\n const syncService = yield* SyncService;\n\n // Capture dependencies for startScheduler (which requires runtime services)\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const schedulerConfigBaseDir = yield* SchedulerConfigBaseDir;\n const lifeCycleService = yield* ClaudeCodeLifeCycleService;\n const projectRepository = yield* ProjectRepository;\n const schedulerRuntimeLayer = Layer.mergeAll(\n Layer.succeed(FileSystem.FileSystem, fs),\n Layer.succeed(Path.Path, pathService),\n Layer.succeed(SchedulerConfigBaseDir, schedulerConfigBaseDir),\n Layer.succeed(ClaudeCodeLifeCycleService, lifeCycleService),\n Layer.succeed(ProjectRepository, projectRepository),\n );\n\n // \u72B6\u614B\u7BA1\u7406\u7528\u306E Ref\n const listenersRef = yield* Ref.make<{\n sessionChanged?: ((event: InternalEventDeclaration[\"sessionChanged\"]) => void) | null;\n sessionListChanged?:\n | ((event: InternalEventDeclaration[\"sessionListChanged\"]) => void)\n | null;\n }>({});\n\n const startInitialization = (): Effect.Effect<void> => {\n return Effect.gen(function* () {\n // Run full sync to populate SQLite cache\n yield* Effect.logInfo(\"Starting fullSync...\");\n yield* syncService.fullSync().pipe(\n Effect.catchAll((e) => {\n Effect.runFork(Effect.logError(`[InitializeService] fullSync failed: ${String(e)}`));\n return Effect.void;\n }),\n );\n yield* Effect.logInfo(\"fullSync completed\");\n\n // \u30D5\u30A1\u30A4\u30EB\u30A6\u30A9\u30C3\u30C1\u30E3\u30FC\u3092\u958B\u59CB\n yield* fileWatcher.startWatching();\n\n // Start all enabled scheduled jobs\n yield* schedulerService.startScheduler.pipe(\n Effect.provide(schedulerRuntimeLayer),\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] startScheduler failed: ${String(error)}`),\n );\n return Effect.void;\n }),\n );\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 yield* Effect.logInfo(\"start heartbeat\");\n yield* Effect.forkDaemon(daemon);\n yield* Effect.logInfo(\"after starting heartbeat fork\");\n\n // sessionChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionChanged = (event: InternalEventDeclaration[\"sessionChanged\"]) => {\n Effect.runFork(projectMetaService.invalidateProject(event.projectId));\n\n Effect.runFork(sessionMetaService.invalidateSession(event.projectId, event.sessionId));\n };\n\n // sessionListChanged \u30A4\u30D9\u30F3\u30C8\u306E\u30EA\u30B9\u30CA\u30FC\u3092\u767B\u9332\n const onSessionListChanged = (event: InternalEventDeclaration[\"sessionListChanged\"]) => {\n Effect.runFork(\n syncService.syncProjectList(event.projectId).pipe(\n Effect.catchAll((e) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] syncProjectList failed: ${String(e)}`),\n );\n return Effect.void;\n }),\n ),\n );\n };\n\n yield* Ref.set(listenersRef, {\n sessionChanged: onSessionChanged,\n sessionListChanged: onSessionListChanged,\n });\n yield* eventBus.on(\"sessionChanged\", onSessionChanged);\n yield* eventBus.on(\"sessionListChanged\", onSessionListChanged);\n }).pipe(Effect.withSpan(\"start-initialization\"));\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 if (listeners.sessionListChanged) {\n yield* eventBus.off(\"sessionListChanged\", listeners.sessionListChanged);\n }\n\n yield* Ref.set(listenersRef, {});\n yield* schedulerService.stopScheduler.pipe(\n Effect.catchAll((error) => {\n Effect.runFork(\n Effect.logError(`[InitializeService] stopScheduler failed: ${String(error)}`),\n );\n return Effect.void;\n }),\n );\n yield* rateLimitAutoScheduleService.stop();\n yield* fileWatcher.stop();\n });\n\n return {\n startInitialization,\n stopCleanup,\n } satisfies InitializeServiceInterface;\n }),\n );\n}\n", "import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { Context, Effect, Layer, Runtime } from \"effect\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\nimport { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService.ts\";\nimport type { InferEffect } from \"../../lib/effect/types.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\n/**\n * Compare two strings in constant time to prevent timing attacks.\n * Returns false immediately if lengths differ (length is already leaked by nature).\n */\nconst safeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a, \"utf-8\"), Buffer.from(b, \"utf-8\"));\n};\n\n// Generate a cryptographically random session token (not derived from password)\nconst generateSessionToken = (password: string | undefined): string => {\n if (password === undefined || password === \"\") return \"\";\n return randomBytes(32).toString(\"hex\");\n};\n\nconst getBearerToken = (authorization: string | undefined) => {\n if (authorization === undefined || authorization === \"\") return undefined;\n const [scheme, token] = authorization.split(\" \");\n if (scheme === undefined || scheme === \"\" || token === undefined || token === \"\")\n 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 =\n sessionToken !== undefined &&\n validSessionToken !== \"\" &&\n safeEqual(sessionToken, validSessionToken);\n const bearerAuthorized =\n authPassword !== undefined &&\n bearerToken !== undefined &&\n safeEqual(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 // Cache the session token so it remains stable across calls (generated once on first access)\n let cachedSessionToken: string | undefined;\n\n const getAuthState = Effect.gen(function* () {\n const authPassword = yield* ccvOptionsService.getCcvOptions(\"password\");\n const authEnabled = authPassword !== undefined;\n cachedSessionToken ??= generateSessionToken(authPassword);\n return { authEnabled, authPassword, validSessionToken: cachedSessionToken };\n });\n\n const authRequiredMiddleware = createMiddleware<HonoContext>(async (c, next) => {\n if (!c.req.path.startsWith(\"/api\")) {\n return next();\n }\n\n const { authEnabled, validSessionToken, authPassword } = await runPromise(getAuthState);\n\n return createAuthRequiredMiddleware(authEnabled, validSessionToken, authPassword)(c, next);\n });\n\n return {\n getAuthState,\n authRequiredMiddleware,\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 { createMiddleware } from \"hono/factory\";\nimport prexit from \"prexit\";\nimport packageJson from \"../../../../package.json\" with { type: \"json\" };\nimport {\n CcvOptionsService,\n type CliOptions,\n} from \"../../core/platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../../core/platform/services/EnvService.ts\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService.ts\";\nimport { userConfigSchema } from \"../../lib/config/config.ts\";\nimport type { HonoAppType, HonoContext } from \"../app.ts\";\nimport { InitializeService } from \"../initialize.ts\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware.ts\";\nimport { configMiddleware } from \"../middleware/config.middleware.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\nimport { authRoutes } from \"./authRoutes.ts\";\nimport { claudeCodeRoutes } from \"./claudeCodeRoutes.ts\";\nimport { featureFlagRoutes } from \"./featureFlagRoutes.ts\";\nimport { fileSystemRoutes } from \"./fileSystemRoutes.ts\";\nimport { notificationRoutes } from \"./notificationRoutes.ts\";\nimport { projectRoutes } from \"./projectRoutes.ts\";\nimport { schedulerRoutes } from \"./schedulerRoutes.ts\";\nimport { searchRoutes } from \"./searchRoutes.ts\";\nimport { sseRoutes } from \"./sseRoutes.ts\";\nimport { tasksRoutes } from \"./tasksRoutes.ts\";\n\nconst API_ONLY_ALLOWED_PREFIXES = [\n \"/api/version\",\n \"/api/config\",\n \"/api/projects\",\n \"/api/claude-code\",\n \"/api/search\",\n \"/api/notifications\",\n \"/api/sse\",\n];\n\nconst createApiOnlyMiddleware = (apiOnly: boolean) =>\n createMiddleware<HonoContext>(async (c, next) => {\n if (apiOnly) {\n const path = c.req.path;\n const allowed = API_ONLY_ALLOWED_PREFIXES.some(\n (prefix) => path === prefix || path.startsWith(`${prefix}/`),\n );\n if (!allowed) {\n return c.json({ error: \"Not Found\" }, 404);\n }\n }\n return next();\n });\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 const apiOnly = (yield* ccvOptionsService.getCcvOptions(\"apiOnly\")) === true;\n const apiOnlyMiddleware = createApiOnlyMiddleware(apiOnly);\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(apiOnlyMiddleware)\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\", (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\", (c) => {\n return c.json({\n config: c.get(\"userConfig\"),\n });\n })\n .put(\"/api/config\", zValidator(\"json\", userConfigSchema), (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/notifications\", yield* notificationRoutes)\n .route(\"/api/sse\", yield* sseRoutes)\n );\n });\n\nexport type RouteType =\n ReturnType<typeof routes> extends Effect.Effect<infer A, unknown, unknown> ? A : never;\n", "import z from \"zod\";\nimport { localeSchema } from \"../i18n/schema.ts\";\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 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 findHotkey: z.enum([\"ctrl-f\", \"command-f\"]).optional().default(\"command-f\"),\n autoScheduleContinueOnRateLimit: z.boolean().optional().default(false),\n modelChoices: z.array(z.string()).optional().default([\"default\", \"haiku\", \"sonnet\", \"opus\"]),\n usageMode: z.enum([\"subscription\", \"api\"]).optional(),\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.ts\";\nimport { defaultUserConfig, type UserConfig } from \"../../lib/config/config.ts\";\nimport { parseUserConfig } from \"../../lib/config/parseUserConfig.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\nexport const configMiddleware = createMiddleware<HonoContext>(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\")) ?? 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", "import { userConfigSchema } from \"./config.ts\";\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.ts\";\nimport type { ApplicationContext } from \"../core/platform/services/ApplicationContext.ts\";\nimport type { CcvOptionsService } from \"../core/platform/services/CcvOptionsService.ts\";\nimport type { EnvService } from \"../core/platform/services/EnvService.ts\";\nimport type { UserConfigService } from \"../core/platform/services/UserConfigService.ts\";\nimport type { ProjectRepository } from \"../core/project/infrastructure/ProjectRepository.ts\";\nimport type { SchedulerConfigBaseDir } from \"../core/scheduler/config.ts\";\nimport type { SessionMetaService } from \"../core/session/services/SessionMetaService.ts\";\n\nexport type HonoRuntime =\n | CcvOptionsService\n | EnvService\n | SessionMetaService\n | FileSystem.FileSystem\n | Path.Path\n | CommandExecutor.CommandExecutor\n | UserConfigService\n | ClaudeCodeLifeCycleService\n | ProjectRepository\n | SchedulerConfigBaseDir\n | ApplicationContext;\n\nexport const getHonoRuntime = Effect.runtime<HonoRuntime>();\n", "import { timingSafeEqual } from \"node:crypto\";\nimport { 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.ts\";\nimport { AuthMiddleware } from \"../middleware/auth.middleware.ts\";\n\n/**\n * Compare two strings in constant time to prevent timing attacks.\n * Returns false immediately if lengths differ (length is already leaked by nature).\n */\nconst safeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a, \"utf-8\"), Buffer.from(b, \"utf-8\"));\n};\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(\"/login\", zValidator(\"json\", z.object({ password: z.string() })), (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 (authPassword === undefined || !safeEqual(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 .post(\"/logout\", (c) => {\n deleteCookie(c, \"ccv-session\", { path: \"/\" });\n return c.json({ success: true });\n })\n\n .get(\"/check\", (c) => {\n const sessionToken = getCookie(c, \"ccv-session\");\n const isAuthenticated = authEnabled\n ? sessionToken !== undefined &&\n validSessionToken !== \"\" &&\n safeEqual(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.ts\";\nimport { CCVAskUserQuestionController } from \"../../core/claude-code/presentation/CCVAskUserQuestionController.ts\";\nimport { ClaudeCodeController } from \"../../core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { ClaudeCodePermissionController } from \"../../core/claude-code/presentation/ClaudeCodePermissionController.ts\";\nimport { ClaudeCodeSessionProcessController } from \"../../core/claude-code/presentation/ClaudeCodeSessionProcessController.ts\";\nimport { ccOptionsSchema, userMessageInputSchema } from \"../../core/claude-code/schema.ts\";\nimport { ClaudeCodeLifeCycleService } from \"../../core/claude-code/services/ClaudeCodeLifeCycleService.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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 type: document.type,\n source: document.source,\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 = yield* ClaudeCodeSessionProcessController;\n const ccvAskUserQuestionController = yield* CCVAskUserQuestionController;\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.getAvailableFeatures().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 sessionId: z.uuid(),\n input: userMessageInputSchema,\n resume: z.boolean(),\n ccOptions: ccOptionsSchema.optional(),\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.createSessionProcess({\n ...body,\n input,\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 (c) => {\n const { sessionProcessId } = c.req.param();\n void Effect.runFork(claudeCodeLifeCycleService.abortTask(sessionProcessId));\n return c.json({ message: \"Task aborted\" });\n },\n )\n .get(\"/pending-permission-requests\", async (c) => {\n const response = await effectToResponse(\n c,\n claudeCodePermissionController.getPendingPermissionRequests(),\n );\n return response;\n })\n .get(\"/pending-question-requests\", async (c) => {\n const response = await effectToResponse(\n c,\n ccvAskUserQuestionController.getPendingQuestionRequests(),\n );\n return response;\n })\n .post(\n \"/permission-response\",\n zValidator(\n \"json\",\n z.object({\n permissionRequestId: z.string(),\n decision: z.enum([\"allow\", \"deny\", \"always_allow\"]),\n alwaysAllowRule: z.string().optional(),\n alwaysAllowScope: z.enum([\"session\", \"project\"]).optional(),\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 .post(\n \"/question-response\",\n zValidator(\n \"json\",\n z.object({\n questionRequestId: z.string(),\n answers: z.record(z.string(), z.string()),\n annotations: z.record(\n z.string(),\n z.object({\n notes: z.string().optional(),\n preview: z.string().optional(),\n }),\n ),\n }),\n ),\n async (c) => {\n const response = await effectToResponse(\n c,\n ccvAskUserQuestionController.questionResponse({\n questionResponse: c.req.valid(\"json\"),\n }),\n );\n return response;\n },\n )\n .post(\n \"/generate-permission-rule\",\n zValidator(\n \"json\",\n z.object({\n toolName: z.string(),\n toolInput: z.record(z.string(), z.unknown()),\n projectId: z.string(),\n }),\n ),\n async (c) => {\n const body = c.req.valid(\"json\");\n const response = await effectToResponse(\n c,\n claudeCodePermissionController.generatePermissionRuleForTool(body),\n );\n return response;\n },\n );\n});\n\nexport { claudeCodeRoutes };\n", "import { z } from \"zod\";\n\nexport const mediaTypeSchema = z.enum([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]);\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 effort: z.enum([\"low\", \"medium\", \"high\", \"max\"]).optional(),\n permissionMode: z.enum([\"acceptEdits\", \"bypassPermissions\", \"default\", \"plan\"]).optional(),\n agent: z.string().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.ts\";\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>(s: S, t: T) =>\n dummyCtx.json(t, s);\ntype ResponseType<S extends ContentfulStatusCode, T extends object> = ReturnType<\n typeof dummyJson<S, T>\n>;\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 // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- complex Hono response type inference requires this cast\n return result2 as Ret;\n};\n", "import { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { FeatureFlagController } from \"../../core/feature-flag/presentation/FeatureFlagController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\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(\"/\"),\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 { NotificationController } from \"../../core/notification/presentation/NotificationController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\n\nconst pushSubscriptionSchema = z.object({\n endpoint: z.string(),\n keys: z.object({\n p256dh: z.string(),\n auth: z.string(),\n }),\n});\n\nconst notificationRoutes = Effect.gen(function* () {\n const notificationController = yield* NotificationController;\n\n return new Hono<HonoContext>()\n .get(\"/\", async (c) => {\n const response = await effectToResponse(c, notificationController.getNotifications());\n return response;\n })\n .post(\n \"/:sessionId/consume\",\n zValidator(\n \"json\",\n z\n .object({\n types: z\n .array(\n z.enum([\n \"session_paused\",\n \"session_completed\",\n \"permission_requested\",\n \"question_asked\",\n ]),\n )\n .optional(),\n })\n .optional(),\n ),\n async (c) => {\n const { sessionId } = c.req.param();\n const body = c.req.valid(\"json\");\n const response = await effectToResponse(\n c,\n notificationController.consumeNotifications({\n sessionId,\n types: body?.types,\n }),\n );\n return response;\n },\n )\n .get(\"/vapid-public-key\", async (c) => {\n const response = await effectToResponse(c, notificationController.getVapidPublicKey());\n return response;\n })\n .post(\"/push-subscription\", zValidator(\"json\", pushSubscriptionSchema), async (c) => {\n const subscription = c.req.valid(\"json\");\n const response = await effectToResponse(\n c,\n notificationController.subscribePush({ subscription }),\n );\n return response;\n });\n});\n\nexport { notificationRoutes };\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.ts\";\nimport { ClaudeCodeController } from \"../../core/claude-code/presentation/ClaudeCodeController.ts\";\nimport { FileSystemController } from \"../../core/file-system/presentation/FileSystemController.ts\";\nimport { GitController } from \"../../core/git/presentation/GitController.ts\";\nimport { CommitRequestSchema } from \"../../core/git/schema.ts\";\nimport { ProjectController } from \"../../core/project/presentation/ProjectController.ts\";\nimport { SessionController } from \"../../core/session/presentation/SessionController.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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(c, projectController.getProjects());\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.getSession({ projectId, sessionId }).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.deleteSession({ projectId, sessionId }).pipe(Effect.provide(runtime)),\n );\n return response;\n })\n .get(\"/:projectId/sessions/:sessionId/agent-sessions\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const sessionId = c.req.param(\"sessionId\");\n const response = await effectToResponse(\n c,\n agentSessionController.listAgentSessions({\n projectId,\n sessionId,\n }),\n );\n return response;\n })\n\n /**\n * agent sessions\n */\n .get(\n \"/:projectId/agent-sessions/:agentId\",\n zValidator(\"query\", z.object({ sessionId: z.string().optional() })),\n async (c) => {\n const projectId = c.req.param(\"projectId\");\n const agentId = c.req.param(\"agentId\");\n const { sessionId } = c.req.valid(\"query\");\n const response = await effectToResponse(\n c,\n agentSessionController.getAgentSession({\n projectId,\n agentId,\n sessionId,\n }),\n );\n return response;\n },\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(\"/:projectId/git/commit\", zValidator(\"json\", CommitRequestSchema), 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 .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<typeof CommitAndPushResultSuccessSchema>;\nexport type CommitAndPushResultError = z.infer<typeof CommitAndPushResultErrorSchema>;\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.ts\";\nimport { newSchedulerJobSchema, updateSchedulerJobSchema } from \"../../core/scheduler/schema.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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(\"/jobs/:id\", zValidator(\"json\", updateSchedulerJobSchema), 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 .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.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\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 !== undefined && 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.search({ query: q, limit, projectId }).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.ts\";\nimport { SSEController } from \"../../core/events/presentation/SSEController.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\n\nconst sseRoutes = Effect.gen(function* () {\n const sseController = yield* SSEController;\n const runtime = yield* getHonoRuntime;\n\n return new Hono<HonoContext>().get(\"/\", (c) => {\n return streamSSE(\n c,\n async (rawStream) => {\n await Runtime.runPromise(runtime)(\n sseController.handleSSE(rawStream).pipe(Effect.provide(TypeSafeSSE.make(rawStream))),\n );\n },\n async (err) => {\n await Runtime.runPromise(runtime)(Effect.logError(`Streaming error: ${String(err)}`));\n },\n );\n });\n});\n\nexport { sseRoutes };\n", "import { zValidator } from \"@hono/zod-validator\";\nimport { Effect } from \"effect\";\nimport { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { z } from \"zod\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport { decodeProjectId, validateProjectPath } from \"../../core/project/functions/id.ts\";\nimport { TasksController } from \"../../core/tasks/presentation/TasksController.ts\";\nimport { TaskCreateSchema, TaskUpdateSchema } from \"../../core/tasks/schema.ts\";\nimport { effectToResponse } from \"../../lib/effect/toEffectResponse.ts\";\nimport type { HonoContext } from \"../app.ts\";\nimport { getHonoRuntime } from \"../runtime.ts\";\n\nconst getClaudeProjectsDirPath = Effect.gen(function* () {\n const applicationContext = yield* ApplicationContext;\n const claudeCodePaths = yield* applicationContext.claudeCodePaths;\n return claudeCodePaths.claudeProjectsDirPath;\n});\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\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\n const claudeProjectsDirPath = await Effect.runPromise(\n getClaudeProjectsDirPath.pipe(Effect.provide(runtime)),\n );\n if (!validateProjectPath(projectPath, claudeProjectsDirPath)) {\n throw new HTTPException(403, { message: \"Invalid project path\" });\n }\n\n const status = 200 as const;\n\n const response = await effectToResponse(\n c,\n tasksController.updateTask(projectPath, { ...body, taskId }, sessionId).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.ts\";\nimport { ApplicationContext } from \"../../core/platform/services/ApplicationContext.ts\";\nimport { CcvOptionsService } from \"../../core/platform/services/CcvOptionsService.ts\";\nimport { EnvService } from \"../../core/platform/services/EnvService.ts\";\nimport { UserConfigService } from \"../../core/platform/services/UserConfigService.ts\";\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 Effect, LogLevel, Logger } from \"effect\";\n\nexport const resolveLogLevel = (verbose: boolean | undefined) =>\n verbose === true ? LogLevel.Debug : LogLevel.Info;\n\nexport const serverLoggerLayer = Logger.replace(Logger.defaultLogger, Logger.prettyLogger());\n\nexport const withServerLogLevel =\n (verbose: boolean | undefined) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(Logger.withMinimumLogLevel(resolveLogLevel(verbose)));\n", "import type { IncomingMessage } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport type { ServerType } from \"@hono/node-server\";\nimport { Effect, Runtime } from \"effect\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { z } from \"zod\";\nimport { TerminalService } from \"../core/terminal/TerminalService.ts\";\nimport { AuthMiddleware } from \"../hono/middleware/auth.middleware.ts\";\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 === undefined || cookieHeader === \"\") return result;\n const parts = cookieHeader.split(\";\");\n for (const part of parts) {\n const [rawKey, ...rest] = part.trim().split(\"=\");\n if (rawKey === undefined || rawKey === \"\") continue;\n result[rawKey] = rest.join(\"=\");\n }\n return result;\n};\n\nconst clientMessageSchema = z.union([\n z.object({ type: z.literal(\"input\"), data: z.string() }),\n z.object({ type: z.literal(\"resize\"), cols: z.number(), rows: z.number() }),\n z.object({ type: z.literal(\"signal\"), name: z.string() }),\n z.object({ type: z.literal(\"sync\"), lastSeq: z.number() }),\n z.object({ type: z.literal(\"ping\") }),\n]);\n\nconst parseClientMessage = (payload: string): ClientMessage | undefined => {\n try {\n const result = clientMessageSchema.safeParse(JSON.parse(payload));\n return result.success ? result.data : undefined;\n } catch {\n return undefined;\n }\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: IncomingMessage, socket: Duplex, head: Buffer) => {\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 !== null && sessionIdParam.length > 0 ? sessionIdParam : undefined;\n const cwdParam = url.searchParams.get(\"cwd\");\n const cwd = cwdParam !== null && 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(terminalService.registerClient(session.id, ws)).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 === undefined || text === \"\") return;\n const message = parseClientMessage(text);\n if (!message) return;\n if (message.type === \"input\") {\n void runPromise(terminalService.writeInput(session.id, message.data));\n return;\n }\n if (message.type === \"resize\") {\n void runPromise(terminalService.resize(session.id, message.cols, message.rows));\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(terminalService.snapshotSince(session.id, message.lastSeq)).then(\n (snapshot) => {\n if (!snapshot) return;\n sendJson(ws, {\n type: \"snapshot\",\n seq: snapshot.seq,\n data: snapshot.data,\n });\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", "FileSystem", "Path", "NodeContext", "Effect", "Layer", "Layer", "Path", "Context", "Effect", "Layer", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "index", "Effect", "Layer", "Effect", "getOptionalEnv", "Context", "Effect", "Layer", "Ref", "z", "LayerImpl", "Effect", "Ref", "Context", "Layer", "LayerImpl", "Effect", "Layer", "LayerImpl", "Effect", "Path", "content", "z", "Context", "Layer", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Layer", "Context", "Effect", "Layer", "z", "FileSystem", "Path", "Context", "Effect", "Layer", "Context", "Layer", "Effect", "FileSystem", "Path", "error", "z", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "Ref", "z", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Ref", "z", "Context", "Layer", "LayerImpl", "Effect", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "FileSystem", "Context", "Effect", "Layer", "Option", "Path", "eq", "Context", "Effect", "Layer", "FileSystem", "Path", "eq", "Context", "Effect", "Layer", "z", "FileSystem", "Path", "Effect", "toPosixPath", "z", "text", "z", "LayerImpl", "Effect", "FileSystem", "Path", "Layer", "text", "eq", "Context", "LayerImpl", "Effect", "Path", "eq", "baseName", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "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", "eq", "Context", "Effect", "Layer", "eq", "Context", "Deferred", "Effect", "Layer", "Ref", "ulid", "FileSystem", "Path", "Context", "Effect", "Layer", "LayerImpl", "LayerImpl", "Effect", "Ref", "eq", "Deferred", "ulid", "Context", "Layer", "LayerImpl", "Effect", "permissionResponse", "eq", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "ulid", "process", "Context", "Data", "Effect", "Layer", "Ref", "Data", "LayerImpl", "Effect", "Ref", "process", "Context", "Layer", "LayerImpl", "Effect", "ulid", "input", "query", "process", "Context", "Layer", "LayerImpl", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "Context", "Effect", "Layer", "ulid", "LayerImpl", "Effect", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "z", "Context", "Layer", "Effect", "FileSystem", "Path", "Ref", "debounceKey", "Context", "Effect", "Layer", "LayerImpl", "Effect", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "FileSystem", "Path", "Effect", "FileSystem", "Path", "Effect", "FileSystem", "Path", "Effect", "LayerImpl", "Effect", "Path", "FileSystem", "Context", "Layer", "Context", "Effect", "Either", "Layer", "Command", "FileSystem", "Path", "Context", "Data", "Effect", "Either", "Layer", "text", "Data", "Effect", "index", "LayerImpl", "FileSystem", "Path", "Command", "Either", "commit", "Context", "Layer", "LayerImpl", "Effect", "Either", "Context", "Layer", "Context", "Effect", "Layer", "FileSystem", "Context", "Effect", "Layer", "Ref", "ulid", "z", "isRecord", "z", "Effect", "LayerImpl", "Ref", "FileSystem", "ulid", "notifications", "Context", "Layer", "LayerImpl", "Effect", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Path", "Effect", "Context", "Effect", "Layer", "Ref", "index", "LayerImpl", "Effect", "Ref", "Context", "Layer", "FileSystem", "desc", "eq", "Context", "Effect", "Layer", "Option", "eq", "Context", "Effect", "Layer", "z", "z", "Context", "Layer", "Effect", "eq", "LayerImpl", "Effect", "FileSystem", "sessionDetail", "Option", "eq", "desc", "Context", "Layer", "LayerImpl", "Effect", "FileSystem", "Path", "projects", "sessions", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "FileSystem", "Path", "Context", "Data", "Effect", "Layer", "z", "Data", "Context", "Layer", "Effect", "Path", "FileSystem", "Context", "Data", "Duration", "Effect", "Fiber", "Layer", "Ref", "ulid", "Effect", "Effect", "Data", "LayerImpl", "Effect", "Ref", "Duration", "result", "Fiber", "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", "sql", "Context", "Effect", "Layer", "query", "LayerImpl", "Effect", "sql", "text", "Context", "Layer", "LayerImpl", "Effect", "query", "Context", "Layer", "FileSystem", "Context", "Effect", "Layer", "Effect", "text", "html", "LayerImpl", "Effect", "FileSystem", "Context", "Layer", "Context", "Effect", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Option", "z", "z", "Context", "Layer", "Effect", "FileSystem", "Path", "Option", "z", "Effect", "Context", "Layer", "Context", "Effect", "Layer", "ulid", "isFlagEnabled", "LayerImpl", "Effect", "sessions", "getOrCreateSession", "sendJson", "ulid", "Context", "Layer", "FileSystem", "Path", "Context", "Effect", "Layer", "Ref", "Schedule", "Context", "Layer", "Effect", "FileSystem", "Path", "Ref", "Schedule", "Context", "Effect", "Layer", "Runtime", "LayerImpl", "Effect", "Runtime", "Context", "Layer", "zValidator", "Effect", "Runtime", "setCookie", "createMiddleware", "z", "z", "z", "getCookie", "createMiddleware", "createMiddleware", "getCookie", "Effect", "timingSafeEqual", "Effect", "Hono", "getCookie", "setCookie", "z", "safeEqual", "timingSafeEqual", "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", "Effect", "Hono", "zValidator", "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", "createMiddleware", "Effect", "Runtime", "zValidator", "setCookie", "Layer", "Layer", "Effect", "Runtime", "z", "z", "Effect", "Runtime", "text", "Effect", "Path", "NodeContext", "FileSystem", "program", "Layer", "Command", "Effect"]
|
|
7
7
|
}
|