@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,8 @@
|
|
|
1
|
+
module.exports=[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}])}];
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=apps_web_src_0s6cw51._.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"],"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"],"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"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[5833,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(82885);function e({className:a}){return(0,b.jsxs)("div",{className:`relative ${a??""}`,children:[(0,b.jsx)("div",{className:"flex h-12 w-64 items-center justify-center rounded-[16px] border border-gray-900/[0.10] bg-gray-900/[0.05] shadow-[inset_0_1px_0_rgba(0,0,0,0.06)] backdrop-blur-sm dark:border-white/[0.10] dark:bg-white/[0.05] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]",children:(0,b.jsx)("span",{className:"font-mono text-sm font-bold tracking-widest text-gray-900/65 dark:text-white/65",children:"INTEGRATION-CLI"})}),(0,b.jsx)("div",{className:"absolute -inset-2 rounded-[20px] bg-orange-500/10 blur-xl"})]})}function f({label:a,id:c,...d}){return(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("label",{htmlFor:c,className:"text-xs font-medium text-gray-900/50 dark:text-white/50",children:a}),(0,b.jsx)("input",{id:c,...d,className:"w-full rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] px-4 py-3 text-sm text-gray-900/90 placeholder:text-gray-900/25 outline-none ring-0 transition-all duration-200 focus:border-orange-400/60 focus:ring-2 focus:ring-orange-400/15 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/90 dark:placeholder:text-white/25 dark:focus:border-orange-400/50 dark:focus:ring-orange-400/10"})]})}function g({label:a,loading:c}){return(0,b.jsx)("button",{type:"submit",disabled:c,className:"relative w-full overflow-hidden rounded-xl bg-orange-600 py-3 text-sm font-semibold text-white transition-all duration-200 hover:bg-orange-500 active:scale-[0.99] disabled:opacity-60",children:c?(0,b.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,b.jsx)("span",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white"}),"로그인 중…"]}):a})}function h({label:a}){return(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("div",{className:"h-px flex-1 bg-gray-900/[0.07] dark:bg-white/[0.07]"}),(0,b.jsx)("span",{className:"text-xs text-gray-900/25 dark:text-white/25",children:a}),(0,b.jsx)("div",{className:"h-px flex-1 bg-gray-900/[0.07] dark:bg-white/[0.07]"})]})}function i({email:a,password:c,loading:d,error:j,onEmailChange:k,onPasswordChange:l,onSubmit:m,onGuestLogin:n}){return(0,b.jsxs)("div",{className:"flex w-full max-w-[400px] flex-col items-center gap-8 animate-fade-in-up",children:[(0,b.jsxs)("header",{className:"flex flex-col items-center gap-5 text-center",children:[(0,b.jsx)(e,{}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-[2.25rem] font-bold leading-none tracking-[-0.03em]",style:{background:"var(--heading-gradient)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text"},children:"JC-CLI"}),(0,b.jsx)("p",{className:"mt-2 text-[13px] font-medium uppercase tracking-[0.06em] text-gray-900/28 dark:text-white/28",children:"하나의 플랫폼에서 모든 AI CLI를 제어합니다"})]})]}),(0,b.jsxs)("div",{className:"w-full rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.025] p-6 shadow-[0_1px_3px_rgba(0,0,0,0.04),0_8px_24px_-4px_rgba(0,0,0,0.04)] backdrop-blur-sm dark:border-white/[0.08] dark:bg-white/[0.025]",children:[(0,b.jsx)("div",{className:"absolute inset-x-0 top-0 h-px rounded-t-2xl bg-gradient-to-r from-transparent via-orange-400/50 to-transparent"}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5 mb-6",children:[(0,b.jsx)("h2",{className:"text-[15px] font-semibold text-gray-900/90 dark:text-white/90",children:"로그인"}),(0,b.jsx)("p",{className:"text-[13px] text-gray-900/35 dark:text-white/35",children:"계정에 로그인하여 서비스를 이용하세요."})]}),(0,b.jsxs)("form",{onSubmit:m,className:"flex flex-col gap-4",children:[(0,b.jsx)(f,{id:"email",label:"이메일",type:"email",placeholder:"you@example.com",autoComplete:"email",value:a,onChange:a=>k(a.target.value)}),(0,b.jsx)(f,{id:"password",label:"비밀번호",type:"password",placeholder:"••••••••",autoComplete:"current-password",value:c,onChange:a=>l(a.target.value)}),j&&(0,b.jsx)("p",{className:"rounded-lg border border-red-500/20 bg-red-500/[0.07] px-3 py-2 text-xs text-red-500 dark:text-red-400",children:j}),(0,b.jsx)(g,{label:"로그인",loading:d})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-4",children:[(0,b.jsx)(h,{label:"또는"}),(0,b.jsx)("button",{type:"button",onClick:n,className:"w-full rounded-xl border border-gray-900/[0.09] bg-transparent py-3 text-sm font-medium text-gray-900/60 transition-all duration-200 hover:border-gray-900/[0.14] hover:bg-gray-900/[0.03] hover:text-gray-900/80 dark:border-white/[0.09] dark:text-white/60 dark:hover:border-white/[0.14] dark:hover:bg-white/[0.03] dark:hover:text-white/80",children:"게스트로 계속하기"})]})]}),(0,b.jsxs)("p",{className:"text-xs text-gray-900/25 dark:text-white/25",children:["계정이 없으신가요?"," ",(0,b.jsx)("button",{type:"button",className:"text-orange-600 transition-colors hover:text-orange-500 dark:text-orange-400 dark:hover:text-orange-300",children:"회원가입"})]})]})}a.s(["default",0,function(){let[a,e]=(0,c.useState)(""),[f,g]=(0,c.useState)(""),[h]=(0,c.useState)(!1),[j]=(0,c.useState)(null);return(0,b.jsxs)("div",{className:"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-[#faf8f5] px-6 py-12 dark:bg-[#07090e]",children:[(0,b.jsx)("div",{className:"absolute right-4 top-4",children:(0,b.jsx)(d.ThemeToggle,{})}),(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-0 overflow-hidden",children:[(0,b.jsx)("div",{className:"absolute left-1/2 top-[40%] h-[600px] w-[800px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-orange-500/[0.04] blur-[120px] dark:bg-orange-500/[0.035]"}),(0,b.jsx)("div",{className:"absolute -left-24 bottom-1/4 h-[350px] w-[450px] rounded-full bg-blue-600/[0.03] blur-[100px] dark:bg-blue-600/[0.025]"}),(0,b.jsx)("div",{className:"absolute -right-24 top-1/4 h-[300px] w-[400px] rounded-full bg-purple-600/[0.03] blur-[100px] dark:bg-purple-600/[0.025]"})]}),(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 opacity-60",style:{backgroundImage:"radial-gradient(circle, var(--dot-color) 1px, transparent 1px)",backgroundSize:"28px 28px",maskImage:"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)",WebkitMaskImage:"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)"}}),(0,b.jsx)("div",{className:"relative w-full flex justify-center",children:(0,b.jsx)(i,{email:a,password:f,loading:h,error:j,onEmailChange:e,onPasswordChange:g,onSubmit:a=>{a.preventDefault()},onGuestLogin:()=>{}})}),(0,b.jsx)("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-gradient-to-r from-transparent via-gray-900/[0.05] to-transparent dark:via-white/[0.05]"})]})}],5833)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=apps_web_src_app_login_page_tsx_07oskhj._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/app/login/page.tsx","../../../../../../apps/web/src/features/auth/ui/LoginForm.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ThemeToggle } from \"@/lib/theme\";\nimport { LoginForm } from \"@/features/auth/ui/LoginForm\";\n\n// ─── Container ────────────────────────────────────────────────────────────────\n\nexport default function LoginPage() {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [loading] = useState(false);\n const [error] = useState<string | null>(null);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n // TODO: 로그인 로직 연결\n };\n\n const handleGuestLogin = () => {\n // TODO: 게스트 로그인 로직 연결\n };\n\n return (\n <div className=\"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-[#faf8f5] px-6 py-12 dark:bg-[#07090e]\">\n {/* Theme toggle */}\n <div className=\"absolute right-4 top-4\">\n <ThemeToggle />\n </div>\n\n {/* Ambient background glows */}\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n <div className=\"absolute left-1/2 top-[40%] h-[600px] w-[800px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-orange-500/[0.04] blur-[120px] dark:bg-orange-500/[0.035]\" />\n <div className=\"absolute -left-24 bottom-1/4 h-[350px] w-[450px] rounded-full bg-blue-600/[0.03] blur-[100px] dark:bg-blue-600/[0.025]\" />\n <div className=\"absolute -right-24 top-1/4 h-[300px] w-[400px] rounded-full bg-purple-600/[0.03] blur-[100px] dark:bg-purple-600/[0.025]\" />\n </div>\n\n {/* Dot-grid pattern */}\n <div\n className=\"pointer-events-none absolute inset-0 opacity-60\"\n style={{\n backgroundImage: \"radial-gradient(circle, var(--dot-color) 1px, transparent 1px)\",\n backgroundSize: \"28px 28px\",\n maskImage: \"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)\",\n WebkitMaskImage: \"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)\",\n }}\n />\n\n {/* Form */}\n <div className=\"relative w-full flex justify-center\">\n <LoginForm\n email={email}\n password={password}\n loading={loading}\n error={error}\n onEmailChange={setEmail}\n onPasswordChange={setPassword}\n onSubmit={handleSubmit}\n onGuestLogin={handleGuestLogin}\n />\n </div>\n\n {/* Bottom rule */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-gradient-to-r from-transparent via-gray-900/[0.05] to-transparent dark:via-white/[0.05]\" />\n </div>\n );\n}\n","\"use client\";\n\n// ─── Atoms ────────────────────────────────────────────────────────────────────\n\ninterface LogoMarkProps {\n className?: string;\n}\n\nfunction LogoMark({ className }: LogoMarkProps) {\n return (\n <div className={`relative ${className ?? \"\"}`}>\n <div className=\"flex h-12 w-64 items-center justify-center rounded-[16px] border border-gray-900/[0.10] bg-gray-900/[0.05] shadow-[inset_0_1px_0_rgba(0,0,0,0.06)] backdrop-blur-sm dark:border-white/[0.10] dark:bg-white/[0.05] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]\">\n <span className=\"font-mono text-sm font-bold tracking-widest text-gray-900/65 dark:text-white/65\">\n INTEGRATION-CLI\n </span>\n </div>\n <div className=\"absolute -inset-2 rounded-[20px] bg-orange-500/10 blur-xl\" />\n </div>\n );\n}\n\ninterface InputFieldProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label: string;\n id: string;\n}\n\nfunction InputField({ label, id, ...props }: InputFieldProps) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={id} className=\"text-xs font-medium text-gray-900/50 dark:text-white/50\">\n {label}\n </label>\n <input\n id={id}\n {...props}\n className=\"w-full rounded-xl border border-gray-900/[0.10] bg-gray-900/[0.03] px-4 py-3 text-sm text-gray-900/90 placeholder:text-gray-900/25 outline-none ring-0 transition-all duration-200 focus:border-orange-400/60 focus:ring-2 focus:ring-orange-400/15 dark:border-white/[0.10] dark:bg-white/[0.03] dark:text-white/90 dark:placeholder:text-white/25 dark:focus:border-orange-400/50 dark:focus:ring-orange-400/10\"\n />\n </div>\n );\n}\n\ninterface SubmitButtonProps {\n label: string;\n loading?: boolean;\n onClick?: () => void;\n}\n\nfunction SubmitButton({ label, loading }: SubmitButtonProps) {\n return (\n <button\n type=\"submit\"\n disabled={loading}\n className=\"relative w-full overflow-hidden rounded-xl bg-orange-600 py-3 text-sm font-semibold text-white transition-all duration-200 hover:bg-orange-500 active:scale-[0.99] disabled:opacity-60\"\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n 로그인 중…\n </span>\n ) : (\n label\n )}\n </button>\n );\n}\n\ninterface DividerProps {\n label: string;\n}\n\nfunction Divider({ label }: DividerProps) {\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"h-px flex-1 bg-gray-900/[0.07] dark:bg-white/[0.07]\" />\n <span className=\"text-xs text-gray-900/25 dark:text-white/25\">{label}</span>\n <div className=\"h-px flex-1 bg-gray-900/[0.07] dark:bg-white/[0.07]\" />\n </div>\n );\n}\n\n// ─── Form ─────────────────────────────────────────────────────────────────────\n\nexport interface LoginFormProps {\n email: string;\n password: string;\n loading: boolean;\n error: string | null;\n onEmailChange: (value: string) => void;\n onPasswordChange: (value: string) => void;\n onSubmit: (e: React.FormEvent) => void;\n onGuestLogin: () => void;\n}\n\nexport function LoginForm({\n email,\n password,\n loading,\n error,\n onEmailChange,\n onPasswordChange,\n onSubmit,\n onGuestLogin,\n}: LoginFormProps) {\n return (\n <div className=\"flex w-full max-w-[400px] flex-col items-center gap-8 animate-fade-in-up\">\n {/* Logo */}\n <header className=\"flex flex-col items-center gap-5 text-center\">\n <LogoMark />\n <div>\n <h1\n className=\"text-[2.25rem] font-bold leading-none tracking-[-0.03em]\"\n style={{\n background: \"var(--heading-gradient)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n JC-CLI\n </h1>\n <p className=\"mt-2 text-[13px] font-medium uppercase tracking-[0.06em] text-gray-900/28 dark:text-white/28\">\n 하나의 플랫폼에서 모든 AI CLI를 제어합니다\n </p>\n </div>\n </header>\n\n {/* Card */}\n <div className=\"w-full rounded-2xl border border-gray-900/[0.08] bg-gray-900/[0.025] p-6 shadow-[0_1px_3px_rgba(0,0,0,0.04),0_8px_24px_-4px_rgba(0,0,0,0.04)] backdrop-blur-sm dark:border-white/[0.08] dark:bg-white/[0.025]\">\n {/* Top accent */}\n <div className=\"absolute inset-x-0 top-0 h-px rounded-t-2xl bg-gradient-to-r from-transparent via-orange-400/50 to-transparent\" />\n\n <div className=\"flex flex-col gap-1.5 mb-6\">\n <h2 className=\"text-[15px] font-semibold text-gray-900/90 dark:text-white/90\">\n 로그인\n </h2>\n <p className=\"text-[13px] text-gray-900/35 dark:text-white/35\">\n 계정에 로그인하여 서비스를 이용하세요.\n </p>\n </div>\n\n <form onSubmit={onSubmit} className=\"flex flex-col gap-4\">\n <InputField\n id=\"email\"\n label=\"이메일\"\n type=\"email\"\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n value={email}\n onChange={(e) => onEmailChange(e.target.value)}\n />\n <InputField\n id=\"password\"\n label=\"비밀번호\"\n type=\"password\"\n placeholder=\"••••••••\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n />\n\n {error && (\n <p className=\"rounded-lg border border-red-500/20 bg-red-500/[0.07] px-3 py-2 text-xs text-red-500 dark:text-red-400\">\n {error}\n </p>\n )}\n\n <SubmitButton label=\"로그인\" loading={loading} />\n </form>\n\n <div className=\"mt-4 flex flex-col gap-4\">\n <Divider label=\"또는\" />\n <button\n type=\"button\"\n onClick={onGuestLogin}\n className=\"w-full rounded-xl border border-gray-900/[0.09] bg-transparent py-3 text-sm font-medium text-gray-900/60 transition-all duration-200 hover:border-gray-900/[0.14] hover:bg-gray-900/[0.03] hover:text-gray-900/80 dark:border-white/[0.09] dark:text-white/60 dark:hover:border-white/[0.14] dark:hover:bg-white/[0.03] dark:hover:text-white/80\"\n >\n 게스트로 계속하기\n </button>\n </div>\n </div>\n\n <p className=\"text-xs text-gray-900/25 dark:text-white/25\">\n 계정이 없으신가요?{\" \"}\n <button type=\"button\" className=\"text-orange-600 transition-colors hover:text-orange-500 dark:text-orange-400 dark:hover:text-orange-300\">\n 회원가입\n </button>\n </p>\n </div>\n );\n}\n"],"names":["LogoMark","className","InputField","label","id","props","htmlFor","SubmitButton","loading","type","disabled","Divider","LoginForm","email","password","error","onEmailChange","onPasswordChange","onSubmit","onGuestLogin","style","background","WebkitBackgroundClip","WebkitTextFillColor","backgroundClip","placeholder","autoComplete","value","onChange","e","target","onClick"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[46940,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131),e=a.i(72404),f=a.i(5207),g=a.i(70548),h=a.i(24431),i=a.i(10750),j=a.i(17273),k=a.i(81937),l=a.i(82885);function m(a){return"checking"===a?"loading":"authenticated"===a?"authenticated":"not-installed"===a?"unavailable":"unauthenticated"}let n={loading:{border:"border-gray-900/[0.07] dark:border-white/[0.07]",bg:"bg-gray-900/[0.04] dark:bg-white/[0.04]",text:"text-transparent",dot:"bg-gray-900/20 dark:bg-white/20",label:"확인 중"},authenticated:{border:"border-emerald-500/25",bg:"bg-emerald-500/[0.08]",text:"text-emerald-600 dark:text-emerald-400",dot:"bg-emerald-500 shadow-[0_0_5px_#34d399] dark:bg-emerald-400",label:"사용 가능"},unauthenticated:{border:"border-amber-500/25",bg:"bg-amber-500/[0.08]",text:"text-amber-600 dark:text-amber-400",dot:"bg-amber-500 dark:bg-amber-400",label:"로그인 필요"},unavailable:{border:"border-gray-900/[0.06] dark:border-white/[0.06]",bg:"bg-gray-900/[0.03] dark:bg-white/[0.03]",text:"text-gray-900/30 dark:text-white/30",dot:"bg-gray-900/20 dark:bg-white/20",label:"미설치"}};function o({badge:a}){let{border:c,bg:d,text:e,dot:f,label:g}=n[a];return(0,b.jsxs)("span",{className:["inline-flex min-w-[86px] shrink-0 items-center justify-center gap-1.5 rounded-full border px-3 py-[5px] text-xs font-medium transition-all duration-500",c,d,e].join(" "),children:[(0,b.jsx)("span",{className:["h-1.5 w-1.5 rounded-full",f,"loading"===a||"authenticated"===a?"animate-pulse":""].join(" ")}),g]})}let p={claude:{name:"Claude CLI",description:"Anthropic Claude Code",icon:(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 text-[#D97757]","aria-hidden":"true",children:(0,b.jsx)("path",{d:"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z"})}),iconBg:"bg-orange-500/[0.10]",accentFrom:"from-orange-500/[0.10]",accentVia:"via-orange-400/50"},gemini:{name:"Gemini CLI",description:"Google Gemini",icon:(0,b.jsxs)("svg",{viewBox:"0 0 24 24",className:"h-5 w-5","aria-hidden":"true",children:[(0,b.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,b.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,b.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,b.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"})]}),iconBg:"bg-blue-500/[0.08]",accentFrom:"from-blue-500/[0.10]",accentVia:"via-blue-400/40"},codex:{name:"Codex CLI",description:"OpenAI Codex",icon:(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 text-gray-900/70 dark:text-white/70","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"})}),iconBg:"bg-gray-900/[0.05] dark:bg-white/[0.05]",accentFrom:"from-gray-500/[0.07]",accentVia:"via-gray-400/25"}};function q({agentKey:a,badge:c,onAuth:d,index:e}){let f=p[a],g="unauthenticated"===c||"loading"===c,h="authenticated"===c;return(0,b.jsxs)("div",{className:"animate-fade-in-up relative overflow-hidden rounded-2xl border border-gray-900/[0.07] dark:border-white/[0.07] bg-gray-900/[0.025] dark:bg-white/[0.025] p-4 transition-all duration-300",style:{animationDelay:`${60*e}ms`},children:[(0,b.jsx)("div",{className:["absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent to-transparent",f.accentVia].join(" ")}),(0,b.jsx)("div",{className:`pointer-events-none absolute inset-x-0 top-0 h-20 bg-gradient-to-b ${f.accentFrom} to-transparent opacity-50`}),(0,b.jsxs)("div",{className:"relative flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,b.jsx)("span",{className:["flex h-9 w-9 shrink-0 items-center justify-center rounded-xl",f.iconBg].join(" "),children:f.icon}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("p",{className:"text-[14px] font-semibold text-gray-900/85 dark:text-white/85",children:f.name}),(0,b.jsx)("p",{className:"text-[12px] text-gray-900/35 dark:text-white/35",children:f.description})]})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,b.jsx)(o,{badge:c}),!h&&"unavailable"!==c&&(0,b.jsx)("button",{onClick:d,disabled:!g,className:["rounded-lg border px-3 py-1.5 text-xs font-medium transition-all",g?"border-gray-900/[0.10] bg-gray-900/[0.04] text-gray-900/60 hover:border-gray-900/[0.18] hover:bg-gray-900/[0.08] hover:text-gray-900/90 dark:border-white/[0.10] dark:bg-white/[0.04] dark:text-white/60 dark:hover:border-white/[0.18] dark:hover:bg-white/[0.08] dark:hover:text-white/90":"cursor-not-allowed border-gray-900/[0.06] bg-gray-900/[0.02] text-gray-900/25 dark:border-white/[0.06] dark:bg-white/[0.02] dark:text-white/25"].join(" "),children:"인증하기"}),h&&(0,b.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-full bg-emerald-500/[0.10]",children:(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-3.5 w-3.5 text-emerald-500 dark:text-emerald-400",children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z",clipRule:"evenodd"})})})]})]})]})}function r({canEnter:a,isLoading:d}){return d?(0,b.jsx)("div",{className:"animate-fade-in-up flex h-[60px] w-full max-w-[460px] items-center justify-center rounded-2xl border border-gray-900/[0.07] bg-gray-900/[0.025] dark:border-white/[0.07] dark:bg-white/[0.025]",children:(0,b.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]"})}):a?(0,b.jsxs)(c.default,{href:"/claude",className:"animate-fade-in-up group relative flex w-full max-w-[460px] items-center justify-between overflow-hidden rounded-2xl px-6 py-4 transition-all duration-300 bg-gradient-to-r from-orange-600 to-orange-500 shadow-[0_4px_20px_-2px_rgba(234,88,12,0.30)] hover:shadow-[0_8px_28px_-2px_rgba(234,88,12,0.40)] hover:from-orange-500 hover:to-orange-400",style:{animationDelay:"180ms"},children:[(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 bg-gradient-to-tr from-white/[0.07] to-transparent"}),(0,b.jsxs)("div",{className:"relative flex items-center gap-3",children:[(0,b.jsx)("span",{className:"flex h-8 w-8 items-center justify-center rounded-lg bg-white/[0.18]",children:(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-4.5 w-4.5 text-white",children:(0,b.jsx)("path",{d:"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z"})})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"text-[15px] font-bold tracking-tight text-white",children:"JI CLI 시작하기"}),(0,b.jsx)("p",{className:"text-[11px] text-white/60",children:"멀티 에이전트 채팅 시작"})]})]}),(0,b.jsx)("div",{className:"relative flex h-7 w-7 items-center justify-center rounded-lg bg-white/[0.15] transition-transform duration-200 group-hover:translate-x-0.5",children:(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-4 w-4 text-white",children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z",clipRule:"evenodd"})})})]}):(0,b.jsxs)("div",{className:"animate-fade-in-up flex w-full max-w-[460px] flex-col items-center gap-2",style:{animationDelay:"180ms"},children:[(0,b.jsxs)("div",{className:"relative flex w-full items-center justify-between overflow-hidden rounded-2xl border border-gray-900/[0.07] bg-gray-900/[0.025] px-6 py-4 dark:border-white/[0.07] dark:bg-white/[0.025] opacity-40 cursor-not-allowed",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("span",{className:"flex h-8 w-8 items-center justify-center rounded-lg 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 16 16",fill:"currentColor",className:"h-4 w-4 text-gray-900/40 dark:text-white/40",children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M8 1a3.5 3.5 0 00-3.5 3.5V7A1.5 1.5 0 003 8.5v5A1.5 1.5 0 004.5 15h7a1.5 1.5 0 001.5-1.5v-5A1.5 1.5 0 0011.5 7V4.5A3.5 3.5 0 008 1zm2 6V4.5a2 2 0 10-4 0V7h4z",clipRule:"evenodd"})})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"text-[15px] font-bold tracking-tight text-gray-900/60 dark:text-white/60",children:"JI Claude 시작하기"}),(0,b.jsx)("p",{className:"text-[11px] text-gray-900/30 dark:text-white/30",children:"멀티 에이전트 채팅 시작"})]})]}),(0,b.jsx)("div",{className:"flex h-7 w-7 items-center justify-center rounded-lg 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 16 16",fill:"currentColor",className:"h-3.5 w-3.5 text-gray-900/30 dark:text-white/30",children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z",clipRule:"evenodd"})})})]}),(0,b.jsx)("p",{className:"text-[12px] text-gray-900/30 dark:text-white/30",children:"에이전트를 하나 이상 인증해야 시작할 수 있습니다"})]})}a.s(["default",0,function(){let a=(0,e.useClaudeAuth)(),c=(0,f.useGeminiAuth)(),n=(0,g.useCodexAuth)(),[o,p]=(0,d.useState)(null);(0,d.useEffect)(()=>{if("claude"===o&&"done"===a.loginState){let a=setTimeout(()=>p(null),1200);return()=>clearTimeout(a)}},[a.loginState,o]),(0,d.useEffect)(()=>{if("gemini"===o&&"done"===c.loginState){let a=setTimeout(()=>p(null),1200);return()=>clearTimeout(a)}},[c.loginState,o]),(0,d.useEffect)(()=>{if("codex"===o&&("done"===n.loginState||"done"===n.apiKeyLoginState)){let a=setTimeout(()=>p(null),1200);return()=>clearTimeout(a)}},[n.loginState,n.apiKeyLoginState,o]);let s=()=>{"claude"===o&&a.cancelLogin(),"gemini"===o&&c.cancelLogin(),"codex"===o&&n.cancelDeviceLogin(),p(null)},t=m(a.authState),u=m(c.authState),v=m(n.authState);return(0,b.jsxs)("div",{className:"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-[#faf8f5] px-6 py-12 dark:bg-[#07090e]",children:[(0,b.jsx)("div",{className:"absolute right-4 top-4",children:(0,b.jsx)(l.ThemeToggle,{})}),(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-0 overflow-hidden",children:[(0,b.jsx)("div",{className:"absolute left-1/2 top-[40%] h-[600px] w-[800px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-orange-500/[0.04] blur-[120px] dark:bg-orange-500/[0.035]"}),(0,b.jsx)("div",{className:"absolute -left-24 bottom-1/4 h-[350px] w-[450px] rounded-full bg-blue-600/[0.03] blur-[100px] dark:bg-blue-600/[0.025]"}),(0,b.jsx)("div",{className:"absolute -right-24 top-1/4 h-[300px] w-[400px] rounded-full bg-purple-600/[0.03] blur-[100px] dark:bg-purple-600/[0.025]"})]}),(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 opacity-60",style:{backgroundImage:"radial-gradient(circle, var(--dot-color) 1px, transparent 1px)",backgroundSize:"28px 28px",maskImage:"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)",WebkitMaskImage:"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)"}}),(0,b.jsxs)("header",{className:"animate-fade-in-up relative mb-10 flex flex-col items-center gap-5 text-center",children:[(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("div",{className:"flex h-12 w-80 items-center justify-center rounded-[16px] border border-gray-900/[0.10] bg-gray-900/[0.05] shadow-[inset_0_1px_0_rgba(0,0,0,0.06)] backdrop-blur-sm dark:border-white/[0.10] dark:bg-white/[0.05] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]",children:(0,b.jsx)("span",{className:"font-mono text-sm font-bold tracking-widest text-gray-900/65 dark:text-white/65",children:"INTEGRATION-CLI"})}),(0,b.jsx)("div",{className:"absolute -inset-2 rounded-[20px] bg-orange-500/10 blur-xl"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-[2.75rem] font-bold leading-none tracking-[-0.03em]",style:{background:"var(--heading-gradient)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text"},children:"JI-CLI"}),(0,b.jsx)("p",{className:"mt-2.5 text-[13px] font-medium uppercase tracking-[0.06em] text-gray-900/28 dark:text-white/28",children:"하나의 플랫폼에서 모든 AI CLI를 제어합니다"})]})]}),(0,b.jsxs)("div",{className:"relative flex w-full max-w-[460px] flex-col gap-3",children:[(0,b.jsxs)("div",{className:"animate-fade-in-up mb-1 flex items-center gap-2",style:{animationDelay:"60ms"},children:[(0,b.jsx)("span",{className:"text-[11px] font-semibold uppercase tracking-[0.07em] text-gray-900/35 dark:text-white/35",children:"에이전트 인증"}),(0,b.jsx)("div",{className:"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]"})]}),(0,b.jsx)(q,{agentKey:"claude",badge:t,onAuth:()=>p("claude"),index:0}),(0,b.jsx)(q,{agentKey:"gemini",badge:u,onAuth:()=>p("gemini"),index:1}),(0,b.jsx)(q,{agentKey:"codex",badge:v,onAuth:()=>p("codex"),index:2}),(0,b.jsxs)("div",{className:"animate-fade-in-up my-1 flex items-center gap-2",style:{animationDelay:"150ms"},children:[(0,b.jsx)("div",{className:"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]"}),(0,b.jsx)("span",{className:"text-[11px] font-semibold uppercase tracking-[0.07em] text-gray-900/35 dark:text-white/35",children:"시작하기"}),(0,b.jsx)("div",{className:"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]"})]}),(0,b.jsx)(r,{canEnter:"authenticated"===t||"authenticated"===u||"authenticated"===v,isLoading:"loading"===t||"loading"===u||"loading"===v})]}),(0,b.jsx)("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-gradient-to-r from-transparent via-gray-900/[0.05] to-transparent dark:via-white/[0.05]"}),(0,b.jsx)(k.Modal,{open:"claude"===o,onClose:s,title:"Claude CLI 인증",maxWidth:"max-w-lg",children:(0,b.jsx)(h.LoginPanel,{loginState:a.loginState,loginOutput:a.loginOutput,loginUrls:a.loginUrls,onStart:a.startLogin,onCancel:()=>{a.cancelLogin(),p(null)}})}),(0,b.jsx)(k.Modal,{open:"gemini"===o,onClose:s,title:"Gemini CLI 인증",maxWidth:"max-w-lg",children:(0,b.jsx)(i.GeminiLoginPanel,{loginState:c.loginState,loginOutput:c.loginOutput,loginUrls:c.loginUrls,configError:c.configError,onSaveApiKey:c.saveApiKey,onStartGca:c.startGcaLogin,onCancel:()=>{c.cancelLogin(),p(null)},onReset:c.resetLogin})}),(0,b.jsx)(k.Modal,{open:"codex"===o,onClose:s,title:"Codex CLI 인증",maxWidth:"max-w-lg",children:(0,b.jsx)(j.CodexLoginPanel,{loginMethod:n.loginMethod,onMethodChange:n.setLoginMethod,loginState:n.loginState,loginOutput:n.loginOutput,loginUrls:n.loginUrls,deviceCode:n.deviceCode,onStartDeviceLogin:n.startDeviceLogin,onCancelDeviceLogin:()=>{n.cancelDeviceLogin(),p(null)},apiKeyLoginState:n.apiKeyLoginState,configError:n.configError,onSaveApiKey:n.saveApiKey})})]})}])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=apps_web_src_app_page_tsx_0kq.zh9._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/app/page.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useEffect, useState } from \"react\";\n\nimport { useClaudeAuth } from \"@/features/auth/hooks/useClaudeAuth\";\nimport { useGeminiAuth } from \"@/features/auth/hooks/useGeminiAuth\";\nimport { useCodexAuth } from \"@/features/auth/hooks/useCodexAuth\";\nimport { LoginPanel } from \"@/features/auth/ui/LoginPanel\";\nimport { GeminiLoginPanel } from \"@/features/auth/ui/GeminiLoginPanel\";\nimport { CodexLoginPanel } from \"@/features/auth/ui/CodexLoginPanel\";\nimport { Modal } from \"@/components/ui/Modal\";\nimport { ThemeToggle } from \"@/lib/theme\";\n\ntype AgentKey = \"claude\" | \"gemini\" | \"codex\";\ntype AuthBadge = \"loading\" | \"authenticated\" | \"unauthenticated\" | \"unavailable\";\n\n// ─── 에이전트 인증 상태 → Badge 변환 ─────────────────────────────────────────\n\nfunction toBadge(state: string): AuthBadge {\n if (state === \"checking\") return \"loading\";\n if (state === \"authenticated\") return \"authenticated\";\n if (state === \"not-installed\") return \"unavailable\";\n return \"unauthenticated\";\n}\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nconst BADGE_CONFIG: Record<\n AuthBadge,\n { border: string; bg: string; text: string; dot: string; label: string }\n> = {\n loading: {\n border: \"border-gray-900/[0.07] dark:border-white/[0.07]\",\n bg: \"bg-gray-900/[0.04] dark:bg-white/[0.04]\",\n text: \"text-transparent\",\n dot: \"bg-gray-900/20 dark:bg-white/20\",\n label: \"확인 중\",\n },\n authenticated: {\n border: \"border-emerald-500/25\",\n bg: \"bg-emerald-500/[0.08]\",\n text: \"text-emerald-600 dark:text-emerald-400\",\n dot: \"bg-emerald-500 shadow-[0_0_5px_#34d399] dark:bg-emerald-400\",\n label: \"사용 가능\",\n },\n unauthenticated: {\n border: \"border-amber-500/25\",\n bg: \"bg-amber-500/[0.08]\",\n text: \"text-amber-600 dark:text-amber-400\",\n dot: \"bg-amber-500 dark:bg-amber-400\",\n label: \"로그인 필요\",\n },\n unavailable: {\n border: \"border-gray-900/[0.06] dark:border-white/[0.06]\",\n bg: \"bg-gray-900/[0.03] dark:bg-white/[0.03]\",\n text: \"text-gray-900/30 dark:text-white/30\",\n dot: \"bg-gray-900/20 dark:bg-white/20\",\n label: \"미설치\",\n },\n};\n\nfunction Badge({ badge }: { badge: AuthBadge }) {\n const { border, bg, text, dot, label } = BADGE_CONFIG[badge];\n const isPulsing = badge === \"loading\" || badge === \"authenticated\";\n return (\n <span\n className={[\n \"inline-flex min-w-[86px] shrink-0 items-center justify-center gap-1.5\",\n \"rounded-full border px-3 py-[5px] text-xs font-medium\",\n \"transition-all duration-500\",\n border, bg, text,\n ].join(\" \")}\n >\n <span className={[\"h-1.5 w-1.5 rounded-full\", dot, isPulsing ? \"animate-pulse\" : \"\"].join(\" \")} />\n {label}\n </span>\n );\n}\n\n// ─── 에이전트 아이콘 ──────────────────────────────────────────────────────────\n\nconst CLAUDE_ICON = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 text-[#D97757]\" aria-hidden=\"true\">\n <path d=\"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z\" />\n </svg>\n);\n\nconst GEMINI_ICON = (\n <svg viewBox=\"0 0 24 24\" className=\"h-5 w-5\" 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\nconst CODEX_ICON = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 text-gray-900/70 dark:text-white/70\" 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\nconst AGENT_META: Record<\n AgentKey,\n { name: string; description: string; icon: React.ReactNode; iconBg: string; accentFrom: string; accentVia: string }\n> = {\n claude: {\n name: \"Claude CLI\",\n description: \"Anthropic Claude Code\",\n icon: CLAUDE_ICON,\n iconBg: \"bg-orange-500/[0.10]\",\n accentFrom: \"from-orange-500/[0.10]\",\n accentVia: \"via-orange-400/50\",\n },\n gemini: {\n name: \"Gemini CLI\",\n description: \"Google Gemini\",\n icon: GEMINI_ICON,\n iconBg: \"bg-blue-500/[0.08]\",\n accentFrom: \"from-blue-500/[0.10]\",\n accentVia: \"via-blue-400/40\",\n },\n codex: {\n name: \"Codex CLI\",\n description: \"OpenAI Codex\",\n icon: CODEX_ICON,\n iconBg: \"bg-gray-900/[0.05] dark:bg-white/[0.05]\",\n accentFrom: \"from-gray-500/[0.07]\",\n accentVia: \"via-gray-400/25\",\n },\n};\n\n// ─── 에이전트 인증 카드 ───────────────────────────────────────────────────────\n\ninterface AgentAuthCardProps {\n agentKey: AgentKey;\n badge: AuthBadge;\n onAuth: () => void;\n index: number;\n}\n\nfunction AgentAuthCard({ agentKey, badge, onAuth, index }: AgentAuthCardProps) {\n const meta = AGENT_META[agentKey];\n const canAuth = badge === \"unauthenticated\" || badge === \"loading\";\n const isAuth = badge === \"authenticated\";\n\n return (\n <div\n className={[\n \"animate-fade-in-up relative overflow-hidden rounded-2xl\",\n \"border border-gray-900/[0.07] dark:border-white/[0.07]\",\n \"bg-gray-900/[0.025] dark:bg-white/[0.025]\",\n \"p-4 transition-all duration-300\",\n ].join(\" \")}\n style={{ animationDelay: `${index * 60}ms` }}\n >\n {/* 상단 accent 라인 */}\n <div\n className={[\n \"absolute inset-x-0 top-0 h-px\",\n \"bg-gradient-to-r from-transparent to-transparent\",\n meta.accentVia,\n ].join(\" \")}\n />\n {/* 상단 ambient tint */}\n <div\n className={[\n \"pointer-events-none absolute inset-x-0 top-0 h-20\",\n `bg-gradient-to-b ${meta.accentFrom} to-transparent opacity-50`,\n ].join(\" \")}\n />\n\n <div className=\"relative flex items-center justify-between gap-3\">\n {/* 왼쪽: 아이콘 + 이름 */}\n <div className=\"flex items-center gap-3 min-w-0\">\n <span className={[\"flex h-9 w-9 shrink-0 items-center justify-center rounded-xl\", meta.iconBg].join(\" \")}>\n {meta.icon}\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-[14px] font-semibold text-gray-900/85 dark:text-white/85\">{meta.name}</p>\n <p className=\"text-[12px] text-gray-900/35 dark:text-white/35\">{meta.description}</p>\n </div>\n </div>\n\n {/* 오른쪽: 배지 + 인증 버튼 */}\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge badge={badge} />\n {!isAuth && badge !== \"unavailable\" && (\n <button\n onClick={onAuth}\n disabled={!canAuth}\n className={[\n \"rounded-lg border px-3 py-1.5 text-xs font-medium transition-all\",\n canAuth\n ? \"border-gray-900/[0.10] bg-gray-900/[0.04] text-gray-900/60 hover:border-gray-900/[0.18] hover:bg-gray-900/[0.08] hover:text-gray-900/90 dark:border-white/[0.10] dark:bg-white/[0.04] dark:text-white/60 dark:hover:border-white/[0.18] dark:hover:bg-white/[0.08] dark:hover:text-white/90\"\n : \"cursor-not-allowed border-gray-900/[0.06] bg-gray-900/[0.02] text-gray-900/25 dark:border-white/[0.06] dark:bg-white/[0.02] dark:text-white/25\",\n ].join(\" \")}\n >\n 인증하기\n </button>\n )}\n {isAuth && (\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-emerald-500/[0.10]\">\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-3.5 w-3.5 text-emerald-500 dark:text-emerald-400\">\n <path fillRule=\"evenodd\" d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\" clipRule=\"evenodd\" />\n </svg>\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Claude 페이지 진입 버튼 ─────────────────────────────────────────────────\n\nfunction ClaudeEntryButton({ canEnter, isLoading }: { canEnter: boolean; isLoading: boolean }) {\n if (isLoading) {\n return (\n <div className=\"animate-fade-in-up flex h-[60px] w-full max-w-[460px] items-center justify-center rounded-2xl border border-gray-900/[0.07] bg-gray-900/[0.025] dark:border-white/[0.07] dark:bg-white/[0.025]\">\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 </div>\n );\n }\n\n if (canEnter) {\n return (\n <Link\n href=\"/claude\"\n className={[\n \"animate-fade-in-up group relative flex w-full max-w-[460px] items-center justify-between overflow-hidden\",\n \"rounded-2xl px-6 py-4 transition-all duration-300\",\n \"bg-gradient-to-r from-orange-600 to-orange-500\",\n \"shadow-[0_4px_20px_-2px_rgba(234,88,12,0.30)] hover:shadow-[0_8px_28px_-2px_rgba(234,88,12,0.40)]\",\n \"hover:from-orange-500 hover:to-orange-400\",\n ].join(\" \")}\n style={{ animationDelay: \"180ms\" }}\n >\n {/* 배경 반짝임 */}\n <div className=\"pointer-events-none absolute inset-0 bg-gradient-to-tr from-white/[0.07] to-transparent\" />\n\n <div className=\"relative flex items-center gap-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-white/[0.18]\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4.5 w-4.5 text-white\">\n <path d=\"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z\" />\n </svg>\n </span>\n <div>\n <p className=\"text-[15px] font-bold tracking-tight text-white\">JI CLI 시작하기</p>\n <p className=\"text-[11px] text-white/60\">멀티 에이전트 채팅 시작</p>\n </div>\n </div>\n\n <div className=\"relative flex h-7 w-7 items-center justify-center rounded-lg bg-white/[0.15] transition-transform duration-200 group-hover:translate-x-0.5\">\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-4 w-4 text-white\">\n <path fillRule=\"evenodd\" d=\"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </Link>\n );\n }\n\n return (\n <div className=\"animate-fade-in-up flex w-full max-w-[460px] flex-col items-center gap-2\" style={{ animationDelay: \"180ms\" }}>\n <div\n className={[\n \"relative flex w-full items-center justify-between overflow-hidden\",\n \"rounded-2xl border border-gray-900/[0.07] bg-gray-900/[0.025] px-6 py-4\",\n \"dark:border-white/[0.07] dark:bg-white/[0.025]\",\n \"opacity-40 cursor-not-allowed\",\n ].join(\" \")}\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-lg 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 16 16\" fill=\"currentColor\" className=\"h-4 w-4 text-gray-900/40 dark:text-white/40\">\n <path fillRule=\"evenodd\" d=\"M8 1a3.5 3.5 0 00-3.5 3.5V7A1.5 1.5 0 003 8.5v5A1.5 1.5 0 004.5 15h7a1.5 1.5 0 001.5-1.5v-5A1.5 1.5 0 0011.5 7V4.5A3.5 3.5 0 008 1zm2 6V4.5a2 2 0 10-4 0V7h4z\" clipRule=\"evenodd\" />\n </svg>\n </span>\n <div>\n <p className=\"text-[15px] font-bold tracking-tight text-gray-900/60 dark:text-white/60\">JI Claude 시작하기</p>\n <p className=\"text-[11px] text-gray-900/30 dark:text-white/30\">멀티 에이전트 채팅 시작</p>\n </div>\n </div>\n <div className=\"flex h-7 w-7 items-center justify-center rounded-lg 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 16 16\" fill=\"currentColor\" className=\"h-3.5 w-3.5 text-gray-900/30 dark:text-white/30\">\n <path fillRule=\"evenodd\" d=\"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </div>\n <p className=\"text-[12px] text-gray-900/30 dark:text-white/30\">\n 에이전트를 하나 이상 인증해야 시작할 수 있습니다\n </p>\n </div>\n );\n}\n\n// ─── Page ─────────────────────────────────────────────────────────────────────\n\nexport default function Home() {\n const claude = useClaudeAuth();\n const gemini = useGeminiAuth();\n const codex = useCodexAuth();\n\n const [modalOpen, setModalOpen] = useState<AgentKey | null>(null);\n\n // 인증 완료 시 모달 자동 닫기 (1.2초 후)\n useEffect(() => {\n if (modalOpen === \"claude\" && claude.loginState === \"done\") {\n const t = setTimeout(() => setModalOpen(null), 1200);\n return () => clearTimeout(t);\n }\n }, [claude.loginState, modalOpen]);\n\n useEffect(() => {\n if (modalOpen === \"gemini\" && gemini.loginState === \"done\") {\n const t = setTimeout(() => setModalOpen(null), 1200);\n return () => clearTimeout(t);\n }\n }, [gemini.loginState, modalOpen]);\n\n useEffect(() => {\n if (\n modalOpen === \"codex\" &&\n (codex.loginState === \"done\" || codex.apiKeyLoginState === \"done\")\n ) {\n const t = setTimeout(() => setModalOpen(null), 1200);\n return () => clearTimeout(t);\n }\n }, [codex.loginState, codex.apiKeyLoginState, modalOpen]);\n\n // 모달 닫기 핸들러 (진행 중인 인증 취소 포함)\n const handleCloseModal = () => {\n if (modalOpen === \"claude\") claude.cancelLogin();\n if (modalOpen === \"gemini\") gemini.cancelLogin();\n if (modalOpen === \"codex\") codex.cancelDeviceLogin();\n setModalOpen(null);\n };\n\n const claudeBadge = toBadge(claude.authState);\n const geminiBadge = toBadge(gemini.authState);\n const codexBadge = toBadge(codex.authState);\n\n const isAnyAuthenticated =\n claudeBadge === \"authenticated\" ||\n geminiBadge === \"authenticated\" ||\n codexBadge === \"authenticated\";\n\n const isChecking =\n claudeBadge === \"loading\" ||\n geminiBadge === \"loading\" ||\n codexBadge === \"loading\";\n\n return (\n <div className=\"relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-[#faf8f5] px-6 py-12 dark:bg-[#07090e]\">\n\n {/* 테마 토글 */}\n <div className=\"absolute right-4 top-4\">\n <ThemeToggle />\n </div>\n\n {/* 배경 glow */}\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n <div className=\"absolute left-1/2 top-[40%] h-[600px] w-[800px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-orange-500/[0.04] blur-[120px] dark:bg-orange-500/[0.035]\" />\n <div className=\"absolute -left-24 bottom-1/4 h-[350px] w-[450px] rounded-full bg-blue-600/[0.03] blur-[100px] dark:bg-blue-600/[0.025]\" />\n <div className=\"absolute -right-24 top-1/4 h-[300px] w-[400px] rounded-full bg-purple-600/[0.03] blur-[100px] dark:bg-purple-600/[0.025]\" />\n </div>\n\n {/* dot-grid */}\n <div\n className=\"pointer-events-none absolute inset-0 opacity-60\"\n style={{\n backgroundImage: \"radial-gradient(circle, var(--dot-color) 1px, transparent 1px)\",\n backgroundSize: \"28px 28px\",\n maskImage: \"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)\",\n WebkitMaskImage: \"radial-gradient(ellipse 75% 65% at 50% 50%, black 30%, transparent 100%)\",\n }}\n />\n\n {/* 헤더 */}\n <header className=\"animate-fade-in-up relative mb-10 flex flex-col items-center gap-5 text-center\">\n <div className=\"relative\">\n <div className=\"flex h-12 w-80 items-center justify-center rounded-[16px] border border-gray-900/[0.10] bg-gray-900/[0.05] shadow-[inset_0_1px_0_rgba(0,0,0,0.06)] backdrop-blur-sm dark:border-white/[0.10] dark:bg-white/[0.05] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]\">\n <span className=\"font-mono text-sm font-bold tracking-widest text-gray-900/65 dark:text-white/65\">\n INTEGRATION-CLI\n </span>\n </div>\n <div className=\"absolute -inset-2 rounded-[20px] bg-orange-500/10 blur-xl\" />\n </div>\n <div>\n <h1\n className=\"text-[2.75rem] font-bold leading-none tracking-[-0.03em]\"\n style={{\n background: \"var(--heading-gradient)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n JI-CLI\n </h1>\n <p className=\"mt-2.5 text-[13px] font-medium uppercase tracking-[0.06em] text-gray-900/28 dark:text-white/28\">\n 하나의 플랫폼에서 모든 AI CLI를 제어합니다\n </p>\n </div>\n </header>\n\n {/* 본문 */}\n <div className=\"relative flex w-full max-w-[460px] flex-col gap-3\">\n\n {/* ── 에이전트 인증 섹션 ──────────────────────────────────────────── */}\n <div className=\"animate-fade-in-up mb-1 flex items-center gap-2\" style={{ animationDelay: \"60ms\" }}>\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.07em] text-gray-900/35 dark:text-white/35\">\n 에이전트 인증\n </span>\n <div className=\"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]\" />\n </div>\n\n <AgentAuthCard\n agentKey=\"claude\"\n badge={claudeBadge}\n onAuth={() => setModalOpen(\"claude\")}\n index={0}\n />\n <AgentAuthCard\n agentKey=\"gemini\"\n badge={geminiBadge}\n onAuth={() => setModalOpen(\"gemini\")}\n index={1}\n />\n <AgentAuthCard\n agentKey=\"codex\"\n badge={codexBadge}\n onAuth={() => setModalOpen(\"codex\")}\n index={2}\n />\n\n {/* ── 구분선 ──────────────────────────────────────────────────────── */}\n <div className=\"animate-fade-in-up my-1 flex items-center gap-2\" style={{ animationDelay: \"150ms\" }}>\n <div className=\"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.07em] text-gray-900/35 dark:text-white/35\">\n 시작하기\n </span>\n <div className=\"h-px flex-1 bg-gray-900/[0.06] dark:bg-white/[0.06]\" />\n </div>\n\n {/* ── Claude 페이지 진입 버튼 ─────────────────────────────────────── */}\n <ClaudeEntryButton canEnter={isAnyAuthenticated} isLoading={isChecking} />\n </div>\n\n {/* 하단 rule */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-gradient-to-r from-transparent via-gray-900/[0.05] to-transparent dark:via-white/[0.05]\" />\n\n {/* ── Claude 인증 모달 ────────────────────────────────────────────────── */}\n <Modal open={modalOpen === \"claude\"} onClose={handleCloseModal} title=\"Claude CLI 인증\" maxWidth=\"max-w-lg\">\n <LoginPanel\n loginState={claude.loginState}\n loginOutput={claude.loginOutput}\n loginUrls={claude.loginUrls}\n onStart={claude.startLogin}\n onCancel={() => { claude.cancelLogin(); setModalOpen(null); }}\n />\n </Modal>\n\n {/* ── Gemini 인증 모달 ────────────────────────────────────────────────── */}\n <Modal open={modalOpen === \"gemini\"} onClose={handleCloseModal} title=\"Gemini CLI 인증\" maxWidth=\"max-w-lg\">\n <GeminiLoginPanel\n loginState={gemini.loginState}\n loginOutput={gemini.loginOutput}\n loginUrls={gemini.loginUrls}\n configError={gemini.configError}\n onSaveApiKey={gemini.saveApiKey}\n onStartGca={gemini.startGcaLogin}\n onCancel={() => { gemini.cancelLogin(); setModalOpen(null); }}\n onReset={gemini.resetLogin}\n />\n </Modal>\n\n {/* ── Codex 인증 모달 ─────────────────────────────────────────────────── */}\n <Modal open={modalOpen === \"codex\"} onClose={handleCloseModal} title=\"Codex CLI 인증\" maxWidth=\"max-w-lg\">\n <CodexLoginPanel\n loginMethod={codex.loginMethod}\n onMethodChange={codex.setLoginMethod}\n loginState={codex.loginState}\n loginOutput={codex.loginOutput}\n loginUrls={codex.loginUrls}\n deviceCode={codex.deviceCode}\n onStartDeviceLogin={codex.startDeviceLogin}\n onCancelDeviceLogin={() => { codex.cancelDeviceLogin(); setModalOpen(null); }}\n apiKeyLoginState={codex.apiKeyLoginState}\n configError={codex.configError}\n onSaveApiKey={codex.saveApiKey}\n />\n </Modal>\n </div>\n );\n}\n"],"names":["toBadge","state","BADGE_CONFIG","loading","border","bg","text","dot","label","authenticated","unauthenticated","unavailable","Badge","badge","isPulsing","className","join","CLAUDE_ICON","viewBox","fill","d","GEMINI_ICON","CODEX_ICON","AGENT_META","claude","name","description","icon","iconBg","accentFrom","accentVia","gemini","codex","AgentAuthCard","agentKey","onAuth","index","meta","canAuth","isAuth","style","animationDelay","onClick","disabled","fillRule","clipRule","ClaudeEntryButton","canEnter","isLoading","href","Home","modalOpen","setModalOpen","loginState","t","setTimeout","clearTimeout","apiKeyLoginState","handleCloseModal","cancelLogin","cancelDeviceLogin","claudeBadge","authState","geminiBadge","codexBadge","isAnyAuthenticated","isChecking","backgroundImage","backgroundSize","maskImage","WebkitMaskImage","background","WebkitBackgroundClip","WebkitTextFillColor","backgroundClip","open","onClose","title","maxWidth","loginOutput","loginUrls","onStart","startLogin","onCancel","configError","onSaveApiKey","saveApiKey","onStartGca","startGcaLogin","onReset","resetLogin","loginMethod","onMethodChange","setLoginMethod","deviceCode","onStartDeviceLogin","startDeviceLogin","onCancelDeviceLogin"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[72841,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131);let e={context:"text-gray-900/50 dark:text-white/40",added:"bg-emerald-500/[0.08] text-emerald-700 dark:text-emerald-400",removed:"bg-red-500/[0.08] text-red-700 dark:text-red-400",hunk:"text-purple-500/70 dark:text-purple-400/70"},f={context:"text-gray-900/15 dark:text-white/15",added:"text-emerald-600/40 dark:text-emerald-400/40",removed:"text-red-600/40 dark:text-red-400/40",hunk:"text-purple-500/30 dark:text-purple-400/30"};function g({lines:a}){return(0,b.jsx)("div",{className:"overflow-x-auto rounded-lg bg-gray-950/[0.03] dark:bg-white/[0.03]",children:(0,b.jsx)("table",{className:"w-full border-collapse font-mono text-[11px] leading-relaxed",children:(0,b.jsx)("tbody",{children:a.map((a,c)=>(0,b.jsx)("tr",{className:e[a.type],children:"hunk"===a.type?(0,b.jsx)("td",{colSpan:3,className:"px-3 py-0.5 text-purple-500/70 dark:text-purple-400/70 select-none",children:a.content}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("td",{className:`w-10 select-none px-2 py-0.5 text-right ${f[a.type]}`,children:a.oldLineNo??""}),(0,b.jsx)("td",{className:`w-10 select-none px-2 py-0.5 text-right ${f[a.type]}`,children:a.newLineNo??""}),(0,b.jsxs)("td",{className:"px-3 py-0.5 whitespace-pre",children:[(0,b.jsx)("span",{className:"mr-1 select-none opacity-50",children:"added"===a.type?"+":"removed"===a.type?"-":" "}),a.content]})]})},c))})})})}let h={added:{label:"추가",className:"bg-emerald-500/10 text-emerald-600 border-emerald-500/20 dark:text-emerald-400"},modified:{label:"수정",className:"bg-blue-500/10 text-blue-600 border-blue-500/20 dark:text-blue-400"},deleted:{label:"삭제",className:"bg-red-500/10 text-red-600 border-red-500/20 dark:text-red-400"},renamed:{label:"이동",className:"bg-amber-500/10 text-amber-600 border-amber-500/20 dark:text-amber-400"}};function i({type:a}){let{label:c,className:d}=h[a];return(0,b.jsx)("span",{className:`inline-flex items-center rounded-md border px-1.5 py-0.5 text-[10px] font-medium ${d}`,children:c})}function j({file:a,defaultOpen:c=!1}){let[e,f]=(0,d.useState)(c),h=a.filePath.split("/").pop()??a.filePath,k=a.filePath.includes("/")?a.filePath.slice(0,a.filePath.lastIndexOf("/")):"";return(0,b.jsxs)("div",{className:"overflow-hidden rounded-lg border border-gray-900/[0.07] dark:border-white/[0.07]",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>f(a=>!a),className:"flex w-full items-center gap-2 px-3 py-2 text-left hover:bg-gray-900/[0.02] dark:hover:bg-white/[0.02]",children:[(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:`h-3 w-3 shrink-0 text-gray-900/20 transition-transform dark:text-white/20 ${e?"rotate-90":""}`,children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z",clipRule:"evenodd"})}),(0,b.jsx)(i,{type:a.changeType}),(0,b.jsxs)("span",{className:"min-w-0 flex-1 truncate text-[12px]",children:[k&&(0,b.jsxs)("span",{className:"text-gray-900/30 dark:text-white/30",children:[k,"/"]}),(0,b.jsx)("span",{className:"font-medium text-gray-900/70 dark:text-white/70",children:h})]}),(0,b.jsxs)("span",{className:"shrink-0 text-[10px] font-mono",children:[a.additions>0&&(0,b.jsxs)("span",{className:"text-emerald-600 dark:text-emerald-400",children:["+",a.additions]}),a.additions>0&&a.deletions>0&&(0,b.jsx)("span",{className:"mx-0.5 text-gray-900/15 dark:text-white/15",children:"/"}),a.deletions>0&&(0,b.jsxs)("span",{className:"text-red-600 dark:text-red-400",children:["-",a.deletions]})]})]}),e&&a.lines.length>0&&(0,b.jsx)("div",{className:"border-t border-gray-900/[0.05] dark:border-white/[0.05]",children:(0,b.jsx)(g,{lines:a.lines})})]})}let k=[{filePath:"src/features/auth/hooks/useLogin.ts",changeType:"added",additions:42,deletions:0,lines:[{type:"hunk",content:"@@ -0,0 +1,42 @@"},{type:"added",content:'"use client";',newLineNo:1},{type:"added",content:"",newLineNo:2},{type:"added",content:'import { useState } from "react";',newLineNo:3},{type:"added",content:"",newLineNo:4},{type:"added",content:"export function useLogin() {",newLineNo:5},{type:"added",content:" const [loading, setLoading] = useState(false);",newLineNo:6},{type:"added",content:" const [error, setError] = useState<string | null>(null);",newLineNo:7},{type:"added",content:"",newLineNo:8},{type:"added",content:" const login = async (email: string, password: string) => {",newLineNo:9},{type:"added",content:" setLoading(true);",newLineNo:10},{type:"added",content:" try {",newLineNo:11},{type:"added",content:" await authApi.login({ email, password });",newLineNo:12},{type:"added",content:" } catch (e) {",newLineNo:13},{type:"added",content:' setError(e instanceof Error ? e.message : "로그인 실패");',newLineNo:14},{type:"added",content:" } finally {",newLineNo:15},{type:"added",content:" setLoading(false);",newLineNo:16},{type:"added",content:" }",newLineNo:17},{type:"added",content:" };",newLineNo:18},{type:"added",content:"",newLineNo:19},{type:"added",content:" return { loading, error, login };",newLineNo:20},{type:"added",content:"}",newLineNo:21}]},{filePath:"src/features/auth/ui/LoginForm.tsx",changeType:"modified",additions:15,deletions:8,lines:[{type:"hunk",content:"@@ -12,18 +12,25 @@"},{type:"context",content:"export function LoginForm() {",oldLineNo:12,newLineNo:12},{type:"context",content:" const { loading, error, login } = useLogin();",oldLineNo:13,newLineNo:13},{type:"context",content:"",oldLineNo:14,newLineNo:14},{type:"removed",content:' const [email, setEmail] = useState("");',oldLineNo:15},{type:"removed",content:' const [password, setPassword] = useState("");',oldLineNo:16},{type:"added",content:' const [form, setForm] = useState({ email: "", password: "" });',newLineNo:15},{type:"added",content:"",newLineNo:16},{type:"added",content:" const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {",newLineNo:17},{type:"added",content:" setForm((prev) => ({ ...prev, [e.target.name]: e.target.value }));",newLineNo:18},{type:"added",content:" };",newLineNo:19},{type:"context",content:"",oldLineNo:17,newLineNo:20},{type:"context",content:" const handleSubmit = async (e: React.FormEvent) => {",oldLineNo:18,newLineNo:21},{type:"context",content:" e.preventDefault();",oldLineNo:19,newLineNo:22},{type:"removed",content:" await login(email, password);",oldLineNo:20},{type:"added",content:" await login(form.email, form.password);",newLineNo:23},{type:"context",content:" };",oldLineNo:21,newLineNo:24}]},{filePath:"src/features/auth/api/auth.api.ts",changeType:"modified",additions:6,deletions:2,lines:[{type:"hunk",content:"@@ -28,10 +28,14 @@"},{type:"context",content:"export async function login(dto: LoginDto) {",oldLineNo:28,newLineNo:28},{type:"context",content:" const res = await fetch(`${SERVER_URL}/auth/login`, {",oldLineNo:29,newLineNo:29},{type:"context",content:' method: "POST",',oldLineNo:30,newLineNo:30},{type:"removed",content:" body: JSON.stringify(dto),",oldLineNo:31},{type:"added",content:' headers: { "Content-Type": "application/json" },',newLineNo:31},{type:"added",content:" body: JSON.stringify(dto),",newLineNo:32},{type:"context",content:" });",oldLineNo:32,newLineNo:33},{type:"removed",content:' if (!res.ok) throw new Error("HTTP " + res.status);',oldLineNo:33},{type:"added",content:" if (!res.ok) {",newLineNo:34},{type:"added",content:" const body = await res.json().catch(() => ({}));",newLineNo:35},{type:"added",content:" throw new Error(body.message ?? `HTTP ${res.status}`);",newLineNo:36},{type:"added",content:" }",newLineNo:37},{type:"context",content:" return res.json();",oldLineNo:34,newLineNo:38},{type:"context",content:"}",oldLineNo:35,newLineNo:39}]},{filePath:"src/features/auth/utils/validators.ts",changeType:"deleted",additions:0,deletions:18,lines:[{type:"hunk",content:"@@ -1,18 +0,0 @@"},{type:"removed",content:"export function validateEmail(email: string) {",oldLineNo:1},{type:"removed",content:" return /^[^@]+@[^@]+\\.[^@]+$/.test(email);",oldLineNo:2},{type:"removed",content:"}",oldLineNo:3},{type:"removed",content:"",oldLineNo:4},{type:"removed",content:"export function validatePassword(password: string) {",oldLineNo:5},{type:"removed",content:" return password.length >= 8;",oldLineNo:6},{type:"removed",content:"}",oldLineNo:7}]},{filePath:"src/features/auth/utils/validation.ts",changeType:"renamed",additions:4,deletions:0,lines:[{type:"hunk",content:"@@ -0,0 +1,12 @@ (validators.ts → validation.ts)"},{type:"context",content:"export function validateEmail(email: string) {",oldLineNo:1,newLineNo:1},{type:"context",content:" return /^[^@]+@[^@]+\\.[^@]+$/.test(email);",oldLineNo:2,newLineNo:2},{type:"context",content:"}",oldLineNo:3,newLineNo:3},{type:"context",content:"",oldLineNo:4,newLineNo:4},{type:"context",content:"export function validatePassword(password: string) {",oldLineNo:5,newLineNo:5},{type:"context",content:" return password.length >= 8;",oldLineNo:6,newLineNo:6},{type:"context",content:"}",oldLineNo:7,newLineNo:7},{type:"added",content:"",newLineNo:8},{type:"added",content:"export function validateRequired(value: string) {",newLineNo:9},{type:"added",content:" return value.trim().length > 0;",newLineNo:10},{type:"added",content:"}",newLineNo:11}]}],l=k.reduce((a,b)=>({additions:a.additions+b.additions,deletions:a.deletions+b.deletions}),{additions:0,deletions:0});function m(){let a=l.additions+l.deletions,c=a>0?l.additions/a*100:50;return(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsxs)("span",{className:"text-[11px] font-mono text-emerald-600 dark:text-emerald-400",children:["+",l.additions]}),(0,b.jsx)("div",{className:"h-1.5 flex-1 overflow-hidden rounded-full bg-gray-900/[0.06] dark:bg-white/[0.06]",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-emerald-500",style:{width:`${c}%`}})}),(0,b.jsxs)("span",{className:"text-[11px] font-mono text-red-600 dark:text-red-400",children:["-",l.deletions]})]})}let n={all:"전체",added:"추가",modified:"수정",deleted:"삭제",renamed:"이동"};function o({active:a,onChange:c}){let d=Object.keys(n);return(0,b.jsx)("div",{className:"flex gap-1 rounded-lg border border-gray-900/[0.06] bg-gray-900/[0.02] p-0.5 dark:border-white/[0.06] dark:bg-white/[0.02]",children:d.map(d=>(0,b.jsxs)("button",{type:"button",onClick:()=>c(d),className:["rounded-md px-2.5 py-1 text-[11px] font-medium transition-colors",a===d?"bg-white text-gray-900/70 shadow-sm dark:bg-white/[0.08] dark:text-white/70":"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60"].join(" "),children:[n[d],"all"!==d&&(0,b.jsx)("span",{className:"ml-1 opacity-50",children:k.filter(a=>a.changeType===d).length})]},d))})}a.s(["default",0,function(){let[a,e]=(0,d.useState)("all"),[f,g]=(0,d.useState)(!1),h="all"===a?k:k.filter(b=>b.changeType===a);return(0,b.jsx)("div",{className:"min-h-screen bg-[#faf8f5] px-4 py-8 dark:bg-[#07090e]",children:(0,b.jsxs)("div",{className:"mx-auto max-w-3xl",children:[(0,b.jsxs)("div",{className:"mb-6 flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)(c.default,{href:"/",className:"flex h-7 w-7 items-center justify-center rounded-lg border border-gray-900/[0.08] text-gray-900/30 transition-colors hover:border-gray-900/[0.15] hover:text-gray-900/60 dark:border-white/[0.08] dark:text-white/30 dark:hover:border-white/[0.15] dark:hover:text-white/60",children:(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-3.5 w-3.5",children:(0,b.jsx)("path",{fillRule:"evenodd",d:"M9.78 4.22a.75.75 0 010 1.06L7.06 8l2.72 2.72a.75.75 0 11-1.06 1.06L5.47 8.53a.75.75 0 010-1.06l3.25-3.25a.75.75 0 011.06 0z",clipRule:"evenodd"})})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-sm font-semibold text-gray-900/80 dark:text-white/80",children:"Diff 뷰어 테스트"}),(0,b.jsx)("p",{className:"text-[11px] text-gray-900/30 dark:text-white/30",children:"feat/auth-refactor → main"})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.03] px-2.5 py-1.5 dark:border-white/[0.07] dark:bg-white/[0.03]",children:[(0,b.jsxs)("span",{className:"text-[11px] text-gray-900/40 dark:text-white/40",children:[k.length,"개 파일"]}),(0,b.jsx)("span",{className:"text-gray-900/10 dark:text-white/10",children:"·"}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-emerald-600 dark:text-emerald-400",children:["+",l.additions]}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-red-600 dark:text-red-400",children:["-",l.deletions]})]})]}),(0,b.jsxs)("div",{className:"mb-4 rounded-xl border border-gray-900/[0.07] bg-white/60 p-4 dark:border-white/[0.07] dark:bg-white/[0.03]",children:[(0,b.jsx)("p",{className:"mb-2 text-[11px] font-medium text-gray-900/40 dark:text-white/40",children:"변경 통계"}),(0,b.jsx)(m,{})]}),(0,b.jsxs)("div",{className:"mb-3 flex items-center justify-between gap-3",children:[(0,b.jsx)(o,{active:a,onChange:e}),(0,b.jsxs)("button",{type:"button",onClick:()=>g(a=>!a),className:"flex items-center gap-1.5 rounded-lg border border-gray-900/[0.07] px-2.5 py-1 text-[11px] font-medium text-gray-900/35 transition-colors hover:border-gray-900/[0.13] hover:text-gray-900/70 dark:border-white/[0.07] dark:text-white/35 dark:hover:border-white/[0.13] dark:hover:text-white/70",children:[(0,b.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-3 w-3",children:f?(0,b.jsx)("path",{fillRule:"evenodd",d:"M4.22 6.22a.75.75 0 011.06 0L8 8.94l2.72-2.72a.75.75 0 111.06 1.06l-3.25 3.25a.75.75 0 01-1.06 0L4.22 7.28a.75.75 0 010-1.06z",clipRule:"evenodd"}):(0,b.jsx)("path",{fillRule:"evenodd",d:"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z",clipRule:"evenodd"})}),f?"모두 접기":"모두 펼치기"]})]}),0===h.length?(0,b.jsxs)("div",{className:"flex flex-col items-center gap-2 rounded-xl border border-gray-900/[0.06] py-12 text-center dark:border-white/[0.06]",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/15 dark:text-white/15",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12"})}),(0,b.jsx)("p",{className:"text-xs text-gray-900/30 dark:text-white/30",children:"해당 유형의 변경사항이 없습니다"})]}):(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:h.map(a=>(0,b.jsx)(j,{file:a,defaultOpen:f},`${a.filePath}-${String(f)}`))})]})})}],72841)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=apps_web_src_app_test_page_tsx_04ji_kt._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/app/test/page.tsx","../../../../../../apps/web/src/features/diff/ui/DiffHunk.tsx","../../../../../../apps/web/src/features/diff/ui/FileChangeBadge.tsx","../../../../../../apps/web/src/features/diff/ui/DiffFileRow.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useState } from \"react\";\n\nimport type { DiffFile } from \"@/features/diff/ui/DiffFileRow\";\nimport { DiffFileRow } from \"@/features/diff/ui/DiffFileRow\";\n\n// ─── Mock Data ────────────────────────────────────────────────────────────────\n\nconst MOCK_FILES: DiffFile[] = [\n {\n filePath: \"src/features/auth/hooks/useLogin.ts\",\n changeType: \"added\",\n additions: 42,\n deletions: 0,\n lines: [\n { type: \"hunk\", content: \"@@ -0,0 +1,42 @@\" },\n { type: \"added\", content: '\"use client\";', newLineNo: 1 },\n { type: \"added\", content: \"\", newLineNo: 2 },\n { type: \"added\", content: \"import { useState } from \\\"react\\\";\", newLineNo: 3 },\n { type: \"added\", content: \"\", newLineNo: 4 },\n { type: \"added\", content: \"export function useLogin() {\", newLineNo: 5 },\n { type: \"added\", content: \" const [loading, setLoading] = useState(false);\", newLineNo: 6 },\n { type: \"added\", content: \" const [error, setError] = useState<string | null>(null);\", newLineNo: 7 },\n { type: \"added\", content: \"\", newLineNo: 8 },\n { type: \"added\", content: \" const login = async (email: string, password: string) => {\", newLineNo: 9 },\n { type: \"added\", content: \" setLoading(true);\", newLineNo: 10 },\n { type: \"added\", content: \" try {\", newLineNo: 11 },\n { type: \"added\", content: \" await authApi.login({ email, password });\", newLineNo: 12 },\n { type: \"added\", content: \" } catch (e) {\", newLineNo: 13 },\n { type: \"added\", content: \" setError(e instanceof Error ? e.message : \\\"로그인 실패\\\");\", newLineNo: 14 },\n { type: \"added\", content: \" } finally {\", newLineNo: 15 },\n { type: \"added\", content: \" setLoading(false);\", newLineNo: 16 },\n { type: \"added\", content: \" }\", newLineNo: 17 },\n { type: \"added\", content: \" };\", newLineNo: 18 },\n { type: \"added\", content: \"\", newLineNo: 19 },\n { type: \"added\", content: \" return { loading, error, login };\", newLineNo: 20 },\n { type: \"added\", content: \"}\", newLineNo: 21 },\n ],\n },\n {\n filePath: \"src/features/auth/ui/LoginForm.tsx\",\n changeType: \"modified\",\n additions: 15,\n deletions: 8,\n lines: [\n { type: \"hunk\", content: \"@@ -12,18 +12,25 @@\" },\n { type: \"context\", content: \"export function LoginForm() {\", oldLineNo: 12, newLineNo: 12 },\n { type: \"context\", content: \" const { loading, error, login } = useLogin();\", oldLineNo: 13, newLineNo: 13 },\n { type: \"context\", content: \"\", oldLineNo: 14, newLineNo: 14 },\n { type: \"removed\", content: \" const [email, setEmail] = useState(\\\"\\\");\", oldLineNo: 15 },\n { type: \"removed\", content: \" const [password, setPassword] = useState(\\\"\\\");\", oldLineNo: 16 },\n { type: \"added\", content: \" const [form, setForm] = useState({ email: \\\"\\\", password: \\\"\\\" });\", newLineNo: 15 },\n { type: \"added\", content: \"\", newLineNo: 16 },\n { type: \"added\", content: \" const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\", newLineNo: 17 },\n { type: \"added\", content: \" setForm((prev) => ({ ...prev, [e.target.name]: e.target.value }));\", newLineNo: 18 },\n { type: \"added\", content: \" };\", newLineNo: 19 },\n { type: \"context\", content: \"\", oldLineNo: 17, newLineNo: 20 },\n { type: \"context\", content: \" const handleSubmit = async (e: React.FormEvent) => {\", oldLineNo: 18, newLineNo: 21 },\n { type: \"context\", content: \" e.preventDefault();\", oldLineNo: 19, newLineNo: 22 },\n { type: \"removed\", content: \" await login(email, password);\", oldLineNo: 20 },\n { type: \"added\", content: \" await login(form.email, form.password);\", newLineNo: 23 },\n { type: \"context\", content: \" };\", oldLineNo: 21, newLineNo: 24 },\n ],\n },\n {\n filePath: \"src/features/auth/api/auth.api.ts\",\n changeType: \"modified\",\n additions: 6,\n deletions: 2,\n lines: [\n { type: \"hunk\", content: \"@@ -28,10 +28,14 @@\" },\n { type: \"context\", content: \"export async function login(dto: LoginDto) {\", oldLineNo: 28, newLineNo: 28 },\n { type: \"context\", content: \" const res = await fetch(`${SERVER_URL}/auth/login`, {\", oldLineNo: 29, newLineNo: 29 },\n { type: \"context\", content: \" method: \\\"POST\\\",\", oldLineNo: 30, newLineNo: 30 },\n { type: \"removed\", content: \" body: JSON.stringify(dto),\", oldLineNo: 31 },\n { type: \"added\", content: \" headers: { \\\"Content-Type\\\": \\\"application/json\\\" },\", newLineNo: 31 },\n { type: \"added\", content: \" body: JSON.stringify(dto),\", newLineNo: 32 },\n { type: \"context\", content: \" });\", oldLineNo: 32, newLineNo: 33 },\n { type: \"removed\", content: \" if (!res.ok) throw new Error(\\\"HTTP \\\" + res.status);\", oldLineNo: 33 },\n { type: \"added\", content: \" if (!res.ok) {\", newLineNo: 34 },\n { type: \"added\", content: \" const body = await res.json().catch(() => ({}));\", newLineNo: 35 },\n { type: \"added\", content: \" throw new Error(body.message ?? `HTTP ${res.status}`);\", newLineNo: 36 },\n { type: \"added\", content: \" }\", newLineNo: 37 },\n { type: \"context\", content: \" return res.json();\", oldLineNo: 34, newLineNo: 38 },\n { type: \"context\", content: \"}\", oldLineNo: 35, newLineNo: 39 },\n ],\n },\n {\n filePath: \"src/features/auth/utils/validators.ts\",\n changeType: \"deleted\",\n additions: 0,\n deletions: 18,\n lines: [\n { type: \"hunk\", content: \"@@ -1,18 +0,0 @@\" },\n { type: \"removed\", content: \"export function validateEmail(email: string) {\", oldLineNo: 1 },\n { type: \"removed\", content: \" return /^[^@]+@[^@]+\\\\.[^@]+$/.test(email);\", oldLineNo: 2 },\n { type: \"removed\", content: \"}\", oldLineNo: 3 },\n { type: \"removed\", content: \"\", oldLineNo: 4 },\n { type: \"removed\", content: \"export function validatePassword(password: string) {\", oldLineNo: 5 },\n { type: \"removed\", content: \" return password.length >= 8;\", oldLineNo: 6 },\n { type: \"removed\", content: \"}\", oldLineNo: 7 },\n ],\n },\n {\n filePath: \"src/features/auth/utils/validation.ts\",\n changeType: \"renamed\",\n additions: 4,\n deletions: 0,\n lines: [\n { type: \"hunk\", content: \"@@ -0,0 +1,12 @@ (validators.ts → validation.ts)\" },\n { type: \"context\", content: \"export function validateEmail(email: string) {\", oldLineNo: 1, newLineNo: 1 },\n { type: \"context\", content: \" return /^[^@]+@[^@]+\\\\.[^@]+$/.test(email);\", oldLineNo: 2, newLineNo: 2 },\n { type: \"context\", content: \"}\", oldLineNo: 3, newLineNo: 3 },\n { type: \"context\", content: \"\", oldLineNo: 4, newLineNo: 4 },\n { type: \"context\", content: \"export function validatePassword(password: string) {\", oldLineNo: 5, newLineNo: 5 },\n { type: \"context\", content: \" return password.length >= 8;\", oldLineNo: 6, newLineNo: 6 },\n { type: \"context\", content: \"}\", oldLineNo: 7, newLineNo: 7 },\n { type: \"added\", content: \"\", newLineNo: 8 },\n { type: \"added\", content: \"export function validateRequired(value: string) {\", newLineNo: 9 },\n { type: \"added\", content: \" return value.trim().length > 0;\", newLineNo: 10 },\n { type: \"added\", content: \"}\", newLineNo: 11 },\n ],\n },\n];\n\nconst STATS = MOCK_FILES.reduce(\n (acc, f) => ({ additions: acc.additions + f.additions, deletions: acc.deletions + f.deletions }),\n { additions: 0, deletions: 0 },\n);\n\n// ─── DiffSummaryBar ───────────────────────────────────────────────────────────\n\nfunction DiffSummaryBar() {\n const total = STATS.additions + STATS.deletions;\n const addRatio = total > 0 ? (STATS.additions / total) * 100 : 50;\n\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-[11px] font-mono text-emerald-600 dark:text-emerald-400\">\n +{STATS.additions}\n </span>\n <div className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-gray-900/[0.06] dark:bg-white/[0.06]\">\n <div\n className=\"h-full rounded-full bg-emerald-500\"\n style={{ width: `${addRatio}%` }}\n />\n </div>\n <span className=\"text-[11px] font-mono text-red-600 dark:text-red-400\">\n -{STATS.deletions}\n </span>\n </div>\n );\n}\n\n// ─── FilterBar ────────────────────────────────────────────────────────────────\n\ntype FilterType = \"all\" | \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n\nconst FILTER_LABELS: Record<FilterType, string> = {\n all: \"전체\",\n added: \"추가\",\n modified: \"수정\",\n deleted: \"삭제\",\n renamed: \"이동\",\n};\n\ninterface FilterBarProps {\n active: FilterType;\n onChange: (f: FilterType) => void;\n}\n\nfunction FilterBar({ active, onChange }: FilterBarProps) {\n const filters = (Object.keys(FILTER_LABELS) as FilterType[]);\n return (\n <div className=\"flex gap-1 rounded-lg border border-gray-900/[0.06] bg-gray-900/[0.02] p-0.5 dark:border-white/[0.06] dark:bg-white/[0.02]\">\n {filters.map((f) => (\n <button\n key={f}\n type=\"button\"\n onClick={() => onChange(f)}\n className={[\n \"rounded-md px-2.5 py-1 text-[11px] font-medium transition-colors\",\n active === f\n ? \"bg-white text-gray-900/70 shadow-sm dark:bg-white/[0.08] dark:text-white/70\"\n : \"text-gray-900/35 hover:text-gray-900/60 dark:text-white/35 dark:hover:text-white/60\",\n ].join(\" \")}\n >\n {FILTER_LABELS[f]}\n {f !== \"all\" && (\n <span className=\"ml-1 opacity-50\">\n {MOCK_FILES.filter((file) => file.changeType === f).length}\n </span>\n )}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Page ─────────────────────────────────────────────────────────────────────\n\nexport default function DiffTestPage() {\n const [filter, setFilter] = useState<FilterType>(\"all\");\n const [expandAll, setExpandAll] = useState(false);\n\n const filtered = filter === \"all\"\n ? MOCK_FILES\n : MOCK_FILES.filter((f) => f.changeType === filter);\n\n return (\n <div className=\"min-h-screen bg-[#faf8f5] px-4 py-8 dark:bg-[#07090e]\">\n <div className=\"mx-auto max-w-3xl\">\n\n {/* 헤더 */}\n <div className=\"mb-6 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Link\n href=\"/\"\n className=\"flex h-7 w-7 items-center justify-center rounded-lg border border-gray-900/[0.08] text-gray-900/30 transition-colors hover:border-gray-900/[0.15] hover:text-gray-900/60 dark:border-white/[0.08] dark:text-white/30 dark:hover:border-white/[0.15] dark:hover:text-white/60\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-3.5 w-3.5\">\n <path fillRule=\"evenodd\" d=\"M9.78 4.22a.75.75 0 010 1.06L7.06 8l2.72 2.72a.75.75 0 11-1.06 1.06L5.47 8.53a.75.75 0 010-1.06l3.25-3.25a.75.75 0 011.06 0z\" clipRule=\"evenodd\" />\n </svg>\n </Link>\n <div>\n <h1 className=\"text-sm font-semibold text-gray-900/80 dark:text-white/80\">\n Diff 뷰어 테스트\n </h1>\n <p className=\"text-[11px] text-gray-900/30 dark:text-white/30\">\n feat/auth-refactor → main\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1.5 rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.03] px-2.5 py-1.5 dark:border-white/[0.07] dark:bg-white/[0.03]\">\n <span className=\"text-[11px] text-gray-900/40 dark:text-white/40\">\n {MOCK_FILES.length}개 파일\n </span>\n <span className=\"text-gray-900/10 dark:text-white/10\">·</span>\n <span className=\"font-mono text-[11px] text-emerald-600 dark:text-emerald-400\">\n +{STATS.additions}\n </span>\n <span className=\"font-mono text-[11px] text-red-600 dark:text-red-400\">\n -{STATS.deletions}\n </span>\n </div>\n </div>\n\n {/* 통계 바 */}\n <div className=\"mb-4 rounded-xl border border-gray-900/[0.07] bg-white/60 p-4 dark:border-white/[0.07] dark:bg-white/[0.03]\">\n <p className=\"mb-2 text-[11px] font-medium text-gray-900/40 dark:text-white/40\">변경 통계</p>\n <DiffSummaryBar />\n </div>\n\n {/* 툴바 */}\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <FilterBar active={filter} onChange={setFilter} />\n <button\n type=\"button\"\n onClick={() => setExpandAll((p) => !p)}\n className=\"flex items-center gap-1.5 rounded-lg border border-gray-900/[0.07] px-2.5 py-1 text-[11px] font-medium text-gray-900/35 transition-colors hover:border-gray-900/[0.13] hover:text-gray-900/70 dark:border-white/[0.07] dark:text-white/35 dark:hover:border-white/[0.13] dark:hover:text-white/70\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className=\"h-3 w-3\">\n {expandAll ? (\n <path fillRule=\"evenodd\" d=\"M4.22 6.22a.75.75 0 011.06 0L8 8.94l2.72-2.72a.75.75 0 111.06 1.06l-3.25 3.25a.75.75 0 01-1.06 0L4.22 7.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n ) : (\n <path fillRule=\"evenodd\" d=\"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n )}\n </svg>\n {expandAll ? \"모두 접기\" : \"모두 펼치기\"}\n </button>\n </div>\n\n {/* 파일 목록 */}\n {filtered.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 rounded-xl border border-gray-900/[0.06] py-12 text-center dark:border-white/[0.06]\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" className=\"h-8 w-8 text-gray-900/15 dark:text-white/15\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12\" />\n </svg>\n <p className=\"text-xs text-gray-900/30 dark:text-white/30\">해당 유형의 변경사항이 없습니다</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n {filtered.map((file) => (\n <DiffFileRow\n key={`${file.filePath}-${String(expandAll)}`}\n file={file}\n defaultOpen={expandAll}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nexport interface DiffLine {\n type: \"context\" | \"added\" | \"removed\" | \"hunk\";\n content: string;\n oldLineNo?: number;\n newLineNo?: number;\n}\n\ninterface Props {\n lines: DiffLine[];\n}\n\nconst LINE_STYLE: Record<DiffLine[\"type\"], string> = {\n context: \"text-gray-900/50 dark:text-white/40\",\n added: \"bg-emerald-500/[0.08] text-emerald-700 dark:text-emerald-400\",\n removed: \"bg-red-500/[0.08] text-red-700 dark:text-red-400\",\n hunk: \"text-purple-500/70 dark:text-purple-400/70\",\n};\n\nconst LINE_NO_STYLE: Record<DiffLine[\"type\"], string> = {\n context: \"text-gray-900/15 dark:text-white/15\",\n added: \"text-emerald-600/40 dark:text-emerald-400/40\",\n removed: \"text-red-600/40 dark:text-red-400/40\",\n hunk: \"text-purple-500/30 dark:text-purple-400/30\",\n};\n\nexport function DiffHunk({ lines }: Props) {\n return (\n <div className=\"overflow-x-auto rounded-lg bg-gray-950/[0.03] dark:bg-white/[0.03]\">\n <table className=\"w-full border-collapse font-mono text-[11px] leading-relaxed\">\n <tbody>\n {lines.map((line, i) => (\n <tr key={i} className={LINE_STYLE[line.type]}>\n {line.type === \"hunk\" ? (\n <td colSpan={3} className=\"px-3 py-0.5 text-purple-500/70 dark:text-purple-400/70 select-none\">\n {line.content}\n </td>\n ) : (\n <>\n <td className={`w-10 select-none px-2 py-0.5 text-right ${LINE_NO_STYLE[line.type]}`}>\n {line.oldLineNo ?? \"\"}\n </td>\n <td className={`w-10 select-none px-2 py-0.5 text-right ${LINE_NO_STYLE[line.type]}`}>\n {line.newLineNo ?? \"\"}\n </td>\n <td className=\"px-3 py-0.5 whitespace-pre\">\n <span className=\"mr-1 select-none opacity-50\">\n {line.type === \"added\" ? \"+\" : line.type === \"removed\" ? \"-\" : \" \"}\n </span>\n {line.content}\n </td>\n </>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nexport type ChangeType = \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n\nconst CONFIG: Record<ChangeType, { label: string; className: string }> = {\n added: { label: \"추가\", className: \"bg-emerald-500/10 text-emerald-600 border-emerald-500/20 dark:text-emerald-400\" },\n modified: { label: \"수정\", className: \"bg-blue-500/10 text-blue-600 border-blue-500/20 dark:text-blue-400\" },\n deleted: { label: \"삭제\", className: \"bg-red-500/10 text-red-600 border-red-500/20 dark:text-red-400\" },\n renamed: { label: \"이동\", className: \"bg-amber-500/10 text-amber-600 border-amber-500/20 dark:text-amber-400\" },\n};\n\ninterface Props {\n type: ChangeType;\n}\n\nexport function FileChangeBadge({ type }: Props) {\n const { label, className } = CONFIG[type];\n return (\n <span className={`inline-flex items-center rounded-md border px-1.5 py-0.5 text-[10px] font-medium ${className}`}>\n {label}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\n\nimport type { DiffLine } from \"./DiffHunk\";\nimport { DiffHunk } from \"./DiffHunk\";\nimport type { ChangeType } from \"./FileChangeBadge\";\nimport { FileChangeBadge } from \"./FileChangeBadge\";\n\nexport interface DiffFile {\n filePath: string;\n changeType: ChangeType;\n additions: number;\n deletions: number;\n lines: DiffLine[];\n}\n\ninterface Props {\n file: DiffFile;\n defaultOpen?: boolean;\n}\n\nexport function DiffFileRow({ file, defaultOpen = false }: Props) {\n const [open, setOpen] = useState(defaultOpen);\n\n const fileName = file.filePath.split(\"/\").pop() ?? file.filePath;\n const dirName = file.filePath.includes(\"/\")\n ? file.filePath.slice(0, file.filePath.lastIndexOf(\"/\"))\n : \"\";\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-gray-900/[0.07] dark:border-white/[0.07]\">\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left hover:bg-gray-900/[0.02] dark:hover:bg-white/[0.02]\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={`h-3 w-3 shrink-0 text-gray-900/20 transition-transform dark:text-white/20 ${open ? \"rotate-90\" : \"\"}`}\n >\n <path fillRule=\"evenodd\" d=\"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n </svg>\n\n <FileChangeBadge type={file.changeType} />\n\n <span className=\"min-w-0 flex-1 truncate text-[12px]\">\n {dirName && <span className=\"text-gray-900/30 dark:text-white/30\">{dirName}/</span>}\n <span className=\"font-medium text-gray-900/70 dark:text-white/70\">{fileName}</span>\n </span>\n\n <span className=\"shrink-0 text-[10px] font-mono\">\n {file.additions > 0 && (\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{file.additions}</span>\n )}\n {file.additions > 0 && file.deletions > 0 && (\n <span className=\"mx-0.5 text-gray-900/15 dark:text-white/15\">/</span>\n )}\n {file.deletions > 0 && (\n <span className=\"text-red-600 dark:text-red-400\">-{file.deletions}</span>\n )}\n </span>\n </button>\n\n {open && file.lines.length > 0 && (\n <div className=\"border-t border-gray-900/[0.05] dark:border-white/[0.05]\">\n <DiffHunk lines={file.lines} />\n </div>\n )}\n </div>\n );\n}\n"],"names":["LINE_STYLE","context","added","removed","hunk","LINE_NO_STYLE","DiffHunk","lines","className","map","line","i","type","colSpan","content","oldLineNo","newLineNo"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[62424,a=>{"use strict";var b=a.i(47077);async function c(a){let c=await fetch(`${b.SERVER_URL}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!c.ok)throw Error(`HTTP ${c.status}`);return c.json()}async function d(){let a=await fetch(`${b.SERVER_URL}/tasks`);if(!a.ok)throw Error(`HTTP ${a.status}`);return a.json()}async function e(a){let c=await fetch(`${b.SERVER_URL}/tasks/${a}`);if(!c.ok)throw Error(`HTTP ${c.status}`);return c.json()}async function f(a,c){let d=await fetch(`${b.SERVER_URL}/tasks/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!d.ok)throw Error(`HTTP ${d.status}`);return d.json()}async function g(a){let c=await fetch(`${b.SERVER_URL}/tasks/${a}/archive`,{method:"POST"});if(!c.ok)throw Error(`HTTP ${c.status}`)}async function h(a){let c=await fetch(`${b.SERVER_URL}/tasks/${a}`,{method:"DELETE"});if(!c.ok)throw Error(`HTTP ${c.status}`)}async function i(a,c=[]){let d=await fetch(`${b.SERVER_URL}/tasks/${a}/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({agentTestCodePreferences:c})});if(!d.ok)throw Error(`HTTP ${d.status}`);return d.json()}async function j(a){let c=await fetch(`${b.SERVER_URL}/tasks/${a}/stop`,{method:"POST"});if(!c.ok)throw Error(`HTTP ${c.status}`);return c.json()}async function k(a){let c=await fetch(`${b.SERVER_URL}/tasks/${a}/runs`);if(!c.ok)throw Error(`HTTP ${c.status}`);return c.json()}async function l(a){let c=await fetch(`${b.SERVER_URL}/conversations/session/${a}`);if(!c.ok)throw Error(`HTTP ${c.status}`);return c.json()}async function m(a,c,d){let e=await fetch(`${b.SERVER_URL}/tasks/${a}/rerun`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({supplementNote:c,writeTestCode:d})});if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}async function n(a,c,d,e){let f=await fetch(`${b.SERVER_URL}/tasks/${a}/agents/${c}/rerun`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({supplementNote:d,writeTestCode:e})});if(!f.ok)throw Error(`HTTP ${f.status}`);return f.json()}a.s(["archiveTask",0,g,"createTask",0,c,"deleteTask",0,h,"executeTask",0,i,"fetchTask",0,e,"fetchTaskConversations",0,l,"fetchTaskRuns",0,k,"fetchTasks",0,d,"rerunTask",0,m,"rerunTaskAgent",0,n,"stopTask",0,j,"updateTask",0,f])},182,a=>{"use strict";var b=a.i(47077);async function c(a,c){let d=await fetch(`${b.SERVER_URL}/tasks/${a}/changelog`,{signal:c});if(!d.ok)throw Error(`HTTP ${d.status}`);return d.json()}async function d(a,c,d){let e=await fetch(`${b.SERVER_URL}/tasks/${a}/runs/${c}/changelog`,{signal:d});if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}async function e(a,c){let d=await fetch(`${b.SERVER_URL}/tasks/${a}/agents/${c}/merge`,{method:"POST"});if(!d.ok)throw Error(`HTTP ${d.status}`);return d.json()}async function f(a,c,d){let e=await fetch(`${b.SERVER_URL}/tasks/${a}/agents/${c}/merge-file`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:d})});if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}a.s(["fetchTaskChangelog",0,c,"fetchTaskRunChangelog",0,d,"mergeAgentAll",0,e,"mergeAgentFile",0,f])},24149,a=>{"use strict";let b;var c=a.i(87924),d=a.i(72131),e=a.i(81937);let f=a=>{let b,c=new Set,d=(a,d)=>{let e="function"==typeof a?a(b):a;if(!Object.is(e,b)){let a=b;b=(null!=d?d:"object"!=typeof e||null===e)?e:Object.assign({},b,e),c.forEach(c=>c(b,a))}},e=()=>b,f={setState:d,getState:e,getInitialState:()=>g,subscribe:a=>(c.add(a),()=>c.delete(a))},g=b=a(d,e,f);return f},g=a=>{let b=a?f(a):f,c=a=>(function(a,b=a=>a){let c=d.default.useSyncExternalStore(a.subscribe,d.default.useCallback(()=>b(a.getState()),[a,b]),d.default.useCallback(()=>b(a.getInitialState()),[a,b]));return d.default.useDebugValue(c),c})(b,a);return Object.assign(c,b),c};var h=a.i(28467);let i=(b=a=>({statusByAgent:{claude:"disconnected",gemini:"disconnected",codex:"disconnected",opencode:"disconnected"},loading:!1,refresh:async()=>{a({loading:!0});let[b,c,d]=await Promise.allSettled([(0,h.getAuthStatus)(),(0,h.getGeminiAuthStatus)(),(0,h.getCodexAuthStatus)()]);a({loading:!1,statusByAgent:{claude:"fulfilled"===b.status&&b.value.loggedIn?"connected":"disconnected",gemini:"fulfilled"===c.status&&c.value.loggedIn&&c.value.installed?"connected":"disconnected",codex:"fulfilled"===d.status&&d.value.loggedIn&&d.value.installed?"connected":"disconnected",opencode:"disconnected"}})}}))?g(b):g,j=[{id:"claude",name:"Claude Code",vendor:"Anthropic",description:"코드 작성, 디버깅, 리팩터링을 위한 AI 어시스턴트",available:!0,iconBg:"bg-orange-500/[0.10]",hoverBorder:"hover:border-orange-500/30",hoverBg:"hover:bg-orange-500/[0.04]",icon:(0,c.jsx)(()=>(0,c.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-6 w-6 text-[#D97757]",children:(0,c.jsx)("path",{d:"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z"})}),{})},{id:"gemini",name:"Gemini CLI",vendor:"Google",description:"Google Gemini 기반 코딩 어시스턴트",available:!0,iconBg:"bg-blue-500/[0.08]",hoverBorder:"hover:border-blue-500/20",hoverBg:"hover:bg-blue-500/[0.03]",icon:(0,c.jsx)(()=>(0,c.jsxs)("svg",{viewBox:"0 0 24 24",className:"h-6 w-6","aria-hidden":"true",children:[(0,c.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,c.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,c.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,c.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"})]}),{})},{id:"codex",name:"Codex CLI",vendor:"OpenAI",description:"OpenAI Codex 기반 터미널 에이전트",available:!0,iconBg:"bg-gray-900/[0.05] dark:bg-white/[0.06]",hoverBorder:"hover:border-gray-900/20 dark:hover:border-white/20",hoverBg:"hover:bg-gray-900/[0.03] dark:hover:bg-white/[0.03]",icon:(0,c.jsx)(()=>(0,c.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-6 w-6 text-gray-900 dark:text-white",children:(0,c.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.9 6.065 6.065 0 0 0-10.75 2.918 5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.985 5.985 0 0 0 .511 4.91 6.046 6.046 0 0 0 6.515 2.9 5.985 5.985 0 0 0 4.514 2.012 6.046 6.046 0 0 0 5.772-4.206 5.985 5.985 0 0 0 3.998-2.9 6.046 6.046 0 0 0-.747-7.071zM13.26 21.4a4.476 4.476 0 0 1-2.876-1.041l.141-.08 4.779-2.758a.775.775 0 0 0 .393-.681v-6.737l2.02 1.169a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.495 4.493zM3.6 17.275a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.775.775 0 0 0 .781 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-2.675zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973v5.701a.77.77 0 0 0 .388.677l5.815 3.354-2.02 1.169a.076.076 0 0 1-.071 0l-4.83-2.787A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.843-3.354 2.02-1.169a.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-.402-.695zm2.01-3.023-.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.135-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.775.775 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5Z"})}),{})},{id:"opencode",name:"OpenCode",vendor:"OpenCode",description:"오픈소스 AI 코딩 에이전트",available:!1,iconBg:"bg-emerald-500/[0.08]",hoverBorder:"hover:border-emerald-500/20",hoverBg:"hover:bg-emerald-500/[0.03]",icon:(0,c.jsx)(()=>(0,c.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",className:"h-6 w-6 text-emerald-500",children:[(0,c.jsx)("polyline",{points:"16 18 22 12 16 6"}),(0,c.jsx)("polyline",{points:"8 6 2 12 8 18"}),(0,c.jsx)("line",{x1:"12",y1:"4",x2:"12",y2:"20",strokeWidth:"1.4",strokeDasharray:"2 2"})]}),{})}];function k({agent:a,connectionStatus:b,onSelect:d}){let e=a.available&&"connected"===b;return(0,c.jsxs)("button",{onClick:()=>e&&d(a.id),disabled:!e,className:["group relative flex w-full items-center gap-4 rounded-xl border p-4 text-left transition-all duration-200 border-gray-900/[0.07] bg-gray-900/[0.02] dark:border-white/[0.07] dark:bg-white/[0.02]",e?`cursor-pointer ${a.hoverBorder} ${a.hoverBg}`:"cursor-not-allowed opacity-45"].join(" "),children:[(0,c.jsx)("span",{className:["flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-gray-900/[0.06] dark:border-white/[0.06]",a.iconBg].join(" "),children:a.icon}),(0,c.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,c.jsxs)("div",{className:"flex items-center gap-2",children:[(0,c.jsx)("span",{className:"text-sm font-semibold text-gray-900/85 dark:text-white/85",children:a.name}),(0,c.jsx)("span",{className:"text-[10px] font-medium text-gray-900/25 dark:text-white/25",children:a.vendor})]}),(0,c.jsx)("p",{className:"mt-0.5 text-xs text-gray-900/40 dark:text-white/40",children:a.description})]}),(0,c.jsx)("div",{className:"shrink-0",children:a.available?"connected"===b?(0,c.jsxs)("span",{className:"flex items-center gap-1 rounded-full border border-emerald-500/25 bg-emerald-500/[0.08] px-2.5 py-1 text-[11px] font-medium text-emerald-600 dark:text-emerald-400",children:[(0,c.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-500"}),"사용 가능"]}):"connecting"===b?(0,c.jsxs)("span",{className:"flex items-center gap-1 rounded-full border border-amber-500/25 bg-amber-500/[0.08] px-2.5 py-1 text-[11px] font-medium text-amber-600 dark:text-amber-400",children:[(0,c.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-amber-500"}),"연결 중"]}):(0,c.jsx)("span",{className:"rounded-full border border-gray-900/[0.06] bg-gray-900/[0.03] px-2.5 py-1 text-[11px] font-medium text-gray-900/30 dark:border-white/[0.06] dark:bg-white/[0.03] dark:text-white/30",children:"연결 끊김"}):(0,c.jsx)("span",{className:"rounded-full border border-gray-900/[0.06] bg-gray-900/[0.03] px-2.5 py-1 text-[11px] font-medium text-gray-900/30 dark:border-white/[0.06] dark:bg-white/[0.03] dark:text-white/30",children:"준비 중"})}),e&&(0,c.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:"h-3.5 w-3.5 shrink-0 text-gray-900/20 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-gray-900/50 dark:text-white/20 dark:group-hover:text-white/50",children:(0,c.jsx)("path",{fillRule:"evenodd",d:"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z",clipRule:"evenodd"})})]})}let l={claude:{bg:"bg-[#D97757]",icon:(0,c.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 text-white",children:(0,c.jsx)("path",{d:"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z"})})},gemini:{bg:"bg-white dark:bg-gray-800",icon:(0,c.jsxs)("svg",{viewBox:"0 0 24 24",className:"h-5 w-5","aria-hidden":"true",children:[(0,c.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,c.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,c.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,c.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"})]})},codex:{bg:"bg-gray-900 dark:bg-white",icon:(0,c.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5 text-white dark:text-gray-900",children:(0,c.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.9 6.065 6.065 0 0 0-10.75 2.918 5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.985 5.985 0 0 0 .511 4.91 6.046 6.046 0 0 0 6.515 2.9 5.985 5.985 0 0 0 4.514 2.012 6.046 6.046 0 0 0 5.772-4.206 5.985 5.985 0 0 0 3.998-2.9 6.046 6.046 0 0 0-.747-7.071zM13.26 21.4a4.476 4.476 0 0 1-2.876-1.041l.141-.08 4.779-2.758a.775.775 0 0 0 .393-.681v-6.737l2.02 1.169a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.495 4.493zM3.6 17.275a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.775.775 0 0 0 .781 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-2.675zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973v5.701a.77.77 0 0 0 .388.677l5.815 3.354-2.02 1.169a.076.076 0 0 1-.071 0l-4.83-2.787A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.843-3.354 2.02-1.169a.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-.402-.695zm2.01-3.023-.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.135-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.775.775 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5Z"})})},opencode:{bg:"bg-emerald-600",icon:(0,c.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",className:"h-5 w-5 text-white",children:[(0,c.jsx)("polyline",{points:"16 18 22 12 16 6"}),(0,c.jsx)("polyline",{points:"8 6 2 12 8 18"}),(0,c.jsx)("line",{x1:"12",y1:"4",x2:"12",y2:"20",strokeWidth:"1.4",strokeDasharray:"2 2"})]})}};a.s(["AGENT_AVATAR",0,l,"AGENT_META",0,{claude:{label:"Claude Code",dotColor:"bg-orange-400"},gemini:{label:"Gemini CLI",dotColor:"bg-blue-400"},codex:{label:"Codex CLI",dotColor:"bg-gray-400"},opencode:{label:"OpenCode",dotColor:"bg-emerald-400"}},"AgentSelectModal",0,function({open:a,onClose:b,onSelect:f,connectionStatusByAgent:g}){let{statusByAgent:h,refresh:l}=i();(0,d.useEffect)(()=>{a&&l()},[a,l]);let m=g??h;return(0,c.jsx)(e.Modal,{open:a,onClose:b,title:"에이전트 선택",maxWidth:"max-w-md",zIndex:"z-[60]",children:(0,c.jsx)("div",{className:"flex flex-col gap-2.5",children:j.map(a=>(0,c.jsx)(k,{agent:a,connectionStatus:m[a.id]??"disconnected",onSelect:a=>{f(a),b()}},a.id))})})}],24149)},15295,a=>{"use strict";var b=a.i(87924),c=a.i(24149);let d=[{value:"frontend",label:"Frontend",active:"border-blue-500/50 bg-blue-500/[0.12] text-blue-700 dark:text-blue-300",badge:"border-blue-500/40 bg-blue-500/[0.08] text-blue-700 dark:text-blue-300"},{value:"backend",label:"Backend",active:"border-emerald-500/50 bg-emerald-500/[0.12] text-emerald-700 dark:text-emerald-300",badge:"border-emerald-500/40 bg-emerald-500/[0.08] text-emerald-700 dark:text-emerald-300"},{value:"doc",label:"Doc",active:"border-purple-500/50 bg-purple-500/[0.12] text-purple-700 dark:text-purple-300",badge:"border-purple-500/40 bg-purple-500/[0.08] text-purple-700 dark:text-purple-300"},{value:"operation",label:"Operation",active:"border-amber-500/50 bg-amber-500/[0.12] text-amber-700 dark:text-amber-300",badge:"border-amber-500/40 bg-amber-500/[0.08] text-amber-700 dark:text-amber-300"},{value:"other",label:"Other",active:"border-gray-900/[0.2] bg-gray-900/[0.07] text-gray-700 dark:border-white/[0.2] dark:bg-white/[0.07] dark:text-white/70",badge:"border-gray-900/[0.12] bg-gray-900/[0.05] text-gray-600 dark:border-white/[0.12] dark:bg-white/[0.05] dark:text-white/50"}];a.s(["AgentRoleBadge",0,function({role:a,customRole:c}){let e=d.find(b=>b.value===a),f="other"===a?c??"Other":e?.label??a,g=e?.badge??"border-gray-900/[0.12] bg-gray-900/[0.05] text-gray-600 dark:border-white/[0.12] dark:bg-white/[0.05] dark:text-white/50";return(0,b.jsx)("span",{className:`rounded-full border px-2.5 py-0.5 text-xs font-medium ${g}`,children:f})},"AgentRow",0,function({agent:a,onChange:e,onRemove:f}){let g=c.AGENT_META[a.agentType];return(0,b.jsxs)("div",{className:"flex flex-col gap-2 rounded-xl border border-gray-900/[0.07] bg-gray-900/[0.02] p-3 dark:border-white/[0.07] dark:bg-white/[0.02]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{className:`h-2 w-2 rounded-full ${g.dotColor}`}),(0,b.jsx)("span",{className:"text-xs font-semibold text-gray-900/60 dark:text-white/60",children:g.label})]}),(0,b.jsx)("button",{type:"button",onClick:f,className:"shrink-0 text-gray-900/20 transition-colors hover:text-red-500 dark:text-white/20 dark:hover:text-red-400","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:"flex flex-wrap gap-1.5",children:d.map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>e({role:c.value}),className:["rounded-full border px-3 py-0.5 text-xs font-medium transition-all",a.role===c.value?c.active:"border-gray-900/[0.07] text-gray-900/25 hover:border-gray-900/[0.13] hover:text-gray-900/50 dark:border-white/[0.07] dark:text-white/25 dark:hover:border-white/[0.13] dark:hover:text-white/50"].join(" "),children:c.label},c.value))}),"other"===a.role&&(0,b.jsx)("input",{type:"text",value:a.customRole,onChange:a=>e({customRole:a.target.value}),placeholder:"역할을 직접 입력하세요",className:"w-full rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.03] px-3 py-1.5 text-xs text-gray-900/70 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/[0.15] dark:border-white/[0.07] dark:bg-white/[0.03] dark:text-white/70 dark:placeholder-white/20 dark:focus:border-white/[0.15]"}),"frontend"===a.role&&(0,b.jsx)("p",{className:"text-[10px] text-blue-600/60 dark:text-blue-400/50",children:"UI 구현 · 컴포넌트 개발 · 스타일링"}),"backend"===a.role&&(0,b.jsx)("p",{className:"text-[10px] text-emerald-600/60 dark:text-emerald-400/50",children:"API 개발 · DB 설계 · 서버 로직"})]})}])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=apps_web_src_features_02y94.o._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../apps/web/src/features/tasks/api/tasks.api.ts","../../../../../../apps/web/src/features/tasks/api/changelog.api.ts","../../../../../../apps/web/src/features/chat/ui/AgentSelectModal.tsx","../../../../../../node_modules/zustand/esm/vanilla.mjs","../../../../../../node_modules/zustand/esm/react.mjs","../../../../../../apps/web/src/store/agentStatusStore.ts","../../../../../../apps/web/src/features/tasks/ui/AgentRoleSelect.tsx"],"sourcesContent":["import { SERVER_URL } from \"@/lib/constants\";\n\nexport type AgentRole = \"frontend\" | \"backend\" | \"doc\" | \"operation\" | \"other\";\n\nexport interface TaskAgentRun {\n id: number;\n agentId: number;\n status: string;\n worktreePath: string | null;\n startCommitHash: string | null;\n durationMs: number | null;\n costUsd: number | null;\n}\n\nexport interface TaskRun {\n id: number;\n version: number;\n supplementNote: string | null;\n status: string;\n startedAt: string;\n completedAt: string | null;\n agentRuns: TaskAgentRun[];\n}\n\nexport interface TaskConversation {\n id: string;\n sessionId: string;\n promptId: string;\n agentId: number | null;\n runId: number | null;\n content: string;\n agentModel: string;\n type: \"user_message\" | \"agent_message\";\n createdAt: string;\n}\n\nexport type TaskStatus = \"pending\" | \"running\" | \"stopped\" | \"completed\" | \"error\";\nexport type AgentStatus = \"pending\" | \"running\" | \"stopped\" | \"completed\" | \"error\";\n\nexport interface TaskRequirement {\n id: number;\n content: string;\n status: string;\n orderIndex: number;\n}\n\nexport type AgentType = \"claude\" | \"gemini\" | \"codex\" | \"opencode\";\n\nexport interface TaskAgent {\n id: number;\n agentType: AgentType;\n role: AgentRole;\n customRole: string | null;\n status: AgentStatus;\n claudeSessionId?: string | null;\n}\n\nexport interface Task {\n id: string;\n title: string;\n status: TaskStatus;\n workingDir: string | null;\n requirements: TaskRequirement[];\n agents: TaskAgent[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateTaskPayload {\n title: string;\n workingDir?: string;\n requirements: { content: string; orderIndex: number }[];\n agents: { agentType: AgentType; role: AgentRole; customRole?: string }[];\n}\n\nexport type UpdateTaskPayload = Partial<CreateTaskPayload>;\n\nexport interface AgentTestCodePreference {\n agentId: number;\n writeTestCode: boolean;\n}\n\n// ─── CRUD ────────────────────────────────────────────────────────────────────\n\nexport async function createTask(payload: CreateTaskPayload): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function fetchTasks(): Promise<Task[]> {\n const res = await fetch(`${SERVER_URL}/tasks`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function fetchTask(id: string): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function updateTask(id: string, payload: UpdateTaskPayload): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function archiveTask(id: string): Promise<void> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/archive`, { method: \"POST\" });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n\nexport async function deleteTask(id: string): Promise<void> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}`, { method: \"DELETE\" });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n}\n\n// ─── 실행 제어 ────────────────────────────────────────────────────────────────\n\nexport async function executeTask(id: string, agentTestCodePreferences: AgentTestCodePreference[] = []): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/execute`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agentTestCodePreferences }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function stopTask(id: string): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/stop`, { method: \"POST\" });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function fetchTaskRuns(id: string): Promise<TaskRun[]> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/runs`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function fetchTaskConversations(id: string): Promise<TaskConversation[]> {\n const res = await fetch(`${SERVER_URL}/conversations/session/${id}`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function rerunTask(id: string, supplementNote?: string, writeTestCode?: boolean): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/rerun`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ supplementNote, writeTestCode }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function rerunTaskAgent(id: string, agentId: number, supplementNote?: string, writeTestCode?: boolean): Promise<Task> {\n const res = await fetch(`${SERVER_URL}/tasks/${id}/agents/${agentId}/rerun`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ supplementNote, writeTestCode }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n","import { SERVER_URL } from \"@/lib/constants\";\n\nexport type ChangeType = \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n\nexport interface ChangelogFile {\n id: number;\n filePath: string;\n changeType: ChangeType;\n additions: number;\n deletions: number;\n patch: string | null;\n}\n\nexport interface AgentChangelog {\n agentId: number;\n files: ChangelogFile[];\n}\n\nexport interface MergeResult {\n success: boolean;\n message: string;\n}\n\nexport async function fetchTaskChangelog(taskId: string, signal?: AbortSignal): Promise<AgentChangelog[]> {\n const res = await fetch(`${SERVER_URL}/tasks/${taskId}/changelog`, { signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function fetchTaskRunChangelog(taskId: string, runId: number, signal?: AbortSignal): Promise<AgentChangelog[]> {\n const res = await fetch(`${SERVER_URL}/tasks/${taskId}/runs/${runId}/changelog`, { signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function mergeAgentAll(taskId: string, agentId: number): Promise<MergeResult> {\n const res = await fetch(`${SERVER_URL}/tasks/${taskId}/agents/${agentId}/merge`, {\n method: \"POST\",\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n\nexport async function mergeAgentFile(taskId: string, agentId: number, filePath: string): Promise<MergeResult> {\n const res = await fetch(`${SERVER_URL}/tasks/${taskId}/agents/${agentId}/merge-file`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ filePath }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { Modal } from \"@/components/ui/Modal\";\nimport { useAgentStatusStore } from \"@/store/agentStatusStore\";\n\nexport type AgentId = \"claude\" | \"gemini\" | \"codex\" | \"opencode\";\ntype ConnectionStatus = \"disconnected\" | \"connecting\" | \"connected\";\n\ninterface AgentDef {\n id: AgentId;\n name: string;\n vendor: string;\n description: string;\n available: boolean;\n iconBg: string;\n hoverBorder: string;\n hoverBg: string;\n icon: React.ReactNode;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nexport const ClaudeIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-6 w-6 text-[#D97757]\">\n <path d=\"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z\" />\n </svg>\n);\n\nexport const GeminiIcon = () => (\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" 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\nexport const CodexIcon = () => (\n // OpenAI logo — simplified\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-6 w-6 text-gray-900 dark:text-white\">\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.9 6.065 6.065 0 0 0-10.75 2.918 5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.985 5.985 0 0 0 .511 4.91 6.046 6.046 0 0 0 6.515 2.9 5.985 5.985 0 0 0 4.514 2.012 6.046 6.046 0 0 0 5.772-4.206 5.985 5.985 0 0 0 3.998-2.9 6.046 6.046 0 0 0-.747-7.071zM13.26 21.4a4.476 4.476 0 0 1-2.876-1.041l.141-.08 4.779-2.758a.775.775 0 0 0 .393-.681v-6.737l2.02 1.169a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.495 4.493zM3.6 17.275a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.775.775 0 0 0 .781 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-2.675zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973v5.701a.77.77 0 0 0 .388.677l5.815 3.354-2.02 1.169a.076.076 0 0 1-.071 0l-4.83-2.787A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.843-3.354 2.02-1.169a.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-.402-.695zm2.01-3.023-.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.135-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.775.775 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5Z\" />\n </svg>\n);\n\nexport const OpenCodeIcon = () => (\n // OpenCode — terminal bracket style\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"h-6 w-6 text-emerald-500\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" strokeWidth=\"1.4\" strokeDasharray=\"2 2\" />\n </svg>\n);\n\n// ─── Agent Definitions ────────────────────────────────────────────────────────\n\nconst AGENTS: AgentDef[] = [\n {\n id: \"claude\",\n name: \"Claude Code\",\n vendor: \"Anthropic\",\n description: \"코드 작성, 디버깅, 리팩터링을 위한 AI 어시스턴트\",\n available: true,\n iconBg: \"bg-orange-500/[0.10]\",\n hoverBorder: \"hover:border-orange-500/30\",\n hoverBg: \"hover:bg-orange-500/[0.04]\",\n icon: <ClaudeIcon />,\n },\n {\n id: \"gemini\",\n name: \"Gemini CLI\",\n vendor: \"Google\",\n description: \"Google Gemini 기반 코딩 어시스턴트\",\n available: true,\n iconBg: \"bg-blue-500/[0.08]\",\n hoverBorder: \"hover:border-blue-500/20\",\n hoverBg: \"hover:bg-blue-500/[0.03]\",\n icon: <GeminiIcon />,\n },\n {\n id: \"codex\",\n name: \"Codex CLI\",\n vendor: \"OpenAI\",\n description: \"OpenAI Codex 기반 터미널 에이전트\",\n available: true,\n iconBg: \"bg-gray-900/[0.05] dark:bg-white/[0.06]\",\n hoverBorder: \"hover:border-gray-900/20 dark:hover:border-white/20\",\n hoverBg: \"hover:bg-gray-900/[0.03] dark:hover:bg-white/[0.03]\",\n icon: <CodexIcon />,\n },\n {\n id: \"opencode\",\n name: \"OpenCode\",\n vendor: \"OpenCode\",\n description: \"오픈소스 AI 코딩 에이전트\",\n available: false,\n iconBg: \"bg-emerald-500/[0.08]\",\n hoverBorder: \"hover:border-emerald-500/20\",\n hoverBg: \"hover:bg-emerald-500/[0.03]\",\n icon: <OpenCodeIcon />,\n },\n];\n\n// ─── Agent Card ───────────────────────────────────────────────────────────────\n\ninterface AgentCardProps {\n agent: AgentDef;\n connectionStatus: ConnectionStatus;\n onSelect: (id: AgentId) => void;\n}\n\nfunction AgentCard({ agent, connectionStatus, onSelect }: AgentCardProps) {\n const canSelect = agent.available && connectionStatus === \"connected\";\n\n return (\n <button\n onClick={() => canSelect && onSelect(agent.id)}\n disabled={!canSelect}\n className={[\n \"group relative flex w-full items-center gap-4 rounded-xl border p-4 text-left transition-all duration-200\",\n \"border-gray-900/[0.07] bg-gray-900/[0.02] dark:border-white/[0.07] dark:bg-white/[0.02]\",\n canSelect\n ? `cursor-pointer ${agent.hoverBorder} ${agent.hoverBg}`\n : \"cursor-not-allowed opacity-45\",\n ].join(\" \")}\n >\n {/* Icon */}\n <span\n className={[\n \"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-gray-900/[0.06] dark:border-white/[0.06]\",\n agent.iconBg,\n ].join(\" \")}\n >\n {agent.icon}\n </span>\n\n {/* Text */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900/85 dark:text-white/85\">\n {agent.name}\n </span>\n <span className=\"text-[10px] font-medium text-gray-900/25 dark:text-white/25\">\n {agent.vendor}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-gray-900/40 dark:text-white/40\">{agent.description}</p>\n </div>\n\n {/* Status badge */}\n <div className=\"shrink-0\">\n {!agent.available ? (\n <span className=\"rounded-full border border-gray-900/[0.06] bg-gray-900/[0.03] px-2.5 py-1 text-[11px] font-medium text-gray-900/30 dark:border-white/[0.06] dark:bg-white/[0.03] dark:text-white/30\">\n 준비 중\n </span>\n ) : connectionStatus === \"connected\" ? (\n <span className=\"flex items-center gap-1 rounded-full border border-emerald-500/25 bg-emerald-500/[0.08] px-2.5 py-1 text-[11px] font-medium text-emerald-600 dark:text-emerald-400\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-500\" />\n 사용 가능\n </span>\n ) : connectionStatus === \"connecting\" ? (\n <span className=\"flex items-center gap-1 rounded-full border border-amber-500/25 bg-amber-500/[0.08] px-2.5 py-1 text-[11px] font-medium text-amber-600 dark:text-amber-400\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-amber-500\" />\n 연결 중\n </span>\n ) : (\n <span className=\"rounded-full border border-gray-900/[0.06] bg-gray-900/[0.03] px-2.5 py-1 text-[11px] font-medium text-gray-900/30 dark:border-white/[0.06] dark:bg-white/[0.03] dark:text-white/30\">\n 연결 끊김\n </span>\n )}\n </div>\n\n {/* Arrow */}\n {canSelect && (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"h-3.5 w-3.5 shrink-0 text-gray-900/20 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-gray-900/50 dark:text-white/20 dark:group-hover:text-white/50\"\n >\n <path fillRule=\"evenodd\" d=\"M6.22 4.22a.75.75 0 011.06 0l3.25 3.25a.75.75 0 010 1.06l-3.25 3.25a.75.75 0 01-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 010-1.06z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n );\n}\n\n// ─── Modal ────────────────────────────────────────────────────────────────────\n\ninterface AgentSelectModalProps {\n open: boolean;\n onClose: () => void;\n onSelect: (agentId: AgentId) => void;\n connectionStatusByAgent?: Record<AgentId, ConnectionStatus>;\n}\n\nexport function AgentSelectModal({ open, onClose, onSelect, connectionStatusByAgent }: AgentSelectModalProps) {\n const { statusByAgent, refresh } = useAgentStatusStore();\n\n useEffect(() => {\n if (open) refresh();\n }, [open, refresh]);\n\n const effectiveStatus = connectionStatusByAgent ?? statusByAgent;\n\n return (\n <Modal open={open} onClose={onClose} title=\"에이전트 선택\" maxWidth=\"max-w-md\" zIndex=\"z-[60]\">\n <div className=\"flex flex-col gap-2.5\">\n {AGENTS.map((agent) => (\n <AgentCard\n key={agent.id}\n agent={agent}\n connectionStatus={effectiveStatus[agent.id] ?? \"disconnected\"}\n onSelect={(id) => { onSelect(id); onClose(); }}\n />\n ))}\n </div>\n </Modal>\n );\n}\n\n// ─── Agent meta (for external use) ───────────────────────────────────────────\n\nexport const AGENT_META: Record<AgentId, { label: string; dotColor: string }> = {\n claude: { label: \"Claude Code\", dotColor: \"bg-orange-400\" },\n gemini: { label: \"Gemini CLI\", dotColor: \"bg-blue-400\" },\n codex: { label: \"Codex CLI\", dotColor: \"bg-gray-400\" },\n opencode: { label: \"OpenCode\", dotColor: \"bg-emerald-400\" },\n};\n\nexport const AGENT_AVATAR: Record<AgentId, { bg: string; icon: React.ReactNode }> = {\n claude: { bg: \"bg-[#D97757]\", icon: <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 text-white\"><path d=\"M13.827 3.816L20.05 20.2h-3.672l-1.234-3.365H8.856L7.622 20.2H3.95L10.173 3.816h3.654zm-1.827 4.91l-1.989 5.453h3.978l-1.989-5.453z\" /></svg> },\n gemini: { bg: \"bg-white dark:bg-gray-800\", icon: <svg viewBox=\"0 0 24 24\" className=\"h-5 w-5\" aria-hidden=\"true\"><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\" /><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\" /><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\" /><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\" /></svg> },\n codex: { bg: \"bg-gray-900 dark:bg-white\", icon: <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5 text-white dark:text-gray-900\"><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.9 6.065 6.065 0 0 0-10.75 2.918 5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.985 5.985 0 0 0 .511 4.91 6.046 6.046 0 0 0 6.515 2.9 5.985 5.985 0 0 0 4.514 2.012 6.046 6.046 0 0 0 5.772-4.206 5.985 5.985 0 0 0 3.998-2.9 6.046 6.046 0 0 0-.747-7.071zM13.26 21.4a4.476 4.476 0 0 1-2.876-1.041l.141-.08 4.779-2.758a.775.775 0 0 0 .393-.681v-6.737l2.02 1.169a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.495 4.493zM3.6 17.275a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.775.775 0 0 0 .781 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-2.675zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973v5.701a.77.77 0 0 0 .388.677l5.815 3.354-2.02 1.169a.076.076 0 0 1-.071 0l-4.83-2.787A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.843-3.354 2.02-1.169a.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-.402-.695zm2.01-3.023-.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.135-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.775.775 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5Z\" /></svg> },\n opencode: { bg: \"bg-emerald-600\", icon: <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"h-5 w-5 text-white\"><polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" /><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" strokeWidth=\"1.4\" strokeDasharray=\"2 2\" /></svg> },\n};\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create } from \"zustand\";\n\nimport { getAuthStatus, getCodexAuthStatus, getGeminiAuthStatus } from \"@/features/auth/api/auth.api\";\nimport type { AgentId } from \"@/features/chat/ui/AgentSelectModal\";\nimport type { ConnectionStatus } from \"@/features/chat/hooks/useUnifiedSessions\";\n\ninterface AgentStatusState {\n statusByAgent: Record<AgentId, ConnectionStatus>;\n loading: boolean;\n refresh: () => Promise<void>;\n}\n\nexport const useAgentStatusStore = create<AgentStatusState>((set) => ({\n statusByAgent: {\n claude: \"disconnected\",\n gemini: \"disconnected\",\n codex: \"disconnected\",\n opencode: \"disconnected\",\n },\n loading: false,\n refresh: async () => {\n set({ loading: true });\n const [claude, gemini, codex] = await Promise.allSettled([\n getAuthStatus(),\n getGeminiAuthStatus(),\n getCodexAuthStatus(),\n ]);\n set({\n loading: false,\n statusByAgent: {\n claude: claude.status === \"fulfilled\" && claude.value.loggedIn ? \"connected\" : \"disconnected\",\n gemini: gemini.status === \"fulfilled\" && gemini.value.loggedIn && gemini.value.installed ? \"connected\" : \"disconnected\",\n codex: codex.status === \"fulfilled\" && codex.value.loggedIn && codex.value.installed ? \"connected\" : \"disconnected\",\n opencode: \"disconnected\",\n },\n });\n },\n}));\n","\"use client\";\n\nimport { AGENT_META } from \"@/features/chat/ui/AgentSelectModal\";\nimport type { AgentRole } from \"../api/tasks.api\";\nimport type { AgentDraft } from \"../hooks/useTaskCreate\";\n\nconst ROLES: { value: AgentRole; label: string; active: string; badge: string }[] = [\n { value: \"frontend\", label: \"Frontend\", active: \"border-blue-500/50 bg-blue-500/[0.12] text-blue-700 dark:text-blue-300\", badge: \"border-blue-500/40 bg-blue-500/[0.08] text-blue-700 dark:text-blue-300\" },\n { value: \"backend\", label: \"Backend\", active: \"border-emerald-500/50 bg-emerald-500/[0.12] text-emerald-700 dark:text-emerald-300\", badge: \"border-emerald-500/40 bg-emerald-500/[0.08] text-emerald-700 dark:text-emerald-300\" },\n { value: \"doc\", label: \"Doc\", active: \"border-purple-500/50 bg-purple-500/[0.12] text-purple-700 dark:text-purple-300\", badge: \"border-purple-500/40 bg-purple-500/[0.08] text-purple-700 dark:text-purple-300\" },\n { value: \"operation\", label: \"Operation\", active: \"border-amber-500/50 bg-amber-500/[0.12] text-amber-700 dark:text-amber-300\", badge: \"border-amber-500/40 bg-amber-500/[0.08] text-amber-700 dark:text-amber-300\" },\n { value: \"other\", label: \"Other\", active: \"border-gray-900/[0.2] bg-gray-900/[0.07] text-gray-700 dark:border-white/[0.2] dark:bg-white/[0.07] dark:text-white/70\", badge: \"border-gray-900/[0.12] bg-gray-900/[0.05] text-gray-600 dark:border-white/[0.12] dark:bg-white/[0.05] dark:text-white/50\" },\n];\n\ninterface AgentRowProps {\n agent: AgentDraft;\n onChange: (patch: Partial<Omit<AgentDraft, \"id\">>) => void;\n onRemove: () => void;\n}\n\nexport function AgentRow({ agent, onChange, onRemove }: AgentRowProps) {\n const agentMeta = AGENT_META[agent.agentType];\n\n return (\n <div className=\"flex flex-col gap-2 rounded-xl border border-gray-900/[0.07] bg-gray-900/[0.02] p-3 dark:border-white/[0.07] dark:bg-white/[0.02]\">\n {/* AI 에이전트 + 삭제 */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className={`h-2 w-2 rounded-full ${agentMeta.dotColor}`} />\n <span className=\"text-xs font-semibold text-gray-900/60 dark:text-white/60\">\n {agentMeta.label}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"shrink-0 text-gray-900/20 transition-colors hover:text-red-500 dark:text-white/20 dark:hover:text-red-400\"\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 </div>\n\n {/* 역할 뱃지 선택 */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ROLES.map((r) => (\n <button\n key={r.value}\n type=\"button\"\n onClick={() => onChange({ role: r.value })}\n className={[\n \"rounded-full border px-3 py-0.5 text-xs font-medium transition-all\",\n agent.role === r.value\n ? r.active\n : \"border-gray-900/[0.07] text-gray-900/25 hover:border-gray-900/[0.13] hover:text-gray-900/50 dark:border-white/[0.07] dark:text-white/25 dark:hover:border-white/[0.13] dark:hover:text-white/50\",\n ].join(\" \")}\n >\n {r.label}\n </button>\n ))}\n </div>\n\n {/* other 선택 시 커스텀 입력 */}\n {agent.role === \"other\" && (\n <input\n type=\"text\"\n value={agent.customRole}\n onChange={(e) => onChange({ customRole: e.target.value })}\n placeholder=\"역할을 직접 입력하세요\"\n className=\"w-full rounded-lg border border-gray-900/[0.07] bg-gray-900/[0.03] px-3 py-1.5 text-xs text-gray-900/70 placeholder-gray-900/20 outline-none transition-colors focus:border-gray-900/[0.15] dark:border-white/[0.07] dark:bg-white/[0.03] dark:text-white/70 dark:placeholder-white/20 dark:focus:border-white/[0.15]\"\n />\n )}\n\n {/* 역할 힌트 */}\n {agent.role === \"frontend\" && (\n <p className=\"text-[10px] text-blue-600/60 dark:text-blue-400/50\">UI 구현 · 컴포넌트 개발 · 스타일링</p>\n )}\n {agent.role === \"backend\" && (\n <p className=\"text-[10px] text-emerald-600/60 dark:text-emerald-400/50\">API 개발 · DB 설계 · 서버 로직</p>\n )}\n </div>\n );\n}\n\n// 선택된 role의 뱃지만 표시 (읽기 전용)\nexport function AgentRoleBadge({ role, customRole }: { role: AgentRole; customRole?: string | null }) {\n const found = ROLES.find((r) => r.value === role);\n const label = role === \"other\" ? (customRole ?? \"Other\") : (found?.label ?? role);\n const cls = found?.badge ?? \"border-gray-900/[0.12] bg-gray-900/[0.05] text-gray-600 dark:border-white/[0.12] dark:bg-white/[0.05] dark:text-white/50\";\n return (\n <span className={`rounded-full border px-2.5 py-0.5 text-xs font-medium ${cls}`}>\n {label}\n </span>\n );\n}\n"],"names":["createTask","payload","res","fetch","method","headers","body","JSON","stringify","ok","Error","status","json","fetchTasks","fetchTask","id","updateTask","archiveTask","deleteTask","executeTask","agentTestCodePreferences","stopTask","fetchTaskRuns","fetchTaskConversations","rerunTask","supplementNote","writeTestCode","rerunTaskAgent","agentId","fetchTaskChangelog","taskId","signal","fetchTaskRunChangelog","runId","mergeAgentAll","mergeAgentFile","filePath","createStoreImpl","createState","state","listeners","Set","setState","partial","replace","nextState","Object","is","previousState","assign","forEach","listener","getState","getInitialState","initialState","subscribe","add","delete","api","createStore","ROLES","value","label","active","badge","AgentRow","agent","onChange","onRemove","agentMeta","agentType","className","dotColor","type","onClick","viewBox","fill","d","map","r","role","join","customRole","e","target","placeholder","AgentRoleBadge","found","find","cls"],"mappings":"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","ignoreList":[3,4]}
|