@jcjeon/integration-cli 0.2.0 → 0.2.1
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/apps/server/dist/app.controller.d.ts +6 -0
- package/apps/server/dist/app.controller.js +35 -0
- package/apps/server/dist/app.controller.js.map +1 -0
- package/apps/server/dist/app.module.d.ts +2 -0
- package/apps/server/dist/app.module.js +30 -0
- package/apps/server/dist/app.module.js.map +1 -0
- package/apps/server/dist/app.service.d.ts +3 -0
- package/apps/server/dist/app.service.js +20 -0
- package/apps/server/dist/app.service.js.map +1 -0
- package/apps/server/dist/common/ji-paths.d.ts +22 -0
- package/apps/server/dist/common/ji-paths.js +77 -0
- package/apps/server/dist/common/ji-paths.js.map +1 -0
- package/apps/server/dist/database/database.module.d.ts +2 -0
- package/apps/server/dist/database/database.module.js +38 -0
- package/apps/server/dist/database/database.module.js.map +1 -0
- package/apps/server/dist/database/entities/agent-changelog.entity.d.ts +14 -0
- package/apps/server/dist/database/entities/agent-changelog.entity.js +75 -0
- package/apps/server/dist/database/entities/agent-changelog.entity.js.map +1 -0
- package/apps/server/dist/database/entities/agent-session.entity.d.ts +10 -0
- package/apps/server/dist/database/entities/agent-session.entity.js +60 -0
- package/apps/server/dist/database/entities/agent-session.entity.js.map +1 -0
- package/apps/server/dist/database/entities/conversation.entity.d.ts +12 -0
- package/apps/server/dist/database/entities/conversation.entity.js +66 -0
- package/apps/server/dist/database/entities/conversation.entity.js.map +1 -0
- package/apps/server/dist/database/entities/session.entity.d.ts +6 -0
- package/apps/server/dist/database/entities/session.entity.js +40 -0
- package/apps/server/dist/database/entities/session.entity.js.map +1 -0
- package/apps/server/dist/database/entities/task-agent-run.entity.d.ts +15 -0
- package/apps/server/dist/database/entities/task-agent-run.entity.js +77 -0
- package/apps/server/dist/database/entities/task-agent-run.entity.js.map +1 -0
- package/apps/server/dist/database/entities/task-agent.entity.d.ts +16 -0
- package/apps/server/dist/database/entities/task-agent.entity.js +76 -0
- package/apps/server/dist/database/entities/task-agent.entity.js.map +1 -0
- package/apps/server/dist/database/entities/task-requirement.entity.d.ts +10 -0
- package/apps/server/dist/database/entities/task-requirement.entity.js +56 -0
- package/apps/server/dist/database/entities/task-requirement.entity.js.map +1 -0
- package/apps/server/dist/database/entities/task-run.entity.d.ts +13 -0
- package/apps/server/dist/database/entities/task-run.entity.js +67 -0
- package/apps/server/dist/database/entities/task-run.entity.js.map +1 -0
- package/apps/server/dist/database/entities/task.entity.d.ts +14 -0
- package/apps/server/dist/database/entities/task.entity.js +72 -0
- package/apps/server/dist/database/entities/task.entity.js.map +1 -0
- package/apps/server/dist/main.d.ts +1 -0
- package/apps/server/dist/main.js +81 -0
- package/apps/server/dist/main.js.map +1 -0
- package/apps/server/dist/modules/agents/agents.module.d.ts +2 -0
- package/apps/server/dist/modules/agents/agents.module.js +23 -0
- package/apps/server/dist/modules/agents/agents.module.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude-auth.manager.d.ts +15 -0
- package/apps/server/dist/modules/agents/claude/claude-auth.manager.js +71 -0
- package/apps/server/dist/modules/agents/claude/claude-auth.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude-pty.manager.d.ts +29 -0
- package/apps/server/dist/modules/agents/claude/claude-pty.manager.js +372 -0
- package/apps/server/dist/modules/agents/claude/claude-pty.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude.controller.d.ts +19 -0
- package/apps/server/dist/modules/agents/claude/claude.controller.js +125 -0
- package/apps/server/dist/modules/agents/claude/claude.controller.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude.gateway.d.ts +27 -0
- package/apps/server/dist/modules/agents/claude/claude.gateway.js +148 -0
- package/apps/server/dist/modules/agents/claude/claude.gateway.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude.module.d.ts +2 -0
- package/apps/server/dist/modules/agents/claude/claude.module.js +30 -0
- package/apps/server/dist/modules/agents/claude/claude.module.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/claude.service.d.ts +28 -0
- package/apps/server/dist/modules/agents/claude/claude.service.js +94 -0
- package/apps/server/dist/modules/agents/claude/claude.service.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/dto/create-session.dto.d.ts +6 -0
- package/apps/server/dist/modules/agents/claude/dto/create-session.dto.js +46 -0
- package/apps/server/dist/modules/agents/claude/dto/create-session.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/dto/resize-session.dto.d.ts +4 -0
- package/apps/server/dist/modules/agents/claude/dto/resize-session.dto.js +31 -0
- package/apps/server/dist/modules/agents/claude/dto/resize-session.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/dto/send-input.dto.d.ts +3 -0
- package/apps/server/dist/modules/agents/claude/dto/send-input.dto.js +25 -0
- package/apps/server/dist/modules/agents/claude/dto/send-input.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/interfaces/claude-session.interface.d.ts +22 -0
- package/apps/server/dist/modules/agents/claude/interfaces/claude-session.interface.js +3 -0
- package/apps/server/dist/modules/agents/claude/interfaces/claude-session.interface.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/interfaces/pty-event.interface.d.ts +9 -0
- package/apps/server/dist/modules/agents/claude/interfaces/pty-event.interface.js +3 -0
- package/apps/server/dist/modules/agents/claude/interfaces/pty-event.interface.js.map +1 -0
- package/apps/server/dist/modules/agents/claude/interfaces/stream-event.interface.d.ts +53 -0
- package/apps/server/dist/modules/agents/claude/interfaces/stream-event.interface.js +3 -0
- package/apps/server/dist/modules/agents/claude/interfaces/stream-event.interface.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/codex-auth.manager.d.ts +16 -0
- package/apps/server/dist/modules/agents/codex/codex-auth.manager.js +136 -0
- package/apps/server/dist/modules/agents/codex/codex-auth.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/codex-session.manager.d.ts +37 -0
- package/apps/server/dist/modules/agents/codex/codex-session.manager.js +319 -0
- package/apps/server/dist/modules/agents/codex/codex-session.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/codex.controller.d.ts +19 -0
- package/apps/server/dist/modules/agents/codex/codex.controller.js +95 -0
- package/apps/server/dist/modules/agents/codex/codex.controller.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/codex.gateway.d.ts +27 -0
- package/apps/server/dist/modules/agents/codex/codex.gateway.js +123 -0
- package/apps/server/dist/modules/agents/codex/codex.gateway.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/codex.module.d.ts +2 -0
- package/apps/server/dist/modules/agents/codex/codex.module.js +29 -0
- package/apps/server/dist/modules/agents/codex/codex.module.js.map +1 -0
- package/apps/server/dist/modules/agents/codex/dto/configure-auth.dto.d.ts +3 -0
- package/apps/server/dist/modules/agents/codex/dto/configure-auth.dto.js +23 -0
- package/apps/server/dist/modules/agents/codex/dto/configure-auth.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/dto/configure-auth.dto.d.ts +5 -0
- package/apps/server/dist/modules/agents/gemini/dto/configure-auth.dto.js +31 -0
- package/apps/server/dist/modules/agents/gemini/dto/configure-auth.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/dto/create-session.dto.d.ts +3 -0
- package/apps/server/dist/modules/agents/gemini/dto/create-session.dto.js +25 -0
- package/apps/server/dist/modules/agents/gemini/dto/create-session.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/dto/send-input.dto.d.ts +3 -0
- package/apps/server/dist/modules/agents/gemini/dto/send-input.dto.js +25 -0
- package/apps/server/dist/modules/agents/gemini/dto/send-input.dto.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/gemini-auth.manager.d.ts +20 -0
- package/apps/server/dist/modules/agents/gemini/gemini-auth.manager.js +154 -0
- package/apps/server/dist/modules/agents/gemini/gemini-auth.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/gemini-session.manager.d.ts +31 -0
- package/apps/server/dist/modules/agents/gemini/gemini-session.manager.js +304 -0
- package/apps/server/dist/modules/agents/gemini/gemini-session.manager.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/gemini.controller.d.ts +19 -0
- package/apps/server/dist/modules/agents/gemini/gemini.controller.js +135 -0
- package/apps/server/dist/modules/agents/gemini/gemini.controller.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/gemini.gateway.d.ts +24 -0
- package/apps/server/dist/modules/agents/gemini/gemini.gateway.js +142 -0
- package/apps/server/dist/modules/agents/gemini/gemini.gateway.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/gemini.module.d.ts +2 -0
- package/apps/server/dist/modules/agents/gemini/gemini.module.js +29 -0
- package/apps/server/dist/modules/agents/gemini/gemini.module.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/gemini-session.interface.d.ts +16 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/gemini-session.interface.js +3 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/gemini-session.interface.js.map +1 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/stream-event.interface.d.ts +12 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/stream-event.interface.js +3 -0
- package/apps/server/dist/modules/agents/gemini/interfaces/stream-event.interface.js.map +1 -0
- package/apps/server/dist/modules/changelog/changelog.controller.d.ts +7 -0
- package/apps/server/dist/modules/changelog/changelog.controller.js +50 -0
- package/apps/server/dist/modules/changelog/changelog.controller.js.map +1 -0
- package/apps/server/dist/modules/changelog/changelog.module.d.ts +2 -0
- package/apps/server/dist/modules/changelog/changelog.module.js +26 -0
- package/apps/server/dist/modules/changelog/changelog.module.js.map +1 -0
- package/apps/server/dist/modules/changelog/changelog.service.d.ts +68 -0
- package/apps/server/dist/modules/changelog/changelog.service.js +598 -0
- package/apps/server/dist/modules/changelog/changelog.service.js.map +1 -0
- package/apps/server/dist/modules/conversations/conversation.controller.d.ts +11 -0
- package/apps/server/dist/modules/conversations/conversation.controller.js +95 -0
- package/apps/server/dist/modules/conversations/conversation.controller.js.map +1 -0
- package/apps/server/dist/modules/conversations/conversation.module.d.ts +2 -0
- package/apps/server/dist/modules/conversations/conversation.module.js +26 -0
- package/apps/server/dist/modules/conversations/conversation.module.js.map +1 -0
- package/apps/server/dist/modules/conversations/conversation.service.d.ts +13 -0
- package/apps/server/dist/modules/conversations/conversation.service.js +61 -0
- package/apps/server/dist/modules/conversations/conversation.service.js.map +1 -0
- package/apps/server/dist/modules/conversations/dto/create-conversation.dto.d.ts +10 -0
- package/apps/server/dist/modules/conversations/dto/create-conversation.dto.js +64 -0
- package/apps/server/dist/modules/conversations/dto/create-conversation.dto.js.map +1 -0
- package/apps/server/dist/modules/conversations/enums/conversation.enum.d.ts +12 -0
- package/apps/server/dist/modules/conversations/enums/conversation.enum.js +18 -0
- package/apps/server/dist/modules/conversations/enums/conversation.enum.js.map +1 -0
- package/apps/server/dist/modules/fs/fs.controller.d.ts +6 -0
- package/apps/server/dist/modules/fs/fs.controller.js +85 -0
- package/apps/server/dist/modules/fs/fs.controller.js.map +1 -0
- package/apps/server/dist/modules/fs/fs.module.d.ts +2 -0
- package/apps/server/dist/modules/fs/fs.module.js +20 -0
- package/apps/server/dist/modules/fs/fs.module.js.map +1 -0
- package/apps/server/dist/modules/harness/dto/save-harness.dto.d.ts +4 -0
- package/apps/server/dist/modules/harness/dto/save-harness.dto.js +27 -0
- package/apps/server/dist/modules/harness/dto/save-harness.dto.js.map +1 -0
- package/apps/server/dist/modules/harness/harness.controller.d.ts +14 -0
- package/apps/server/dist/modules/harness/harness.controller.js +72 -0
- package/apps/server/dist/modules/harness/harness.controller.js.map +1 -0
- package/apps/server/dist/modules/harness/harness.module.d.ts +2 -0
- package/apps/server/dist/modules/harness/harness.module.js +23 -0
- package/apps/server/dist/modules/harness/harness.module.js.map +1 -0
- package/apps/server/dist/modules/harness/harness.service.d.ts +20 -0
- package/apps/server/dist/modules/harness/harness.service.js +134 -0
- package/apps/server/dist/modules/harness/harness.service.js.map +1 -0
- package/apps/server/dist/modules/sessions/session.controller.d.ts +12 -0
- package/apps/server/dist/modules/sessions/session.controller.js +79 -0
- package/apps/server/dist/modules/sessions/session.controller.js.map +1 -0
- package/apps/server/dist/modules/sessions/session.module.d.ts +2 -0
- package/apps/server/dist/modules/sessions/session.module.js +26 -0
- package/apps/server/dist/modules/sessions/session.module.js.map +1 -0
- package/apps/server/dist/modules/sessions/session.service.d.ts +9 -0
- package/apps/server/dist/modules/sessions/session.service.js +49 -0
- package/apps/server/dist/modules/sessions/session.service.js.map +1 -0
- package/apps/server/dist/modules/tasks/dto/create-task.dto.d.ts +15 -0
- package/apps/server/dist/modules/tasks/dto/create-task.dto.js +88 -0
- package/apps/server/dist/modules/tasks/dto/create-task.dto.js.map +1 -0
- package/apps/server/dist/modules/tasks/dto/execute-task.dto.d.ts +7 -0
- package/apps/server/dist/modules/tasks/dto/execute-task.dto.js +43 -0
- package/apps/server/dist/modules/tasks/dto/execute-task.dto.js.map +1 -0
- package/apps/server/dist/modules/tasks/dto/merge-file.dto.d.ts +3 -0
- package/apps/server/dist/modules/tasks/dto/merge-file.dto.js +23 -0
- package/apps/server/dist/modules/tasks/dto/merge-file.dto.js.map +1 -0
- package/apps/server/dist/modules/tasks/dto/rerun-task.dto.d.ts +4 -0
- package/apps/server/dist/modules/tasks/dto/rerun-task.dto.js +32 -0
- package/apps/server/dist/modules/tasks/dto/rerun-task.dto.js.map +1 -0
- package/apps/server/dist/modules/tasks/dto/update-task.dto.d.ts +15 -0
- package/apps/server/dist/modules/tasks/dto/update-task.dto.js +89 -0
- package/apps/server/dist/modules/tasks/dto/update-task.dto.js.map +1 -0
- package/apps/server/dist/modules/tasks/task-execution.service.d.ts +105 -0
- package/apps/server/dist/modules/tasks/task-execution.service.js +842 -0
- package/apps/server/dist/modules/tasks/task-execution.service.js.map +1 -0
- package/apps/server/dist/modules/tasks/task.gateway.d.ts +17 -0
- package/apps/server/dist/modules/tasks/task.gateway.js +126 -0
- package/apps/server/dist/modules/tasks/task.gateway.js.map +1 -0
- package/apps/server/dist/modules/tasks/tasks.controller.d.ts +29 -0
- package/apps/server/dist/modules/tasks/tasks.controller.js +209 -0
- package/apps/server/dist/modules/tasks/tasks.controller.js.map +1 -0
- package/apps/server/dist/modules/tasks/tasks.module.d.ts +2 -0
- package/apps/server/dist/modules/tasks/tasks.module.js +42 -0
- package/apps/server/dist/modules/tasks/tasks.module.js.map +1 -0
- package/apps/server/dist/modules/tasks/tasks.service.d.ts +47 -0
- package/apps/server/dist/modules/tasks/tasks.service.js +341 -0
- package/apps/server/dist/modules/tasks/tasks.service.js.map +1 -0
- package/apps/server/dist/tsconfig.build.tsbuildinfo +1 -0
- package/apps/web/.next/BUILD_ID +1 -0
- package/apps/web/.next/app-path-routes-manifest.json +12 -0
- package/apps/web/.next/build/chunks/[root-of-the-server]__0cstldc._.js +206 -0
- package/apps/web/.next/build/chunks/[root-of-the-server]__0cstldc._.js.map +8 -0
- package/apps/web/.next/build/chunks/[root-of-the-server]__0s3ts0r._.js +500 -0
- package/apps/web/.next/build/chunks/[root-of-the-server]__0s3ts0r._.js.map +11 -0
- package/apps/web/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0xqnjlz._.js +13 -0
- package/apps/web/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0xqnjlz._.js.map +5 -0
- package/apps/web/.next/build/chunks/[turbopack]_runtime.js +890 -0
- package/apps/web/.next/build/chunks/[turbopack]_runtime.js.map +11 -0
- package/apps/web/.next/build/chunks/node_modules_13sb.px._.js +6820 -0
- package/apps/web/.next/build/chunks/node_modules_13sb.px._.js.map +47 -0
- package/apps/web/.next/build/package.json +1 -0
- package/apps/web/.next/build/postcss.js +6 -0
- package/apps/web/.next/build/postcss.js.map +5 -0
- package/apps/web/.next/build-manifest.json +21 -0
- package/apps/web/.next/diagnostics/build-diagnostics.json +6 -0
- package/apps/web/.next/diagnostics/framework.json +1 -0
- package/apps/web/.next/diagnostics/route-bundle-stats.json +118 -0
- package/apps/web/.next/export-marker.json +6 -0
- package/apps/web/.next/fallback-build-manifest.json +13 -0
- package/apps/web/.next/images-manifest.json +68 -0
- package/apps/web/.next/next-minimal-server.js.nft.json +1 -0
- package/apps/web/.next/next-server.js.nft.json +1 -0
- package/apps/web/.next/package.json +1 -0
- package/apps/web/.next/prerender-manifest.json +234 -0
- package/apps/web/.next/required-server-files.js +332 -0
- package/apps/web/.next/required-server-files.json +332 -0
- package/apps/web/.next/routes-manifest.json +108 -0
- package/apps/web/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/_global-error/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/apps/web/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/_global-error/page.js +10 -0
- package/apps/web/.next/server/app/_global-error/page.js.map +5 -0
- package/apps/web/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/_global-error.html +1 -0
- package/apps/web/.next/server/app/_global-error.meta +15 -0
- package/apps/web/.next/server/app/_global-error.rsc +15 -0
- package/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/apps/web/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/_not-found/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/_not-found/page.js +13 -0
- package/apps/web/.next/server/app/_not-found/page.js.map +5 -0
- package/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/_not-found.html +1 -0
- package/apps/web/.next/server/app/_not-found.meta +16 -0
- package/apps/web/.next/server/app/_not-found.rsc +19 -0
- package/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
- package/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
- package/apps/web/.next/server/app/claude/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/claude/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/claude/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/claude/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/claude/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/claude/page.js +14 -0
- package/apps/web/.next/server/app/claude/page.js.map +5 -0
- package/apps/web/.next/server/app/claude/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/claude/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/claude.html +1 -0
- package/apps/web/.next/server/app/claude.meta +15 -0
- package/apps/web/.next/server/app/claude.rsc +22 -0
- package/apps/web/.next/server/app/claude.segments/_full.segment.rsc +22 -0
- package/apps/web/.next/server/app/claude.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/claude.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/claude.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/claude.segments/claude/__PAGE__.segment.rsc +6 -0
- package/apps/web/.next/server/app/claude.segments/claude.segment.rsc +5 -0
- package/apps/web/.next/server/app/codex/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/codex/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/codex/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/codex/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/codex/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/codex/page.js +14 -0
- package/apps/web/.next/server/app/codex/page.js.map +5 -0
- package/apps/web/.next/server/app/codex/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/codex/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/codex.html +1 -0
- package/apps/web/.next/server/app/codex.meta +15 -0
- package/apps/web/.next/server/app/codex.rsc +25 -0
- package/apps/web/.next/server/app/codex.segments/_full.segment.rsc +25 -0
- package/apps/web/.next/server/app/codex.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/codex.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/codex.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/codex.segments/codex/__PAGE__.segment.rsc +9 -0
- package/apps/web/.next/server/app/codex.segments/codex.segment.rsc +5 -0
- package/apps/web/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
- package/apps/web/.next/server/app/favicon.ico/route.js +6 -0
- package/apps/web/.next/server/app/favicon.ico/route.js.map +5 -0
- package/apps/web/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/favicon.ico.meta +1 -0
- package/apps/web/.next/server/app/gemini/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/gemini/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/gemini/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/gemini/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/gemini/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/gemini/page.js +14 -0
- package/apps/web/.next/server/app/gemini/page.js.map +5 -0
- package/apps/web/.next/server/app/gemini/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/gemini/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/gemini.html +1 -0
- package/apps/web/.next/server/app/gemini.meta +15 -0
- package/apps/web/.next/server/app/gemini.rsc +25 -0
- package/apps/web/.next/server/app/gemini.segments/_full.segment.rsc +25 -0
- package/apps/web/.next/server/app/gemini.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/gemini.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/gemini.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/gemini.segments/gemini/__PAGE__.segment.rsc +9 -0
- package/apps/web/.next/server/app/gemini.segments/gemini.segment.rsc +5 -0
- package/apps/web/.next/server/app/index.html +1 -0
- package/apps/web/.next/server/app/index.meta +14 -0
- package/apps/web/.next/server/app/index.rsc +23 -0
- package/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
- package/apps/web/.next/server/app/index.segments/_full.segment.rsc +23 -0
- package/apps/web/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/index.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/index.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/login/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/login/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/login/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/login/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/login/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/login/page.js +14 -0
- package/apps/web/.next/server/app/login/page.js.map +5 -0
- package/apps/web/.next/server/app/login/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/login/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/login.html +1 -0
- package/apps/web/.next/server/app/login.meta +15 -0
- package/apps/web/.next/server/app/login.rsc +25 -0
- package/apps/web/.next/server/app/login.segments/_full.segment.rsc +25 -0
- package/apps/web/.next/server/app/login.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/login.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/login.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/login.segments/login/__PAGE__.segment.rsc +9 -0
- package/apps/web/.next/server/app/login.segments/login.segment.rsc +5 -0
- package/apps/web/.next/server/app/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/page.js +14 -0
- package/apps/web/.next/server/app/page.js.map +5 -0
- package/apps/web/.next/server/app/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/task/[id]/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/task/[id]/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/task/[id]/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/task/[id]/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/task/[id]/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/task/[id]/page.js +14 -0
- package/apps/web/.next/server/app/task/[id]/page.js.map +5 -0
- package/apps/web/.next/server/app/task/[id]/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/task/[id]/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/test/page/app-paths-manifest.json +3 -0
- package/apps/web/.next/server/app/test/page/build-manifest.json +17 -0
- package/apps/web/.next/server/app/test/page/next-font-manifest.json +11 -0
- package/apps/web/.next/server/app/test/page/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/test/page/server-reference-manifest.json +4 -0
- package/apps/web/.next/server/app/test/page.js +14 -0
- package/apps/web/.next/server/app/test/page.js.map +5 -0
- package/apps/web/.next/server/app/test/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/test/page_client-reference-manifest.js +3 -0
- package/apps/web/.next/server/app/test.html +1 -0
- package/apps/web/.next/server/app/test.meta +15 -0
- package/apps/web/.next/server/app/test.rsc +25 -0
- package/apps/web/.next/server/app/test.segments/_full.segment.rsc +25 -0
- package/apps/web/.next/server/app/test.segments/_head.segment.rsc +6 -0
- package/apps/web/.next/server/app/test.segments/_index.segment.rsc +8 -0
- package/apps/web/.next/server/app/test.segments/_tree.segment.rsc +5 -0
- package/apps/web/.next/server/app/test.segments/test/__PAGE__.segment.rsc +9 -0
- package/apps/web/.next/server/app/test.segments/test.segment.rsc +5 -0
- package/apps/web/.next/server/app-paths-manifest.json +12 -0
- package/apps/web/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +3 -0
- package/apps/web/.next/server/chunks/[externals]_next_dist_0arv.vj._.js.map +1 -0
- package/apps/web/.next/server/chunks/[root-of-the-server]__0xjvedo._.js +13 -0
- package/apps/web/.next/server/chunks/[root-of-the-server]__0xjvedo._.js.map +1 -0
- package/apps/web/.next/server/chunks/[turbopack]_runtime.js +903 -0
- package/apps/web/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
- package/apps/web/.next/server/chunks/apps_web__next-internal_server_app_favicon_ico_route_actions_0h5n1et.js +3 -0
- package/apps/web/.next/server/chunks/apps_web__next-internal_server_app_favicon_ico_route_actions_0h5n1et.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__00707zu._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__00707zu._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__02w1lqw._.js +33 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__02w1lqw._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__058frv2._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__058frv2._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05mnfv7._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05mnfv7._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05w0js1._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05w0js1._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05y8~sf._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__05y8~sf._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0a~4k2j._.js +8 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0a~4k2j._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0bzgqz2._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0bzgqz2._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0csq2e.._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0csq2e.._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0dgn1-d._.js +8 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0dgn1-d._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0g.z8rw._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0g.z8rw._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0g7.yrd._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0g7.yrd._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ill7bp._.js +4 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ill7bp._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lxs646._.js +33 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lxs646._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0osecwm._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0osecwm._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0x5.eah._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0x5.eah._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10mg911._.js +9 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10mg911._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10xopfz._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10xopfz._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__11illgy._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/[root-of-the-server]__11illgy._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
- package/apps/web/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
- package/apps/web/.next/server/chunks/ssr/_0hy8~s0._.js +6 -0
- package/apps/web/.next/server/chunks/ssr/_0hy8~s0._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app__global-error_page_actions_0.u5cfa.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app__global-error_page_actions_0.u5cfa.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app__not-found_page_actions_0appun9.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app__not-found_page_actions_0appun9.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_claude_page_actions_0_uv-yn.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_claude_page_actions_0_uv-yn.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_codex_page_actions_0ace7zi.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_codex_page_actions_0ace7zi.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_gemini_page_actions_0ux-r~z.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_gemini_page_actions_0ux-r~z.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_login_page_actions_0srfp5v.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_login_page_actions_0srfp5v.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_page_actions_0rm5_5w.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_page_actions_0rm5_5w.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_task_[id]_page_actions_0bd_3_p.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_task_[id]_page_actions_0bd_3_p.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_test_page_actions_0pn8asm.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_test_page_actions_0pn8asm.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_0s6cw51._.js +8 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_0s6cw51._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_login_page_tsx_07oskhj._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_login_page_tsx_07oskhj._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_page_tsx_0kq.zh9._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_page_tsx_0kq.zh9._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_test_page_tsx_04ji_kt._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_app_test_page_tsx_04ji_kt._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_features_02y94.o._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_features_02y94.o._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_features_0y6q6xu._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/apps_web_src_features_0y6q6xu._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0i2xw~e._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0i2xw~e._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0vtdjw7._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_0vtdjw7._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_03nkrli._.js +19 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_03nkrli._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +6 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_01s3o34.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_01s3o34.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ax1b3s.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ax1b3s.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0gl78zj.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0gl78zj.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j~tyzr.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j~tyzr.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0khf96-.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0khf96-.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qgz_85.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qgz_85.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0unh3f-.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0unh3f-.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uq606i.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uq606i.js.map +1 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128e6.l.js +4 -0
- package/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_128e6.l.js.map +1 -0
- package/apps/web/.next/server/functions-config-manifest.json +4 -0
- package/apps/web/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/apps/web/.next/server/middleware-build-manifest.js +21 -0
- package/apps/web/.next/server/middleware-manifest.json +6 -0
- package/apps/web/.next/server/next-font-manifest.js +1 -0
- package/apps/web/.next/server/next-font-manifest.json +39 -0
- package/apps/web/.next/server/pages/404.html +1 -0
- package/apps/web/.next/server/pages/500.html +1 -0
- package/apps/web/.next/server/pages-manifest.json +4 -0
- package/apps/web/.next/server/prefetch-hints.json +1 -0
- package/apps/web/.next/server/server-reference-manifest.js +1 -0
- package/apps/web/.next/server/server-reference-manifest.json +5 -0
- package/apps/web/.next/static/chunks/01xlw8hd842-c.js +1 -0
- package/apps/web/.next/static/chunks/03~yq9q893hmn.js +1 -0
- package/apps/web/.next/static/chunks/04w-clkdzn_sn.js +6 -0
- package/apps/web/.next/static/chunks/066jf0nk75nic.css +2 -0
- package/apps/web/.next/static/chunks/0bmpc66o4m-9z.js +1 -0
- package/apps/web/.next/static/chunks/0cctfc2jrxq_0.js +1 -0
- package/apps/web/.next/static/chunks/0dk1ec~jpoxa3.css +1 -0
- package/apps/web/.next/static/chunks/0e992tq36rg-i.js +6 -0
- package/apps/web/.next/static/chunks/0ieuc6bs-l0iy.js +7 -0
- package/apps/web/.next/static/chunks/0nd5y.4d2gl8g.js +1 -0
- package/apps/web/.next/static/chunks/0o-t4yw-v8ahl.js +6 -0
- package/apps/web/.next/static/chunks/0pqt~8bl3ukh4.js +4 -0
- package/apps/web/.next/static/chunks/0rjn.~e6pvni1.js +2 -0
- package/apps/web/.next/static/chunks/0t2xr05rlu96l.js +1 -0
- package/apps/web/.next/static/chunks/0uuu-x.ka3jyt.js +1 -0
- package/apps/web/.next/static/chunks/0x15z029u118o.js +1 -0
- package/apps/web/.next/static/chunks/0~.kxojjn0k1x.js +1 -0
- package/apps/web/.next/static/chunks/10t1c-qsk.cdw.js +1 -0
- package/apps/web/.next/static/chunks/14zwv8duu059g.js +31 -0
- package/apps/web/.next/static/chunks/turbopack-0gpa2pyrgntw-.js +1 -0
- package/apps/web/.next/static/fdXuROcW6IkgkI61bg3UM/_buildManifest.js +11 -0
- package/apps/web/.next/static/fdXuROcW6IkgkI61bg3UM/_clientMiddlewareManifest.js +1 -0
- package/apps/web/.next/static/fdXuROcW6IkgkI61bg3UM/_ssgManifest.js +1 -0
- package/apps/web/.next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
- package/apps/web/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
- package/apps/web/.next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
- package/apps/web/.next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
- package/apps/web/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
- package/apps/web/.next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
- package/apps/web/.next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
- package/apps/web/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
- package/apps/web/.next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
- package/apps/web/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
- package/apps/web/.next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
- package/apps/web/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
- package/apps/web/.next/trace +1 -0
- package/apps/web/.next/trace-build +1 -0
- package/apps/web/.next/turbopack +0 -0
- package/apps/web/.next/types/cache-life.d.ts +145 -0
- package/apps/web/.next/types/routes.d.ts +63 -0
- package/apps/web/.next/types/validator.ts +115 -0
- package/package.json +28 -42
- package/packages/cli/dist/commands/init.d.ts +1 -2
- package/packages/cli/dist/commands/init.js +14 -16
- package/packages/cli/dist/commands/start.js +41 -26
- package/packages/cli/dist/index.js +6 -23
- package/packages/cli/dist/utils/package-root.d.ts +3 -0
- package/packages/cli/dist/utils/package-root.js +62 -0
- package/.gitignore +0 -23
- package/.npmignore +0 -21
- package/.prettierignore +0 -6
- package/.prettierrc +0 -26
- package/AGENTS.md +0 -10
- package/CLAUDE.md +0 -10
- package/apps/server/eslint.config.mjs +0 -20
- package/apps/server/nest-cli.json +0 -8
- package/apps/server/package.json +0 -89
- package/apps/server/scripts/postinstall.js +0 -53
- package/apps/server/src/__mocks__/glob.js +0 -6
- package/apps/server/src/__mocks__/uuid.js +0 -5
- package/apps/server/src/app.controller.spec.ts +0 -24
- package/apps/server/src/app.controller.ts +0 -13
- package/apps/server/src/app.module.ts +0 -18
- package/apps/server/src/app.service.ts +0 -8
- package/apps/server/src/common/ji-paths.ts +0 -41
- package/apps/server/src/database/database.module.ts +0 -27
- package/apps/server/src/database/entities/agent-changelog.entity.ts +0 -39
- package/apps/server/src/database/entities/agent-session.entity.ts +0 -29
- package/apps/server/src/database/entities/conversation.entity.ts +0 -41
- package/apps/server/src/database/entities/session.entity.ts +0 -16
- package/apps/server/src/database/entities/task-agent-run.entity.ts +0 -40
- package/apps/server/src/database/entities/task-agent.entity.ts +0 -42
- package/apps/server/src/database/entities/task-requirement.entity.ts +0 -27
- package/apps/server/src/database/entities/task-run.entity.ts +0 -41
- package/apps/server/src/database/entities/task.entity.ts +0 -44
- package/apps/server/src/main.ts +0 -65
- package/apps/server/src/modules/agents/agent-model-settings.spec.ts +0 -80
- package/apps/server/src/modules/agents/agents.module.ts +0 -11
- package/apps/server/src/modules/agents/claude/claude-auth.manager.ts +0 -83
- package/apps/server/src/modules/agents/claude/claude-pty.manager.ts +0 -380
- package/apps/server/src/modules/agents/claude/claude.controller.ts +0 -85
- package/apps/server/src/modules/agents/claude/claude.gateway.ts +0 -158
- package/apps/server/src/modules/agents/claude/claude.module.ts +0 -18
- package/apps/server/src/modules/agents/claude/claude.service.ts +0 -67
- package/apps/server/src/modules/agents/claude/dto/create-session.dto.ts +0 -24
- package/apps/server/src/modules/agents/claude/dto/resize-session.dto.ts +0 -13
- package/apps/server/src/modules/agents/claude/dto/send-input.dto.ts +0 -9
- package/apps/server/src/modules/agents/claude/interfaces/claude-session.interface.ts +0 -26
- package/apps/server/src/modules/agents/claude/interfaces/pty-event.interface.ts +0 -10
- package/apps/server/src/modules/agents/claude/interfaces/stream-event.interface.ts +0 -61
- package/apps/server/src/modules/agents/codex/codex-auth.manager.ts +0 -107
- package/apps/server/src/modules/agents/codex/codex-session.manager.ts +0 -357
- package/apps/server/src/modules/agents/codex/codex.controller.ts +0 -64
- package/apps/server/src/modules/agents/codex/codex.gateway.ts +0 -97
- package/apps/server/src/modules/agents/codex/codex.module.ts +0 -17
- package/apps/server/src/modules/agents/codex/dto/configure-auth.dto.ts +0 -7
- package/apps/server/src/modules/agents/gemini/dto/configure-auth.dto.ts +0 -15
- package/apps/server/src/modules/agents/gemini/dto/create-session.dto.ts +0 -9
- package/apps/server/src/modules/agents/gemini/dto/send-input.dto.ts +0 -9
- package/apps/server/src/modules/agents/gemini/gemini-auth.manager.ts +0 -157
- package/apps/server/src/modules/agents/gemini/gemini-session.manager.ts +0 -287
- package/apps/server/src/modules/agents/gemini/gemini.controller.ts +0 -93
- package/apps/server/src/modules/agents/gemini/gemini.gateway.ts +0 -149
- package/apps/server/src/modules/agents/gemini/gemini.module.ts +0 -17
- package/apps/server/src/modules/agents/gemini/interfaces/gemini-session.interface.ts +0 -18
- package/apps/server/src/modules/agents/gemini/interfaces/stream-event.interface.ts +0 -14
- package/apps/server/src/modules/agents/session-termination.spec.ts +0 -103
- package/apps/server/src/modules/changelog/changelog.controller.ts +0 -20
- package/apps/server/src/modules/changelog/changelog.module.ts +0 -14
- package/apps/server/src/modules/changelog/changelog.service.spec.ts +0 -531
- package/apps/server/src/modules/changelog/changelog.service.ts +0 -690
- package/apps/server/src/modules/conversations/conversation.controller.spec.ts +0 -106
- package/apps/server/src/modules/conversations/conversation.controller.ts +0 -60
- package/apps/server/src/modules/conversations/conversation.module.ts +0 -14
- package/apps/server/src/modules/conversations/conversation.service.spec.ts +0 -176
- package/apps/server/src/modules/conversations/conversation.service.ts +0 -54
- package/apps/server/src/modules/conversations/dto/create-conversation.dto.ts +0 -37
- package/apps/server/src/modules/conversations/enums/conversation.enum.ts +0 -13
- package/apps/server/src/modules/fs/fs.controller.ts +0 -29
- package/apps/server/src/modules/fs/fs.module.ts +0 -8
- package/apps/server/src/modules/harness/dto/save-harness.dto.ts +0 -9
- package/apps/server/src/modules/harness/harness.controller.spec.ts +0 -95
- package/apps/server/src/modules/harness/harness.controller.ts +0 -35
- package/apps/server/src/modules/harness/harness.module.ts +0 -11
- package/apps/server/src/modules/harness/harness.service.spec.ts +0 -217
- package/apps/server/src/modules/harness/harness.service.ts +0 -112
- package/apps/server/src/modules/sessions/session.controller.spec.ts +0 -68
- package/apps/server/src/modules/sessions/session.controller.ts +0 -43
- package/apps/server/src/modules/sessions/session.module.ts +0 -14
- package/apps/server/src/modules/sessions/session.service.spec.ts +0 -106
- package/apps/server/src/modules/sessions/session.service.ts +0 -35
- package/apps/server/src/modules/tasks/dto/create-task.dto.ts +0 -54
- package/apps/server/src/modules/tasks/dto/execute-task.dto.ts +0 -22
- package/apps/server/src/modules/tasks/dto/merge-file.dto.ts +0 -7
- package/apps/server/src/modules/tasks/dto/rerun-task.dto.ts +0 -14
- package/apps/server/src/modules/tasks/dto/update-task.dto.ts +0 -55
- package/apps/server/src/modules/tasks/task-execution.service.ts +0 -978
- package/apps/server/src/modules/tasks/task.gateway.ts +0 -140
- package/apps/server/src/modules/tasks/tasks.controller.spec.ts +0 -210
- package/apps/server/src/modules/tasks/tasks.controller.ts +0 -139
- package/apps/server/src/modules/tasks/tasks.module.ts +0 -30
- package/apps/server/src/modules/tasks/tasks.service.spec.ts +0 -552
- package/apps/server/src/modules/tasks/tasks.service.ts +0 -333
- package/apps/server/test/app.e2e-spec.ts +0 -28
- package/apps/server/test/jest-e2e.json +0 -9
- package/apps/server/tsconfig.build.json +0 -4
- package/apps/server/tsconfig.json +0 -13
- package/apps/web/AGENTS.md +0 -7
- package/apps/web/CLAUDE.md +0 -1
- package/apps/web/eslint.config.mjs +0 -21
- package/apps/web/next-env.d.ts +0 -6
- package/apps/web/postcss.config.mjs +0 -7
- package/apps/web/src/app/claude/page.tsx +0 -5
- package/apps/web/src/app/codex/page.tsx +0 -126
- package/apps/web/src/app/gemini/page.tsx +0 -130
- package/apps/web/src/app/globals.css +0 -149
- package/apps/web/src/app/layout.tsx +0 -40
- package/apps/web/src/app/login/page.tsx +0 -67
- package/apps/web/src/app/page.tsx +0 -497
- package/apps/web/src/app/task/[id]/page.tsx +0 -11
- package/apps/web/src/app/test/page.tsx +0 -298
- package/apps/web/src/components/ui/Modal.tsx +0 -78
- package/apps/web/src/components/ui/WorkingDirPicker.tsx +0 -195
- package/apps/web/src/components/ui/__tests__/Modal.test.tsx +0 -68
- package/apps/web/src/features/auth/api/__tests__/auth.api.test.ts +0 -83
- package/apps/web/src/features/auth/api/auth.api.ts +0 -81
- package/apps/web/src/features/auth/hooks/__tests__/useClaudeAuth.test.ts +0 -166
- package/apps/web/src/features/auth/hooks/__tests__/useCodexAuth.test.ts +0 -127
- package/apps/web/src/features/auth/hooks/__tests__/useGeminiAuth.test.ts +0 -120
- package/apps/web/src/features/auth/hooks/useClaudeAuth.ts +0 -88
- package/apps/web/src/features/auth/hooks/useCodexAuth.ts +0 -149
- package/apps/web/src/features/auth/hooks/useGeminiAuth.ts +0 -125
- package/apps/web/src/features/auth/ui/CodexLoginPanel.tsx +0 -302
- package/apps/web/src/features/auth/ui/GeminiLoginPanel.tsx +0 -316
- package/apps/web/src/features/auth/ui/LoginForm.tsx +0 -190
- package/apps/web/src/features/auth/ui/LoginPanel.tsx +0 -114
- package/apps/web/src/features/auth/ui/__tests__/LoginPanel.test.tsx +0 -105
- package/apps/web/src/features/chat/api/__tests__/sessions.api.test.ts +0 -187
- package/apps/web/src/features/chat/api/sessions.api.ts +0 -161
- package/apps/web/src/features/chat/container/ClaudePageContainer.tsx +0 -152
- package/apps/web/src/features/chat/hooks/__tests__/useCodexSessions.test.ts +0 -131
- package/apps/web/src/features/chat/hooks/__tests__/useGeminiSessions.test.ts +0 -130
- package/apps/web/src/features/chat/hooks/useAgentModelSettings.ts +0 -54
- package/apps/web/src/features/chat/hooks/useClaudeSessions.ts +0 -323
- package/apps/web/src/features/chat/hooks/useCodexSessions.ts +0 -275
- package/apps/web/src/features/chat/hooks/useGeminiSessions.ts +0 -255
- package/apps/web/src/features/chat/hooks/useSessionCommand.ts +0 -66
- package/apps/web/src/features/chat/hooks/useSessionRename.ts +0 -61
- package/apps/web/src/features/chat/hooks/useSessionWorkingDirectories.ts +0 -34
- package/apps/web/src/features/chat/hooks/useUnifiedSessions.ts +0 -156
- package/apps/web/src/features/chat/lib/agentModelOptions.ts +0 -72
- package/apps/web/src/features/chat/ui/AgentModelPicker.tsx +0 -134
- package/apps/web/src/features/chat/ui/AgentSelectModal.tsx +0 -236
- package/apps/web/src/features/chat/ui/ChatInput.tsx +0 -162
- package/apps/web/src/features/chat/ui/ChatMessage.tsx +0 -204
- package/apps/web/src/features/chat/ui/ChatWorkspace.tsx +0 -207
- package/apps/web/src/features/chat/ui/CheckingSkeleton.tsx +0 -44
- package/apps/web/src/features/chat/ui/ClaudeLoginView.tsx +0 -44
- package/apps/web/src/features/chat/ui/PermissionCard.tsx +0 -37
- package/apps/web/src/features/chat/ui/SessionSidebar.tsx +0 -280
- package/apps/web/src/features/chat/ui/__tests__/AgentSelectModal.test.tsx +0 -58
- package/apps/web/src/features/chat/ui/__tests__/ChatInput.test.tsx +0 -134
- package/apps/web/src/features/chat/ui/__tests__/ChatMessage.test.tsx +0 -106
- package/apps/web/src/features/chat/ui/__tests__/ChatWorkspace.test.tsx +0 -66
- package/apps/web/src/features/diff/ui/DiffFileRow.tsx +0 -73
- package/apps/web/src/features/diff/ui/DiffHunk.tsx +0 -61
- package/apps/web/src/features/diff/ui/FileChangeBadge.tsx +0 -23
- package/apps/web/src/features/diff/ui/__tests__/DiffFileRow.test.tsx +0 -40
- package/apps/web/src/features/diff/ui/__tests__/DiffHunk.test.tsx +0 -24
- package/apps/web/src/features/diff/ui/__tests__/FileChangeBadge.test.tsx +0 -16
- package/apps/web/src/features/fs/api/fs.api.ts +0 -14
- package/apps/web/src/features/fs/hooks/useDirBrowser.ts +0 -50
- package/apps/web/src/features/harness/api/__tests__/harness.api.test.ts +0 -73
- package/apps/web/src/features/harness/api/harness.api.ts +0 -46
- package/apps/web/src/features/harness/hooks/__tests__/useHarness.test.ts +0 -65
- package/apps/web/src/features/harness/hooks/useHarness.ts +0 -66
- package/apps/web/src/features/harness/ui/HarnessModal.tsx +0 -171
- package/apps/web/src/features/harness/ui/__tests__/HarnessModal.test.tsx +0 -46
- package/apps/web/src/features/status/ui/AgentStatusModal.tsx +0 -267
- package/apps/web/src/features/status/ui/__tests__/AgentStatusModal.test.tsx +0 -71
- package/apps/web/src/features/tasks/api/__tests__/changelog.api.test.ts +0 -89
- package/apps/web/src/features/tasks/api/__tests__/tasks.api.test.ts +0 -282
- package/apps/web/src/features/tasks/api/changelog.api.ts +0 -52
- package/apps/web/src/features/tasks/api/tasks.api.ts +0 -175
- package/apps/web/src/features/tasks/container/TaskDetailPageContainer.tsx +0 -69
- package/apps/web/src/features/tasks/hooks/__tests__/useChangelogCodeCopy.test.ts +0 -48
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskChangelog.test.ts +0 -48
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskCreate.test.ts +0 -217
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskEdit.test.ts +0 -152
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskExecution.test.ts +0 -143
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskList.test.ts +0 -168
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskNotification.test.ts +0 -125
- package/apps/web/src/features/tasks/hooks/__tests__/useTaskRuns.test.ts +0 -51
- package/apps/web/src/features/tasks/hooks/useChangelogCodeCopy.ts +0 -52
- package/apps/web/src/features/tasks/hooks/useCopyToClipboard.ts +0 -47
- package/apps/web/src/features/tasks/hooks/useTaskChangelog.ts +0 -32
- package/apps/web/src/features/tasks/hooks/useTaskCreate.ts +0 -137
- package/apps/web/src/features/tasks/hooks/useTaskDetail.ts +0 -217
- package/apps/web/src/features/tasks/hooks/useTaskEdit.ts +0 -130
- package/apps/web/src/features/tasks/hooks/useTaskExecution.ts +0 -137
- package/apps/web/src/features/tasks/hooks/useTaskList.ts +0 -159
- package/apps/web/src/features/tasks/hooks/useTaskNotification.ts +0 -80
- package/apps/web/src/features/tasks/hooks/useTaskRuns.ts +0 -32
- package/apps/web/src/features/tasks/ui/AgentOutputPanel.tsx +0 -203
- package/apps/web/src/features/tasks/ui/AgentRoleSelect.tsx +0 -97
- package/apps/web/src/features/tasks/ui/ChangelogPanel.tsx +0 -321
- package/apps/web/src/features/tasks/ui/RunHistoryPanel.tsx +0 -193
- package/apps/web/src/features/tasks/ui/TaskCreateModal.tsx +0 -205
- package/apps/web/src/features/tasks/ui/TaskDetailView.tsx +0 -413
- package/apps/web/src/features/tasks/ui/TaskEditModal.tsx +0 -165
- package/apps/web/src/features/tasks/ui/TaskListModal.tsx +0 -591
- package/apps/web/src/features/tasks/ui/__tests__/AgentRoleSelect.test.tsx +0 -91
- package/apps/web/src/features/tasks/ui/__tests__/ChangelogPanel.test.tsx +0 -94
- package/apps/web/src/features/tasks/ui/__tests__/RunHistoryPanel.test.tsx +0 -71
- package/apps/web/src/features/tasks/ui/__tests__/TaskCreateModal.test.tsx +0 -153
- package/apps/web/src/features/tasks/ui/__tests__/TaskEditModal.test.tsx +0 -75
- package/apps/web/src/features/tasks/ui/__tests__/TaskListModal.test.tsx +0 -243
- package/apps/web/src/hooks/useWorkingDir.ts +0 -28
- package/apps/web/src/lib/__tests__/ansi.test.ts +0 -88
- package/apps/web/src/lib/ansi.ts +0 -105
- package/apps/web/src/lib/constants.ts +0 -4
- package/apps/web/src/lib/quota.ts +0 -22
- package/apps/web/src/lib/theme.tsx +0 -78
- package/apps/web/src/lib/toast.tsx +0 -175
- package/apps/web/src/store/agentStatusStore.ts +0 -38
- package/apps/web/tsconfig.json +0 -18
- package/apps/web/vitest.config.ts +0 -25
- package/apps/web/vitest.setup.ts +0 -10
- package/packages/cli/dist/utils/project-init.d.ts +0 -12
- package/packages/cli/dist/utils/project-init.js +0 -258
- package/packages/cli/package.json +0 -30
- package/packages/cli/src/commands/check.ts +0 -77
- package/packages/cli/src/commands/init.ts +0 -209
- package/packages/cli/src/commands/start.ts +0 -183
- package/packages/cli/src/index.ts +0 -91
- package/packages/cli/src/utils/agent-tools.ts +0 -201
- package/packages/cli/src/utils/project-init.ts +0 -252
- package/packages/cli/src/utils/proxy.ts +0 -123
- package/packages/cli/tsconfig.json +0 -14
- package/packages/eslint-config/base.mjs +0 -31
- package/packages/eslint-config/nest.mjs +0 -55
- package/packages/eslint-config/next.mjs +0 -23
- package/packages/eslint-config/package.json +0 -20
- package/packages/typescript-config/base.json +0 -16
- package/packages/typescript-config/nestjs.json +0 -17
- package/packages/typescript-config/nextjs.json +0 -15
- package/packages/typescript-config/package.json +0 -11
- package/turbo.json +0 -28
- /package/apps/web/{src/app/favicon.ico → .next/server/app/favicon.ico.body} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/lib/constants.ts","../../../../../../apps/web/src/features/auth/api/auth.api.ts","../../../../../../apps/web/src/components/ui/Modal.tsx","../../../../../../apps/web/src/features/auth/hooks/useClaudeAuth.ts","../../../../../../apps/web/src/features/auth/ui/LoginPanel.tsx"],"sourcesContent":["// 프로덕션(프리빌드 배포)에서는 프록시 뒤에서 same-origin으로 호출하고,\n// 로컬 개발에서는 별도 포트의 서버(3001)로 직접 호출한다.\nexport const SERVER_URL =\n process.env.NEXT_PUBLIC_SERVER_URL ??\n (process.env.NODE_ENV === \"production\" ? \"\" : \"http://localhost:3001\");\nexport const CLAUDE_WS_NAMESPACE = \"/agents/claude\";\nexport const GEMINI_WS_NAMESPACE = \"/agents/gemini\";\nexport const CODEX_WS_NAMESPACE = \"/agents/codex\";\n","import { SERVER_URL } from \"@/lib/constants\";\n\nexport interface AuthStatus {\n loggedIn: boolean;\n authMethod: string;\n apiProvider: string;\n email?: string;\n orgName?: string;\n subscriptionType?: string;\n}\n\nexport interface ClaudeStatus {\n version: string;\n auth: AuthStatus;\n activeSessions: number;\n platform: string;\n}\n\nexport interface GeminiAuthStatus {\n loggedIn: boolean;\n authMethod: string;\n installed: boolean;\n email?: string;\n}\n\nexport async function getAuthStatus(): Promise<AuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getClaudeStatus(): Promise<ClaudeStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getGeminiAuthStatus(): Promise<GeminiAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureGeminiAuth(\n authType: \"api-key\",\n apiKey: string,\n): Promise<void>;\nexport async function configureGeminiAuth(authType: \"gca\"): Promise<void>;\nexport async function configureGeminiAuth(\n authType: \"api-key\" | \"gca\",\n apiKey?: string,\n): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ authType, ...(apiKey ? { apiKey } : {}) }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n\n// ─── Codex ────────────────────────────────────────────────────────────────────\n\nexport interface CodexAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n}\n\nexport async function getCodexAuthStatus(): Promise<CodexAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureCodexAuth(apiKey: string): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n maxWidth?: string;\n hideClose?: boolean;\n zIndex?: string;\n}\n\nexport function Modal({ open, onClose, title, children, maxWidth = \"max-w-lg\", hideClose = false, zIndex = \"z-50\" }: ModalProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, onClose]);\n\n useEffect(() => {\n if (open) document.body.style.overflow = \"hidden\";\n else document.body.style.overflow = \"\";\n return () => { document.body.style.overflow = \"\"; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div\n ref={overlayRef}\n className={`fixed inset-0 flex items-center justify-center bg-black/50 p-4 backdrop-blur-md dark:bg-black/70 ${zIndex}`}\n onMouseDown={(e) => { if (e.target === overlayRef.current) onClose(); }}\n >\n <div\n className={[\n \"relative flex w-full flex-col rounded-2xl\",\n \"border border-gray-900/[0.08] bg-white dark:border-white/[0.08] dark:bg-[#0a0c10]\",\n \"shadow-[0_24px_80px_rgba(0,0,0,0.15)] dark:shadow-[0_24px_80px_rgba(0,0,0,0.7)]\",\n maxWidth,\n ].join(\" \")}\n style={{ animation: \"modal-in 0.18s cubic-bezier(0.16,1,0.3,1) both\" }}\n >\n {/* 헤더 */}\n <div className=\"flex items-center justify-between border-b border-gray-900/[0.06] px-5 py-4 dark:border-white/[0.06]\">\n <h2 className=\"text-sm font-semibold text-gray-900/85 dark:text-white/85\">{title}</h2>\n {!hideClose && (\n <button\n onClick={onClose}\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-gray-900/25 transition-colors hover:bg-gray-900/[0.07] hover:text-gray-900/70 dark:text-white/25 dark:hover:bg-white/[0.07] dark:hover:text-white/70\"\n aria-label=\"닫기\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-3.5 w-3.5\">\n <path d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* 본문 */}\n <div className=\"overflow-y-auto px-5 py-5\" style={{ maxHeight: \"calc(90vh - 64px)\" }}>\n {children}\n </div>\n </div>\n\n <style>{`\n @keyframes modal-in {\n from { opacity: 0; transform: scale(0.96) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n `}</style>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { io, type Socket } from \"socket.io-client\";\n\nimport { CLAUDE_WS_NAMESPACE, SERVER_URL } from \"@/lib/constants\";\nimport { getAuthStatus } from \"../api/auth.api\";\n\nexport type AuthState = \"checking\" | \"authenticated\" | \"unauthenticated\";\nexport type LoginState = \"idle\" | \"pending\" | \"done\" | \"error\";\n\nconst URL_REGEX = /https?:\\/\\/[^\\s\\-\"<>\\\\^`{|}~]+/g;\n\nexport function extractUrls(text: string): string[] {\n return Array.from(new Set(text.match(URL_REGEX) ?? []));\n}\n\nexport function useClaudeAuth() {\n const [authState, setAuthState] = useState<AuthState>(\"checking\");\n const [loginState, setLoginState] = useState<LoginState>(\"idle\");\n const [loginOutput, setLoginOutput] = useState(\"\");\n const [loginUrls, setLoginUrls] = useState<string[]>([]);\n\n const socketRef = useRef<Socket | null>(null);\n const outputRef = useRef(\"\");\n const isLoginActiveRef = useRef(false);\n\n const checkAuth = useCallback(async () => {\n setAuthState(\"checking\");\n try {\n const data = await getAuthStatus();\n setAuthState(data.loggedIn ? \"authenticated\" : \"unauthenticated\");\n } catch {\n setAuthState(\"unauthenticated\");\n }\n }, []);\n\n useEffect(() => { void checkAuth(); }, [checkAuth]);\n\n const startLogin = useCallback(() => {\n if (loginState === \"pending\") return;\n\n outputRef.current = \"\";\n setLoginOutput(\"\");\n setLoginUrls([]);\n setLoginState(\"pending\");\n isLoginActiveRef.current = true;\n\n const socket = io(`${SERVER_URL}${CLAUDE_WS_NAMESPACE}`, { transports: [\"websocket\"] });\n socketRef.current = socket;\n\n socket.on(\"connect\", () => socket.emit(\"auth:login:start\"));\n\n socket.on(\"auth:output\", ({ text }: { text: string }) => {\n outputRef.current += text;\n setLoginOutput(outputRef.current);\n setLoginUrls(extractUrls(outputRef.current));\n });\n\n socket.on(\"auth:done\", ({ success }: { success: boolean }) => {\n isLoginActiveRef.current = false;\n socket.disconnect();\n socketRef.current = null;\n setLoginState(success ? \"done\" : \"error\");\n if (success) setAuthState(\"authenticated\");\n });\n\n socket.on(\"disconnect\", () => {\n if (isLoginActiveRef.current) {\n isLoginActiveRef.current = false;\n setLoginState(\"error\");\n }\n });\n }, [loginState]);\n\n const cancelLogin = useCallback(() => {\n isLoginActiveRef.current = false;\n socketRef.current?.emit(\"auth:login:cancel\");\n socketRef.current?.disconnect();\n socketRef.current = null;\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n outputRef.current = \"\";\n }, []);\n\n return { authState, loginState, loginOutput, loginUrls, startLogin, cancelLogin, checkAuth };\n}\n","\"use client\";\n\nimport type { LoginState } from \"../hooks/useClaudeAuth\";\n\ninterface LoginPanelProps {\n loginState: LoginState;\n loginOutput: string;\n loginUrls: string[];\n onStart: () => void;\n onCancel: () => void;\n}\n\nexport function LoginPanel({ loginState, loginOutput, loginUrls, onStart, onCancel }: LoginPanelProps) {\n const isPending = loginState === \"pending\";\n const isDone = loginState === \"done\";\n const isError = loginState === \"error\";\n\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-orange-500/[0.08] dark:border-white/[0.08]\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" className=\"h-8 w-8 text-orange-500 dark:text-orange-400/80\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\" />\n </svg>\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Claude Code 로그인 필요</h2>\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n Claude CLI를 사용하려면 Anthropic 계정으로 로그인해야 합니다.\n </p>\n </div>\n\n {loginState === \"idle\" && (\n <button\n onClick={onStart}\n className=\"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500\"\n >\n Claude Code 로그인\n </button>\n )}\n\n {isPending && (\n <div className=\"flex w-full max-w-lg flex-col gap-4\">\n {loginUrls.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">브라우저에서 아래 링크를 열어 인증을 완료하세요:</p>\n {loginUrls.map((url) => (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all rounded-lg border border-orange-700/50 bg-orange-950/30 px-4 py-3 text-xs font-mono text-orange-700 transition-colors hover:border-orange-500 hover:text-orange-600 dark:text-orange-300 dark:hover:text-orange-200\"\n >\n {url}\n </a>\n ))}\n </div>\n )}\n\n {loginOutput && (\n <pre className=\"max-h-48 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45\">\n {loginOutput}\n </pre>\n )}\n\n {loginUrls.length === 0 && (\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-orange-500 dark:border-white/[0.08]\" />\n 로그인 프로세스를 시작하는 중…\n </div>\n )}\n\n <button onClick={onCancel} className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\">\n 취소\n </button>\n </div>\n )}\n\n {isDone && (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">로그인 완료</p>\n <p className=\"text-xs text-gray-900/25 dark:text-white/25\">잠시 후 자동으로 이동합니다…</p>\n </div>\n )}\n\n {isError && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-red-500 dark:text-red-400\">\n <path fillRule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm text-red-500 dark:text-red-400\">로그인 중 문제가 발생했습니다.</p>\n {loginOutput && (\n <pre className=\"max-h-32 w-full max-w-lg overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40\">\n {loginOutput}\n </pre>\n )}\n <button\n onClick={onStart}\n className=\"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500\"\n >\n 다시 시도\n </button>\n </div>\n )}\n </div>\n );\n}\n"],"names":["SERVER_URL","process","env","NEXT_PUBLIC_SERVER_URL","CLAUDE_WS_NAMESPACE","GEMINI_WS_NAMESPACE","CODEX_WS_NAMESPACE","Modal","open","onClose","title","children","maxWidth","hideClose","zIndex","overlayRef","handler","e","key","window","addEventListener","removeEventListener","document","body","style","overflow","ref","className","onMouseDown","target","current","join","animation","onClick","viewBox","fill","d","maxHeight","URL_REGEX","extractUrls","text","Array","from","Set","match","useClaudeAuth","authState","setAuthState","loginState","setLoginState","loginOutput","setLoginOutput","loginUrls","setLoginUrls","socketRef","outputRef","isLoginActiveRef","checkAuth","data","loggedIn","startLogin","socket","transports","on","emit","success","disconnect","cancelLogin"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},47077,28467,a=>{"use strict";let b=process.env.NEXT_PUBLIC_SERVER_URL??"";async function c(){let a=await fetch(`${b}/agents/claude/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function d(){let a=await fetch(`${b}/agents/claude/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function e(){let a=await fetch(`${b}/agents/gemini/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function f(a,c){let d=await fetch(`${b}/agents/gemini/auth/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:a,...c?{apiKey:c}:{}})});if(!d.ok)throw Error(`HTTP ${d.status}`)}async function g(){let a=await fetch(`${b}/agents/codex/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function h(a){let c=await fetch(`${b}/agents/codex/auth/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:a})});if(!c.ok)throw Error(`HTTP ${c.status}`)}a.s(["CLAUDE_WS_NAMESPACE",0,"/agents/claude","CODEX_WS_NAMESPACE",0,"/agents/codex","GEMINI_WS_NAMESPACE",0,"/agents/gemini","SERVER_URL",0,b],47077),a.s(["configureCodexAuth",0,h,"configureGeminiAuth",0,f,"getAuthStatus",0,c,"getClaudeStatus",0,d,"getCodexAuthStatus",0,g,"getGeminiAuthStatus",0,e],28467)},70548,17273,a=>{"use strict";var b=a.i(72131),c=a.i(83915),d=a.i(47077),e=a.i(28467);let f=/https?:\/\/[\w./-]+/g,g=/(?<![A-Z0-9])([A-Z0-9]{4}-[A-Z0-9]{4,6})(?![A-Z0-9])/;a.s(["useCodexAuth",0,function(){let[a,h]=(0,b.useState)("checking"),[i,j]=(0,b.useState)("device"),[k,l]=(0,b.useState)("idle"),[m,n]=(0,b.useState)(""),[o,p]=(0,b.useState)([]),[q,r]=(0,b.useState)(null),[s,t]=(0,b.useState)("idle"),[u,v]=(0,b.useState)(""),w=(0,b.useRef)(null),x=(0,b.useRef)(""),y=(0,b.useRef)(!1),z=(0,b.useCallback)(async()=>{h("checking");try{let a=await (0,e.getCodexAuthStatus)();a.installed?h(a.loggedIn?"authenticated":"unauthenticated"):h("not-installed")}catch{h("unauthenticated")}},[]);(0,b.useEffect)(()=>{z()},[z]);let A=(0,b.useCallback)(()=>{if("pending"===k)return;x.current="",n(""),p([]),r(null),l("pending"),y.current=!0;let a=(0,c.io)(`${d.SERVER_URL}${d.CODEX_WS_NAMESPACE}`,{transports:["websocket"]});w.current=a,a.on("connect",()=>a.emit("auth:login:start")),a.on("auth:output",({text:a})=>{var b;x.current+=a,n(x.current),p(Array.from(new Set(x.current.match(f)??[])));let c=(b=x.current,b.match(g)?.[1]??null);c&&r(c)}),a.on("auth:done",({success:b})=>{y.current=!1,a.disconnect(),w.current=null,l(b?"done":"error"),b&&h("authenticated")}),a.on("disconnect",()=>{y.current&&(y.current=!1,l("error"))})},[k]),B=(0,b.useCallback)(()=>{y.current=!1,w.current?.emit("auth:login:cancel"),w.current?.disconnect(),w.current=null,l("idle"),n(""),p([]),r(null),x.current=""},[]);return{authState:a,loginMethod:i,setLoginMethod:j,loginState:k,loginOutput:m,loginUrls:o,deviceCode:q,startDeviceLogin:A,cancelDeviceLogin:B,apiKeyLoginState:s,configError:u,saveApiKey:(0,b.useCallback)(async a=>{v(""),t("pending");try{await (0,e.configureCodexAuth)(a),t("done"),h("authenticated")}catch{v("API 키 저장에 실패했습니다. 서버 연결을 확인하세요."),t("error")}},[]),resetApiKeyLogin:(0,b.useCallback)(()=>{t("idle"),v("")},[]),checkAuth:z}}],70548);var h=a.i(87924);let i=(0,h.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 shrink-0 text-gray-900/80 dark:text-white/80","aria-hidden":"true",children:(0,h.jsx)("path",{d:"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"})});function j({method:a,selected:b,onSelect:c,label:d}){return(0,h.jsx)("button",{type:"button",onClick:()=>c(a),className:["flex-1 rounded-lg px-4 py-2 text-xs font-medium transition-colors",b===a?"bg-gray-900/[0.07] text-gray-900/75 dark:bg-white/[0.07] dark:text-white/75":"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60"].join(" "),children:d})}function k({loginState:a,loginOutput:b,loginUrls:c,deviceCode:d,onStart:e,onCancel:f}){return"idle"===a?(0,h.jsx)("button",{onClick:e,className:"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:"ChatGPT로 로그인"}):"pending"===a?(0,h.jsxs)("div",{className:"flex w-full max-w-sm flex-col gap-4",children:[c.length>0?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,h.jsx)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:"1. 아래 링크를 브라우저에서 열어 로그인하세요"}),c.map(a=>(0,h.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"break-all rounded-lg border border-emerald-700/40 bg-emerald-950/20 px-4 py-3 text-xs font-mono text-emerald-700 transition-colors hover:border-emerald-500 hover:text-emerald-600 dark:text-emerald-300 dark:hover:text-emerald-200",children:a},a))]}),d&&(0,h.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,h.jsxs)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:["2. 이 일회용 코드를 입력하세요 ",(0,h.jsx)("span",{className:"text-gray-900/20 dark:text-white/20",children:"(15분 내 유효)"})]}),(0,h.jsx)("div",{className:"flex items-center justify-center rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] py-4 dark:border-white/[0.10] dark:bg-white/[0.03]",children:(0,h.jsx)("span",{className:"font-mono text-2xl font-bold tracking-widest text-gray-900/80 dark:text-white/80",children:d})})]})]}):(0,h.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30",children:[(0,h.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60"}),"연결 중…"]}),b&&!c.length&&(0,h.jsx)("pre",{className:"max-h-40 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45",children:b}),(0,h.jsx)("button",{onClick:f,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"취소"})]}):"done"===a?(0,h.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"로그인 완료"}),(0,h.jsx)("p",{className:"text-xs text-gray-900/25 dark:text-white/25",children:"잠시 후 자동으로 이동합니다…"})]}):(0,h.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-red-500 dark:text-red-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm text-red-500 dark:text-red-400",children:"로그인 중 문제가 발생했습니다."}),b&&(0,h.jsx)("pre",{className:"max-h-32 w-full max-w-sm overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40",children:b}),(0,h.jsx)("button",{onClick:e,className:"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:"다시 시도"})]})}function l({loginState:a,configError:c,onSave:d}){let e=(0,b.useRef)(null);return"done"===a?(0,h.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"인증 완료"})]}):(0,h.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=e.current?.value.trim()??"";b&&d(b)},className:"flex w-full max-w-sm flex-col gap-4",children:[(0,h.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,h.jsx)("label",{className:"text-xs font-medium text-gray-900/50 dark:text-white/50",children:"OpenAI API 키"}),(0,h.jsx)("input",{ref:e,type:"password",placeholder:"sk-...",autoFocus:!0,required:!0,className:"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/30 focus:ring-2 focus:ring-gray-900/5 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-white/30 dark:focus:ring-white/5"}),(0,h.jsxs)("p",{className:"text-[11px] text-gray-900/30 dark:text-white/30",children:[(0,h.jsx)("a",{href:"https://platform.openai.com/api-keys",target:"_blank",rel:"noopener noreferrer",className:"text-gray-900/55 underline-offset-2 hover:underline dark:text-white/55",children:"OpenAI 플랫폼"}),"에서 API 키를 발급받을 수 있습니다."]}),c&&(0,h.jsx)("p",{className:"text-xs text-red-500 dark:text-red-400",children:c})]}),(0,h.jsxs)("button",{type:"submit",disabled:"pending"===a,className:"flex items-center justify-center gap-2 rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 disabled:opacity-50 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:["pending"===a&&(0,h.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white dark:border-gray-900/30 dark:border-t-gray-900"}),"pending"===a?"저장 중…":"저장"]})]})}a.s(["CodexLoginPanel",0,function({loginMethod:a,onMethodChange:b,loginState:c,loginOutput:d,loginUrls:e,deviceCode:f,onStartDeviceLogin:g,onCancelDeviceLogin:m,apiKeyLoginState:n,configError:o,onSaveApiKey:p}){return(0,h.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-6 px-6",children:[(0,h.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,h.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]",children:i}),(0,h.jsx)("h2",{className:"text-xl font-semibold text-gray-900/90 dark:text-white/90",children:"Codex CLI 인증"}),(0,h.jsx)("p",{className:"max-w-sm text-sm text-gray-900/40 dark:text-white/40",children:"ChatGPT 계정으로 로그인하거나 API 키를 입력해 주세요."})]}),(0,h.jsxs)("div",{className:"flex w-full max-w-sm rounded-xl border border-gray-900/[0.08] p-1 dark:border-white/[0.08]",children:[(0,h.jsx)(j,{method:"device",selected:a,onSelect:b,label:"ChatGPT 로그인"}),(0,h.jsx)(j,{method:"apikey",selected:a,onSelect:b,label:"API 키"})]}),"device"===a?(0,h.jsx)(k,{loginState:c,loginOutput:d,loginUrls:e,deviceCode:f,onStart:g,onCancel:m}):(0,h.jsx)(l,{loginState:n,configError:o,onSave:p})]})}],17273)},6208,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131),e=a.i(70548),f=a.i(17273),g=a.i(82885);let h=(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-7 w-7 text-gray-900/80 dark:text-white/80","aria-hidden":"true",children:(0,b.jsx)("path",{d:"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"})});function i(){return(0,b.jsxs)("div",{className:"flex h-screen flex-col bg-[#faf8f5] dark:bg-[#07090e]",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 border-b border-gray-900/[0.07] px-4 py-3 dark:border-white/[0.07]",children:[(0,b.jsx)("div",{className:"h-3.5 w-3.5 rounded bg-gray-900/[0.07] dark:bg-white/[0.07]"}),(0,b.jsx)("div",{className:"h-[14px] w-20 rounded bg-gray-900/[0.07] dark:bg-white/[0.07]"})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-3",children:[(0,b.jsx)("span",{className:"h-6 w-6 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60"}),(0,b.jsx)("span",{className:"text-xs text-gray-900/20 dark:text-white/20",children:"인증 확인 중…"})]})]})}function j(){return(0,b.jsx)("div",{className:"flex flex-1 flex-col items-center justify-center gap-6 px-6",children:(0,b.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,b.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]",children:(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",className:"h-8 w-8 text-gray-900/30 dark:text-white/30",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"})})}),(0,b.jsx)("h2",{className:"text-xl font-semibold text-gray-900/90 dark:text-white/90",children:"Codex CLI가 설치되어 있지 않습니다"}),(0,b.jsx)("p",{className:"max-w-sm text-sm text-gray-900/40 dark:text-white/40",children:"먼저 CLI 도구를 설치해 주세요."}),(0,b.jsx)("code",{className:"mt-1 rounded-lg border border-gray-900/[0.08] bg-gray-900/[0.03] px-4 py-2 font-mono text-sm text-gray-900/55 dark:border-white/[0.08] dark:bg-white/[0.03] dark:text-white/55",children:"jccli init"})]})})}function k(){return(0,b.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-4",children:[(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 overflow-hidden",children:(0,b.jsx)("div",{className:"absolute left-1/2 top-1/2 h-[500px] w-[600px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-gray-900/[0.03] blur-[120px] dark:bg-white/[0.03]"})}),(0,b.jsx)("div",{className:"relative flex h-14 w-14 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]",children:h}),(0,b.jsxs)("div",{className:"relative text-center",children:[(0,b.jsx)("p",{className:"font-semibold text-gray-900/75 dark:text-white/75",children:"Codex CLI"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-gray-900/30 dark:text-white/30",children:"로그인되었습니다. 채팅 기능은 준비 중입니다."})]})]})}a.s(["default",0,function(){let{authState:a,loginMethod:h,setLoginMethod:l,loginState:m,loginOutput:n,loginUrls:o,deviceCode:p,startDeviceLogin:q,cancelDeviceLogin:r,apiKeyLoginState:s,configError:t,saveApiKey:u,checkAuth:v}=(0,e.useCodexAuth)();(0,d.useEffect)(()=>{("done"===m||"done"===s)&&v()},[m,s,v]);let w=(0,b.jsxs)("header",{className:"flex items-center gap-2 border-b border-gray-900/[0.07] px-4 py-3 dark:border-white/[0.07]",children:[(0,b.jsx)(c.default,{href:"/",className:"text-gray-900/30 transition-colors hover:text-gray-900/60 dark:text-white/30 dark:hover:text-white/60",children:"←"}),(0,b.jsx)("span",{className:"text-sm font-semibold text-gray-900/80 dark:text-white/80",children:"Codex CLI"}),(0,b.jsx)("div",{className:"ml-auto",children:(0,b.jsx)(g.ThemeToggle,{})})]});return"checking"===a?(0,b.jsx)(i,{}):(0,b.jsxs)("div",{className:"flex h-screen flex-col bg-[#faf8f5] text-gray-900 dark:bg-[#07090e] dark:text-white",children:[w,"not-installed"===a&&(0,b.jsx)(j,{}),"unauthenticated"===a&&(0,b.jsx)(f.CodexLoginPanel,{loginMethod:h,onMethodChange:l,loginState:m,loginOutput:n,loginUrls:o,deviceCode:p,onStartDeviceLogin:q,onCancelDeviceLogin:r,apiKeyLoginState:s,configError:t,onSaveApiKey:u}),"authenticated"===a&&(0,b.jsx)(k,{})]})}])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__0bzgqz2._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/lib/constants.ts","../../../../../../apps/web/src/features/auth/api/auth.api.ts","../../../../../../apps/web/src/features/auth/hooks/useCodexAuth.ts","../../../../../../apps/web/src/features/auth/ui/CodexLoginPanel.tsx","../../../../../../apps/web/src/app/codex/page.tsx"],"sourcesContent":["// 프로덕션(프리빌드 배포)에서는 프록시 뒤에서 same-origin으로 호출하고,\n// 로컬 개발에서는 별도 포트의 서버(3001)로 직접 호출한다.\nexport const SERVER_URL =\n process.env.NEXT_PUBLIC_SERVER_URL ??\n (process.env.NODE_ENV === \"production\" ? \"\" : \"http://localhost:3001\");\nexport const CLAUDE_WS_NAMESPACE = \"/agents/claude\";\nexport const GEMINI_WS_NAMESPACE = \"/agents/gemini\";\nexport const CODEX_WS_NAMESPACE = \"/agents/codex\";\n","import { SERVER_URL } from \"@/lib/constants\";\n\nexport interface AuthStatus {\n loggedIn: boolean;\n authMethod: string;\n apiProvider: string;\n email?: string;\n orgName?: string;\n subscriptionType?: string;\n}\n\nexport interface ClaudeStatus {\n version: string;\n auth: AuthStatus;\n activeSessions: number;\n platform: string;\n}\n\nexport interface GeminiAuthStatus {\n loggedIn: boolean;\n authMethod: string;\n installed: boolean;\n email?: string;\n}\n\nexport async function getAuthStatus(): Promise<AuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getClaudeStatus(): Promise<ClaudeStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getGeminiAuthStatus(): Promise<GeminiAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureGeminiAuth(\n authType: \"api-key\",\n apiKey: string,\n): Promise<void>;\nexport async function configureGeminiAuth(authType: \"gca\"): Promise<void>;\nexport async function configureGeminiAuth(\n authType: \"api-key\" | \"gca\",\n apiKey?: string,\n): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ authType, ...(apiKey ? { apiKey } : {}) }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n\n// ─── Codex ────────────────────────────────────────────────────────────────────\n\nexport interface CodexAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n}\n\nexport async function getCodexAuthStatus(): Promise<CodexAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureCodexAuth(apiKey: string): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { io, type Socket } from \"socket.io-client\";\n\nimport { CODEX_WS_NAMESPACE, SERVER_URL } from \"@/lib/constants\";\nimport { configureCodexAuth, getCodexAuthStatus } from \"../api/auth.api\";\n\nexport type CodexAuthState = \"checking\" | \"authenticated\" | \"unauthenticated\" | \"not-installed\";\nexport type CodexLoginState = \"idle\" | \"pending\" | \"done\" | \"error\";\nexport type CodexLoginMethod = \"device\" | \"apikey\";\n\nconst URL_REGEX = /https?:\\/\\/[\\w./-]+/g;\nconst CODE_REGEX = /(?<![A-Z0-9])([A-Z0-9]{4}-[A-Z0-9]{4,6})(?![A-Z0-9])/;\n\nexport function extractUrls(text: string): string[] {\n return Array.from(new Set(text.match(URL_REGEX) ?? []));\n}\n\nexport function extractDeviceCode(text: string): string | null {\n return text.match(CODE_REGEX)?.[1] ?? null;\n}\n\nexport function useCodexAuth() {\n const [authState, setAuthState] = useState<CodexAuthState>(\"checking\");\n const [loginMethod, setLoginMethod] = useState<CodexLoginMethod>(\"device\");\n\n // device auth state\n const [loginState, setLoginState] = useState<CodexLoginState>(\"idle\");\n const [loginOutput, setLoginOutput] = useState(\"\");\n const [loginUrls, setLoginUrls] = useState<string[]>([]);\n const [deviceCode, setDeviceCode] = useState<string | null>(null);\n\n // api key state\n const [apiKeyLoginState, setApiKeyLoginState] = useState<CodexLoginState>(\"idle\");\n const [configError, setConfigError] = useState(\"\");\n\n const socketRef = useRef<Socket | null>(null);\n const outputRef = useRef(\"\");\n const isLoginActiveRef = useRef(false);\n\n const checkAuth = useCallback(async () => {\n setAuthState(\"checking\");\n try {\n const data = await getCodexAuthStatus();\n if (!data.installed) setAuthState(\"not-installed\");\n else setAuthState(data.loggedIn ? \"authenticated\" : \"unauthenticated\");\n } catch {\n setAuthState(\"unauthenticated\");\n }\n }, []);\n\n useEffect(() => { void checkAuth(); }, [checkAuth]);\n\n // ── Device auth (WebSocket) ───────────────────────────────────────────\n\n const startDeviceLogin = useCallback(() => {\n if (loginState === \"pending\") return;\n\n outputRef.current = \"\";\n setLoginOutput(\"\");\n setLoginUrls([]);\n setDeviceCode(null);\n setLoginState(\"pending\");\n isLoginActiveRef.current = true;\n\n const socket = io(`${SERVER_URL}${CODEX_WS_NAMESPACE}`, { transports: [\"websocket\"] });\n socketRef.current = socket;\n\n socket.on(\"connect\", () => socket.emit(\"auth:login:start\"));\n\n socket.on(\"auth:output\", ({ text }: { text: string }) => {\n outputRef.current += text;\n setLoginOutput(outputRef.current);\n setLoginUrls(extractUrls(outputRef.current));\n const code = extractDeviceCode(outputRef.current);\n if (code) setDeviceCode(code);\n });\n\n socket.on(\"auth:done\", ({ success }: { success: boolean }) => {\n isLoginActiveRef.current = false;\n socket.disconnect();\n socketRef.current = null;\n setLoginState(success ? \"done\" : \"error\");\n if (success) setAuthState(\"authenticated\");\n });\n\n socket.on(\"disconnect\", () => {\n if (isLoginActiveRef.current) {\n isLoginActiveRef.current = false;\n setLoginState(\"error\");\n }\n });\n }, [loginState]);\n\n const cancelDeviceLogin = useCallback(() => {\n isLoginActiveRef.current = false;\n socketRef.current?.emit(\"auth:login:cancel\");\n socketRef.current?.disconnect();\n socketRef.current = null;\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n setDeviceCode(null);\n outputRef.current = \"\";\n }, []);\n\n // ── API key ───────────────────────────────────────────────────────────\n\n const saveApiKey = useCallback(async (apiKey: string) => {\n setConfigError(\"\");\n setApiKeyLoginState(\"pending\");\n try {\n await configureCodexAuth(apiKey);\n setApiKeyLoginState(\"done\");\n setAuthState(\"authenticated\");\n } catch {\n setConfigError(\"API 키 저장에 실패했습니다. 서버 연결을 확인하세요.\");\n setApiKeyLoginState(\"error\");\n }\n }, []);\n\n const resetApiKeyLogin = useCallback(() => {\n setApiKeyLoginState(\"idle\");\n setConfigError(\"\");\n }, []);\n\n return {\n authState,\n loginMethod,\n setLoginMethod,\n\n // device auth\n loginState,\n loginOutput,\n loginUrls,\n deviceCode,\n startDeviceLogin,\n cancelDeviceLogin,\n\n // api key\n apiKeyLoginState,\n configError,\n saveApiKey,\n resetApiKeyLogin,\n\n checkAuth,\n };\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\n\nimport type { CodexLoginMethod, CodexLoginState } from \"../hooks/useCodexAuth\";\n\nconst OPENAI_LOGO = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 shrink-0 text-gray-900/80 dark:text-white/80\" aria-hidden=\"true\">\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z\" />\n </svg>\n);\n\n// ─── Method Tab ───────────────────────────────────────────────────────────────\n\ninterface TabProps {\n method: CodexLoginMethod;\n selected: CodexLoginMethod;\n onSelect: (m: CodexLoginMethod) => void;\n label: string;\n}\n\nfunction MethodTab({ method, selected, onSelect, label }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(method)}\n className={[\n \"flex-1 rounded-lg px-4 py-2 text-xs font-medium transition-colors\",\n selected === method\n ? \"bg-gray-900/[0.07] text-gray-900/75 dark:bg-white/[0.07] dark:text-white/75\"\n : \"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60\",\n ].join(\" \")}\n >\n {label}\n </button>\n );\n}\n\n// ─── Device Auth Panel ────────────────────────────────────────────────────────\n\ninterface DeviceAuthProps {\n loginState: CodexLoginState;\n loginOutput: string;\n loginUrls: string[];\n deviceCode: string | null;\n onStart: () => void;\n onCancel: () => void;\n}\n\nfunction DeviceAuthView({ loginState, loginOutput, loginUrls, deviceCode, onStart, onCancel }: DeviceAuthProps) {\n if (loginState === \"idle\") {\n return (\n <button\n onClick={onStart}\n className=\"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n ChatGPT로 로그인\n </button>\n );\n }\n\n if (loginState === \"pending\") {\n return (\n <div className=\"flex w-full max-w-sm flex-col gap-4\">\n {loginUrls.length > 0 ? (\n <>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">\n 1. 아래 링크를 브라우저에서 열어 로그인하세요\n </p>\n {loginUrls.map((url) => (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all rounded-lg border border-emerald-700/40 bg-emerald-950/20 px-4 py-3 text-xs font-mono text-emerald-700 transition-colors hover:border-emerald-500 hover:text-emerald-600 dark:text-emerald-300 dark:hover:text-emerald-200\"\n >\n {url}\n </a>\n ))}\n </div>\n {deviceCode && (\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">\n 2. 이 일회용 코드를 입력하세요 <span className=\"text-gray-900/20 dark:text-white/20\">(15분 내 유효)</span>\n </p>\n <div className=\"flex items-center justify-center rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] py-4 dark:border-white/[0.10] dark:bg-white/[0.03]\">\n <span className=\"font-mono text-2xl font-bold tracking-widest text-gray-900/80 dark:text-white/80\">\n {deviceCode}\n </span>\n </div>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60\" />\n 연결 중…\n </div>\n )}\n\n {loginOutput && !loginUrls.length && (\n <pre className=\"max-h-40 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45\">\n {loginOutput}\n </pre>\n )}\n\n <button\n onClick={onCancel}\n className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\"\n >\n 취소\n </button>\n </div>\n );\n }\n\n if (loginState === \"done\") {\n return (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">로그인 완료</p>\n <p className=\"text-xs text-gray-900/25 dark:text-white/25\">잠시 후 자동으로 이동합니다…</p>\n </div>\n );\n }\n\n // error\n return (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-red-500 dark:text-red-400\">\n <path fillRule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm text-red-500 dark:text-red-400\">로그인 중 문제가 발생했습니다.</p>\n {loginOutput && (\n <pre className=\"max-h-32 w-full max-w-sm overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40\">\n {loginOutput}\n </pre>\n )}\n <button\n onClick={onStart}\n className=\"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n 다시 시도\n </button>\n </div>\n );\n}\n\n// ─── API Key Panel ────────────────────────────────────────────────────────────\n\ninterface ApiKeyProps {\n loginState: CodexLoginState;\n configError: string;\n onSave: (key: string) => void;\n}\n\nfunction ApiKeyView({ loginState, configError, onSave }: ApiKeyProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const key = inputRef.current?.value.trim() ?? \"\";\n if (key) onSave(key);\n };\n\n if (loginState === \"done\") {\n return (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">인증 완료</p>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"flex w-full max-w-sm flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-gray-900/50 dark:text-white/50\">\n OpenAI API 키\n </label>\n <input\n ref={inputRef}\n type=\"password\"\n placeholder=\"sk-...\"\n autoFocus\n required\n className=\"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/30 focus:ring-2 focus:ring-gray-900/5 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-white/30 dark:focus:ring-white/5\"\n />\n <p className=\"text-[11px] text-gray-900/30 dark:text-white/30\">\n <a\n href=\"https://platform.openai.com/api-keys\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-900/55 underline-offset-2 hover:underline dark:text-white/55\"\n >\n OpenAI 플랫폼\n </a>\n 에서 API 키를 발급받을 수 있습니다.\n </p>\n {configError && (\n <p className=\"text-xs text-red-500 dark:text-red-400\">{configError}</p>\n )}\n </div>\n\n <button\n type=\"submit\"\n disabled={loginState === \"pending\"}\n className=\"flex items-center justify-center gap-2 rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 disabled:opacity-50 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n {loginState === \"pending\" && (\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white dark:border-gray-900/30 dark:border-t-gray-900\" />\n )}\n {loginState === \"pending\" ? \"저장 중…\" : \"저장\"}\n </button>\n </form>\n );\n}\n\n// ─── CodexLoginPanel ──────────────────────────────────────────────────────────\n\nexport type { CodexLoginMethod };\n\ninterface Props {\n loginMethod: CodexLoginMethod;\n onMethodChange: (m: CodexLoginMethod) => void;\n // device auth\n loginState: CodexLoginState;\n loginOutput: string;\n loginUrls: string[];\n deviceCode: string | null;\n onStartDeviceLogin: () => void;\n onCancelDeviceLogin: () => void;\n // api key\n apiKeyLoginState: CodexLoginState;\n configError: string;\n onSaveApiKey: (key: string) => void;\n}\n\nexport function CodexLoginPanel({\n loginMethod,\n onMethodChange,\n loginState,\n loginOutput,\n loginUrls,\n deviceCode,\n onStartDeviceLogin,\n onCancelDeviceLogin,\n apiKeyLoginState,\n configError,\n onSaveApiKey,\n}: Props) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n {/* Header */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]\">\n {OPENAI_LOGO}\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Codex CLI 인증</h2>\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n ChatGPT 계정으로 로그인하거나 API 키를 입력해 주세요.\n </p>\n </div>\n\n {/* Method tabs */}\n <div className=\"flex w-full max-w-sm rounded-xl border border-gray-900/[0.08] p-1 dark:border-white/[0.08]\">\n <MethodTab method=\"device\" selected={loginMethod} onSelect={onMethodChange} label=\"ChatGPT 로그인\" />\n <MethodTab method=\"apikey\" selected={loginMethod} onSelect={onMethodChange} label=\"API 키\" />\n </div>\n\n {/* Content */}\n {loginMethod === \"device\" ? (\n <DeviceAuthView\n loginState={loginState}\n loginOutput={loginOutput}\n loginUrls={loginUrls}\n deviceCode={deviceCode}\n onStart={onStartDeviceLogin}\n onCancel={onCancelDeviceLogin}\n />\n ) : (\n <ApiKeyView\n loginState={apiKeyLoginState}\n configError={configError}\n onSave={onSaveApiKey}\n />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useEffect } from \"react\";\n\nimport { useCodexAuth } from \"@/features/auth/hooks/useCodexAuth\";\nimport { CodexLoginPanel } from \"@/features/auth/ui/CodexLoginPanel\";\nimport { ThemeToggle } from \"@/lib/theme\";\n\nconst OPENAI_LOGO = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-7 w-7 text-gray-900/80 dark:text-white/80\" aria-hidden=\"true\">\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z\" />\n </svg>\n);\n\nfunction CheckingSkeleton() {\n return (\n <div className=\"flex h-screen flex-col bg-[#faf8f5] dark:bg-[#07090e]\">\n <div className=\"flex items-center gap-2 border-b border-gray-900/[0.07] px-4 py-3 dark:border-white/[0.07]\">\n <div className=\"h-3.5 w-3.5 rounded bg-gray-900/[0.07] dark:bg-white/[0.07]\" />\n <div className=\"h-[14px] w-20 rounded bg-gray-900/[0.07] dark:bg-white/[0.07]\" />\n </div>\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60\" />\n <span className=\"text-xs text-gray-900/20 dark:text-white/20\">인증 확인 중…</span>\n </div>\n </div>\n );\n}\n\nfunction NotInstalledView() {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" className=\"h-8 w-8 text-gray-900/30 dark:text-white/30\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Codex CLI가 설치되어 있지 않습니다</h2>\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n 먼저 CLI 도구를 설치해 주세요.\n </p>\n <code className=\"mt-1 rounded-lg border border-gray-900/[0.08] bg-gray-900/[0.03] px-4 py-2 font-mono text-sm text-gray-900/55 dark:border-white/[0.08] dark:bg-white/[0.03] dark:text-white/55\">\n jccli init\n </code>\n </div>\n </div>\n );\n}\n\nfunction AuthenticatedView() {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4\">\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n <div className=\"absolute left-1/2 top-1/2 h-[500px] w-[600px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-gray-900/[0.03] blur-[120px] dark:bg-white/[0.03]\" />\n </div>\n <div className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]\">\n {OPENAI_LOGO}\n </div>\n <div className=\"relative text-center\">\n <p className=\"font-semibold text-gray-900/75 dark:text-white/75\">Codex CLI</p>\n <p className=\"mt-1 text-sm text-gray-900/30 dark:text-white/30\">로그인되었습니다. 채팅 기능은 준비 중입니다.</p>\n </div>\n </div>\n );\n}\n\nexport default function CodexPage() {\n const {\n authState,\n loginMethod,\n setLoginMethod,\n loginState,\n loginOutput,\n loginUrls,\n deviceCode,\n startDeviceLogin,\n cancelDeviceLogin,\n apiKeyLoginState,\n configError,\n saveApiKey,\n checkAuth,\n } = useCodexAuth();\n\n useEffect(() => {\n if (loginState === \"done\" || apiKeyLoginState === \"done\") void checkAuth();\n }, [loginState, apiKeyLoginState, checkAuth]);\n\n const pageHeader = (\n <header className=\"flex items-center gap-2 border-b border-gray-900/[0.07] px-4 py-3 dark:border-white/[0.07]\">\n <Link href=\"/\" className=\"text-gray-900/30 transition-colors hover:text-gray-900/60 dark:text-white/30 dark:hover:text-white/60\">\n ←\n </Link>\n <span className=\"text-sm font-semibold text-gray-900/80 dark:text-white/80\">Codex CLI</span>\n <div className=\"ml-auto\">\n <ThemeToggle />\n </div>\n </header>\n );\n\n if (authState === \"checking\") return <CheckingSkeleton />;\n\n return (\n <div className=\"flex h-screen flex-col bg-[#faf8f5] text-gray-900 dark:bg-[#07090e] dark:text-white\">\n {pageHeader}\n {authState === \"not-installed\" && <NotInstalledView />}\n {authState === \"unauthenticated\" && (\n <CodexLoginPanel\n loginMethod={loginMethod}\n onMethodChange={setLoginMethod}\n loginState={loginState}\n loginOutput={loginOutput}\n loginUrls={loginUrls}\n deviceCode={deviceCode}\n onStartDeviceLogin={startDeviceLogin}\n onCancelDeviceLogin={cancelDeviceLogin}\n apiKeyLoginState={apiKeyLoginState}\n configError={configError}\n onSaveApiKey={saveApiKey}\n />\n )}\n {authState === \"authenticated\" && <AuthenticatedView />}\n </div>\n );\n}\n"],"names":["SERVER_URL","process","env","NEXT_PUBLIC_SERVER_URL","CLAUDE_WS_NAMESPACE","GEMINI_WS_NAMESPACE","CODEX_WS_NAMESPACE","URL_REGEX","CODE_REGEX","extractUrls","text","Array","from","Set","match","extractDeviceCode","useCodexAuth","authState","setAuthState","loginMethod","setLoginMethod","loginState","setLoginState","loginOutput","setLoginOutput","loginUrls","setLoginUrls","deviceCode","setDeviceCode","apiKeyLoginState","setApiKeyLoginState","configError","setConfigError","socketRef","outputRef","isLoginActiveRef","checkAuth","data","installed","loggedIn","startDeviceLogin","current","socket","transports","on","emit","code","success","disconnect","cancelDeviceLogin","saveApiKey","apiKey","resetApiKeyLogin","OPENAI_LOGO","viewBox","fill","className","d","CheckingSkeleton","NotInstalledView","stroke","strokeWidth","strokeLinecap","strokeLinejoin","AuthenticatedView","CodexPage","pageHeader","href","onMethodChange","onStartDeviceLogin","onCancelDeviceLogin","onSaveApiKey"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},26298,a=>{a.v("/_next/static/media/favicon.0x3dzn~oxb6tn.ico"+(globalThis.NEXT_CLIENT_ASSET_SUFFIX||""))},92214,a=>{"use strict";let b={src:a.i(26298).default,width:256,height:256};a.s(["default",0,b])},10270,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/apps/web/src/app/task/[id]/page.tsx <module evaluation> from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/app/task/[id]/page.tsx <module evaluation>","default")},5237,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/apps/web/src/app/task/[id]/page.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/app/task/[id]/page.tsx","default")},64588,a=>{"use strict";a.i(10270);var b=a.i(5237);a.n(b)},41314,a=>{a.n(a.i(64588))}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__0csq2e.._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/app/favicon.ico.mjs%20%28structured%20image%20object%29","../../../../../../apps/web/src/app/task/%5Bid%5D/page.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["import src from \"IMAGE\";\nexport default { src, width: 256, height: 256 }\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport default registerClientReference(\n function() { throw new Error(\"Attempted to call the default export of [project]/apps/web/src/app/task/[id]/page.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/app/task/[id]/page.tsx\",\n \"default\",\n);\n"],"names":["src","width","height","Error"],"mappings":"8SACe,CAAEA,IAAAA,AADjB,EAAA,CAAA,CAAA,OACiBA,OAAG,CAAEC,MAAO,IAAKC,OAAQ,GAAI,4ECC/B,CAAA,EADf,AACe,EADf,CAAA,CAAA,OACe,uBAAuB,AAAvB,EACX,WAAa,MAAM,AAAIC,MAAM,qSAAuS,EACpU,oEACA,+DAHW,CAAA,EADf,AACe,EADf,CAAA,CAAA,OACe,uBAAA,AAAuB,EAClC,WAAa,MAAM,AAAIA,MAAM,iRAAmR,EAChT,gDACA","ignoreList":[1]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module.exports=[24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},47077,28467,a=>{"use strict";let b=process.env.NEXT_PUBLIC_SERVER_URL??"";async function c(){let a=await fetch(`${b}/agents/claude/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function d(){let a=await fetch(`${b}/agents/claude/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function e(){let a=await fetch(`${b}/agents/gemini/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function f(a,c){let d=await fetch(`${b}/agents/gemini/auth/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:a,...c?{apiKey:c}:{}})});if(!d.ok)throw Error(`HTTP ${d.status}`)}async function g(){let a=await fetch(`${b}/agents/codex/auth/status`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function h(a){let c=await fetch(`${b}/agents/codex/auth/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:a})});if(!c.ok)throw Error(`HTTP ${c.status}`)}a.s(["CLAUDE_WS_NAMESPACE",0,"/agents/claude","CODEX_WS_NAMESPACE",0,"/agents/codex","GEMINI_WS_NAMESPACE",0,"/agents/gemini","SERVER_URL",0,b],47077),a.s(["configureCodexAuth",0,h,"configureGeminiAuth",0,f,"getAuthStatus",0,c,"getClaudeStatus",0,d,"getCodexAuthStatus",0,g,"getGeminiAuthStatus",0,e],28467)},81937,a=>{"use strict";var b=a.i(87924),c=a.i(72131);a.s(["Modal",0,function({open:a,onClose:d,title:e,children:f,maxWidth:g="max-w-lg",hideClose:h=!1,zIndex:i="z-50"}){let j=(0,c.useRef)(null);return((0,c.useEffect)(()=>{if(!a)return;let b=a=>{"Escape"===a.key&&d()};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[a,d]),(0,c.useEffect)(()=>(a?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[a]),a)?(0,b.jsxs)("div",{ref:j,className:`fixed inset-0 flex items-center justify-center bg-black/50 p-4 backdrop-blur-md dark:bg-black/70 ${i}`,onMouseDown:a=>{a.target===j.current&&d()},children:[(0,b.jsxs)("div",{className:["relative flex w-full flex-col rounded-2xl border border-gray-900/[0.08] bg-white dark:border-white/[0.08] dark:bg-[#0a0c10] shadow-[0_24px_80px_rgba(0,0,0,0.15)] dark:shadow-[0_24px_80px_rgba(0,0,0,0.7)]",g].join(" "),style:{animation:"modal-in 0.18s cubic-bezier(0.16,1,0.3,1) both"},children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-900/[0.06] px-5 py-4 dark:border-white/[0.06]",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-900/85 dark:text-white/85",children:e}),!h&&(0,b.jsx)("button",{onClick:d,className:"flex h-6 w-6 items-center justify-center rounded-md text-gray-900/25 transition-colors hover:bg-gray-900/[0.07] hover:text-gray-900/70 dark:text-white/25 dark:hover:bg-white/[0.07] dark:hover:text-white/70","aria-label":"닫기",children:(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-3.5 w-3.5",children:(0,b.jsx)("path",{d:"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z"})})})]}),(0,b.jsx)("div",{className:"overflow-y-auto px-5 py-5",style:{maxHeight:"calc(90vh - 64px)"},children:f})]}),(0,b.jsx)("style",{children:`
|
|
2
|
+
@keyframes modal-in {
|
|
3
|
+
from { opacity: 0; transform: scale(0.96) translateY(6px); }
|
|
4
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
5
|
+
}
|
|
6
|
+
`})]}):null}])},72404,24431,a=>{"use strict";var b=a.i(72131),c=a.i(83915),d=a.i(47077),e=a.i(28467);let f=/https?:\/\/[^\s\-"<>\\^`{|}~]+/g;a.s(["useClaudeAuth",0,function(){let[a,g]=(0,b.useState)("checking"),[h,i]=(0,b.useState)("idle"),[j,k]=(0,b.useState)(""),[l,m]=(0,b.useState)([]),n=(0,b.useRef)(null),o=(0,b.useRef)(""),p=(0,b.useRef)(!1),q=(0,b.useCallback)(async()=>{g("checking");try{let a=await (0,e.getAuthStatus)();g(a.loggedIn?"authenticated":"unauthenticated")}catch{g("unauthenticated")}},[]);(0,b.useEffect)(()=>{q()},[q]);let r=(0,b.useCallback)(()=>{if("pending"===h)return;o.current="",k(""),m([]),i("pending"),p.current=!0;let a=(0,c.io)(`${d.SERVER_URL}${d.CLAUDE_WS_NAMESPACE}`,{transports:["websocket"]});n.current=a,a.on("connect",()=>a.emit("auth:login:start")),a.on("auth:output",({text:a})=>{o.current+=a,k(o.current),m(Array.from(new Set(o.current.match(f)??[])))}),a.on("auth:done",({success:b})=>{p.current=!1,a.disconnect(),n.current=null,i(b?"done":"error"),b&&g("authenticated")}),a.on("disconnect",()=>{p.current&&(p.current=!1,i("error"))})},[h]);return{authState:a,loginState:h,loginOutput:j,loginUrls:l,startLogin:r,cancelLogin:(0,b.useCallback)(()=>{p.current=!1,n.current?.emit("auth:login:cancel"),n.current?.disconnect(),n.current=null,i("idle"),k(""),m([]),o.current=""},[]),checkAuth:q}}],72404);var g=a.i(87924);a.s(["LoginPanel",0,function({loginState:a,loginOutput:b,loginUrls:c,onStart:d,onCancel:e}){return(0,g.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-6 px-6",children:[(0,g.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,g.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-orange-500/[0.08] dark:border-white/[0.08]",children:(0,g.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",className:"h-8 w-8 text-orange-500 dark:text-orange-400/80",children:(0,g.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z"})})}),(0,g.jsx)("h2",{className:"text-xl font-semibold text-gray-900/90 dark:text-white/90",children:"Claude Code 로그인 필요"}),(0,g.jsx)("p",{className:"max-w-sm text-sm text-gray-900/40 dark:text-white/40",children:"Claude CLI를 사용하려면 Anthropic 계정으로 로그인해야 합니다."})]}),"idle"===a&&(0,g.jsx)("button",{onClick:d,className:"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500",children:"Claude Code 로그인"}),"pending"===a&&(0,g.jsxs)("div",{className:"flex w-full max-w-lg flex-col gap-4",children:[c.length>0&&(0,g.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,g.jsx)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:"브라우저에서 아래 링크를 열어 인증을 완료하세요:"}),c.map(a=>(0,g.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"break-all rounded-lg border border-orange-700/50 bg-orange-950/30 px-4 py-3 text-xs font-mono text-orange-700 transition-colors hover:border-orange-500 hover:text-orange-600 dark:text-orange-300 dark:hover:text-orange-200",children:a},a))]}),b&&(0,g.jsx)("pre",{className:"max-h-48 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45",children:b}),0===c.length&&(0,g.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30",children:[(0,g.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-orange-500 dark:border-white/[0.08]"}),"로그인 프로세스를 시작하는 중…"]}),(0,g.jsx)("button",{onClick:e,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"취소"})]}),"done"===a&&(0,g.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,g.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,g.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,g.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,g.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"로그인 완료"}),(0,g.jsx)("p",{className:"text-xs text-gray-900/25 dark:text-white/25",children:"잠시 후 자동으로 이동합니다…"})]}),"error"===a&&(0,g.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,g.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]",children:(0,g.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-red-500 dark:text-red-400",children:(0,g.jsx)("path",{fillRule:"evenodd",d:"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})})}),(0,g.jsx)("p",{className:"text-sm text-red-500 dark:text-red-400",children:"로그인 중 문제가 발생했습니다."}),b&&(0,g.jsx)("pre",{className:"max-h-32 w-full max-w-lg overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40",children:b}),(0,g.jsx)("button",{onClick:d,className:"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500",children:"다시 시도"})]})]})}],24431)},5207,10750,a=>{"use strict";var b=a.i(72131),c=a.i(83915),d=a.i(47077),e=a.i(28467);let f=/https?:\/\/[^\s\-"<>\\^`{|}~]+/g;a.s(["useGeminiAuth",0,function(){let[a,g]=(0,b.useState)("checking"),[h,i]=(0,b.useState)("idle"),[j,k]=(0,b.useState)(""),[l,m]=(0,b.useState)([]),[n,o]=(0,b.useState)(""),p=(0,b.useRef)(null),q=(0,b.useRef)(""),r=(0,b.useRef)(!1),s=(0,b.useCallback)(async()=>{g("checking");try{let a=await (0,e.getGeminiAuthStatus)();a.installed?g(a.loggedIn?"authenticated":"unauthenticated"):g("not-installed")}catch{g("unauthenticated")}},[]);(0,b.useEffect)(()=>{s()},[s]);let t=(0,b.useCallback)(async a=>{o(""),i("pending");try{await (0,e.configureGeminiAuth)("api-key",a),i("done"),g("authenticated")}catch{o("API 키 저장에 실패했습니다. 서버 연결을 확인하세요."),i("error")}},[]),u=(0,b.useCallback)(()=>{if("pending"===h)return;q.current="",k(""),m([]),i("pending"),r.current=!0;let a=(0,c.io)(`${d.SERVER_URL}${d.GEMINI_WS_NAMESPACE}`,{transports:["websocket"]});p.current=a,a.on("connect",()=>a.emit("auth:gca:start")),a.on("auth:output",({text:a})=>{q.current+=a,k(q.current),m(Array.from(new Set(q.current.match(f)??[])))}),a.on("auth:done",({success:b})=>{r.current=!1,a.disconnect(),p.current=null,i(b?"done":"error"),b&&g("authenticated")}),a.on("disconnect",()=>{r.current&&(r.current=!1,i("error"))})},[h]);return{authState:a,loginState:h,loginOutput:j,loginUrls:l,configError:n,saveApiKey:t,startGcaLogin:u,cancelLogin:(0,b.useCallback)(()=>{r.current=!1,p.current?.emit("auth:login:cancel"),p.current?.disconnect(),p.current=null,i("idle"),k(""),m([]),q.current=""},[]),resetLogin:(0,b.useCallback)(()=>{i("idle"),k(""),m([]),o(""),q.current=""},[]),checkAuth:s}}],5207);var g=a.i(87924);let h=(0,g.jsxs)("svg",{viewBox:"0 0 24 24",className:"h-5 w-5 shrink-0","aria-hidden":"true",children:[(0,g.jsx)("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z",fill:"#4285F4"}),(0,g.jsx)("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),(0,g.jsx)("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),(0,g.jsx)("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]});function i({onSelect:a}){return(0,g.jsxs)("div",{className:"flex w-full max-w-sm flex-col gap-3",children:[(0,g.jsxs)("button",{onClick:()=>a("api-key"),className:"flex items-center gap-3 rounded-xl border border-gray-900/[0.08] bg-gray-900/[0.02] px-5 py-4 text-left transition-all hover:border-blue-500/40 hover:bg-blue-500/[0.04] dark:border-white/[0.08] dark:bg-white/[0.02] dark:hover:border-blue-400/40 dark:hover:bg-blue-400/[0.04]",children:[(0,g.jsx)("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-blue-500/[0.10]",children:(0,g.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-4.5 w-4.5 text-blue-500 dark:text-blue-400",children:(0,g.jsx)("path",{fillRule:"evenodd",d:"M8 7a5 5 0 113.61 4.804l-1.903 1.903A1 1 0 019 14H8v1a1 1 0 01-1 1H6v1a1 1 0 01-1 1H3a1 1 0 01-1-1v-2a1 1 0 01.293-.707L8.196 8.39A5.002 5.002 0 018 7zm5-3a.75.75 0 000 1.5A1.5 1.5 0 0114.5 7 .75.75 0 0016 7a3 3 0 00-3-3z",clipRule:"evenodd"})})}),(0,g.jsxs)("div",{children:[(0,g.jsx)("p",{className:"text-sm font-semibold text-gray-900/85 dark:text-white/85",children:"API 키"}),(0,g.jsx)("p",{className:"text-xs text-gray-900/35 dark:text-white/35",children:"Google AI Studio에서 발급한 키 입력"})]})]}),(0,g.jsxs)("button",{onClick:()=>a("gca"),className:"flex items-center gap-3 rounded-xl border border-gray-900/[0.08] bg-gray-900/[0.02] px-5 py-4 text-left transition-all hover:border-blue-500/40 hover:bg-blue-500/[0.04] dark:border-white/[0.08] dark:bg-white/[0.02] dark:hover:border-blue-400/40 dark:hover:bg-blue-400/[0.04]",children:[(0,g.jsx)("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-blue-500/[0.10]",children:h}),(0,g.jsxs)("div",{children:[(0,g.jsx)("p",{className:"text-sm font-semibold text-gray-900/85 dark:text-white/85",children:"Google Cloud (GCA)"}),(0,g.jsx)("p",{className:"text-xs text-gray-900/35 dark:text-white/35",children:"gcloud CLI로 Application Default Credentials 설정"})]})]})]})}function j({loginState:a,configError:c,onSubmit:d,onBack:e}){let f=(0,b.useRef)(null);return"done"===a?(0,g.jsx)(l,{}):(0,g.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=f.current?.value.trim()??"";b&&d(b)},className:"flex w-full max-w-sm flex-col gap-4",children:[(0,g.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,g.jsx)("label",{className:"text-xs font-medium text-gray-900/50 dark:text-white/50",children:"Gemini API 키"}),(0,g.jsx)("input",{ref:f,type:"password",placeholder:"AIza...",autoFocus:!0,required:!0,className:"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-blue-500/50 focus:ring-2 focus:ring-blue-500/10 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/10"}),(0,g.jsxs)("p",{className:"text-[11px] text-gray-900/30 dark:text-white/30",children:[(0,g.jsx)("a",{href:"https://aistudio.google.com/app/apikey",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline dark:text-blue-400",children:"Google AI Studio"}),"에서 API 키를 발급받을 수 있습니다."]}),c&&(0,g.jsx)("p",{className:"text-xs text-red-500 dark:text-red-400",children:c})]}),(0,g.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,g.jsxs)("button",{type:"submit",disabled:"pending"===a,className:"flex items-center justify-center gap-2 rounded-xl bg-blue-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-blue-500 disabled:opacity-50",children:["pending"===a&&(0,g.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white"}),"pending"===a?"저장 중…":"저장"]}),(0,g.jsx)("button",{type:"button",onClick:e,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"← 뒤로"})]})]})}function k({loginState:a,loginOutput:b,loginUrls:c,onStart:d,onCancel:e,onBack:f}){return"done"===a?(0,g.jsx)(l,{}):(0,g.jsxs)("div",{className:"flex w-full max-w-lg flex-col gap-4",children:["idle"===a||"error"===a?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)("div",{className:"flex flex-col gap-2 rounded-xl border border-gray-900/[0.07] bg-gray-900/[0.025] p-4 dark:border-white/[0.07] dark:bg-white/[0.025]",children:[(0,g.jsx)("p",{className:"text-sm font-medium text-gray-900/70 dark:text-white/70",children:"gcloud CLI가 필요합니다"}),(0,g.jsxs)("p",{className:"text-xs text-gray-900/40 dark:text-white/40",children:["먼저"," ",(0,g.jsx)("a",{href:"https://cloud.google.com/sdk/docs/install",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline dark:text-blue-400",children:"Google Cloud SDK"}),"를 설치한 후 아래 버튼을 클릭하세요."]}),(0,g.jsx)("code",{className:"mt-1 rounded-md bg-gray-900/[0.04] px-2.5 py-1.5 font-mono text-xs text-gray-900/50 dark:bg-white/[0.04] dark:text-white/50",children:"gcloud auth application-default login"})]}),"error"===a&&b&&(0,g.jsx)("pre",{className:"max-h-32 overflow-y-auto rounded-lg border border-red-200 bg-red-50 px-4 py-3 font-mono text-xs whitespace-pre-wrap text-red-600 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-400",children:b}),(0,g.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,g.jsxs)("button",{onClick:d,className:"flex items-center justify-center gap-2 rounded-xl bg-blue-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-blue-500",children:[h,"Google 계정으로 로그인"]}),(0,g.jsx)("button",{onClick:f,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"← 뒤로"})]})]}):null,"pending"===a&&(0,g.jsxs)(g.Fragment,{children:[c.length>0&&(0,g.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,g.jsx)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:"브라우저에서 아래 링크를 열어 인증을 완료하세요:"}),c.map(a=>(0,g.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"break-all rounded-lg border border-blue-700/50 bg-blue-950/30 px-4 py-3 text-xs font-mono text-blue-700 transition-colors hover:border-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200",children:a},a))]}),b&&(0,g.jsx)("pre",{className:"max-h-48 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45",children:b}),0===c.length&&(0,g.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30",children:[(0,g.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-blue-500 dark:border-white/[0.08]"}),"gcloud 인증 진행 중…"]}),(0,g.jsx)("button",{onClick:e,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"취소"})]})]})}function l(){return(0,g.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,g.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,g.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,g.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,g.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"인증 완료"})]})}a.s(["GeminiLoginPanel",0,function({loginState:a,loginOutput:c,loginUrls:d,configError:e,onSaveApiKey:f,onStartGca:l,onCancel:m,onReset:n}){let[o,p]=(0,b.useState)(null),q=()=>{n(),p(null)};return(0,g.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-6 px-6",children:[(0,g.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,g.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-blue-500/[0.08] dark:border-white/[0.08]",children:h}),(0,g.jsx)("h2",{className:"text-xl font-semibold text-gray-900/90 dark:text-white/90",children:"Gemini CLI 인증"}),!o&&(0,g.jsx)("p",{className:"max-w-sm text-sm text-gray-900/40 dark:text-white/40",children:"사용할 인증 방식을 선택해 주세요."})]}),!o&&(0,g.jsx)(i,{onSelect:p}),"api-key"===o&&(0,g.jsx)(j,{loginState:a,configError:e,onSubmit:f,onBack:q}),"gca"===o&&(0,g.jsx)(k,{loginState:a,loginOutput:c,loginUrls:d,onStart:l,onCancel:m,onBack:q})]})}],10750)},70548,17273,a=>{"use strict";var b=a.i(72131),c=a.i(83915),d=a.i(47077),e=a.i(28467);let f=/https?:\/\/[\w./-]+/g,g=/(?<![A-Z0-9])([A-Z0-9]{4}-[A-Z0-9]{4,6})(?![A-Z0-9])/;a.s(["useCodexAuth",0,function(){let[a,h]=(0,b.useState)("checking"),[i,j]=(0,b.useState)("device"),[k,l]=(0,b.useState)("idle"),[m,n]=(0,b.useState)(""),[o,p]=(0,b.useState)([]),[q,r]=(0,b.useState)(null),[s,t]=(0,b.useState)("idle"),[u,v]=(0,b.useState)(""),w=(0,b.useRef)(null),x=(0,b.useRef)(""),y=(0,b.useRef)(!1),z=(0,b.useCallback)(async()=>{h("checking");try{let a=await (0,e.getCodexAuthStatus)();a.installed?h(a.loggedIn?"authenticated":"unauthenticated"):h("not-installed")}catch{h("unauthenticated")}},[]);(0,b.useEffect)(()=>{z()},[z]);let A=(0,b.useCallback)(()=>{if("pending"===k)return;x.current="",n(""),p([]),r(null),l("pending"),y.current=!0;let a=(0,c.io)(`${d.SERVER_URL}${d.CODEX_WS_NAMESPACE}`,{transports:["websocket"]});w.current=a,a.on("connect",()=>a.emit("auth:login:start")),a.on("auth:output",({text:a})=>{var b;x.current+=a,n(x.current),p(Array.from(new Set(x.current.match(f)??[])));let c=(b=x.current,b.match(g)?.[1]??null);c&&r(c)}),a.on("auth:done",({success:b})=>{y.current=!1,a.disconnect(),w.current=null,l(b?"done":"error"),b&&h("authenticated")}),a.on("disconnect",()=>{y.current&&(y.current=!1,l("error"))})},[k]),B=(0,b.useCallback)(()=>{y.current=!1,w.current?.emit("auth:login:cancel"),w.current?.disconnect(),w.current=null,l("idle"),n(""),p([]),r(null),x.current=""},[]);return{authState:a,loginMethod:i,setLoginMethod:j,loginState:k,loginOutput:m,loginUrls:o,deviceCode:q,startDeviceLogin:A,cancelDeviceLogin:B,apiKeyLoginState:s,configError:u,saveApiKey:(0,b.useCallback)(async a=>{v(""),t("pending");try{await (0,e.configureCodexAuth)(a),t("done"),h("authenticated")}catch{v("API 키 저장에 실패했습니다. 서버 연결을 확인하세요."),t("error")}},[]),resetApiKeyLogin:(0,b.useCallback)(()=>{t("idle"),v("")},[]),checkAuth:z}}],70548);var h=a.i(87924);let i=(0,h.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 shrink-0 text-gray-900/80 dark:text-white/80","aria-hidden":"true",children:(0,h.jsx)("path",{d:"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"})});function j({method:a,selected:b,onSelect:c,label:d}){return(0,h.jsx)("button",{type:"button",onClick:()=>c(a),className:["flex-1 rounded-lg px-4 py-2 text-xs font-medium transition-colors",b===a?"bg-gray-900/[0.07] text-gray-900/75 dark:bg-white/[0.07] dark:text-white/75":"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60"].join(" "),children:d})}function k({loginState:a,loginOutput:b,loginUrls:c,deviceCode:d,onStart:e,onCancel:f}){return"idle"===a?(0,h.jsx)("button",{onClick:e,className:"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:"ChatGPT로 로그인"}):"pending"===a?(0,h.jsxs)("div",{className:"flex w-full max-w-sm flex-col gap-4",children:[c.length>0?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,h.jsx)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:"1. 아래 링크를 브라우저에서 열어 로그인하세요"}),c.map(a=>(0,h.jsx)("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"break-all rounded-lg border border-emerald-700/40 bg-emerald-950/20 px-4 py-3 text-xs font-mono text-emerald-700 transition-colors hover:border-emerald-500 hover:text-emerald-600 dark:text-emerald-300 dark:hover:text-emerald-200",children:a},a))]}),d&&(0,h.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,h.jsxs)("p",{className:"text-xs font-medium text-gray-900/35 dark:text-white/35",children:["2. 이 일회용 코드를 입력하세요 ",(0,h.jsx)("span",{className:"text-gray-900/20 dark:text-white/20",children:"(15분 내 유효)"})]}),(0,h.jsx)("div",{className:"flex items-center justify-center rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] py-4 dark:border-white/[0.10] dark:bg-white/[0.03]",children:(0,h.jsx)("span",{className:"font-mono text-2xl font-bold tracking-widest text-gray-900/80 dark:text-white/80",children:d})})]})]}):(0,h.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30",children:[(0,h.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60"}),"연결 중…"]}),b&&!c.length&&(0,h.jsx)("pre",{className:"max-h-40 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45",children:b}),(0,h.jsx)("button",{onClick:f,className:"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50",children:"취소"})]}):"done"===a?(0,h.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"로그인 완료"}),(0,h.jsx)("p",{className:"text-xs text-gray-900/25 dark:text-white/25",children:"잠시 후 자동으로 이동합니다…"})]}):(0,h.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-red-500 dark:text-red-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm text-red-500 dark:text-red-400",children:"로그인 중 문제가 발생했습니다."}),b&&(0,h.jsx)("pre",{className:"max-h-32 w-full max-w-sm overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40",children:b}),(0,h.jsx)("button",{onClick:e,className:"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:"다시 시도"})]})}function l({loginState:a,configError:c,onSave:d}){let e=(0,b.useRef)(null);return"done"===a?(0,h.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,h.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,h.jsx)("svg",{viewBox:"0 0 20 20",fill:"currentColor",className:"h-6 w-6 text-emerald-500 dark:text-emerald-400",children:(0,h.jsx)("path",{fillRule:"evenodd",d:"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z",clipRule:"evenodd"})})}),(0,h.jsx)("p",{className:"text-sm font-medium text-emerald-600 dark:text-emerald-400",children:"인증 완료"})]}):(0,h.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=e.current?.value.trim()??"";b&&d(b)},className:"flex w-full max-w-sm flex-col gap-4",children:[(0,h.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,h.jsx)("label",{className:"text-xs font-medium text-gray-900/50 dark:text-white/50",children:"OpenAI API 키"}),(0,h.jsx)("input",{ref:e,type:"password",placeholder:"sk-...",autoFocus:!0,required:!0,className:"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/30 focus:ring-2 focus:ring-gray-900/5 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-white/30 dark:focus:ring-white/5"}),(0,h.jsxs)("p",{className:"text-[11px] text-gray-900/30 dark:text-white/30",children:[(0,h.jsx)("a",{href:"https://platform.openai.com/api-keys",target:"_blank",rel:"noopener noreferrer",className:"text-gray-900/55 underline-offset-2 hover:underline dark:text-white/55",children:"OpenAI 플랫폼"}),"에서 API 키를 발급받을 수 있습니다."]}),c&&(0,h.jsx)("p",{className:"text-xs text-red-500 dark:text-red-400",children:c})]}),(0,h.jsxs)("button",{type:"submit",disabled:"pending"===a,className:"flex items-center justify-center gap-2 rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 disabled:opacity-50 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100",children:["pending"===a&&(0,h.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white dark:border-gray-900/30 dark:border-t-gray-900"}),"pending"===a?"저장 중…":"저장"]})]})}a.s(["CodexLoginPanel",0,function({loginMethod:a,onMethodChange:b,loginState:c,loginOutput:d,loginUrls:e,deviceCode:f,onStartDeviceLogin:g,onCancelDeviceLogin:m,apiKeyLoginState:n,configError:o,onSaveApiKey:p}){return(0,h.jsxs)("div",{className:"flex flex-1 flex-col items-center justify-center gap-6 px-6",children:[(0,h.jsxs)("div",{className:"flex flex-col items-center gap-3 text-center",children:[(0,h.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]",children:i}),(0,h.jsx)("h2",{className:"text-xl font-semibold text-gray-900/90 dark:text-white/90",children:"Codex CLI 인증"}),(0,h.jsx)("p",{className:"max-w-sm text-sm text-gray-900/40 dark:text-white/40",children:"ChatGPT 계정으로 로그인하거나 API 키를 입력해 주세요."})]}),(0,h.jsxs)("div",{className:"flex w-full max-w-sm rounded-xl border border-gray-900/[0.08] p-1 dark:border-white/[0.08]",children:[(0,h.jsx)(j,{method:"device",selected:a,onSelect:b,label:"ChatGPT 로그인"}),(0,h.jsx)(j,{method:"apikey",selected:a,onSelect:b,label:"API 키"})]}),"device"===a?(0,h.jsx)(k,{loginState:c,loginOutput:d,loginUrls:e,deviceCode:f,onStart:g,onCancel:m}):(0,h.jsx)(l,{loginState:n,configError:o,onSave:p})]})}],17273)}];
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__0dgn1-d._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/lib/constants.ts","../../../../../../apps/web/src/features/auth/api/auth.api.ts","../../../../../../apps/web/src/components/ui/Modal.tsx","../../../../../../apps/web/src/features/auth/hooks/useClaudeAuth.ts","../../../../../../apps/web/src/features/auth/ui/LoginPanel.tsx","../../../../../../apps/web/src/features/auth/hooks/useGeminiAuth.ts","../../../../../../apps/web/src/features/auth/ui/GeminiLoginPanel.tsx","../../../../../../apps/web/src/features/auth/hooks/useCodexAuth.ts","../../../../../../apps/web/src/features/auth/ui/CodexLoginPanel.tsx"],"sourcesContent":["// 프로덕션(프리빌드 배포)에서는 프록시 뒤에서 same-origin으로 호출하고,\n// 로컬 개발에서는 별도 포트의 서버(3001)로 직접 호출한다.\nexport const SERVER_URL =\n process.env.NEXT_PUBLIC_SERVER_URL ??\n (process.env.NODE_ENV === \"production\" ? \"\" : \"http://localhost:3001\");\nexport const CLAUDE_WS_NAMESPACE = \"/agents/claude\";\nexport const GEMINI_WS_NAMESPACE = \"/agents/gemini\";\nexport const CODEX_WS_NAMESPACE = \"/agents/codex\";\n","import { SERVER_URL } from \"@/lib/constants\";\n\nexport interface AuthStatus {\n loggedIn: boolean;\n authMethod: string;\n apiProvider: string;\n email?: string;\n orgName?: string;\n subscriptionType?: string;\n}\n\nexport interface ClaudeStatus {\n version: string;\n auth: AuthStatus;\n activeSessions: number;\n platform: string;\n}\n\nexport interface GeminiAuthStatus {\n loggedIn: boolean;\n authMethod: string;\n installed: boolean;\n email?: string;\n}\n\nexport async function getAuthStatus(): Promise<AuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getClaudeStatus(): Promise<ClaudeStatus> {\n const res = await fetch(`${SERVER_URL}/agents/claude/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function getGeminiAuthStatus(): Promise<GeminiAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureGeminiAuth(\n authType: \"api-key\",\n apiKey: string,\n): Promise<void>;\nexport async function configureGeminiAuth(authType: \"gca\"): Promise<void>;\nexport async function configureGeminiAuth(\n authType: \"api-key\" | \"gca\",\n apiKey?: string,\n): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/gemini/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ authType, ...(apiKey ? { apiKey } : {}) }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n\n// ─── Codex ────────────────────────────────────────────────────────────────────\n\nexport interface CodexAuthStatus {\n installed: boolean;\n loggedIn: boolean;\n}\n\nexport async function getCodexAuthStatus(): Promise<CodexAuthStatus> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/status`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function configureCodexAuth(apiKey: string): Promise<void> {\n const res = await fetch(`${SERVER_URL}/agents/codex/auth/configure`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n maxWidth?: string;\n hideClose?: boolean;\n zIndex?: string;\n}\n\nexport function Modal({ open, onClose, title, children, maxWidth = \"max-w-lg\", hideClose = false, zIndex = \"z-50\" }: ModalProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, onClose]);\n\n useEffect(() => {\n if (open) document.body.style.overflow = \"hidden\";\n else document.body.style.overflow = \"\";\n return () => { document.body.style.overflow = \"\"; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div\n ref={overlayRef}\n className={`fixed inset-0 flex items-center justify-center bg-black/50 p-4 backdrop-blur-md dark:bg-black/70 ${zIndex}`}\n onMouseDown={(e) => { if (e.target === overlayRef.current) onClose(); }}\n >\n <div\n className={[\n \"relative flex w-full flex-col rounded-2xl\",\n \"border border-gray-900/[0.08] bg-white dark:border-white/[0.08] dark:bg-[#0a0c10]\",\n \"shadow-[0_24px_80px_rgba(0,0,0,0.15)] dark:shadow-[0_24px_80px_rgba(0,0,0,0.7)]\",\n maxWidth,\n ].join(\" \")}\n style={{ animation: \"modal-in 0.18s cubic-bezier(0.16,1,0.3,1) both\" }}\n >\n {/* 헤더 */}\n <div className=\"flex items-center justify-between border-b border-gray-900/[0.06] px-5 py-4 dark:border-white/[0.06]\">\n <h2 className=\"text-sm font-semibold text-gray-900/85 dark:text-white/85\">{title}</h2>\n {!hideClose && (\n <button\n onClick={onClose}\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-gray-900/25 transition-colors hover:bg-gray-900/[0.07] hover:text-gray-900/70 dark:text-white/25 dark:hover:bg-white/[0.07] dark:hover:text-white/70\"\n aria-label=\"닫기\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-3.5 w-3.5\">\n <path d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* 본문 */}\n <div className=\"overflow-y-auto px-5 py-5\" style={{ maxHeight: \"calc(90vh - 64px)\" }}>\n {children}\n </div>\n </div>\n\n <style>{`\n @keyframes modal-in {\n from { opacity: 0; transform: scale(0.96) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n `}</style>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { io, type Socket } from \"socket.io-client\";\n\nimport { CLAUDE_WS_NAMESPACE, SERVER_URL } from \"@/lib/constants\";\nimport { getAuthStatus } from \"../api/auth.api\";\n\nexport type AuthState = \"checking\" | \"authenticated\" | \"unauthenticated\";\nexport type LoginState = \"idle\" | \"pending\" | \"done\" | \"error\";\n\nconst URL_REGEX = /https?:\\/\\/[^\\s\\-\"<>\\\\^`{|}~]+/g;\n\nexport function extractUrls(text: string): string[] {\n return Array.from(new Set(text.match(URL_REGEX) ?? []));\n}\n\nexport function useClaudeAuth() {\n const [authState, setAuthState] = useState<AuthState>(\"checking\");\n const [loginState, setLoginState] = useState<LoginState>(\"idle\");\n const [loginOutput, setLoginOutput] = useState(\"\");\n const [loginUrls, setLoginUrls] = useState<string[]>([]);\n\n const socketRef = useRef<Socket | null>(null);\n const outputRef = useRef(\"\");\n const isLoginActiveRef = useRef(false);\n\n const checkAuth = useCallback(async () => {\n setAuthState(\"checking\");\n try {\n const data = await getAuthStatus();\n setAuthState(data.loggedIn ? \"authenticated\" : \"unauthenticated\");\n } catch {\n setAuthState(\"unauthenticated\");\n }\n }, []);\n\n useEffect(() => { void checkAuth(); }, [checkAuth]);\n\n const startLogin = useCallback(() => {\n if (loginState === \"pending\") return;\n\n outputRef.current = \"\";\n setLoginOutput(\"\");\n setLoginUrls([]);\n setLoginState(\"pending\");\n isLoginActiveRef.current = true;\n\n const socket = io(`${SERVER_URL}${CLAUDE_WS_NAMESPACE}`, { transports: [\"websocket\"] });\n socketRef.current = socket;\n\n socket.on(\"connect\", () => socket.emit(\"auth:login:start\"));\n\n socket.on(\"auth:output\", ({ text }: { text: string }) => {\n outputRef.current += text;\n setLoginOutput(outputRef.current);\n setLoginUrls(extractUrls(outputRef.current));\n });\n\n socket.on(\"auth:done\", ({ success }: { success: boolean }) => {\n isLoginActiveRef.current = false;\n socket.disconnect();\n socketRef.current = null;\n setLoginState(success ? \"done\" : \"error\");\n if (success) setAuthState(\"authenticated\");\n });\n\n socket.on(\"disconnect\", () => {\n if (isLoginActiveRef.current) {\n isLoginActiveRef.current = false;\n setLoginState(\"error\");\n }\n });\n }, [loginState]);\n\n const cancelLogin = useCallback(() => {\n isLoginActiveRef.current = false;\n socketRef.current?.emit(\"auth:login:cancel\");\n socketRef.current?.disconnect();\n socketRef.current = null;\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n outputRef.current = \"\";\n }, []);\n\n return { authState, loginState, loginOutput, loginUrls, startLogin, cancelLogin, checkAuth };\n}\n","\"use client\";\n\nimport type { LoginState } from \"../hooks/useClaudeAuth\";\n\ninterface LoginPanelProps {\n loginState: LoginState;\n loginOutput: string;\n loginUrls: string[];\n onStart: () => void;\n onCancel: () => void;\n}\n\nexport function LoginPanel({ loginState, loginOutput, loginUrls, onStart, onCancel }: LoginPanelProps) {\n const isPending = loginState === \"pending\";\n const isDone = loginState === \"done\";\n const isError = loginState === \"error\";\n\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-orange-500/[0.08] dark:border-white/[0.08]\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" className=\"h-8 w-8 text-orange-500 dark:text-orange-400/80\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\" />\n </svg>\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Claude Code 로그인 필요</h2>\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n Claude CLI를 사용하려면 Anthropic 계정으로 로그인해야 합니다.\n </p>\n </div>\n\n {loginState === \"idle\" && (\n <button\n onClick={onStart}\n className=\"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500\"\n >\n Claude Code 로그인\n </button>\n )}\n\n {isPending && (\n <div className=\"flex w-full max-w-lg flex-col gap-4\">\n {loginUrls.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">브라우저에서 아래 링크를 열어 인증을 완료하세요:</p>\n {loginUrls.map((url) => (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all rounded-lg border border-orange-700/50 bg-orange-950/30 px-4 py-3 text-xs font-mono text-orange-700 transition-colors hover:border-orange-500 hover:text-orange-600 dark:text-orange-300 dark:hover:text-orange-200\"\n >\n {url}\n </a>\n ))}\n </div>\n )}\n\n {loginOutput && (\n <pre className=\"max-h-48 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45\">\n {loginOutput}\n </pre>\n )}\n\n {loginUrls.length === 0 && (\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-orange-500 dark:border-white/[0.08]\" />\n 로그인 프로세스를 시작하는 중…\n </div>\n )}\n\n <button onClick={onCancel} className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\">\n 취소\n </button>\n </div>\n )}\n\n {isDone && (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">로그인 완료</p>\n <p className=\"text-xs text-gray-900/25 dark:text-white/25\">잠시 후 자동으로 이동합니다…</p>\n </div>\n )}\n\n {isError && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-red-500 dark:text-red-400\">\n <path fillRule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm text-red-500 dark:text-red-400\">로그인 중 문제가 발생했습니다.</p>\n {loginOutput && (\n <pre className=\"max-h-32 w-full max-w-lg overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40\">\n {loginOutput}\n </pre>\n )}\n <button\n onClick={onStart}\n className=\"rounded-xl bg-orange-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-orange-500\"\n >\n 다시 시도\n </button>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { io, type Socket } from \"socket.io-client\";\n\nimport { GEMINI_WS_NAMESPACE, SERVER_URL } from \"@/lib/constants\";\nimport { configureGeminiAuth, getGeminiAuthStatus } from \"../api/auth.api\";\n\nexport type GeminiAuthState = \"checking\" | \"authenticated\" | \"unauthenticated\" | \"not-installed\";\nexport type GeminiLoginState = \"idle\" | \"pending\" | \"done\" | \"error\";\nexport type GeminiAuthMethod = \"api-key\" | \"gca\";\n\nconst URL_REGEX = /https?:\\/\\/[^\\s\\-\"<>\\\\^`{|}~]+/g;\n\nfunction extractUrls(text: string): string[] {\n return Array.from(new Set(text.match(URL_REGEX) ?? []));\n}\n\nexport function useGeminiAuth() {\n const [authState, setAuthState] = useState<GeminiAuthState>(\"checking\");\n const [loginState, setLoginState] = useState<GeminiLoginState>(\"idle\");\n const [loginOutput, setLoginOutput] = useState(\"\");\n const [loginUrls, setLoginUrls] = useState<string[]>([]);\n const [configError, setConfigError] = useState(\"\");\n\n const socketRef = useRef<Socket | null>(null);\n const outputRef = useRef(\"\");\n const isLoginActiveRef = useRef(false);\n\n const checkAuth = useCallback(async () => {\n setAuthState(\"checking\");\n try {\n const data = await getGeminiAuthStatus();\n if (!data.installed) setAuthState(\"not-installed\");\n else setAuthState(data.loggedIn ? \"authenticated\" : \"unauthenticated\");\n } catch {\n setAuthState(\"unauthenticated\");\n }\n }, []);\n\n useEffect(() => { void checkAuth(); }, [checkAuth]);\n\n // ── API Key 방식 ────────────────────────────────────────────────────────────\n const saveApiKey = useCallback(async (apiKey: string) => {\n setConfigError(\"\");\n setLoginState(\"pending\");\n try {\n await configureGeminiAuth(\"api-key\", apiKey);\n setLoginState(\"done\");\n setAuthState(\"authenticated\");\n } catch {\n setConfigError(\"API 키 저장에 실패했습니다. 서버 연결을 확인하세요.\");\n setLoginState(\"error\");\n }\n }, []);\n\n // ── GCA 방식 (gcloud auth application-default login) ────────────────────────\n const startGcaLogin = useCallback(() => {\n if (loginState === \"pending\") return;\n\n outputRef.current = \"\";\n setLoginOutput(\"\");\n setLoginUrls([]);\n setLoginState(\"pending\");\n isLoginActiveRef.current = true;\n\n const socket = io(`${SERVER_URL}${GEMINI_WS_NAMESPACE}`, { transports: [\"websocket\"] });\n socketRef.current = socket;\n\n socket.on(\"connect\", () => socket.emit(\"auth:gca:start\"));\n\n socket.on(\"auth:output\", ({ text }: { text: string }) => {\n outputRef.current += text;\n setLoginOutput(outputRef.current);\n setLoginUrls(extractUrls(outputRef.current));\n });\n\n socket.on(\"auth:done\", ({ success }: { success: boolean }) => {\n isLoginActiveRef.current = false;\n socket.disconnect();\n socketRef.current = null;\n setLoginState(success ? \"done\" : \"error\");\n if (success) setAuthState(\"authenticated\");\n });\n\n socket.on(\"disconnect\", () => {\n if (isLoginActiveRef.current) {\n isLoginActiveRef.current = false;\n setLoginState(\"error\");\n }\n });\n }, [loginState]);\n\n const cancelLogin = useCallback(() => {\n isLoginActiveRef.current = false;\n socketRef.current?.emit(\"auth:login:cancel\");\n socketRef.current?.disconnect();\n socketRef.current = null;\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n outputRef.current = \"\";\n }, []);\n\n const resetLogin = useCallback(() => {\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n setConfigError(\"\");\n outputRef.current = \"\";\n }, []);\n\n return {\n authState,\n loginState,\n loginOutput,\n loginUrls,\n configError,\n saveApiKey,\n startGcaLogin,\n cancelLogin,\n resetLogin,\n checkAuth,\n };\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\nimport type { GeminiAuthMethod, GeminiLoginState } from \"../hooks/useGeminiAuth\";\n\ninterface GeminiLoginPanelProps {\n loginState: GeminiLoginState;\n loginOutput: string;\n loginUrls: string[];\n configError: string;\n onSaveApiKey: (key: string) => void;\n onStartGca: () => void;\n onCancel: () => void;\n onReset: () => void;\n}\n\nconst GOOGLE_LOGO = (\n <svg viewBox=\"0 0 24 24\" className=\"h-5 w-5 shrink-0\" aria-hidden=\"true\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n);\n\n// ─── Method Select ────────────────────────────────────────────────────────────\n\ninterface MethodSelectProps {\n onSelect: (method: GeminiAuthMethod) => void;\n}\n\nfunction MethodSelect({ onSelect }: MethodSelectProps) {\n return (\n <div className=\"flex w-full max-w-sm flex-col gap-3\">\n <button\n onClick={() => onSelect(\"api-key\")}\n className=\"flex items-center gap-3 rounded-xl border border-gray-900/[0.08] bg-gray-900/[0.02] px-5 py-4 text-left transition-all hover:border-blue-500/40 hover:bg-blue-500/[0.04] dark:border-white/[0.08] dark:bg-white/[0.02] dark:hover:border-blue-400/40 dark:hover:bg-blue-400/[0.04]\"\n >\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-blue-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-4.5 w-4.5 text-blue-500 dark:text-blue-400\">\n <path fillRule=\"evenodd\" d=\"M8 7a5 5 0 113.61 4.804l-1.903 1.903A1 1 0 019 14H8v1a1 1 0 01-1 1H6v1a1 1 0 01-1 1H3a1 1 0 01-1-1v-2a1 1 0 01.293-.707L8.196 8.39A5.002 5.002 0 018 7zm5-3a.75.75 0 000 1.5A1.5 1.5 0 0114.5 7 .75.75 0 0016 7a3 3 0 00-3-3z\" clipRule=\"evenodd\" />\n </svg>\n </span>\n <div>\n <p className=\"text-sm font-semibold text-gray-900/85 dark:text-white/85\">API 키</p>\n <p className=\"text-xs text-gray-900/35 dark:text-white/35\">Google AI Studio에서 발급한 키 입력</p>\n </div>\n </button>\n\n <button\n onClick={() => onSelect(\"gca\")}\n className=\"flex items-center gap-3 rounded-xl border border-gray-900/[0.08] bg-gray-900/[0.02] px-5 py-4 text-left transition-all hover:border-blue-500/40 hover:bg-blue-500/[0.04] dark:border-white/[0.08] dark:bg-white/[0.02] dark:hover:border-blue-400/40 dark:hover:bg-blue-400/[0.04]\"\n >\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-blue-500/[0.10]\">\n {GOOGLE_LOGO}\n </span>\n <div>\n <p className=\"text-sm font-semibold text-gray-900/85 dark:text-white/85\">Google Cloud (GCA)</p>\n <p className=\"text-xs text-gray-900/35 dark:text-white/35\">gcloud CLI로 Application Default Credentials 설정</p>\n </div>\n </button>\n </div>\n );\n}\n\n// ─── API Key Form ─────────────────────────────────────────────────────────────\n\ninterface ApiKeyFormProps {\n loginState: GeminiLoginState;\n configError: string;\n onSubmit: (key: string) => void;\n onBack: () => void;\n}\n\nfunction ApiKeyForm({ loginState, configError, onSubmit, onBack }: ApiKeyFormProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const key = inputRef.current?.value.trim() ?? \"\";\n if (key) onSubmit(key);\n };\n\n if (loginState === \"done\") return <SuccessView />;\n\n return (\n <form onSubmit={handleSubmit} className=\"flex w-full max-w-sm flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-gray-900/50 dark:text-white/50\">\n Gemini API 키\n </label>\n <input\n ref={inputRef}\n type=\"password\"\n placeholder=\"AIza...\"\n autoFocus\n required\n className=\"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-blue-500/50 focus:ring-2 focus:ring-blue-500/10 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/10\"\n />\n <p className=\"text-[11px] text-gray-900/30 dark:text-white/30\">\n <a\n href=\"https://aistudio.google.com/app/apikey\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-500 hover:underline dark:text-blue-400\"\n >\n Google AI Studio\n </a>\n 에서 API 키를 발급받을 수 있습니다.\n </p>\n {configError && (\n <p className=\"text-xs text-red-500 dark:text-red-400\">{configError}</p>\n )}\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <button\n type=\"submit\"\n disabled={loginState === \"pending\"}\n className=\"flex items-center justify-center gap-2 rounded-xl bg-blue-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-blue-500 disabled:opacity-50\"\n >\n {loginState === \"pending\" && (\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n )}\n {loginState === \"pending\" ? \"저장 중…\" : \"저장\"}\n </button>\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\"\n >\n ← 뒤로\n </button>\n </div>\n </form>\n );\n}\n\n// ─── GCA Form ─────────────────────────────────────────────────────────────────\n\ninterface GcaFormProps {\n loginState: GeminiLoginState;\n loginOutput: string;\n loginUrls: string[];\n onStart: () => void;\n onCancel: () => void;\n onBack: () => void;\n}\n\nfunction GcaForm({ loginState, loginOutput, loginUrls, onStart, onCancel, onBack }: GcaFormProps) {\n if (loginState === \"done\") return <SuccessView />;\n\n const isPending = loginState === \"pending\";\n\n return (\n <div className=\"flex w-full max-w-lg flex-col gap-4\">\n {loginState === \"idle\" || loginState === \"error\" ? (\n <>\n <div className=\"flex flex-col gap-2 rounded-xl border border-gray-900/[0.07] bg-gray-900/[0.025] p-4 dark:border-white/[0.07] dark:bg-white/[0.025]\">\n <p className=\"text-sm font-medium text-gray-900/70 dark:text-white/70\">\n gcloud CLI가 필요합니다\n </p>\n <p className=\"text-xs text-gray-900/40 dark:text-white/40\">\n 먼저{\" \"}\n <a\n href=\"https://cloud.google.com/sdk/docs/install\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-500 hover:underline dark:text-blue-400\"\n >\n Google Cloud SDK\n </a>\n 를 설치한 후 아래 버튼을 클릭하세요.\n </p>\n <code className=\"mt-1 rounded-md bg-gray-900/[0.04] px-2.5 py-1.5 font-mono text-xs text-gray-900/50 dark:bg-white/[0.04] dark:text-white/50\">\n gcloud auth application-default login\n </code>\n </div>\n\n {loginState === \"error\" && loginOutput && (\n <pre className=\"max-h-32 overflow-y-auto rounded-lg border border-red-200 bg-red-50 px-4 py-3 font-mono text-xs whitespace-pre-wrap text-red-600 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-400\">\n {loginOutput}\n </pre>\n )}\n\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={onStart}\n className=\"flex items-center justify-center gap-2 rounded-xl bg-blue-600 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-blue-500\"\n >\n {GOOGLE_LOGO}\n Google 계정으로 로그인\n </button>\n <button\n onClick={onBack}\n className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\"\n >\n ← 뒤로\n </button>\n </div>\n </>\n ) : null}\n\n {isPending && (\n <>\n {loginUrls.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">브라우저에서 아래 링크를 열어 인증을 완료하세요:</p>\n {loginUrls.map((url) => (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all rounded-lg border border-blue-700/50 bg-blue-950/30 px-4 py-3 text-xs font-mono text-blue-700 transition-colors hover:border-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200\"\n >\n {url}\n </a>\n ))}\n </div>\n )}\n {loginOutput && (\n <pre className=\"max-h-48 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45\">\n {loginOutput}\n </pre>\n )}\n {loginUrls.length === 0 && (\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-blue-500 dark:border-white/[0.08]\" />\n gcloud 인증 진행 중…\n </div>\n )}\n <button onClick={onCancel} className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\">\n 취소\n </button>\n </>\n )}\n </div>\n );\n}\n\n// ─── Success ──────────────────────────────────────────────────────────────────\n\nfunction SuccessView() {\n return (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">인증 완료</p>\n </div>\n );\n}\n\n// ─── Panel Root ───────────────────────────────────────────────────────────────\n\nexport function GeminiLoginPanel({\n loginState,\n loginOutput,\n loginUrls,\n configError,\n onSaveApiKey,\n onStartGca,\n onCancel,\n onReset,\n}: GeminiLoginPanelProps) {\n const [selectedMethod, setSelectedMethod] = useState<GeminiAuthMethod | null>(null);\n\n const handleBack = () => {\n onReset();\n setSelectedMethod(null);\n };\n\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n {/* Header */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-blue-500/[0.08] dark:border-white/[0.08]\">\n {GOOGLE_LOGO}\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Gemini CLI 인증</h2>\n {!selectedMethod && (\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n 사용할 인증 방식을 선택해 주세요.\n </p>\n )}\n </div>\n\n {/* Content */}\n {!selectedMethod && <MethodSelect onSelect={setSelectedMethod} />}\n\n {selectedMethod === \"api-key\" && (\n <ApiKeyForm\n loginState={loginState}\n configError={configError}\n onSubmit={onSaveApiKey}\n onBack={handleBack}\n />\n )}\n\n {selectedMethod === \"gca\" && (\n <GcaForm\n loginState={loginState}\n loginOutput={loginOutput}\n loginUrls={loginUrls}\n onStart={onStartGca}\n onCancel={onCancel}\n onBack={handleBack}\n />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { io, type Socket } from \"socket.io-client\";\n\nimport { CODEX_WS_NAMESPACE, SERVER_URL } from \"@/lib/constants\";\nimport { configureCodexAuth, getCodexAuthStatus } from \"../api/auth.api\";\n\nexport type CodexAuthState = \"checking\" | \"authenticated\" | \"unauthenticated\" | \"not-installed\";\nexport type CodexLoginState = \"idle\" | \"pending\" | \"done\" | \"error\";\nexport type CodexLoginMethod = \"device\" | \"apikey\";\n\nconst URL_REGEX = /https?:\\/\\/[\\w./-]+/g;\nconst CODE_REGEX = /(?<![A-Z0-9])([A-Z0-9]{4}-[A-Z0-9]{4,6})(?![A-Z0-9])/;\n\nexport function extractUrls(text: string): string[] {\n return Array.from(new Set(text.match(URL_REGEX) ?? []));\n}\n\nexport function extractDeviceCode(text: string): string | null {\n return text.match(CODE_REGEX)?.[1] ?? null;\n}\n\nexport function useCodexAuth() {\n const [authState, setAuthState] = useState<CodexAuthState>(\"checking\");\n const [loginMethod, setLoginMethod] = useState<CodexLoginMethod>(\"device\");\n\n // device auth state\n const [loginState, setLoginState] = useState<CodexLoginState>(\"idle\");\n const [loginOutput, setLoginOutput] = useState(\"\");\n const [loginUrls, setLoginUrls] = useState<string[]>([]);\n const [deviceCode, setDeviceCode] = useState<string | null>(null);\n\n // api key state\n const [apiKeyLoginState, setApiKeyLoginState] = useState<CodexLoginState>(\"idle\");\n const [configError, setConfigError] = useState(\"\");\n\n const socketRef = useRef<Socket | null>(null);\n const outputRef = useRef(\"\");\n const isLoginActiveRef = useRef(false);\n\n const checkAuth = useCallback(async () => {\n setAuthState(\"checking\");\n try {\n const data = await getCodexAuthStatus();\n if (!data.installed) setAuthState(\"not-installed\");\n else setAuthState(data.loggedIn ? \"authenticated\" : \"unauthenticated\");\n } catch {\n setAuthState(\"unauthenticated\");\n }\n }, []);\n\n useEffect(() => { void checkAuth(); }, [checkAuth]);\n\n // ── Device auth (WebSocket) ───────────────────────────────────────────\n\n const startDeviceLogin = useCallback(() => {\n if (loginState === \"pending\") return;\n\n outputRef.current = \"\";\n setLoginOutput(\"\");\n setLoginUrls([]);\n setDeviceCode(null);\n setLoginState(\"pending\");\n isLoginActiveRef.current = true;\n\n const socket = io(`${SERVER_URL}${CODEX_WS_NAMESPACE}`, { transports: [\"websocket\"] });\n socketRef.current = socket;\n\n socket.on(\"connect\", () => socket.emit(\"auth:login:start\"));\n\n socket.on(\"auth:output\", ({ text }: { text: string }) => {\n outputRef.current += text;\n setLoginOutput(outputRef.current);\n setLoginUrls(extractUrls(outputRef.current));\n const code = extractDeviceCode(outputRef.current);\n if (code) setDeviceCode(code);\n });\n\n socket.on(\"auth:done\", ({ success }: { success: boolean }) => {\n isLoginActiveRef.current = false;\n socket.disconnect();\n socketRef.current = null;\n setLoginState(success ? \"done\" : \"error\");\n if (success) setAuthState(\"authenticated\");\n });\n\n socket.on(\"disconnect\", () => {\n if (isLoginActiveRef.current) {\n isLoginActiveRef.current = false;\n setLoginState(\"error\");\n }\n });\n }, [loginState]);\n\n const cancelDeviceLogin = useCallback(() => {\n isLoginActiveRef.current = false;\n socketRef.current?.emit(\"auth:login:cancel\");\n socketRef.current?.disconnect();\n socketRef.current = null;\n setLoginState(\"idle\");\n setLoginOutput(\"\");\n setLoginUrls([]);\n setDeviceCode(null);\n outputRef.current = \"\";\n }, []);\n\n // ── API key ───────────────────────────────────────────────────────────\n\n const saveApiKey = useCallback(async (apiKey: string) => {\n setConfigError(\"\");\n setApiKeyLoginState(\"pending\");\n try {\n await configureCodexAuth(apiKey);\n setApiKeyLoginState(\"done\");\n setAuthState(\"authenticated\");\n } catch {\n setConfigError(\"API 키 저장에 실패했습니다. 서버 연결을 확인하세요.\");\n setApiKeyLoginState(\"error\");\n }\n }, []);\n\n const resetApiKeyLogin = useCallback(() => {\n setApiKeyLoginState(\"idle\");\n setConfigError(\"\");\n }, []);\n\n return {\n authState,\n loginMethod,\n setLoginMethod,\n\n // device auth\n loginState,\n loginOutput,\n loginUrls,\n deviceCode,\n startDeviceLogin,\n cancelDeviceLogin,\n\n // api key\n apiKeyLoginState,\n configError,\n saveApiKey,\n resetApiKeyLogin,\n\n checkAuth,\n };\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\n\nimport type { CodexLoginMethod, CodexLoginState } from \"../hooks/useCodexAuth\";\n\nconst OPENAI_LOGO = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 shrink-0 text-gray-900/80 dark:text-white/80\" aria-hidden=\"true\">\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z\" />\n </svg>\n);\n\n// ─── Method Tab ───────────────────────────────────────────────────────────────\n\ninterface TabProps {\n method: CodexLoginMethod;\n selected: CodexLoginMethod;\n onSelect: (m: CodexLoginMethod) => void;\n label: string;\n}\n\nfunction MethodTab({ method, selected, onSelect, label }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(method)}\n className={[\n \"flex-1 rounded-lg px-4 py-2 text-xs font-medium transition-colors\",\n selected === method\n ? \"bg-gray-900/[0.07] text-gray-900/75 dark:bg-white/[0.07] dark:text-white/75\"\n : \"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60\",\n ].join(\" \")}\n >\n {label}\n </button>\n );\n}\n\n// ─── Device Auth Panel ────────────────────────────────────────────────────────\n\ninterface DeviceAuthProps {\n loginState: CodexLoginState;\n loginOutput: string;\n loginUrls: string[];\n deviceCode: string | null;\n onStart: () => void;\n onCancel: () => void;\n}\n\nfunction DeviceAuthView({ loginState, loginOutput, loginUrls, deviceCode, onStart, onCancel }: DeviceAuthProps) {\n if (loginState === \"idle\") {\n return (\n <button\n onClick={onStart}\n className=\"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n ChatGPT로 로그인\n </button>\n );\n }\n\n if (loginState === \"pending\") {\n return (\n <div className=\"flex w-full max-w-sm flex-col gap-4\">\n {loginUrls.length > 0 ? (\n <>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">\n 1. 아래 링크를 브라우저에서 열어 로그인하세요\n </p>\n {loginUrls.map((url) => (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all rounded-lg border border-emerald-700/40 bg-emerald-950/20 px-4 py-3 text-xs font-mono text-emerald-700 transition-colors hover:border-emerald-500 hover:text-emerald-600 dark:text-emerald-300 dark:hover:text-emerald-200\"\n >\n {url}\n </a>\n ))}\n </div>\n {deviceCode && (\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"text-xs font-medium text-gray-900/35 dark:text-white/35\">\n 2. 이 일회용 코드를 입력하세요 <span className=\"text-gray-900/20 dark:text-white/20\">(15분 내 유효)</span>\n </p>\n <div className=\"flex items-center justify-center rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] py-4 dark:border-white/[0.10] dark:bg-white/[0.03]\">\n <span className=\"font-mono text-2xl font-bold tracking-widest text-gray-900/80 dark:text-white/80\">\n {deviceCode}\n </span>\n </div>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-900/30 dark:text-white/30\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-gray-900/[0.08] border-t-gray-900/60 dark:border-white/[0.08] dark:border-t-white/60\" />\n 연결 중…\n </div>\n )}\n\n {loginOutput && !loginUrls.length && (\n <pre className=\"max-h-40 overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs leading-relaxed whitespace-pre-wrap text-gray-900/45 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/45\">\n {loginOutput}\n </pre>\n )}\n\n <button\n onClick={onCancel}\n className=\"text-xs text-gray-900/25 transition-colors hover:text-gray-900/50 dark:text-white/25 dark:hover:text-white/50\"\n >\n 취소\n </button>\n </div>\n );\n }\n\n if (loginState === \"done\") {\n return (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">로그인 완료</p>\n <p className=\"text-xs text-gray-900/25 dark:text-white/25\">잠시 후 자동으로 이동합니다…</p>\n </div>\n );\n }\n\n // error\n return (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-red-500 dark:text-red-400\">\n <path fillRule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm text-red-500 dark:text-red-400\">로그인 중 문제가 발생했습니다.</p>\n {loginOutput && (\n <pre className=\"max-h-32 w-full max-w-sm overflow-y-auto rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.02] px-4 py-3 font-mono text-xs whitespace-pre-wrap text-gray-900/40 dark:border-white/[0.07] dark:bg-white/[0.02] dark:text-white/40\">\n {loginOutput}\n </pre>\n )}\n <button\n onClick={onStart}\n className=\"rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n 다시 시도\n </button>\n </div>\n );\n}\n\n// ─── API Key Panel ────────────────────────────────────────────────────────────\n\ninterface ApiKeyProps {\n loginState: CodexLoginState;\n configError: string;\n onSave: (key: string) => void;\n}\n\nfunction ApiKeyView({ loginState, configError, onSave }: ApiKeyProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const key = inputRef.current?.value.trim() ?? \"\";\n if (key) onSave(key);\n };\n\n if (loginState === \"done\") {\n return (\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-6 w-6 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <p className=\"text-sm font-medium text-emerald-600 dark:text-emerald-400\">인증 완료</p>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"flex w-full max-w-sm flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-gray-900/50 dark:text-white/50\">\n OpenAI API 키\n </label>\n <input\n ref={inputRef}\n type=\"password\"\n placeholder=\"sk-...\"\n autoFocus\n required\n className=\"rounded-lg border border-gray-900/[0.10] bg-gray-900/[0.03] px-3.5 py-2.5 font-mono text-sm text-gray-900/85 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/30 focus:ring-2 focus:ring-gray-900/5 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/85 dark:placeholder-white/20 dark:focus:border-white/30 dark:focus:ring-white/5\"\n />\n <p className=\"text-[11px] text-gray-900/30 dark:text-white/30\">\n <a\n href=\"https://platform.openai.com/api-keys\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-900/55 underline-offset-2 hover:underline dark:text-white/55\"\n >\n OpenAI 플랫폼\n </a>\n 에서 API 키를 발급받을 수 있습니다.\n </p>\n {configError && (\n <p className=\"text-xs text-red-500 dark:text-red-400\">{configError}</p>\n )}\n </div>\n\n <button\n type=\"submit\"\n disabled={loginState === \"pending\"}\n className=\"flex items-center justify-center gap-2 rounded-xl bg-gray-900 px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gray-800 disabled:opacity-50 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100\"\n >\n {loginState === \"pending\" && (\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white dark:border-gray-900/30 dark:border-t-gray-900\" />\n )}\n {loginState === \"pending\" ? \"저장 중…\" : \"저장\"}\n </button>\n </form>\n );\n}\n\n// ─── CodexLoginPanel ──────────────────────────────────────────────────────────\n\nexport type { CodexLoginMethod };\n\ninterface Props {\n loginMethod: CodexLoginMethod;\n onMethodChange: (m: CodexLoginMethod) => void;\n // device auth\n loginState: CodexLoginState;\n loginOutput: string;\n loginUrls: string[];\n deviceCode: string | null;\n onStartDeviceLogin: () => void;\n onCancelDeviceLogin: () => void;\n // api key\n apiKeyLoginState: CodexLoginState;\n configError: string;\n onSaveApiKey: (key: string) => void;\n}\n\nexport function CodexLoginPanel({\n loginMethod,\n onMethodChange,\n loginState,\n loginOutput,\n loginUrls,\n deviceCode,\n onStartDeviceLogin,\n onCancelDeviceLogin,\n apiKeyLoginState,\n configError,\n onSaveApiKey,\n}: Props) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-6 px-6\">\n {/* Header */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.04] dark:border-white/[0.08] dark:bg-white/[0.04]\">\n {OPENAI_LOGO}\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900/90 dark:text-white/90\">Codex CLI 인증</h2>\n <p className=\"max-w-sm text-sm text-gray-900/40 dark:text-white/40\">\n ChatGPT 계정으로 로그인하거나 API 키를 입력해 주세요.\n </p>\n </div>\n\n {/* Method tabs */}\n <div className=\"flex w-full max-w-sm rounded-xl border border-gray-900/[0.08] p-1 dark:border-white/[0.08]\">\n <MethodTab method=\"device\" selected={loginMethod} onSelect={onMethodChange} label=\"ChatGPT 로그인\" />\n <MethodTab method=\"apikey\" selected={loginMethod} onSelect={onMethodChange} label=\"API 키\" />\n </div>\n\n {/* Content */}\n {loginMethod === \"device\" ? (\n <DeviceAuthView\n loginState={loginState}\n loginOutput={loginOutput}\n loginUrls={loginUrls}\n deviceCode={deviceCode}\n onStart={onStartDeviceLogin}\n onCancel={onCancelDeviceLogin}\n />\n ) : (\n <ApiKeyView\n loginState={apiKeyLoginState}\n configError={configError}\n onSave={onSaveApiKey}\n />\n )}\n </div>\n );\n}\n"],"names":["SERVER_URL","process","env","NEXT_PUBLIC_SERVER_URL","CLAUDE_WS_NAMESPACE","GEMINI_WS_NAMESPACE","CODEX_WS_NAMESPACE","Modal","open","onClose","title","children","maxWidth","hideClose","zIndex","overlayRef","handler","e","key","window","addEventListener","removeEventListener","document","body","style","overflow","ref","className","onMouseDown","target","current","join","animation","onClick","viewBox","fill","d","maxHeight","URL_REGEX","extractUrls","text","Array","from","Set","match","useClaudeAuth","authState","setAuthState","loginState","setLoginState","loginOutput","setLoginOutput","loginUrls","setLoginUrls","socketRef","outputRef","isLoginActiveRef","checkAuth","data","loggedIn","startLogin","socket","transports","on","emit","success","disconnect","cancelLogin","useGeminiAuth","configError","setConfigError","installed","saveApiKey","apiKey","startGcaLogin","resetLogin","CODE_REGEX","extractDeviceCode","useCodexAuth","loginMethod","setLoginMethod","deviceCode","setDeviceCode","apiKeyLoginState","setApiKeyLoginState","startDeviceLogin","code","cancelDeviceLogin","resetApiKeyLogin"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[89578,a=>{a.v({className:"geist_a71539c9-module__T19VSG__className",variable:"geist_a71539c9-module__T19VSG__variable"})},35214,a=>{a.v({className:"geist_mono_8d43a2aa-module__8Li5zG__className",variable:"geist_mono_8d43a2aa-module__8Li5zG__variable"})},1012,a=>{"use strict";a.s(["ThemeProvider",()=>c,"ThemeToggle",()=>d,"useTheme",()=>e]);var b=a.i(11857);let c=(0,b.registerClientReference)(function(){throw Error("Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx <module evaluation>","ThemeProvider"),d=(0,b.registerClientReference)(function(){throw Error("Attempted to call ThemeToggle() from the server but ThemeToggle is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx <module evaluation>","ThemeToggle"),e=(0,b.registerClientReference)(function(){throw Error("Attempted to call useTheme() from the server but useTheme is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx <module evaluation>","useTheme")},82374,a=>{"use strict";a.s(["ThemeProvider",()=>c,"ThemeToggle",()=>d,"useTheme",()=>e]);var b=a.i(11857);let c=(0,b.registerClientReference)(function(){throw Error("Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx","ThemeProvider"),d=(0,b.registerClientReference)(function(){throw Error("Attempted to call ThemeToggle() from the server but ThemeToggle is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx","ThemeToggle"),e=(0,b.registerClientReference)(function(){throw Error("Attempted to call useTheme() from the server but useTheme is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/theme.tsx","useTheme")},39720,a=>{"use strict";a.i(1012);var b=a.i(82374);a.n(b)},56915,a=>{"use strict";a.s(["ToastProvider",()=>c,"useToast",()=>d]);var b=a.i(11857);let c=(0,b.registerClientReference)(function(){throw Error("Attempted to call ToastProvider() from the server but ToastProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/toast.tsx <module evaluation>","ToastProvider"),d=(0,b.registerClientReference)(function(){throw Error("Attempted to call useToast() from the server but useToast is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/toast.tsx <module evaluation>","useToast")},49073,a=>{"use strict";a.s(["ToastProvider",()=>c,"useToast",()=>d]);var b=a.i(11857);let c=(0,b.registerClientReference)(function(){throw Error("Attempted to call ToastProvider() from the server but ToastProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/toast.tsx","ToastProvider"),d=(0,b.registerClientReference)(function(){throw Error("Attempted to call useToast() from the server but useToast is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/web/src/lib/toast.tsx","useToast")},24245,a=>{"use strict";a.i(56915);var b=a.i(49073);a.n(b)},77930,a=>{"use strict";var b=a.i(7997),c=a.i(89578);let d={className:c.default.className,style:{fontFamily:"'Geist', 'Geist Fallback'",fontStyle:"normal"}};null!=c.default.variable&&(d.variable=c.default.variable);var e=a.i(35214);let f={className:e.default.className,style:{fontFamily:"'Geist Mono', 'Geist Mono Fallback'",fontStyle:"normal"}};null!=e.default.variable&&(f.variable=e.default.variable);var g=a.i(39720),h=a.i(24245);a.s(["default",0,function({children:a}){return(0,b.jsx)("html",{lang:"en",suppressHydrationWarning:!0,className:`${d.variable} ${f.variable} h-full antialiased`,children:(0,b.jsx)("body",{className:"flex min-h-full flex-col",children:(0,b.jsx)(g.ThemeProvider,{children:(0,b.jsx)(h.ToastProvider,{children:a})})})})},"metadata",0,{title:"ji-cli",description:"하나의 플랫폼에서 모든 AI CLI를 제어합니다"}],77930)},34005,a=>{a.n(a.i(77930))}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__0g.z8rw._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[next]/internal/font/google/geist_a71539c9.module.css [app-rsc] (css module)","turbopack:///[next]/internal/font/google/geist_mono_8d43a2aa.module.css [app-rsc] (css module)","../../../../../../apps/web/src/lib/theme.tsx/__nextjs-internal-proxy.mjs","../../../../../../apps/web/src/lib/toast.tsx/__nextjs-internal-proxy.mjs","turbopack:///[next]/internal/font/google/geist_a71539c9.js","turbopack:///[next]/internal/font/google/geist_mono_8d43a2aa.js","../../../../../../apps/web/src/app/layout.tsx"],"sourcesContent":["__turbopack_context__.v({\n \"className\": \"geist_a71539c9-module__T19VSG__className\",\n \"variable\": \"geist_a71539c9-module__T19VSG__variable\",\n});\n","__turbopack_context__.v({\n \"className\": \"geist_mono_8d43a2aa-module__8Li5zG__className\",\n \"variable\": \"geist_mono_8d43a2aa-module__8Li5zG__variable\",\n});\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const ThemeProvider = registerClientReference(\n function() { throw new Error(\"Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/lib/theme.tsx\",\n \"ThemeProvider\",\n);\nexport const ThemeToggle = registerClientReference(\n function() { throw new Error(\"Attempted to call ThemeToggle() from the server but ThemeToggle is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/lib/theme.tsx\",\n \"ThemeToggle\",\n);\nexport const useTheme = registerClientReference(\n function() { throw new Error(\"Attempted to call useTheme() from the server but useTheme is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/lib/theme.tsx\",\n \"useTheme\",\n);\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const ToastProvider = registerClientReference(\n function() { throw new Error(\"Attempted to call ToastProvider() from the server but ToastProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/lib/toast.tsx\",\n \"ToastProvider\",\n);\nexport const useToast = registerClientReference(\n function() { throw new Error(\"Attempted to call useToast() from the server but useToast is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/apps/web/src/lib/toast.tsx\",\n \"useToast\",\n);\n","import cssModule from \"@vercel/turbopack-next/internal/font/google/cssmodule.module.css?{%22path%22:%22layout.tsx%22,%22import%22:%22Geist%22,%22arguments%22:[{%22variable%22:%22--font-geist-sans%22,%22subsets%22:[%22latin%22]}],%22variableName%22:%22geistSans%22}\";\nconst fontData = {\n className: cssModule.className,\n style: {\n fontFamily: \"'Geist', 'Geist Fallback'\",\n fontStyle: \"normal\",\n\n },\n};\n\nif (cssModule.variable != null) {\n fontData.variable = cssModule.variable;\n}\n\nexport default fontData;\n","import cssModule from \"@vercel/turbopack-next/internal/font/google/cssmodule.module.css?{%22path%22:%22layout.tsx%22,%22import%22:%22Geist_Mono%22,%22arguments%22:[{%22variable%22:%22--font-geist-mono%22,%22subsets%22:[%22latin%22]}],%22variableName%22:%22geistMono%22}\";\nconst fontData = {\n className: cssModule.className,\n style: {\n fontFamily: \"'Geist Mono', 'Geist Mono Fallback'\",\n fontStyle: \"normal\",\n\n },\n};\n\nif (cssModule.variable != null) {\n fontData.variable = cssModule.variable;\n}\n\nexport default fontData;\n","import type { Metadata } from \"next\";\nimport { Geist, Geist_Mono } from \"next/font/google\";\nimport { ThemeProvider } from \"@/lib/theme\";\nimport { ToastProvider } from \"@/lib/toast\";\nimport \"./globals.css\";\n\nconst geistSans = Geist({\n variable: \"--font-geist-sans\",\n subsets: [\"latin\"],\n});\n\nconst geistMono = Geist_Mono({\n variable: \"--font-geist-mono\",\n subsets: [\"latin\"],\n});\n\nexport const metadata: Metadata = {\n title: \"ji-cli\",\n description: \"하나의 플랫폼에서 모든 AI CLI를 제어합니다\",\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html\n lang=\"en\"\n suppressHydrationWarning\n className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}\n >\n <body className=\"flex min-h-full flex-col\">\n <ThemeProvider>\n <ToastProvider>{children}</ToastProvider>\n </ThemeProvider>\n </body>\n </html>\n );\n}\n"],"names":["ThemeProvider","Error","ThemeToggle","useTheme","ToastProvider","useToast","fontData","className","style","fontFamily","fontStyle","variable"],"mappings":"0BAAA,EAAA,CAAA,CAAA,CACA,UAAA,2CACA,SAAA,yCACA,cCHA,EAAA,CAAA,CAAA,CACA,UAAA,gDACA,SAAA,8CACA,4FCFA,IAAA,EAAA,EAAA,CAAA,CAAA,OACO,IAAMA,EAAgB,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAChD,WAAa,MAAM,AAAIC,MAAM,wOAA0O,EACvQ,2DACA,iBAESC,EAAc,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAC9C,WAAa,MAAM,AAAID,MAAM,oOAAsO,EACnQ,2DACA,eAESE,EAAW,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAC3C,WAAa,MAAM,AAAIF,MAAM,8NAAgO,EAC7P,2DACA,sGAdJ,IAAA,EAAA,EAAA,CAAA,CAAA,OACO,IAAMD,EAAgB,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAChD,WAAa,MAAM,AAAIC,MAAM,wOAA0O,EACvQ,uCACA,iBAESC,EAAc,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAC9C,WAAa,MAAM,AAAID,MAAM,oOAAsO,EACnQ,uCACA,eAESE,EAAW,CAAA,EAAA,EAAA,uBAAuB,AAAvB,EACpB,WAAa,MAAM,AAAIF,MAAM,8NAAgO,EAC7P,uCACA,4ICdJ,IAAA,EAAA,EAAA,CAAA,CAAA,OACO,IAAMG,EAAgB,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAChD,WAAa,MAAM,AAAIH,MAAM,wOAA0O,EACvQ,2DACA,iBAESI,EAAW,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAC3C,WAAa,MAAM,AAAIJ,MAAM,8NAAgO,EAC7P,2DACA,kFATJ,IAAA,EAAA,EAAA,CAAA,CAAA,OACO,IAAMG,EAAgB,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAChD,WAAa,MAAM,AAAIH,MAAM,wOAA0O,EACvQ,uCACA,iBAESI,EAAW,CAAA,EAAA,EAAA,uBAAA,AAAuB,EAC3C,WAAa,MAAM,AAAIJ,MAAM,8NAAgO,EAC7P,uCACA,+GCVJ,EAAA,EAAA,CAAA,CAAA,OACA,IAAMK,EAAW,CACbC,UAAW,EAAA,OAAS,CAACA,SAAS,CAC9BC,MAAO,CACHC,WAAY,4BACZC,UAAW,QAEf,CACJ,CAE0B,MAAM,CAA5B,EAAA,OAAS,CAACC,QAAQ,GAClBL,EAASK,QAAQ,CAAG,EAAA,OAAS,CAACA,QAAAA,AAAQ,ECX1C,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,IAAM,EAAW,CACb,UAAW,EAAA,OAAS,CAAC,SAAS,CAC9B,MAAO,CACH,WAAY,sCACZ,UAAW,QAEf,CACJ,CAE0B,MAAMA,CAA5B,EAAA,OAAS,CAAC,QAAQ,GAClB,EAAS,QAAQ,CAAG,EAAA,OAAS,CAAC,QAAA,AAAQ,ECT1C,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,wBAkBe,SAAS,AAAW,UACjC,CAAQ,CAGR,EACA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,KAAK,KACL,wBAAwB,CAAA,CAAA,EACxB,UAAW,CAAA,EFhBFL,AEgBK,EAAU,QAAQ,CAAC,CAAC,EDhBzB,ACgB2B,EAAU,QAAQ,CAAC,mBAAmB,CAAC,UAE3E,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oCACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,UACZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,UAAE,SAK1B,eAvBkC,CAChC,MAAO,SACP,YAAa,4BACf","ignoreList":[0,1,2,3,4,5]}
|