elanous 0.2.21 → 0.2.22
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/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2489-ff55a35b202c0f94.js → 2489-d238d3e2eb5b2bf5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-d781be3e3a9cfd74.js → page-d85c43f46f58716b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/{page-b0a80997903852d8.js → page-4e645600579ae952.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-2b1263165630d9c8.js → page-87edbfd19117823b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-e2d6bed48ac20120.js → page-cbaf66b1e1804adf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-111cabe4d1fd69ae.js → page-80ed511e02c81412.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/{page-544dd4bd4847eeb7.js → page-9f5610caaa06178c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/{page-3ee191319bf97d87.js → page-ec8f3575e339de74.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-a449f1ed472b81c2.js → page-2a19c5cd3b562580.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-9045094d6d3b5cd0.js → page-b6a09cde2e07521a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/{page-c06673596849ef45.js → page-f7eae1518ca0c353.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/{layout-9f81233f29dcd409.js → layout-8462d6a543cbb2d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-7a12f61be4a579d1.js → page-786fb4504d0f2fa9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-c85b0589591a99c9.js → not-found-75209f14597dcb8f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/{page-725a4da02dd129eb.js → page-bf30affe3a85af7e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/{page-21bec4afeb2f0917.js → page-76cf838050a8d681.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-dc39ee7a36d26385.js → page-7ec8e289b4c14df6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-84ae759f76053672.js → page-8c8ac17d52be2a79.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/{page-3db58ddb61fe2be9.js → page-d359ab048d63a9d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-c5315e30f3528dc4.js → page-b8b345c880bf78d1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/{page-2fe368efb6de3b6a.js → page-f151cc10ad026940.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-c69762987b751174.js → page-bf495a1e284f4e00.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/{page-7f8d7fcdf058a845.js → page-69cb93d1a2e57e0e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-22163556cd38bc88.js → page-72ec543928d67c3e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +1 -0
- package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +14 -14
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +14 -14
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +14 -14
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +14 -14
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +14 -14
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +14 -14
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +14 -14
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +14 -14
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +14 -14
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +14 -14
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +14 -14
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +14 -14
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +14 -14
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +14 -14
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +14 -14
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +14 -14
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +14 -14
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +14 -14
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +14 -14
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +14 -14
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +14 -14
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +14 -14
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +14 -14
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +14 -14
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +14 -14
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +14 -14
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +14 -14
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +14 -14
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +15 -15
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +14 -14
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +14 -14
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +14 -14
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +14 -14
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +14 -14
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +14 -14
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +14 -14
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +14 -14
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +14 -14
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +14 -14
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +14 -14
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +14 -14
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +14 -14
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +14 -14
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +14 -14
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +14 -14
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/drafts/recipes.yaml +2 -2
- package/graphs/test-diet/recipes.yaml +3 -0
- package/graphs/test-diet/test-diet.yaml +3 -1
- package/package.json +1 -1
- package/scripts/f-session-monitor.ts +69 -0
- package/scripts/hq/standby-snapshot.ts +7 -3
- package/scripts/knowledge-compress.ts +11 -0
- package/scripts/nightly-docops.ts +90 -3
- package/scripts/research-coo-admin-dates.ts +39 -0
- package/scripts/skills/public-check.ts +7 -2
- package/scripts/smart-merge/resync-shadow.ts +5 -3
- package/scripts/test-diet/lib.ts +81 -1
- package/scripts/test-diet/node.ts +48 -2
- package/scripts/verify-coo-admin-evidence.ts +83 -0
- package/src/acp/client.ts +4 -2
- package/src/agent/run-context.ts +4 -0
- package/src/agent-env/profile.ts +25 -5
- package/src/agent-mission/driver.ts +26 -12
- package/src/agent-mission/supervisor-metrics.ts +17 -2
- package/src/agent-substrate/acp-reviewer.ts +12 -5
- package/src/agent-substrate/pr-reviewer.ts +11 -4
- package/src/agent-substrate/review-intent.ts +102 -3
- package/src/autopilot/build/llm-conflict-merge.ts +22 -8
- package/src/autopilot/pr-manager.ts +18 -8
- package/src/away/release-watch.ts +47 -8
- package/src/briefing/brief-items.ts +104 -11
- package/src/chat/index.ts +1 -0
- package/src/cli/brief-cli.ts +20 -2
- package/src/cli/config-classify.ts +83 -0
- package/src/cli/control-cli.ts +14 -0
- package/src/cli/decisions-cli.ts +26 -16
- package/src/cli/logs-model-input.ts +1 -1
- package/src/cli/pr-cli.ts +65 -8
- package/src/cli/release-cli.ts +21 -4
- package/src/cli/tasks-cli.ts +108 -1
- package/src/connectors/types.ts +6 -6
- package/src/context-bus/context-now-surfaces.ts +18 -0
- package/src/context-bus/coord-events.ts +32 -4
- package/src/context-bus/long-term-memory.ts +23 -6
- package/src/context-bus/nightly-condense.ts +169 -21
- package/src/control/control-status.ts +87 -0
- package/src/control-plane/light-member.ts +5 -3
- package/src/control-plane/member.ts +172 -7
- package/src/core-turn/run-goal-loop.ts +22 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +9 -0
- package/src/decisions/decision-cards.ts +20 -1
- package/src/decisions/decision-ledger.ts +11 -8
- package/src/decisions/web-push-decision-cards.ts +19 -3
- package/src/discord-self-message.ts +2 -2
- package/src/domains/coo-admin-dates.evidence.json +876 -0
- package/src/domains/coo-admin-tool.ts +48 -14
- package/src/domains/ops-status.ts +53 -0
- package/src/domains/outbound-alert.ts +24 -1
- package/src/exec-requests/planner.ts +6 -0
- package/src/graph-kinds/registry.ts +6 -6
- package/src/graph-runner/graph-cli.ts +34 -2
- package/src/graph-runner/graph-run-api.ts +7 -0
- package/src/graph-runner/graph-tick.ts +73 -12
- package/src/graph-runner/runner.ts +43 -11
- package/src/graph-unify/wf-to-graph.ts +79 -0
- package/src/graph-wizard/generate.ts +34 -2
- package/src/graph-wizard/steps.ts +13 -0
- package/src/harness/harness-cli-command.ts +121 -23
- package/src/harness/harness-queue.ts +58 -14
- package/src/harness/launch-advice.ts +23 -0
- package/src/index.ts +36 -7
- package/src/knowledge/conclusion-compress.ts +93 -0
- package/src/knowledge/know-find.ts +9 -2
- package/src/knowledge/query.ts +20 -0
- package/src/llm.ts +26 -16
- package/src/loops/neighbor-runtime.ts +88 -0
- package/src/loops/orchestrator/author-depth.ts +29 -11
- package/src/loops/orchestrator/overlap.ts +7 -1
- package/src/loops/orchestrator/resync-shadow.ts +1 -1
- package/src/loops/orchestrator/tick.ts +35 -2
- package/src/loops/orchestrator/traffic.ts +2 -0
- package/src/loops/registry.ts +5 -0
- package/src/market/publish.ts +17 -1
- package/src/maturity/feature-maturity.ts +2 -1
- package/src/mss/logging/redaction.ts +17 -0
- package/src/nexus/api/draft-metrics.ts +22 -8
- package/src/nexus/api/graph-peer-edit.ts +77 -0
- package/src/nexus/api/graph-wizard-api.ts +9 -1
- package/src/nexus/api/graphs-api.ts +145 -7
- package/src/nexus/api/http-server.ts +93 -8
- package/src/nexus/api/plugins-market.ts +24 -0
- package/src/nexus/index.ts +3 -2
- package/src/oauth/claude-pty-maturity.ts +24 -0
- package/src/oauth/fallback-chain.ts +27 -14
- package/src/plugins/maker/market-bundle.ts +9 -0
- package/src/plugins/maker/plugin-maker.ts +9 -3
- package/src/plugins/maker/wizard-generate.ts +73 -9
- package/src/policy/llm-policy.ts +11 -6
- package/src/release-loop/checklist-board.ts +27 -0
- package/src/release-loop/checklist.ts +38 -0
- package/src/seat-address/seat-address.ts +1 -0
- package/src/seat-loop/seat-loop.ts +174 -20
- package/src/seat-loop/seat-report.ts +29 -1
- package/src/self-dev/dev-cli.ts +90 -8
- package/src/self-dev/dev-pipeline.ts +20 -1
- package/src/self-dev/draft-sweep.ts +45 -8
- package/src/self-dev/orchestrate.ts +3 -0
- package/src/self-dev/review-provider-fallback.ts +83 -0
- package/src/self-dev/run-supervisor.ts +5 -1
- package/src/self-implement/harness-policy-gates.ts +7 -5
- package/src/self-implement/host-regate.ts +28 -14
- package/src/self-implement/l8-merge-queue.ts +80 -8
- package/src/self-implement/orchestrator.ts +68 -27
- package/src/self-implement/seams.ts +5 -3
- package/src/self-implement/self-implement-cli.ts +4 -0
- package/src/shell-env-bootstrap.ts +19 -4
- package/src/steward/triage.ts +25 -8
- package/src/storage/file-lock.ts +33 -4
- package/src/task-agent/completion-evidence.ts +31 -3
- package/src/task-agent/cover.ts +61 -0
- package/src/task-agent/live-moves.ts +126 -3
- package/src/task-agent/shadow.ts +19 -4
- package/src/task-agent/task-hand.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +138 -15
- package/src/task-orchestrator/surfaces/self-implement.ts +7 -0
- package/src/telegram-commands.ts +8 -0
- package/src/telegram-project-command.ts +6 -0
- package/src/telegram.ts +2 -2
- package/src/typecheck-ratchet.ts +2 -1
- package/src/user-config.ts +35 -4
- package/src/version/packed-revision.json +1 -1
- package/src/workflow-runtime/executor.ts +24 -2
- package/src/workflow-runtime/triggers/registry.ts +27 -0
- package/src/workflow-runtime/triggers/schedule-source.ts +30 -3
- package/apps/pwa/out/_next/static/chunks/1307-c97eba9fb72a9a5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3857-995ea9f5ef33d71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-59fedea50d13c762.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8857-f1762140ef9a96b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-7581825d511a64c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9497-b0e758d1cd4ae8d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-937c92292a4ab4f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea998f7f5d156bea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-33c328b64ca508f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e4bcb2c503dab04b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-300897dcbbd5ed76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-103fa3191c1b2e08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-be8b4615c919e36c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-c685b104e0dfa609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8d693331cfbb6add.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-cef4f30a4c22fae1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66ea1b54fc83fa15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8cc707bd09a497d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-90b55be1f15ce0e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cb16606e08be65db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-16dc64b74ed6a40a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8d04132dd0ac5e10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-f23484de467c9ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5456692bda39aafb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d75f7cd65845ce98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-5603f5e568b25ce3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-d2cc0f4e89f42028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a6eb73b8a4840f1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-c0a3f4d10edb83fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6c0b88068c143f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-141436fd26dd56fc.js +0 -1
- package/apps/pwa/out/_next/static/css/e81df11490b4413b.css +0 -1
- /package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → aBi6EyMtLsrl7J8eH4kF7}/_buildManifest.js +0 -0
- /package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → aBi6EyMtLsrl7J8eH4kF7}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3141],{3704:(e,t,a)=>{"use strict";a.d(t,{A:()=>d});var n=a(46124);let r=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.filter((e,t,a)=>!!e&&""!==e.trim()&&a.indexOf(e)===t).join(" ").trim()},l=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,a)=>a?a.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var s={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,n.createContext)({}),o=(0,n.forwardRef)((e,t)=>{var a,l,o;let{color:d,size:c,strokeWidth:u,absoluteStrokeWidth:x,className:m="",children:h,iconNode:p,...g}=e,{size:f=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,color:j="currentColor",className:N=""}=null!=(a=(0,n.useContext)(i))?a:{},w=(null!=x?x:b)?24*Number(null!=u?u:v)/Number(null!=c?c:f):null!=u?u:v;return(0,n.createElement)("svg",{ref:t,...s,width:null!=(l=null!=c?c:f)?l:s.width,height:null!=(o=null!=c?c:f)?o:s.height,stroke:null!=d?d:j,strokeWidth:w,className:r("lucide",N,m),...!h&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...p.map(e=>{let[t,a]=e;return(0,n.createElement)(t,a)}),...Array.isArray(h)?h:[h]])}),d=(e,t)=>{let a=(0,n.forwardRef)((a,s)=>{let{className:i,...d}=a;return(0,n.createElement)(o,{ref:s,iconNode:t,className:r("lucide-".concat(l(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...d})});return a.displayName=l(e),a}},46044:(e,t,a)=>{"use strict";a.d(t,{A:()=>n});let n=(0,a(3704).A)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]])},51706:(e,t,a)=>{"use strict";a.d(t,{A:()=>n});let n=(0,a(3704).A)("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]])},66847:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>I});var n=a(55539),r=a(46124),l=a(21501),s=a(46044),i=a(51706),o=a(94306),d=a(34885),c=a(16241),u=a(21108),x=a(7456),m=a(97479),h=a(44373);let p={PLAN:"text-sky-600 dark:text-sky-400",ROUTE:"text-violet-600 dark:text-violet-400",VERIFY:"text-amber-600 dark:text-amber-400",HEAL:"text-emerald-600 dark:text-emerald-400",ESCALATE:"text-rose-600 dark:text-rose-400",SHIP:"text-green-700 dark:text-green-400 font-semibold"};function g(e){let{board:t,lines:a,mode:r,onSelectRun:l,selectedRunId:s,role:i="owner"}=e,o="max"===r,d="owner"===i,u=t.gauges,{snapshot:x}=t,m=d?0:t.stream.filter(e=>null!=e.why&&(0,c.Yu)(e.why)).length;return(0,n.jsxs)("div",{className:(0,h.cn)("space-y-4",o&&"live-max"),"data-live-mode":r,children:[(0,n.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6",children:[(0,n.jsx)(v,{label:"LIVE",hint:"도는 런",value:String(u.live),tone:u.live>0?"live":"idle",max:o}),(0,n.jsx)(v,{label:"DECISIONS/MIN",hint:"판단 ".concat(u.decisions,"건"),value:String(u.decisionsPerMin),max:o}),(0,n.jsx)(v,{label:"SHIPPED",hint:"병합\xb7PR",value:String(u.shipped),tone:"ok",max:o}),(0,n.jsx)(v,{label:"SELF-HEAL",hint:u.selfHealRuns?"수리 런 ".concat(u.selfHealRuns):"수리 런 없음",value:null===u.selfHealRate?"—":"".concat(u.selfHealRate,"%"),max:o}),(0,n.jsx)(v,{label:"BURN",hint:"토큰/분",value:f(u.burnTokensPerMin),max:o}),(0,n.jsx)(v,{label:"BLOCKED",hint:"막힌 런",value:String(x.counters.blocked),tone:x.counters.blocked?"bad":"idle",max:o})]}),(0,n.jsxs)("section",{className:"space-y-2","aria-label":"런",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium",children:["런 ",(0,n.jsxs)("span",{className:"text-xs text-muted-foreground",children:["최근 ",x.windowMinutes,"분 \xb7 ",x.runs.length]})]}),0===x.runs.length?(0,n.jsx)("p",{className:"rounded-md border border-dashed p-4 text-sm text-muted-foreground","data-live-empty":!0,children:"지금 이 창에 런 신호가 없습니다 — 텔레그램이나 Intake 로 한 줄 보내면 여기에 런이 뜹니다."}):(0,n.jsx)("ul",{className:"space-y-1.5",children:x.runs.slice(0,12).map(e=>(0,n.jsx)(b,{run:e,round:t.rounds[e.runId],max:o,selected:e.runId===s,onSelect:l,owner:d},e.runId))})]}),(0,n.jsxs)("div",{className:"grid gap-4 lg:grid-cols-5",children:[(0,n.jsxs)("section",{className:"space-y-2 lg:col-span-3","aria-label":"판단 스트림",children:[(0,n.jsxs)("h2",{className:"flex flex-wrap items-center gap-2 text-sm font-medium",children:["판단 스트림",c.jg.map(e=>(0,n.jsx)("span",{className:(0,h.cn)("text-[11px] lg:text-[10px] font-mono",p[e]),children:e},e))]}),0===t.stream.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"이 창에 판단 신호가 없습니다."}):(0,n.jsx)("ul",{className:"max-h-80 space-y-1 overflow-auto rounded-md border p-2 font-mono text-[11px]","data-live-stream":!0,children:t.stream.slice(0,40).map((e,t)=>(0,n.jsxs)("li",{className:(0,h.cn)("leading-relaxed",o&&0===t&&"live-line-in",o&&"SHIP"===e.kind&&"live-ship"),children:[(0,n.jsxs)("span",{className:"text-muted-foreground",children:[(0,n.jsx)("span",{title:e.ts,children:(0,c.qo)(e.ts)})," "]}),(0,n.jsxs)("span",{className:p[e.kind],children:["[",e.kind,"]"]})," ",d?e.what:(0,c.hS)(e.what.replace(/run-[0-9a-f]{8}-[^\s]*/gi,""),i),e.why&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" \xb7 왜: ",(0,c.hS)(e.why,i)]}),e.purpose&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" \xb7 목적: ",e.purpose]}),e.target&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" → ",e.target]})]},"".concat(e.ts,"-").concat(t)))})]}),(0,n.jsxs)("section",{className:"space-y-2 lg:col-span-2","aria-label":"성적표",children:[(0,n.jsx)("h2",{className:"text-sm font-medium",children:"모델 성적표"}),0===t.scorecard.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"이 창에 모델 요청이 없습니다."}):(0,n.jsxs)("table",{className:"w-full text-[11px]",children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{className:"text-muted-foreground",children:[(0,n.jsx)("th",{className:"text-left font-normal",children:"모델"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"요청"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"토큰"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"과금"})]})}),(0,n.jsx)("tbody",{children:t.scorecard.slice(0,8).map(e=>{var t;return(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"truncate",children:e.model}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:e.requests}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:f(e.tokens)}),(0,n.jsx)("td",{className:"text-right text-muted-foreground",children:null!=(t=e.billing)?t:"—"})]},e.model)})})]}),(0,n.jsx)("h2",{className:"pt-2 text-sm font-medium",children:"리뷰 판정"}),(0,n.jsx)(j,{items:x.reviewVerdicts,max:o})]})]}),(0,n.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[d?(0,n.jsxs)("section",{className:"space-y-2","aria-label":"흐르는 로그",children:[(0,n.jsx)("h2",{className:"text-sm font-medium",children:"흐르는 로그"}),(0,n.jsx)("pre",{className:"max-h-60 overflow-auto rounded-md border bg-muted/30 p-2 text-[11px] leading-relaxed","data-live-log":!0,children:a.slice(0,60).join("\n")||"—"})]}):m>0?(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-live-folded-errors":!0,children:["오류 ",m,"건 접힘"]}):null,(0,n.jsxs)("section",{className:"space-y-2","aria-label":"빈 칸 표",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium",children:["빈 칸 표 ",(0,n.jsx)("span",{className:"text-xs text-muted-foreground",children:"판단 로그에 없는 칸"})]}),0===t.missing.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"빈 칸 없음."}):(0,n.jsx)("table",{className:"w-full text-[11px]","data-live-missing":!0,children:(0,n.jsx)("tbody",{children:t.missing.slice(0,10).map(e=>(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"font-mono",children:e.key}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:e.count}),(0,n.jsx)("td",{className:"pl-2 text-muted-foreground",children:e.lacks.join(" \xb7 ")})]},e.key))})})]})]})]})}function f(e){return e>=1e6?"".concat((e/1e6).toFixed(1),"M"):e>=1e3?"".concat((e/1e3).toFixed(e>=1e5?0:1),"k"):String(e)}function v(e){let{label:t,hint:a,value:r,tone:l="idle",max:s}=e;return(0,n.jsxs)("div",{className:(0,h.cn)("rounded-lg border p-3","live"===l&&"border-primary/50","bad"===l&&"border-error/50","ok"===l&&"border-green-600/40",s&&"live-gauge",s&&"live"===l&&"live-glow"),children:[(0,n.jsx)("div",{className:"font-mono text-[11px] lg:text-[10px] tracking-wider text-muted-foreground",children:t}),(0,n.jsx)("div",{className:(0,h.cn)("text-2xl font-semibold tabular-nums",s&&"live-count"),"data-live-gauge":t,children:r}),(0,n.jsx)("div",{className:"text-[11px] lg:text-[10px] text-muted-foreground",children:a})]})}function b(e){let{run:t,round:a,max:r,selected:l,onSelect:s,owner:i}=e;return(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button","data-live-run":t.runId,onClick:()=>null==s?void 0:s(t.runId),className:(0,h.cn)("flex w-full items-center gap-3 rounded-md border px-3 py-2 text-left text-xs hover:bg-muted/40",l&&"ring-1 ring-primary"),children:[(0,n.jsx)("span",{className:"w-24 shrink-0 truncate font-mono text-[11px] text-muted-foreground",children:i?t.runId.replace(/^run-/,"").slice(0,8):"런"}),(0,n.jsx)("span",{className:"flex flex-1 gap-1","aria-label":"단계",children:c.lV.map(e=>{let a=t.stages[e],l=t.current===e;return(0,n.jsx)("span",{title:"".concat(c.fQ[e]," \xb7 ").concat(null!=a?a:"신호 없음"),"data-stage":e,"data-tone":null!=a?a:"none",className:(0,h.cn)("h-2 flex-1 rounded-full bg-muted","info"===a&&"bg-primary/60","ok"===a&&"bg-green-600","bad"===a&&"bg-error",r&&l&&"bad"!==a&&"live-pulse",r&&l&&"bad"===a&&"live-pulse-bad")},e)})}),(0,n.jsx)("span",{className:"w-14 shrink-0 text-right font-mono text-[11px] lg:text-[10px] text-muted-foreground",children:a?"R ".concat(a,"/3"):""}),(0,n.jsx)("span",{className:"w-24 shrink-0 text-right text-[11px]",children:t.blocked?(0,n.jsx)("span",{className:"text-error",children:"막힘"}):"ok"===t.stages.land?(0,n.jsxs)("span",{className:"text-green-700",children:["착지",t.pr?" #".concat(t.pr):""]}):t.current?c.fQ[t.current]:""})]})})}function j(e){let{items:t,max:a}=e,r=Math.max(1,...t.map(e=>e.count));return 0===t.length?(0,n.jsx)("div",{className:"text-[11px] text-muted-foreground",children:"—"}):(0,n.jsx)("ul",{className:"space-y-1",children:t.slice(0,6).map(e=>(0,n.jsxs)("li",{className:"flex items-center gap-2 text-[11px]",children:[(0,n.jsx)("span",{className:"w-24 shrink-0 truncate",children:e.name}),(0,n.jsx)("span",{className:"h-1.5 flex-1 rounded-full bg-muted",children:(0,n.jsx)("span",{className:(0,h.cn)("block h-1.5 rounded-full bg-primary/70",a&&"transition-[width] duration-700"),style:{width:"".concat(e.count/r*100,"%")}})}),(0,n.jsx)("span",{className:"w-8 text-right tabular-nums",children:e.count})]},e.name))})}var N=a(89578),w=a(43422);let y=[15,60,360,1440],k="@active";function S(){return(0,o.Qj)()?(0,n.jsx)(E,{}):(0,n.jsxs)("div",{className:"mx-auto max-w-2xl space-y-2 p-6",children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Live"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Connect to a NEXUS daemon to watch runs live."})]})}function E(){var e,t,a,h,p,f;let v=(0,m.In)(),[b,j]=(0,r.useState)("practical"),[S,E]=(0,r.useState)(null),[I,C]=(0,r.useState)("all"),[L,R]=(0,r.useState)(!1);(0,r.useEffect)(()=>{try{window.localStorage.removeItem("elanous.live.mode")}catch(e){}},[]),(0,r.useEffect)(()=>{if(!S)return;let e=setTimeout(()=>{j("practical"),E(null)},Math.max(0,S-Date.now()));return()=>clearTimeout(e)},[S]);let H=(0,o.M1)(),[D,P]=(0,r.useState)(null),X=e=>{e.on?(j("max"),C(e.scope&&"all"!==e.scope?"run":"all"),E(e.until?Date.parse(e.until):Date.now()+18e5)):(j("practical"),E(null))};(0,r.useEffect)(()=>{let e=!0;return H.getLiveDetail().then(t=>{e&&X(t)}).catch(()=>{}),()=>{e=!1}},[H]);let q=e=>{R(!1),P(null);let t="run"===e&&z?z:"all";H.setLiveDetail({scope:t,ttlMin:30,by:"pwa-live"}).then(X).catch(e=>P(e instanceof Error?e.message:String(e)))},[O,U]=(0,r.useState)(60),[_,B]=(0,r.useState)(""),T=(0,r.useRef)(!1);(0,r.useEffect)(()=>{"max"!==b||T.current||(T.current=!0,B(k),U(1440)),"max"!==b&&(T.current=!1)},[b]);let[z,F]=(0,r.useState)(null),{logs:W,runs:K,instances:V}=(0,d.HI)({store:_||void 0,windowMinutes:O}),[Q,Y]=(0,r.useState)(()=>Date.now());(0,r.useEffect)(()=>{Y(Date.now())},[W.dataUpdatedAt]);let[Z,G]=(0,r.useState)(!1);(0,r.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&G(!0)},[]);let $=null!=(h=null==(e=W.data)?void 0:e.logs)?h:M,J=(0,r.useMemo)(()=>Z?(0,x.yR)($):$,[$,Z]),ee=(0,l.I)({queryKey:["live","shipped",O],queryFn:()=>H.getLiveShipped("".concat(O,"m")),refetchInterval:6e4}),et=(0,r.useMemo)(()=>{var e,t,a;let n=(0,c.Hc)(J,null!=(a=null==(e=K.data)?void 0:e.entries)?a:[],{now:Q,windowMinutes:O}),r=null==(t=ee.data)?void 0:t.merged;if("number"!=typeof r)return n;let l=(0,u.NZ)(J).length;return{...n,gauges:{...n.gauges,shipped:r,selfHealRuns:l,selfHealRate:r>0?Math.round(l/r*100):null}}},[J,K.data,Q,O,ee.data]),ea=O>0?Math.round(J.length/O*10)/10:0,en=Math.round(JSON.stringify(J).length/1024),er=(0,r.useMemo)(()=>J.filter(e=>{var t;return!z||(null==(t=e.data)?void 0:t.runId)===z}).map(e=>(0,c.BP)(e)),[J,z]),el=(null!=(p=null==(t=V.data)?void 0:t.instances)?p:[]).filter(e=>!1!==e.dbExists&&!e.current);return(0,n.jsxs)("div",{className:"mx-auto ".concat("max"===b?"max-w-none space-y-2 p-2":"max-w-6xl space-y-4 p-4 sm:p-6"),children:[(0,n.jsx)("style",{children:A}),(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-3 ".concat("max"===b?"justify-end":"justify-between"),children:[(0,n.jsxs)("div",{className:"max"===b?"hidden":"",children:[(0,n.jsxs)("h1",{className:"flex items-center gap-2 text-xl font-semibold tracking-tight",children:[(0,n.jsx)(s.A,{className:"h-5 w-5","aria-hidden":!0})," Live"]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"하니스 런이 판단하고 기획하는 신호 — 보이는 수는 전부 진짜다."})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,n.jsx)("select",{"aria-label":"시간 창",value:O,onChange:e=>U(Number(e.target.value)),className:"rounded-md border bg-background px-2 py-1",children:y.map(e=>(0,n.jsx)("option",{value:e,children:e<60?"".concat(e,"분"):"".concat(e/60,"시간")},e))}),(0,n.jsxs)("select",{"aria-label":"신호 출처",value:_,onChange:e=>B(e.target.value),className:"max-w-48 rounded-md border bg-background px-2 py-1",children:[(0,n.jsx)("option",{value:"",children:"이 인스턴스"}),(0,n.jsx)("option",{value:k,children:"전체(연합 \xb7 최근 24시간에 쓰인 우주)"}),el.map(e=>(0,n.jsx)("option",{value:e.name,children:e.name},e.name))]}),(0,n.jsx)("button",{type:"button","data-elanous-action":"live-public-capture","aria-pressed":Z,onClick:()=>G(e=>!e),title:"녹화\xb7스크린샷용 — 계정 이름 → account-N \xb7 크레딧\xb7USD 숨김 \xb7 홈 경로 가림",className:"rounded-md border px-2 py-1 ".concat(Z?"border-emerald-500 text-emerald-600 dark:text-emerald-300":"hover:bg-muted"),children:Z?"● 공개 캡처 켜짐":"공개 캡처"}),"max"===b?(0,n.jsxs)("button",{type:"button","data-elanous-action":"live-max-off",onClick:()=>{P(null),H.setLiveDetail({scope:"all",ttlMin:0,by:"pwa-live"}).then(X).catch(e=>P(e instanceof Error?e.message:String(e))),j("practical"),E(null)},className:"inline-flex items-center gap-1 rounded-md border border-primary px-2 py-1 text-primary hover:bg-muted",children:[(0,n.jsx)(i.A,{className:"h-3.5 w-3.5","aria-hidden":!0})," 화려함 MAX 켜짐 \xb7 끄기"]}):(0,n.jsxs)("button",{type:"button","data-elanous-action":"live-max-on",onClick:()=>R(!0),className:"inline-flex items-center gap-1 rounded-md border px-2 py-1 hover:bg-muted",children:[(0,n.jsx)(i.A,{className:"h-3.5 w-3.5","aria-hidden":!0})," 화려함 MAX"]})]})]}),L&&(0,n.jsxs)("div",{role:"dialog","aria-label":"화려함 MAX 켜기",className:"space-y-2 rounded-md border border-primary/50 bg-primary/5 p-3 text-sm","data-live-max-confirm":!0,children:[(0,n.jsx)("p",{className:"font-medium",children:"화려함 MAX 를 켤까요?"}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["마케팅(시연\xb7녹화)과 상세 런 디버깅용입니다. 켜면 하니스가 판단마다 \xab왜\xb7목적\xb7보낸 곳\xbb을 추가로 기록합니다(부하가 듭니다) — 30분 뒤 자동으로 꺼지고, 다른 기기에서도 같은 상태로 보입니다. 지금 이 화면이 받는 신호: 분당 ",ea,"건 \xb7 응답 약 ",en,"KB."]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2 text-xs",children:[(0,n.jsx)("button",{type:"button","data-elanous-action":"live-max-all",onClick:()=>q("all"),className:"rounded-md border px-2 py-1 hover:bg-muted",children:"전체로 켜기"}),(0,n.jsx)("button",{type:"button","data-elanous-action":"live-max-run",disabled:!z,onClick:()=>q("run"),className:"rounded-md border px-2 py-1 hover:bg-muted disabled:opacity-50",children:z?"이 런만 켜기":"이 런만 켜기(먼저 런을 고르세요)"}),(0,n.jsx)("button",{type:"button",onClick:()=>R(!1),className:"rounded-md px-2 py-1 text-muted-foreground hover:bg-muted",children:"취소"})]})]}),D&&(0,n.jsxs)("p",{className:"rounded-md bg-error/10 p-2 text-xs text-error",children:["MAX 스위치를 못 바꿨다: ",D]}),"max"===b&&(0,n.jsxs)("p",{className:"rounded-md border border-primary/40 px-3 py-1 text-[11px] lg:text-[10px] text-muted-foreground","data-live-cost-badge":!0,children:["화려함 MAX \xb7 범위 ","run"===I&&z?"런 ".concat(z.replace(/^run-/,"").slice(0,8)):"전체"," \xb7 받는 신호 분당 ",ea,"건 \xb7 응답 약 ",en,"KB",S?" \xb7 ".concat(Math.max(0,Math.round((S-Q)/6e4)),"분 뒤 자동 꺼짐"):""," \xb7 하니스 판단 이벤트 ",et.emitted,"건"]}),W.error?(0,n.jsxs)("p",{className:"rounded-md bg-error/10 p-3 text-sm text-error",children:["신호를 못 읽었다: ",W.error instanceof Error?W.error.message:String(W.error)]}):null,z&&(0,n.jsx)(w.RT,{runId:z,run:null!=(f=et.snapshot.runs.find(e=>e.runId===z))?f:null,lines:er,onClose:()=>F(null)}),"max"===b?(0,n.jsx)(N.xl,{board:et,rows:J,windowMinutes:O,sourceLabel:_===k?"federated":_||"this instance",shippedSource:"number"==typeof(null==(a=ee.data)?void 0:a.merged)?"github":"log",publicCapture:Z,role:v,onSelectRun:e=>F(t=>t===e?null:e)}):(0,n.jsx)(g,{board:et,lines:er,mode:b,role:v,selectedRunId:z,onSelectRun:e=>F(t=>t===e?null:e)}),(0,n.jsxs)("p",{className:"text-[11px] text-muted-foreground ".concat("max"===b?"hidden":""),children:["갱신 5초 \xb7 출처 ",(0,n.jsx)("code",{children:"/v1/logs"})," \xb7 ",(0,n.jsx)("code",{children:"/v1/harness/runs"})," \xb7 비밀처럼 보이는 조각은 가린다."]})]})}let M=[],A="\n@keyframes live-pulse { 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(99,102,241,0) } 50% { opacity: .55; box-shadow: 0 0 10px 2px rgba(99,102,241,.55) } }\n@keyframes live-pulse-bad { 0%,100% { opacity: 1 } 50% { opacity: .4; box-shadow: 0 0 10px 2px rgba(239,68,68,.6) } }\n@keyframes live-glow { 0%,100% { box-shadow: 0 0 0 0 rgba(99,102,241,0) } 50% { box-shadow: 0 0 18px 2px rgba(99,102,241,.35) } }\n@keyframes live-line-in { from { transform: translateY(-6px); opacity: 0 } to { transform: none; opacity: 1 } }\n@keyframes live-ship { 0% { background: rgba(34,197,94,.35) } 100% { background: transparent } }\n.live-max .live-pulse { animation: live-pulse 1.4s ease-in-out infinite }\n.live-max .live-pulse-bad { animation: live-pulse-bad 1s ease-in-out infinite }\n.live-max .live-glow { animation: live-glow 2.4s ease-in-out infinite }\n.live-max .live-line-in { animation: live-line-in .45s ease-out }\n.live-max .live-ship { animation: live-ship 2.4s ease-out; font-size: 12px }\n.live-max .live-gauge { background: radial-gradient(120% 120% at 0% 0%, rgba(99,102,241,.10), transparent 60%) }\n.live-max .live-count { text-shadow: 0 0 12px rgba(99,102,241,.45) }\n.live-stage { background: radial-gradient(120% 90% at 50% 0%, rgba(79,70,229,.25), rgba(2,6,23,.98) 60%), #020617; box-shadow: inset 0 0 0 1px rgba(99,102,241,.25) }\n.live-stage .live-line-in { animation: live-line-in .45s ease-out }\n@keyframes live-v5-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }\n@keyframes live-v5-blink { 0%,100% { opacity: 1 } 50% { opacity: .45 } }\n@keyframes live-v5-hot { 0%,100% { box-shadow: 0 0 14px #a78bfa55, inset 0 0 14px #a78bfa22 } 50% { box-shadow: 0 0 26px #a78bfa99, inset 0 0 22px #a78bfa44 } }\n.live-v5-marquee { animation: live-v5-marquee linear infinite }\n.live-v5-blink { animation: live-v5-blink 1.6s ease-in-out infinite }\n.live-v5-hot { animation: live-v5-hot 1.8s ease-in-out infinite }\n@media (prefers-reduced-motion: reduce) { .live-max *, .live-v5 * { animation: none !important; transition: none !important } }\n";function I(){return(0,n.jsx)(S,{})}},88833:(e,t,a)=>{Promise.resolve().then(a.bind(a,66847))},97479:(e,t,a)=>{"use strict";a.d(t,{GC:()=>r,In:()=>d,OG:()=>i});var n=a(46124);let r="elanous.pwa.role",l="elanous:pwa-role";function s(){try{let e=window.localStorage.getItem(r);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function i(e){try{window.localStorage.setItem(r,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(l))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(l,e);let t=t=>{(t.key===r||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(l,e),window.removeEventListener("storage",t)}}function d(){return(0,n.useSyncExternalStore)(o,s,()=>"general")}}},e=>{e.O(0,[211,3324,3558,1501,5360,2463,2196,7358],()=>e(e.s=88833)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[125],{1097:(e,t,n)=>{Promise.resolve().then(n.bind(n,30212))},30212:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>T});var a=n(55539),r=n(46124),l=n(58603),s=n(21501),o=n(94306);let i=new Set(["fail","failed","error","blocked","rejected","aborted","unconvergeable","timeout"]);function d(e,t,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:900,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:4e3,l=e[t],s=e[t+1];if(!l||!s)return a/n;let o=Date.parse(s.at)-Date.parse(l.at);return(Number.isFinite(o)?Math.min(r,Math.max(a,o/60)):a)/Math.max(1,n)}function c(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t+324e5).toISOString().slice(11,19):"—"}function u(e){if(null===e||!Number.isFinite(e)||e<0)return"—";if(e<1e3)return"".concat(Math.round(e),"ms");let t=Math.round(e/1e3);if(t<60)return"".concat(t,"초");let n=Math.floor(t/60);return n<60?"".concat(n,"분 ").concat(t%60,"초"):"".concat(Math.floor(n/60),"시간 ").concat(n%60,"분")}var p=n(88928),m=n(69280);n(71588),n(34188);var x=n(81663),h=n(41778);let f="group:",b=e=>e.startsWith(f);function g(e){let t=new Map;for(let n of e.nodes){let e="string"==typeof n.group?n.group.trim():"";e&&t.set(n.node_id,e)}return t}let v={pending:"var(--border, #94a3b8)",running:"#f59e0b",passed:"var(--chart-2, #16a34a)",failed:"var(--destructive, #ef4444)"},y={pending:"대기",running:"도는 중",passed:"통과",failed:"실패"},j={agent:"#3b82f6",gate:"#f59e0b",git:"#10b981",judge:"#a855f7",observe:"#06b6d4",hitl:"#f43f5e",subgraph:"#8b5cf6"},w={pending:"var(--border, #cbd5e1)",running:"#f59e0b",passed:"var(--chart-2, #16a34a)",failed:"var(--destructive, #ef4444)"},N={pending:"대기",running:"도는 중",passed:"통과",failed:"실패"},k={pending:"workflow-node-status",running:"workflow-node-status workflow-node-status-running",passed:"workflow-node-status workflow-node-status-done",failed:"workflow-node-status workflow-node-status-failed"},M=[1,4,16],I={live:function(e){var t;let{data:n}=e;return(0,a.jsxs)("div",{"data-testid":"live-node-".concat(n.label),"data-state":n.state,className:"relative rounded-lg border-2 bg-surface px-3 py-2 shadow-sm transition-opacity duration-300 ".concat(k[n.state]," ").concat("pending"===n.state?n.unrecorded?"opacity-35":"opacity-60":""),style:{width:x.E,height:n.height,borderColor:w[n.state],borderLeft:"5px solid ".concat(null!=(t=j[n.kind])?t:"#64748b"),outline:n.focused?"2px solid var(--accent, #8b5cf6)":void 0,outlineOffset:3},children:[(0,a.jsx)(p.h7,{id:"in",type:"target",position:m.yX.Left,className:"!pointer-events-none !opacity-0"}),(0,a.jsxs)("div",{className:"flex items-center gap-1 text-[11px] text-text-tertiary",children:[(0,a.jsx)("span",{children:"subgraph"===n.kind?"묶음 \xb7 눌러서 펼치기":n.kind}),n.entry&&(0,a.jsx)("span",{className:"rounded bg-success/15 px-1 text-success",children:"시작"}),n.terminal&&(0,a.jsx)("span",{className:"rounded bg-accent/15 px-1 text-accent",children:"끝"}),(0,a.jsx)("span",{className:"ml-auto font-medium",style:{color:w[n.state]},children:n.unrecorded?"기록 없음":N[n.state]})]}),(0,a.jsx)("div",{className:"truncate font-mono text-sm font-semibold text-text-primary",children:b(n.label)?"▣ ".concat(n.label.slice(f.length)):n.label}),(0,a.jsxs)("div",{className:"truncate text-[11px] text-text-tertiary",title:n.recipe,children:[n.recipe," \xb7 최대 ",n.maxVisits,"회"]}),n.visits>1&&(0,a.jsxs)("span",{"data-testid":"visit-badge-".concat(n.label),className:"absolute -right-2 -top-2 rounded-full bg-amber-500 px-1.5 text-xs font-bold text-white shadow",children:["\xd7",n.visits]}),(0,a.jsx)(p.h7,{id:"out",type:"source",position:m.yX.Right,className:"!pointer-events-none !opacity-0"})]})},groupBox:function(e){let{data:t}=e,n=v[t.state];return(0,a.jsx)("div",{"data-testid":"group-box-".concat(t.group),"data-state":t.state,className:"pointer-events-none rounded-xl border-2 border-dashed ".concat(t.unrecorded?"opacity-60":""),style:{width:t.width,height:t.height,borderColor:n,background:"color-mix(in srgb, ".concat(n," 6%, transparent)")},children:(0,a.jsxs)("div",{className:"pointer-events-auto flex items-center gap-2 px-2.5 py-1 text-xs",children:[(0,a.jsx)("span",{className:"font-mono font-semibold text-text-primary",children:t.group}),(0,a.jsx)("span",{className:"text-[11px]",style:{color:n},children:t.unrecorded?"기록 없음":y[t.state]}),(0,a.jsxs)("span",{className:"text-[11px] text-text-tertiary",children:["노드 ",t.memberCount]}),t.onCollapse&&(0,a.jsx)("button",{type:"button",onClick:e=>{var n;e.stopPropagation(),null==(n=t.onCollapse)||n.call(t,t.group)},className:"nodrag ml-auto rounded border border-border bg-background px-1.5 text-[11px] text-text-secondary",children:"접기"})]})})}},C={live:function(e){let{id:t,data:n,markerEnd:r}=e;if(!(null==n?void 0:n.route))return null;let{route:l}=n,s=h.Bu[l.family],o="back"===l.kind;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(p.tE,{id:t,path:l.path,markerEnd:r,style:{stroke:s,strokeWidth:n.active?4:n.taken?3:1.5,opacity:n.active||n.taken?1:.22,transition:"opacity 300ms, stroke-width 300ms",...o?{strokeDasharray:"6 4"}:{}}}),n.active&&(0,a.jsxs)("g",{"data-testid":"edge-token-".concat(l.from,"-").concat(l.to),children:[(0,a.jsx)("circle",{r:7,fill:s,opacity:.25,children:(0,a.jsx)("animateMotion",{dur:"".concat(n.tokenMs,"ms"),fill:"freeze",path:l.path})}),(0,a.jsx)("circle",{r:4.5,fill:s,stroke:"var(--background, #fff)",strokeWidth:1.5,children:(0,a.jsx)("animateMotion",{dur:"".concat(n.tokenMs,"ms"),fill:"freeze",path:l.path})})]},n.tokenKey),l.label&&(0,a.jsx)(p.rV,{children:(0,a.jsx)("div",{className:"nodrag nopan pointer-events-none absolute whitespace-nowrap rounded-full border px-1.5 font-mono text-[11px] leading-4",style:{transform:"translate(-50%, -50%) translate(".concat(l.label.x,"px, ").concat(l.label.y,"px)"),width:l.label.width,textAlign:"center",borderColor:s,color:s,background:"var(--background, #fff)",opacity:n.active||n.taken?1:.35,fontWeight:n.active?700:500},children:l.label.text})})]})}};function S(e){var t,n,l,m,h,v;let{runId:y,initialFolded:j=!1}=e,w=(0,o.M1)(),N=(0,s.I)({queryKey:["harness-run-traversal",y],queryFn:()=>w.getHarnessRunTraversal(y),refetchInterval:e=>{var t;return(null==(t=e.state.data)?void 0:t.status)==="running"&&4e3}}),k=N.data,S=(0,s.I)({queryKey:["run-graph",null==k?void 0:k.graphId],queryFn:()=>w.getRunGraph(k.graphId),enabled:!!(null==k?void 0:k.graphId),retry:!1,staleTime:6e4}),_=(0,r.useMemo)(()=>{var e;return null!=(e=null==k?void 0:k.steps)?e:[]},[k]),E=(0,r.useMemo)(()=>{var e;if(!k)return null;let t=S.data;return t?function(e,t){let n=new Set(e.nodes.map(e=>e.node_id)),a=[...new Set(t.map(e=>e.node))].filter(e=>!n.has(e)),r=t=>e.edges.filter(e=>e.from===t).flatMap(e=>e.map?Object.values(e.map):e.to?[e.to]:[]),l=[];for(let e=1;e<t.length;e+=1){let n=t[e-1].node,a=t[e].node;r(n).includes(a)||l.some(e=>e.from===n&&e.to===a)||l.push({from:n,to:a})}return 0===a.length&&0===l.length?e:{...e,nodes:[...e.nodes,...a.map(e=>({node_id:e,kind:"agent",recipe:"원장에서 본 노드(선언 밖)",max_visits:t.filter(t=>t.node===e).length}))],edges:[...e.edges,...l]}}(t,_):S.isLoading&&k.graphId?null:function(e,t){var n,a,r;let l=[...new Set(t.map(e=>e.node))],s=new Map;for(let e=1;e<t.length;e+=1){let r=t[e-1],l=null!=(n=s.get(r.node))?n:{},o=null!=(a=r.outcome)?a:"pass";Object.values(l).includes(t[e].node)||(l[l[o]?"".concat(o,"\xb7").concat(t[e].node):o]=t[e].node),s.set(r.node,l)}return{id:e,source:"core",editable:!1,entry_node:null!=(r=l[0])?r:"",terminal_nodes:t.length?[t.at(-1).node]:[],nodes:l.map(e=>({node_id:e,kind:"agent",recipe:"원장에서 본 노드",max_visits:t.filter(t=>t.node===e).length})),edges:[...s.entries()].map(e=>{let[t,n]=e;return{from:t,on:"outcome",map:n}})}}(null!=(e=k.graphId)?e:k.runId,_)},[k,S.data,S.isLoading,_]),[T,O]=(0,r.useState)(()=>new Set),R=(0,r.useMemo)(()=>E?[...new Set(g(E).values())]:[],[E]),F=(0,r.useMemo)(()=>E?g(E):new Map,[E]),D=(0,r.useRef)(!1);(0,r.useEffect)(()=>{j&&!D.current&&0!==R.length&&(D.current=!0,O(new Set(R)))},[j,R]);let V=(0,r.useMemo)(()=>E?function(e,t){let n=g(e),a=e=>{let a=n.get(e);return a&&t.has(a)?"".concat(f).concat(a):e};if(![...n.values()].some(e=>t.has(e)))return{graph:e,resolve:a};let r=[],l=new Set;for(let t of e.nodes){let s=a(t.node_id);if(l.has(s))continue;if(l.add(s),s===t.node_id){r.push(t);continue}let o=n.get(t.node_id),i=e.nodes.filter(e=>n.get(e.node_id)===o);r.push({node_id:s,kind:"subgraph",recipe:"묶음 \xb7 노드 ".concat(i.length,"개"),max_visits:Math.max(...i.map(e=>e.max_visits)),group:o})}let s=[];for(let t of e.edges){let e=a(t.from);if(t.map){let n={};for(let[r,l]of Object.entries(t.map)){let t=a(l);t!==e&&(n[r]=t)}Object.keys(n).length&&s.push({from:e,...t.on?{on:t.on}:{},map:n})}else if(t.to){let n=a(t.to);n!==e&&s.push({from:e,to:n})}}let o=[];for(let e of s){let t=o.find(t=>t.from===e.from&&!!t.map==!!e.map&&(e.map||t.to===e.to));if(!t){o.push(e.map?{...e,map:{...e.map}}:e);continue}if(e.map&&t.map)for(let[n,a]of Object.entries(e.map))n in t.map?t.map[n]===a||Object.values(t.map).includes(a)||(t.map["".concat(n,"\xb7").concat(a.replace(f,""))]=a):t.map[n]=a}let i=a(e.entry_node),d=[...new Set(e.terminal_nodes.map(a))];return{graph:{...e,entry_node:i,terminal_nodes:d,nodes:r,edges:o},resolve:a}}(E,T):null,[E,T]),z=(0,r.useMemo)(()=>V?(0,x.h)(V.graph):null,[V]),K=(0,r.useMemo)(()=>V?_.map(e=>({...e,node:V.resolve(e.node)})):_,[V,_]),L=(0,r.useMemo)(()=>{var e;return null!=(e=null==z?void 0:z.edges.map(e=>({id:e.id,from:e.source,to:e.target,outcomes:e.data.route.outcomes})))?e:[]},[z]),Z=(null==k?void 0:k.status)==="running",[q,A]=(0,r.useState)(null),W=null!=q?q:Z?"live":"replay",[B,P]=(0,r.useState)(-1),[H,G]=(0,r.useState)(!1),[X,$]=(0,r.useState)(!1),[Q,U]=(0,r.useState)(4),[J,Y]=(0,r.useState)(null),[ee,et]=(0,r.useState)(!0),en=(0,r.useRef)(null),ea=(0,r.useRef)(null),[er,el]=(0,r.useState)(0),es=(0,r.useRef)(!1);(0,r.useEffect)(()=>{k&&!es.current&&0!==_.length&&(es.current=!0,"running"===k.status?(P(_.length-1),G(null===_.at(-1).outcome)):(P(0),G(!0),$(!0)))},[k,_]),(0,r.useEffect)(()=>{"live"===W&&0!==_.length&&(P(_.length-1),G(null===_.at(-1).outcome))},[W,_]),(0,r.useEffect)(()=>{if("replay"!==W||!X||0===_.length)return;let e=d(_,B,Q),t=window.setTimeout(()=>G(!1),e/2),n=window.setTimeout(()=>{if(B>=_.length-1)return void $(!1);P(e=>e+1),G(!0)},e);return()=>{window.clearTimeout(t),window.clearTimeout(n)}},[W,X,B,Q,_]);let eo=(0,r.useMemo)(()=>new Set(K.map(e=>e.node)),[K]),ei=(0,r.useMemo)(()=>{var e;return function(e,t,n,a){let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],l=Object.fromEntries(e.map(e=>[e,"pending"])),s={},o=new Set,d=null,c=Math.min(a,n.length-1);for(let e=0;e<=c;e+=1){var u,p;let a=n[e];if(s[a.node]=(null!=(u=s[a.node])?u:0)+1,l[a.node]=e===c&&r||null===(p=a.outcome)?"running":i.has(p.toLowerCase())?"failed":"passed",e>0){let r=n[e-1],l=function(e,t,n,a){var r;let l=e.filter(e=>e.from===t&&e.to===a);return 0===l.length?null:null!=(r=l.find(e=>null!==n&&e.outcomes.includes(n)))?r:l[0]}(t,r.node,r.outcome,a.node);l&&(o.add(l.id),e===c&&(d=l.id))}}return{nodeState:l,visits:s,takenEdges:o,activeEdge:d,cursor:c}}(null!=(e=null==z?void 0:z.nodes.map(e=>e.id))?e:[],L,K,B,H)},[z,L,K,B,H]),ed=(0,r.useCallback)(e=>O(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),[]),ec="replay"===W?Math.max(250,.6*d(_,Math.max(0,B-1),Q)):1200,eu=(0,r.useMemo)(()=>{if(!z)return[];let e=z.nodes.map(e=>{var t,n;return{...e,type:"live",zIndex:1,data:{...e.data,state:null!=(t=ei.nodeState[e.id])?t:"pending",visits:null!=(n=ei.visits[e.id])?n:0,focused:J===e.id,unrecorded:!Z&&!eo.has(e.id)}}});return[...(function(e,t){let n=new Map;for(let r of e){var a;let e=t.get(r.id);!e||b(r.id)||n.set(e,[...null!=(a=n.get(e))?a:[],r])}return[...n.entries()].map(e=>{let[t,n]=e,a=Math.min(...n.map(e=>e.position.x)),r=Math.min(...n.map(e=>e.position.y)),l=Math.max(...n.map(e=>e.position.x+e.width)),s=Math.max(...n.map(e=>e.position.y+e.height));return{id:"box:".concat(t),group:t,members:n.map(e=>e.id),x:a-18,y:r-18-26,width:l-a+36,height:s-r+36+26}})})(z.nodes.map(e=>({id:e.id,position:e.position,width:x.E,height:e.data.height})),F).map(e=>{var t;return{id:e.id,type:"groupBox",position:{x:e.x,y:e.y},zIndex:0,selectable:!1,draggable:!1,focusable:!1,data:{group:e.group,memberCount:e.members.length,width:e.width,height:e.height,onCollapse:ed,state:(t=e.members.map(e=>{var t;return null!=(t=ei.nodeState[e])?t:"pending"})).includes("running")?"running":t.includes("failed")?"failed":t.includes("passed")?"passed":"pending",unrecorded:!Z&&e.members.every(e=>!eo.has(e))}}}),...e]},[z,ei,J,Z,eo,F,ed]),ep=(0,r.useMemo)(()=>{var e;return null!=(e=null==z?void 0:z.edges.map(e=>({...e,type:"live",data:{...e.data,taken:ei.takenEdges.has(e.id),active:ei.activeEdge===e.id,tokenKey:"".concat(e.id,":").concat(ei.cursor),tokenMs:ec}})))?e:[]},[z,ei,ec]),em=(0,r.useCallback)(e=>{Y(e);let t=en.current;t&&(e?t.fitView({nodes:[{id:e}],duration:600,maxZoom:1.4,padding:.6}):t.fitView({duration:600,padding:.08,minZoom:.5}))},[]),ex=null!=(n=null==(t=K[B])?void 0:t.node)?n:null;(0,r.useEffect)(()=>{var e,t;if(!ee||J||!ex||!z)return;let n=z.nodes.find(e=>e.id===ex),a=en.current;if(!n||!a)return;let r=Math.min(1,Math.max(.78,(null!=(t=null==(e=ea.current)?void 0:e.clientWidth)?t:1e3)/900));a.setCenter(n.position.x+x.E/2,n.position.y+n.data.height/2,{zoom:r,duration:400})},[ee,J,ex,z,er]);let eh="replay"===W&&!X&&_.length>0&&B===_.length-1;(0,r.useEffect)(()=>{var e,t;if(!eh||!ee||J||(null!=(t=null==(e=ea.current)?void 0:e.clientWidth)?t:1e3)<700)return;let n=window.setTimeout(()=>{var e;null==(e=en.current)||e.fitView({nodes:[...eo].map(e=>({id:e})),duration:800,padding:.08,minZoom:.5})},1200);return()=>window.clearTimeout(n)},[eh,ee,J,eo]);let ef=e=>{A("replay"),$(!1),P(e),G(!1)};if(N.isLoading)return(0,a.jsx)("p",{className:"p-4 text-sm text-text-tertiary",children:"런 원장을 읽는 중…"});if(N.isError||!k)return(0,a.jsxs)("p",{role:"alert",className:"p-4 text-sm text-error",children:["이 런의 원장을 읽지 못했습니다 (",y,")."]});let eb=J?_.map((e,t)=>({step:e,index:t})).filter(e=>{var t;let{step:n}=e;return(null!=(t=null==V?void 0:V.resolve(n.node))?t:n.node)===J}):[],eg=B>=0?_[B]:void 0;return(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("span",{className:"rounded-full px-2 py-0.5 text-xs font-semibold ".concat(Z?"bg-amber-500/15 text-amber-600 dark:text-amber-400":"completed"===k.status?"bg-success/15 text-success":"bg-error/15 text-error"),children:function(e){switch(e){case"running":return"● 도는 중";case"completed":return"완료";case"failed":return"실패";case"abandoned":return"버려짐";case"cancelled":return"취소됨";default:return e}}(k.status)}),(0,a.jsx)("h2",{className:"order-first min-w-0 basis-full truncate text-sm font-semibold text-text-primary sm:order-none sm:basis-0 sm:flex-1",title:null!=(l=k.title)?l:void 0,children:null!=(m=k.title)?m:k.runId}),null!==k.prNumber&&(0,a.jsxs)("span",{className:"text-xs text-text-secondary",children:["PR #",k.prNumber]}),(0,a.jsxs)("span",{className:"font-mono text-[11px] text-text-tertiary",children:[k.runId.slice(0,12)," \xb7 ",null!=(h=k.graphId)?h:"그래프 모름",k.substrate?" \xb7 ".concat(k.substrate):""]})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,a.jsxs)("div",{role:"group","aria-label":"보기",className:"flex overflow-hidden rounded border border-border",children:[(0,a.jsx)("button",{type:"button",disabled:!Z,onClick:()=>{A("live"),$(!1)},className:"px-2 py-1 ".concat("live"===W?"bg-primary text-primary-foreground":""," disabled:opacity-40"),children:"● 라이브"}),(0,a.jsx)("button",{type:"button",onClick:()=>{A("replay")},className:"px-2 py-1 ".concat("replay"===W?"bg-primary text-primary-foreground":""),children:"리플레이"})]}),"replay"===W&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{type:"button","aria-label":X?"일시정지":"재생",onClick:()=>{!X&&B>=_.length-1&&(P(0),G(!0)),$(!X)},className:"rounded border border-border px-2.5 py-1 font-semibold",children:X?"⏸ 일시정지":"▶ 재생"}),(0,a.jsx)("button",{type:"button",onClick:()=>{P(0),G(!0),$(!1)},className:"rounded border border-border px-2 py-1",children:"처음"}),(0,a.jsx)("div",{role:"group","aria-label":"속도",className:"flex overflow-hidden rounded border border-border",children:M.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>U(e),"aria-pressed":Q===e,className:"px-2 py-1 ".concat(Q===e?"bg-accent/20 font-semibold text-text-primary":"text-text-secondary"),children:[e,"\xd7"]},e))}),(0,a.jsx)("input",{type:"range","aria-label":"재생 위치",min:0,max:Math.max(0,_.length-1),value:Math.max(0,B),onChange:e=>ef(Number(e.target.value)),className:"min-w-[120px] flex-1"})]}),(0,a.jsxs)("span",{className:"text-text-tertiary",children:[Math.max(0,B+1),"/",_.length," 단계",eg?" \xb7 ".concat(eg.node," \xd7").concat(eg.visit):""]}),(0,a.jsx)("button",{type:"button",onClick:()=>{et(!1),em(null)},className:"rounded border border-border px-2 py-1",children:"전체 보기"}),(0,a.jsx)("button",{type:"button","aria-pressed":ee,onClick:()=>{et(!ee),Y(null)},className:"rounded border px-2 py-1 ".concat(ee?"border-primary text-primary":"border-border"),children:"카메라 따라가기"}),R.length>0&&(0,a.jsx)("button",{type:"button","data-testid":"toggle-units",onClick:()=>{Y(null),O(T.size===R.length?new Set:new Set(R))},className:"rounded border border-border px-2 py-1",children:T.size===R.length?"묶음 펼치기 (통합 보기)":"묶음 접기"})]}),(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-3 lg:flex-row",children:[(0,a.jsxs)("section",{ref:ea,"aria-label":"실행 그래프",className:"relative h-[60dvh] min-h-[340px] min-w-0 overflow-hidden rounded-lg border border-border bg-surface lg:h-[calc(100dvh-230px)] lg:min-h-[520px] lg:flex-1",children:[0===_.length&&(0,a.jsx)("p",{className:"absolute left-3 top-3 z-10 text-xs text-text-tertiary",children:"아직 노드에 들어가지 않았습니다(원장에 `pipeline-node-entry` 없음)."}),z&&(0,a.jsxs)(p.Gc,{nodes:eu,edges:ep,nodeTypes:I,edgeTypes:C,onInit:e=>{en.current=e,el(e=>e+1)},onNodeClick:(e,t)=>{if("groupBox"!==t.type){if(b(t.id)){var n;let e=null!=(n=t.data.group)?n:t.id.slice(6);ed(e),Y(null),window.setTimeout(()=>{var t;null==(t=en.current)||t.fitView({nodes:[{id:"box:".concat(e)}],duration:600,maxZoom:1.4,padding:.2})},80);return}em(J===t.id?null:t.id)}},onPaneClick:()=>{J&&em(null)},fitView:!0,fitViewOptions:{padding:.08,minZoom:.5},minZoom:.2,maxZoom:2,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,edgesFocusable:!1,deleteKeyCode:null,proOptions:{hideAttribution:!0},className:"!bg-surface",children:[(0,a.jsx)(p.VS,{}),(0,a.jsx)(p.H2,{showInteractive:!1})]},"".concat(null!=(v=null==E?void 0:E.id)?v:"graph",":").concat([...T].sort().join(","))),J&&(0,a.jsxs)("div",{"data-testid":"node-detail",className:"absolute bottom-3 left-3 right-3 z-10 max-h-[45%] overflow-y-auto rounded-lg border border-border bg-background/95 p-3 text-xs shadow-lg backdrop-blur sm:right-auto sm:w-[320px]",children:[(0,a.jsxs)("div",{className:"mb-1 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-mono text-sm font-semibold text-text-primary",children:J}),(0,a.jsxs)("span",{className:"text-text-tertiary",children:["방문 ",eb.length,"회"]}),(0,a.jsx)("button",{type:"button",onClick:()=>em(null),className:"ml-auto rounded border border-border px-1.5",children:"닫기"})]}),0===eb.length&&(0,a.jsx)("p",{className:"text-text-tertiary",children:Z?"아직 이 노드에 들어가지 않았습니다.":"기록 없음 — 이 런의 원장에 이 노드의 사건이 없습니다."}),(0,a.jsx)("ul",{className:"space-y-1",children:eb.map(e=>{var t;let{step:n,index:r}=e;return(0,a.jsx)("li",{children:(0,a.jsxs)("button",{type:"button",onClick:()=>ef(r),className:"w-full rounded px-1 py-0.5 text-left hover:bg-surface-elevated",children:[(0,a.jsx)("span",{className:"font-mono text-text-secondary",children:c(n.at)})," ",(0,a.jsxs)("span",{className:"font-semibold",children:["\xd7",n.visit]})," ",(0,a.jsx)("span",{className:"fail"===n.outcome?"text-error":null===n.outcome?"text-amber-500":"text-success",children:null!=(t=n.outcome)?t:"도는 중"})," ",(0,a.jsx)("span",{className:"text-text-tertiary",children:u(n.durationMs)}),n.detail&&(0,a.jsx)("span",{className:"block text-text-secondary",children:n.detail})]})},r)})})]})]}),(0,a.jsxs)("aside",{"aria-label":"실행 타임라인",className:"max-h-[420px] overflow-y-auto rounded-lg border border-border bg-surface lg:max-h-[calc(100dvh-230px)] lg:w-[340px] lg:shrink-0",children:[(0,a.jsx)("h3",{className:"sticky top-0 border-b border-border bg-surface px-3 py-2 text-xs font-semibold",children:"타임라인 (KST)"}),(0,a.jsx)("ol",{children:_.map((e,t)=>{var n,r;let l=t>B,s=t===B;return(0,a.jsx)("li",{children:(0,a.jsxs)("button",{type:"button",onClick:()=>{var n;ef(t),em(null!=(n=null==V?void 0:V.resolve(e.node))?n:e.node)},"data-testid":"timeline-step-".concat(t),className:"grid w-full grid-cols-[64px_1fr_auto] items-baseline gap-x-2 border-b border-border/60 px-3 py-1.5 text-left text-xs transition-opacity ".concat(l?"opacity-35":""," ").concat(s?"bg-accent/10":"hover:bg-surface-elevated"),children:[(0,a.jsx)("span",{className:"font-mono text-text-tertiary",children:c(e.at)}),(0,a.jsxs)("span",{className:"font-mono font-semibold text-text-primary",children:[e.node,e.visit>1?" \xd7".concat(e.visit):""]}),(0,a.jsx)("span",{className:"fail"===e.outcome?"text-error":null===e.outcome?"text-amber-500":"text-success",children:null===e.outcome?"도는 중":"fail"===e.outcome?"실패":"통과"}),(0,a.jsx)("span",{className:"text-[11px] text-text-tertiary",children:u(e.durationMs)}),(0,a.jsx)("span",{className:"col-span-2 truncate text-[11px] text-text-secondary",title:null!=(n=e.detail)?n:void 0,children:null!=(r=e.detail)?r:""})]})},t)})})]})]})]})}function _(){return(0,o.Qj)()?(0,a.jsx)(E,{}):(0,a.jsxs)("div",{className:"mx-auto max-w-2xl space-y-2 p-6",children:[(0,a.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"런 장면"}),(0,a.jsx)("p",{className:"text-sm text-text-secondary",children:"데몬에 연결되면 하니스 런 하나가 도는 장면을 그립니다."})]})}function E(){var e;let t=(0,o.M1)(),n=(0,l.useRouter)(),i=(0,l.useSearchParams)(),d=(null==(e=i.get("run"))?void 0:e.trim())||null,u=(0,r.useMemo)(()=>Date.now()-864e5,[]),p=(0,s.I)({queryKey:["harness-runs-since",u],queryFn:()=>t.getHarnessRunsSince(u),refetchInterval:3e4}),m=(0,r.useMemo)(()=>{var e,t;return p.data?function(e,t){let n=e=>(function(e){var t;let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:60,a=(null!=(t=null==e?void 0:e.split("\n").map(e=>e.trim()).find(Boolean))?t:"").replace(/\s*\[truncated[^\]]*\]\s*$/,"").replace(/(?:~|\.{0,2})?\/?(?:[\w.@-]+\/)+([\w.@-]+)/g,"$1");return a.length>n?"".concat(a.slice(0,n-1),"…"):a})(e),a=[...e].sort((e,t)=>{var n,a;return Date.parse(null!=(n=t.lastActivityTimestamp)?n:"")-Date.parse(null!=(a=e.lastActivityTimestamp)?a:"")||0}).map(e=>{var t;return{runId:e.runId,label:n(e.objective)||e.runId,live:!0,at:null!=(t=e.lastActivityTimestamp)?t:null}}),r=new Set(a.map(e=>e.runId));return[...a,...t.filter(e=>!r.has(e.runId)).map(e=>({runId:e.runId,label:n(e.objective)||e.runId,live:!1,at:e.endedAt}))]}(null!=(e=p.data.entries)?e:[],null!=(t=p.data.finished)?t:[]):[]},[p.data]),x=e=>n.replace("/live-run/?run=".concat(encodeURIComponent(e)));return(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-4",children:[(0,a.jsxs)("header",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("h1",{className:"text-base font-semibold text-text-primary",children:"런 장면"}),(0,a.jsx)("span",{className:"text-xs text-text-tertiary",children:"하니스 런 하나가 실제로 밟은 노드\xb7간선 (라이브 \xb7 리플레이)"}),(0,a.jsxs)("label",{className:"flex w-full min-w-0 items-center gap-1 text-xs text-text-secondary sm:ml-auto sm:w-auto sm:min-w-[320px]",children:[(0,a.jsx)("span",{className:"shrink-0",children:"런"}),(0,a.jsxs)("select",{"aria-label":"런 고르기",value:null!=d?d:"",onChange:e=>{e.target.value&&x(e.target.value)},className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1 text-xs text-text-primary",children:[(0,a.jsx)("option",{value:"",children:p.isLoading?"불러오는 중…":m.length?"런을 고르세요":"최근 24시간 런 없음"}),d&&!m.some(e=>e.runId===d)&&(0,a.jsx)("option",{value:d,children:d}),m.some(e=>e.live)&&(0,a.jsx)("optgroup",{label:"도는 중",children:m.filter(e=>e.live).map(e=>(0,a.jsxs)("option",{value:e.runId,children:["● ",e.label]},e.runId))}),m.some(e=>!e.live)&&(0,a.jsx)("optgroup",{label:"끝난 런 (최근 24시간)",children:m.filter(e=>!e.live).map(e=>(0,a.jsxs)("option",{value:e.runId,children:[e.at?"".concat(c(e.at).slice(0,5)," \xb7 "):"",e.label]},e.runId))})]})]})]}),p.isError&&(0,a.jsx)("p",{role:"status",className:"text-xs text-warning",children:"런 목록을 읽지 못했습니다 — 주소에 ?run=<runId> 를 주면 그 런은 그대로 그립니다."}),d?(0,a.jsx)(S,{runId:d,initialFolded:"folded"===i.get("units")},d):(0,a.jsx)("ul",{className:"grid gap-2 sm:grid-cols-2",children:m.slice(0,12).map(e=>(0,a.jsx)("li",{children:(0,a.jsxs)("button",{type:"button",onClick:()=>x(e.runId),className:"w-full rounded-lg border border-border bg-surface p-3 text-left hover:bg-surface-elevated",children:[(0,a.jsx)("span",{className:"text-xs font-semibold ".concat(e.live?"text-amber-500":"text-text-tertiary"),children:e.live?"● 도는 중":"끝남 ".concat(e.at?c(e.at):"")}),(0,a.jsx)("span",{className:"mt-1 block truncate text-sm text-text-primary",children:e.label}),(0,a.jsx)("span",{className:"block font-mono text-[11px] text-text-tertiary",children:e.runId})]})},e.runId))})]})}function T(){return(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)("p",{className:"p-4 text-sm",children:"런 장면을 불러오는 중…"}),children:(0,a.jsx)(_,{})})}}},e=>{e.O(0,[2551,4723,9182,3324,1501,2743,2549,7175,8857,2463,2196,7358],()=>e(e.s=1097)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9902],{1736:(e,r,s)=>{"use strict";s.d(r,{r:()=>d});var t=s(55539),l=s(3558),a=s.n(l);let n=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function d(e){let{active:r}=e;return(0,t.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,t.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),n.map((e,s)=>(0,t.jsxs)("span",{className:"flex items-center gap-1",children:[(0,t.jsxs)(a(),{href:e.href,"aria-current":e.key===r?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===r?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,t.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,t.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),s<n.length-1&&(0,t.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},51974:(e,r,s)=>{"use strict";s.d(r,{LoopsView:()=>j});var t=s(55539),l=s(3558),a=s.n(l),n=s(58603),d=s(1736),i=s(42489),c=s(46124),o=s(15151),x=s(42006);let u={"살아 있음":"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",늦음:"bg-red-500/15 text-red-300 ring-red-500/30",실패:"bg-red-500/15 text-red-300 ring-red-500/30",꺼짐:"bg-muted text-muted-foreground ring-border","판정 불가":"bg-muted text-muted-foreground ring-border"};function m(e){let{value:r}=e;return(0,t.jsx)("span",{"data-loop-verdict":r,className:"inline-flex shrink-0 rounded-full px-2 py-0.5 text-xs font-semibold ring-1 ".concat(u[r]),children:r})}function h(e){let{rows:r,state:s}=e;return"loading"===s?(0,t.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"루프 현황을 읽는 중…"}):"error"===s?(0,t.jsx)("p",{role:"alert",className:"text-sm text-red-300",children:"루프 현황을 읽지 못했습니다. 일부 레지스트리 조회가 실패했습니다. 데몬 연결을 확인하세요."}):r.length?(0,t.jsxs)("div",{className:"rounded-xl border border-border bg-card",children:[(0,t.jsxs)("table",{className:"hidden w-full table-fixed text-left text-sm md:table",children:[(0,t.jsx)("thead",{className:"border-b border-border text-muted-foreground",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",className:"w-1/4 px-4 py-3",children:"루프 \xb7 층"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3",children:"주인(자리)"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3",children:"모드"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3",children:"마지막 실행 시각"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3",children:"판정"})]})}),(0,t.jsx)("tbody",{children:r.map(e=>{var r;return(0,t.jsxs)("tr",{className:"border-b border-border/60 last:border-0","data-loop-id":e.id,children:[(0,t.jsxs)("th",{scope:"row",className:"break-words px-4 py-3 font-medium",children:[e.name,(0,t.jsx)("span",{className:"block text-xs font-normal text-muted-foreground",children:e.layer})]}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.owner}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.mode}),(0,t.jsx)("td",{className:"px-4 py-3",children:(0,t.jsx)("time",{dateTime:null!=(r=e.lastRun)?r:void 0,children:e.lastRun?new Date(e.lastRun).toLocaleString("ko-KR"):"기록 없음"})}),(0,t.jsx)("td",{className:"px-4 py-3",children:(0,t.jsx)(m,{value:e.verdict})})]},e.id)})})]}),(0,t.jsx)("ul",{className:"divide-y divide-border/60 md:hidden",children:r.map(e=>{var r;return(0,t.jsxs)("li",{className:"min-w-0 px-3 py-3","data-loop-id":e.id,children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,t.jsx)("strong",{className:"min-w-0 truncate text-sm",title:e.name,children:e.name}),(0,t.jsx)(m,{value:e.verdict})]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-2 text-xs text-muted-foreground",children:[(0,t.jsx)("span",{children:e.layer}),(0,t.jsxs)("span",{children:["\xb7 ",e.owner]}),(0,t.jsxs)("span",{children:["\xb7 ",e.mode]}),(0,t.jsxs)("time",{dateTime:null!=(r=e.lastRun)?r:void 0,children:["\xb7 ",e.lastRun?new Date(e.lastRun).toLocaleString("ko-KR"):"기록 없음"]})]})]},e.id)})})]}):(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"등록된 루프\xb7크론이 없습니다."})}function p(){var e,r;let{client:s}=(0,o.Q)(),[l,n]=(0,c.useState)(null);(0,c.useEffect)(()=>{let e=(0,x.Pz)(e=>s.fetchJson(e),e=>{let{rows:r,state:t}=e;return n({client:s,rows:r,state:t})});e.refresh();let r=window.setInterval(()=>void e.refresh(),3e4);return()=>{e.dispose(),window.clearInterval(r)}},[s]);let i=(null==l?void 0:l.client)===s?l:null;return(0,t.jsxs)("main",{className:"mx-auto max-w-[1200px] space-y-5 p-4",children:[(0,t.jsx)(d.r,{active:"scheduler"}),(0,t.jsxs)("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold",children:"루프 현황"}),(0,t.jsx)("span",{className:"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground",children:"beta \xb7 운영용"})]}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"데몬의 루프\xb7크론 레지스트리 \xb7 늦음은 마지막 실행 후 주기의 2배 초과"})]}),(0,t.jsx)(a(),{href:"/scheduler",className:"rounded-lg border border-border px-3 py-2 text-sm hover:bg-accent",children:"전체 스케줄 →"})]}),(0,t.jsx)(h,{rows:null!=(e=null==i?void 0:i.rows)?e:[],state:null!=(r=null==i?void 0:i.state)?r:"loading"})]})}var f=s(99974);function b(){return(0,t.jsxs)("main",{className:"mx-auto min-w-0 max-w-[1400px] space-y-4 p-4",children:[(0,t.jsx)(d.r,{active:"scheduler"}),(0,t.jsxs)("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold",children:"루프 상호작용"}),(0,t.jsx)("span",{className:"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground",children:"beta \xb7 운영용"})]}),(0,t.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"자리\xb7루프\xb7런 사이에 오간 실제 사건 \xb7 새 사건이 들어오면 다시 읽습니다"})]}),(0,t.jsx)(a(),{href:"/loops",className:"rounded-lg border border-border px-3 py-2 text-sm hover:bg-accent",children:"루프 현황 →"})]}),(0,t.jsx)("div",{className:"min-w-0 rounded-2xl bg-[#0c1828] text-[#f1f5fa]",children:(0,t.jsx)(i.p1,{initialMode:"map"})})]})}function j(){let e=(0,n.useSearchParams)();return"interact"===(0,f.F)(e)?(0,t.jsx)(b,{}):(0,t.jsx)(p,{})}},69370:(e,r,s)=>{"use strict";s.d(r,{BX:()=>l});let t=new Map;function l(e,r){var s,l;let a=t.get(e);if(!a){let l;try{l=new EventSource(e)}catch(e){return null==(s=r.onConstructError)||s.call(r,e),()=>{}}let n={source:l,subscribers:new Set};l.onmessage=e=>{var r,s;for(let t of[...n.subscribers])null==(r=(s=t.handlers).onMessage)||r.call(s,e)},l.onerror=e=>{var r,s;for(let t of[...n.subscribers])null==(r=(s=t.handlers).onError)||r.call(s,e)},t.set(e,n),a=n}let n=a,d=[];for(let[e,s]of Object.entries(null!=(l=r.events)?l:{})){let r=e=>{s(e)};n.source.addEventListener(e,r),d.push([e,r])}let i={handlers:r};n.subscribers.add(i);let c=!1;return()=>{if(!c){for(let[e,r]of(c=!0,d))try{n.source.removeEventListener(e,r)}catch(e){}if(n.subscribers.delete(i),0===n.subscribers.size){try{n.source.close()}catch(e){}t.get(e)===n&&t.delete(e)}}}}},80698:(e,r,s)=>{Promise.resolve().then(s.bind(s,51974))},99974:(e,r,s)=>{"use strict";s.d(r,{D:()=>t,F:()=>l});let t="/loops?view=interact";function l(e){return(null==e?void 0:e.get("view"))==="interact"?"interact":"status"}}},e=>{e.O(0,[2551,9182,3558,2743,2549,8060,9247,5755,2489,2463,2196,7358],()=>e(e.s=80698)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2967],{5271:(e,t,n)=>{Promise.resolve().then(n.bind(n,54593))},18068:(e,t,n)=>{"use strict";n.d(t,{Qb:()=>r,SI:()=>c,dJ:()=>a});let s="elanous:auth-required",l=null,i=!1;function r(e){null===l&&(l=e,window.dispatchEvent(new CustomEvent(s,{detail:{path:e}})))}function a(e){let t=window,n=t=>e(t.detail);return t.addEventListener(s,n),null===l||i||e({path:l}),()=>t.removeEventListener(s,n)}function c(){i=!0}},54593:(e,t,n)=>{"use strict";n.d(t,{MarketPanel:()=>h});var s=n(55539),l=n(46124),i=n(94306);let r={resolve:"받는 중",verify:"서명 확인",consent:"권한 동의",credentials:"자격 필요",registered:"등록",done:"완료",failed:"실패"},a={signature:"서명을 확인하지 못했습니다.",scan:"플러그인 파일을 확인하지 못했습니다.","consent-denied":"필요한 권한에 동의하지 않았습니다.",credentials:"연결 정보가 필요합니다.",conflict:"이미 설치된 플러그인입니다.",io:"설치 중 오류가 발생했습니다."};var c=n(79247);function o(e){return e.fields.map(e=>{let{name:t,env:n,set:s}=e;return{name:t,env:n,set:s}})}function u(e){if(e instanceof c.Iu){if(404===e.status)return"설치된 플러그인을 찾을 수 없습니다.";if(401===e.status)return"연결 정보를 관리할 권한이 없습니다.";if(400===e.status)return"선언되지 않은 연결 정보 항목입니다."}return"연결 정보를 불러오거나 저장하지 못했습니다."}function d(e){let{client:t,name:n}=e,[i,r]=(0,l.useState)(null),[a,c]=(0,l.useState)({}),[d,h]=(0,l.useState)([]),[p,m]=(0,l.useState)(null),[f,g]=(0,l.useState)(!1);async function x(e){if(e.preventDefault(),f||!i)return;let{fields:s}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n={};for(let[t,s]of Object.entries(e))s.trim()&&(n[t]=s);for(let e of t)n[e]=null;return{fields:n}}(a,d);if(0!==Object.keys(s).length){g(!0),m(null);try{await t.putPluginCredentials(n,s),c({}),h([]),r(null),r(await t.getPluginCredentials(n))}catch(e){m(u(e))}finally{g(!1)}}}return(0,l.useEffect)(()=>{let e=!0;return r(null),c({}),h([]),m(null),t.getPluginCredentials(n).then(t=>{e&&r(t)}).catch(t=>{e&&m(u(t))}),()=>{e=!1}},[t,n]),(0,s.jsxs)("form",{className:"space-y-3 rounded-lg border border-border p-4",onSubmit:e=>void x(e),children:[(0,s.jsx)("h3",{className:"font-medium",children:"연결 정보"}),p&&(0,s.jsx)("p",{role:"alert",className:"text-sm",children:p}),!i&&!p&&(0,s.jsx)("p",{role:"status",children:"연결 정보를 불러오는 중…"}),i&&0===o(i).length&&(0,s.jsx)("p",{className:"text-sm",children:"입력할 연결 정보가 없습니다."}),i&&o(i).map(e=>{var t;return(0,s.jsxs)("div",{className:"space-y-1",children:[(0,s.jsx)("label",{className:"block text-sm font-medium",htmlFor:"credential-".concat(n,"-").concat(e.name),children:e.name}),(0,s.jsxs)("small",{className:"block text-muted-foreground",children:["환경 변수: ",(0,s.jsx)("code",{children:e.env})]}),(0,s.jsx)("p",{className:"text-sm",role:"status",children:e.set?"✓ 저장됨":"비어 있음"}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)("input",{id:"credential-".concat(n,"-").concat(e.name),type:"password",autoComplete:"new-password",className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1",value:null!=(t=a[e.name])?t:"",disabled:f,onChange:t=>{c(n=>({...n,[e.name]:t.target.value})),h(t=>t.filter(t=>t!==e.name))}}),e.set&&(0,s.jsx)("button",{type:"button",className:"rounded border px-2 py-1 text-sm",disabled:f,onClick:()=>{c(t=>({...t,[e.name]:""})),h(t=>t.includes(e.name)?t:[...t,e.name])},children:d.includes(e.name)?"삭제 예정":"지우기"})]})]},e.name)}),i&&i.fields.length>0&&(0,s.jsx)("button",{type:"submit",disabled:f||0===d.length&&!Object.values(a).some(e=>e.trim()),className:"rounded border px-3 py-1 text-sm",children:f?"저장 중…":"저장"})]})}function h(){var e;let t=(0,i.Qj)(),[n,c]=(0,l.useState)("browse"),[o,u]=(0,l.useState)(null),[h,p]=(0,l.useState)([]),[m,f]=(0,l.useState)(null),[g,x]=(0,l.useState)(!1),[b,y]=(0,l.useState)(!1),[j,v]=(0,l.useState)(!1),[w,k]=(0,l.useState)(!1),[N,S]=(0,l.useState)(null),[C,O]=(0,l.useState)(!1),[F,q]=(0,l.useState)([]),[B,P]=(0,l.useState)(null);async function A(){if(t){k(!0),S(null);try{if(!(await t.refreshPluginMarket("elanous")).ok)throw Error("공식 마켓을 받지 못했습니다.");u(await t.getPluginsIndex()),x(!1)}catch(e){S("공식 마켓을 받지 못했습니다.")}finally{k(!1)}}}async function I(){if(!t||!m)return;k(!0),q([]),S(null);let e=null;try{await t.installMarketPlugin("".concat(m.plugin.name,"@").concat(m.market.name),m.plugin.capabilities,t=>{let n=function(e){let t;try{t=JSON.parse(e)}catch(e){return null}if(!t||"object"!=typeof t)return null;let n=t.event;if("string"!=typeof n||!Object.hasOwn(r,n))return null;if("failed"===n){var s;let e=t.reason,n=t.detail,l="string"==typeof e&&null!=(s=a[e])?s:a.io;return{step:"실패",reason:"string"==typeof n&&n.trim()?"".concat(l," — ").concat(n.trim()):l}}return"credentials"===n?!0===t.required?{step:"자격 필요",credentialsRequired:!0}:null:{step:r[n]}}(t);n&&(("완료"===n.step||"실패"===n.step)&&(e=n.step),q(e=>[...e,n]))}),e||q(e=>[...e,{step:"실패",reason:"설치가 끝나지 않았습니다."}])}catch(t){e||q(e=>[...e,{step:"실패",reason:"설치 중 오류가 발생했습니다."}])}if("완료"===e)try{p(await t.getInstalledPlugins()),v(!0),y(!1)}catch(e){y(!0),S("설치는 완료됐지만 설치 목록을 불러오지 못했습니다.")}k(!1)}async function E(e){if(t){k(!0),S(null);try{await t.removeMarketPlugin(e)}catch(e){S("플러그인을 제거하지 못했습니다."),k(!1);return}P(null),p(t=>t.filter(t=>t.name!==e));try{p(await t.getInstalledPlugins()),v(!0),y(!1)}catch(e){y(!0),S("플러그인은 제거됐지만 설치 목록을 불러오지 못했습니다.")}finally{k(!1)}}}(0,l.useEffect)(()=>{if(!t)return;let e=!0;return u(null),p([]),f(null),x(!1),y(!1),v(!1),q([]),O(!1),P(null),S(null),t.getPluginsIndex().then(t=>{e&&u(t)}).catch(()=>{e&&x(!0)}),t.getInstalledPlugins().then(t=>{e&&(p(t),v(!0))}).catch(()=>{e&&(y(!0),v(!0))}),()=>{e=!1}},[t]);let M=o?o.markets.flatMap(e=>e.plugins.map(t=>({market:e,plugin:t,price:function(e){var t;if("free"===e.model)return"무료";let n=void 0===e.amount?"가격 미정":"".concat(e.amount.toLocaleString("ko-KR")," ").concat(null!=(t=e.currency)?t:"").trim();return"subscription"===e.model&&e.period?"".concat(n," / ").concat(e.period):n}(t.pricing),badge:function(e){switch(e){case"ok":return"✅ 서명 확인";case"missing":return"⚠️ 서명 없음";case"unknown-key":return"⚠️ 알 수 없는 서명 키";case"malformed":return"⚠️ 잘못된 서명";case"stale":return"⚠️ 유효하지 않은 서명"}}(e.signature)}))).sort((e,t)=>("ok"!==e.market.signature)-("ok"!==t.market.signature)||e.plugin.name.localeCompare(t.plugin.name)||e.market.name.localeCompare(t.market.name)):[];return(0,s.jsxs)("main",{className:"mx-auto max-w-5xl space-y-6 p-5 text-foreground","aria-label":"마켓",children:[(0,s.jsxs)("header",{children:[(0,s.jsx)("h1",{className:"text-2xl font-semibold",children:"마켓"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"확인된 플러그인을 살펴보고 설치할 수 있습니다."})]}),(0,s.jsx)("nav",{"aria-label":"마켓 탭",className:"flex flex-wrap gap-2",children:[["browse","찾아보기"],["detail","상세"],["installed","설치됨"]].map(e=>{let[t,l]=e;return(0,s.jsx)("button",{type:"button","aria-current":n===t?"page":void 0,className:"rounded-lg border px-4 py-2 text-sm ".concat(n===t?"border-blue-500 font-semibold":"border-border"),onClick:()=>c(t),children:l},t)})}),!t&&(0,s.jsx)("p",{role:"status",children:"서버 연결이 설정되지 않았습니다. 설정에서 서버 주소를 입력하세요."}),N&&(0,s.jsx)("p",{role:"alert",children:N}),"installed"!==n&&g&&(0,s.jsx)("p",{role:"alert",children:"마켓을 불러오지 못했습니다."}),"installed"!==n&&t&&!g&&!o&&(0,s.jsx)("p",{role:"status",children:"마켓을 불러오는 중…"}),"installed"===n&&b&&(0,s.jsx)("p",{role:"alert",children:"설치 목록을 불러오지 못했습니다."}),"installed"===n&&t&&!j&&(0,s.jsx)("p",{role:"status",children:"설치 목록을 불러오는 중…"}),"browse"===n&&o&&(0===o.markets.length?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{children:"아직 받아 둔 마켓이 없습니다."}),(0,s.jsx)("button",{type:"button",disabled:w||!t,className:"rounded border px-3 py-2",onClick:()=>void A(),children:"공식 마켓 받기"})]}):0===M.length?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{children:"등록된 플러그인이 없습니다."}),(0,s.jsx)("button",{type:"button",disabled:w||!t,className:"rounded border px-3 py-2",onClick:()=>void A(),children:"공식 마켓 받기"})]}):(0,s.jsx)("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:M.map(e=>{var t;return(0,s.jsxs)("article",{className:"rounded-xl border border-border p-4 space-y-2",children:[(0,s.jsxs)("h2",{className:"font-semibold",children:[e.plugin.name," ",(0,s.jsxs)("span",{className:"text-xs font-normal",children:["v",e.plugin.version]})]}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:null!=(t=e.plugin.description)?t:"설명이 없습니다."}),(0,s.jsxs)("p",{className:"text-sm",children:[e.price," \xb7 ",(0,s.jsx)("span",{title:e.market.detail,children:e.badge})]}),(0,s.jsx)("button",{type:"button",className:"rounded border px-3 py-1 text-sm",onClick:()=>{f(e),O(!1),q([]),c("detail")},children:"상세 보기"})]},"".concat(e.market.name,"/").concat(e.plugin.name,"/").concat(e.plugin.version))})})),"detail"===n&&!g&&(m?(0,s.jsxs)("section",{className:"space-y-4 rounded-xl border border-border p-5","aria-label":"플러그인 상세",children:[(0,s.jsxs)("h2",{className:"text-xl font-semibold",children:[m.plugin.name," ",(0,s.jsxs)("small",{children:["v",m.plugin.version]})]}),(0,s.jsx)("p",{children:m.plugin.description}),(0,s.jsxs)("p",{children:[m.price," \xb7 ",m.badge]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"권한"}),(0,s.jsx)("ul",{children:m.plugin.capabilities.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"연결 정보 항목"}),m.plugin.connectors.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{children:"연결 정보"}),(0,s.jsx)("ul",{children:e.userConfig.map(e=>(0,s.jsxs)("li",{children:[e.label,e.secret?" \xb7 비공개 정보":""]},e.key))})]},e.id))]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"포함된 기능"}),(0,s.jsx)("ul",{children:null==(e=m.plugin.graphs)?void 0:e.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsxs)("p",{children:["파일 확인값: ",(0,s.jsx)("code",{children:m.plugin.sha256.slice(0,12)})]}),C?(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)("p",{children:"이 플러그인이 요청하는 권한을 확인하세요."}),(0,s.jsx)("ul",{children:m.plugin.capabilities.map(e=>(0,s.jsx)("li",{children:e},e))}),(0,s.jsx)("button",{type:"button",disabled:w,className:"rounded border px-3 py-1",onClick:()=>void I(),children:"동의하고 설치"}),(0,s.jsx)("button",{type:"button",disabled:w,className:"rounded border px-3 py-1",onClick:()=>O(!1),children:"취소"})]}):(0,s.jsx)("button",{type:"button",disabled:w||"ok"!==m.market.signature,className:"rounded border px-3 py-1",onClick:()=>O(!0),children:"설치"}),F.length>0&&(0,s.jsx)("ol",{"aria-label":"설치 진행",className:"space-y-1",children:F.map((e,t)=>(0,s.jsxs)("li",{role:"실패"===e.step?"alert":void 0,children:[e.step,e.reason?": ".concat(e.reason):"",e.credentialsRequired?" — 이 플러그인은 연결 정보가 필요합니다.":""]},t))}),t&&F.some(e=>e.credentialsRequired)&&(0,s.jsx)(d,{client:t,name:m.plugin.name},"".concat(m.plugin.name,"-").concat(F.some(e=>"완료"===e.step||"등록"===e.step)))]}):(0,s.jsx)("p",{children:"찾아보기에서 플러그인을 선택하세요."})),"installed"===n&&j&&!b&&(0===h.length?(0,s.jsx)("p",{children:"설치된 플러그인이 없습니다."}):(0,s.jsx)("ul",{className:"space-y-2",children:h.map(e=>(0,s.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[e.name," \xb7 v",e.version," \xb7 설치 시각: ",e.installedAt&&Number.isFinite(Date.parse(e.installedAt))?(0,s.jsx)("time",{dateTime:e.installedAt,children:new Date(e.installedAt).toLocaleString("ko-KR")}):"알 수 없음",B===e.name?(0,s.jsxs)("span",{className:"ml-3",children:["제거할까요? ",(0,s.jsx)("button",{type:"button",disabled:w,onClick:()=>void E(e.name),children:"제거 확인"})," ",(0,s.jsx)("button",{type:"button",onClick:()=>P(null),children:"취소"})]}):(0,s.jsx)("button",{type:"button",disabled:w,className:"ml-3 rounded border px-3 py-1",onClick:()=>P(e.name),children:"제거"}),t&&(0,s.jsxs)("details",{className:"mt-3",children:[(0,s.jsx)("summary",{className:"cursor-pointer",children:"연결 정보"}),(0,s.jsx)("div",{className:"mt-2",children:(0,s.jsx)(d,{client:t,name:e.name})})]})]},"".concat(e.market,"/").concat(e.name,"/").concat(e.version)))}))]})}},72215:(e,t,n)=>{"use strict";let s;n.d(t,{cY:()=>u,x8:()=>a});let l={debug:0,info:1,warn:2,error:3},i="/v1/debug-logs/batch",r=null;function a(e){r=e}class c{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(l[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<l[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,n=JSON.stringify({records:e});try{var s,l;t=await (s=this.fetchFn(n),l=this.postTimeoutMs,new Promise((e,t)=>{let n=setTimeout(()=>t(Error("debug-forward timeout after ".concat(l,"ms"))),l);s.then(t=>{clearTimeout(n),e(t)},e=>{clearTimeout(n),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&r)try{await r(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let i=this.lastOkAt;this.lastOkAt=Date.now();let a=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:a,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:i},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(i,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=o,t="debug",n=1e4,s=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=n,this.flushMs=s,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function o(e){return(await fetch(i,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function u(e,t){if("undefined"==typeof console)return;let n=new Date().toISOString();if(void 0!==t){let s="";try{let e=new WeakSet;s=JSON.stringify(t,(t,n)=>{if("bigint"==typeof n)return"".concat(n.toString(),"n");if("function"==typeof n)return"[fn ".concat(n.name||"anon","]");if(n&&"object"==typeof n){if(e.has(n))return"[circular]";e.add(n)}return n})}catch(e){s="[unserializable: ".concat(String(e),"]")}s&&s.length>800&&(s=s.slice(0,797)+"..."),console.debug("[".concat(n,"] ").concat(e," ").concat(s),t),d(n,e,s)}else console.debug("[".concat(n,"] ").concat(e)),d(n,e,void 0)}function d(e,t,n){let l,i=function(){if(void 0!==s)return s;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return s=null,null;let t=new c(o,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return s=t,t}();if(!i)return;let r=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==n&&""!==n)try{l=JSON.parse(n)}catch(e){l=n}i.push({ts:e,category:t,event:r,...void 0!==l?{data:l}:{},source:{platform:"pwa"}})}},94306:(e,t,n)=>{"use strict";n.d(t,{M1:()=>o,Qj:()=>u,tI:()=>c});var s=n(55539),l=n(46124),i=n(76642),r=n(50363);let a=(0,l.createContext)(null);function c(e){let{client:t,queryClient:n,defaultStaleTimeMs:c,children:o}=e,u=(0,l.useMemo)(()=>null!=n?n:new i.E({defaultOptions:{queries:{staleTime:null!=c?c:2e3,refetchOnWindowFocus:!1}}}),[n,c]);return(0,s.jsx)(a.Provider,{value:t,children:(0,s.jsx)(r.Ht,{client:u,children:o})})}function o(){let e=(0,l.useContext)(a);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function u(){return(0,l.useContext)(a)}}},e=>{e.O(0,[3324,9247,2463,2196,7358],()=>e(e.s=5271)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7398],{27150:(e,t,s)=>{Promise.resolve().then(s.bind(s,47276))},47276:(e,t,s)=>{"use strict";s.d(t,{default:()=>d});var a=s(55539),i=s(46124),r=s(58603);class n extends Error{constructor(e,t,s){super("mission-room ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="MissionRoomApiError"}}var o=s(62483);function l(e){var t;let[s,r]=(0,i.useState)({loading:!0,error:null,state:null}),[n,l]=(0,i.useState)(""),[d,u]=(0,i.useState)(""),[m,p]=(0,i.useState)(!1),[x,h]=(0,i.useState)(null),[b,f]=(0,i.useState)(!1),y=(0,i.useRef)(!0);(0,i.useEffect)(()=>()=>{y.current=!1},[]);let g=(0,i.useCallback)(async()=>{r(e=>({...e,loading:!0,error:null}));try{let{state:t}=await e.api.spawn(e.missionId);if(!y.current)return;r({loading:!1,error:null,state:t})}catch(e){if(!y.current)return;r({loading:!1,error:c(e),state:null})}},[e.api,e.missionId]);(0,i.useEffect)(()=>{g()},[g]);let j=(0,i.useCallback)(async()=>{if(n.trim()&&!m){p(!0);try{let t=await e.api.deliberate(e.missionId,n.trim(),d.trim()||void 0);if(!y.current)return;r(e=>e.state?{...e,state:{...e.state,decisions:[...e.state.decisions,t]}}:e),l("")}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&p(!1)}}},[e.api,e.missionId,n,d,m]),N=(0,i.useCallback)(async t=>{if(t.trim()&&!x){h(t);try{let s=await e.api.decide(e.missionId,t);if(!y.current)return;r(e=>{if(!e.state)return e;let t=e.state.decisions.slice(),a=t.findIndex(e=>e.ts===s.ts);return a>=0&&(t[a]=s),{...e,state:{...e.state,decisions:t}}})}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&h(null)}}},[e.api,e.missionId,x]),v=(0,i.useCallback)(async()=>{if(!b){f(!0);try{var t;let s=await e.api.archive(e.missionId);if(!y.current)return;r(e=>({...e,state:s})),null==(t=e.onArchived)||t.call(e)}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&f(!1)}}},[e.api,e.missionId,b,e.onArchived]),w=(null==(t=s.state)?void 0:t.status)==="archived",S=(0,i.useMemo)(()=>s.state?[...s.state.decisions].sort((e,t)=>t.ts-e.ts):[],[s.state]);return s.loading&&!s.state?(0,a.jsx)("div",{className:"p-4 text-sm opacity-70",children:"Loading mission room…"}):(0,a.jsxs)("section",{className:"mission-room-panel flex flex-col gap-4 p-4","data-mission-id":e.missionId,children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:e.missionTitle?"".concat(e.missionTitle," \xb7 deliberation"):"Mission Deliberation Room"}),s.state&&(0,a.jsxs)("p",{className:"text-xs opacity-70",children:["tag: ",(0,a.jsx)("code",{children:s.state.missionTag})," \xb7 status:"," ",(0,a.jsx)("span",{className:w?"text-amber-600":"text-emerald-600",children:s.state.status})," \xb7 ","decisions: ",s.state.decisions.length]})]}),!w&&s.state&&(0,a.jsx)("button",{type:"button",className:"text-xs underline opacity-70 hover:opacity-100",disabled:b,onClick:()=>void v(),children:b?"archiving…":"archive room"})]}),s.error&&(0,a.jsx)("div",{role:"alert",className:"rounded border border-rose-400/50 bg-rose-50 px-3 py-2 text-sm text-rose-900",children:s.error}),!w&&(0,a.jsxs)("form",{className:"flex flex-col gap-2 rounded border border-zinc-200 p-3",onSubmit:e=>{e.preventDefault(),j()},children:[(0,a.jsx)("label",{className:"text-xs uppercase tracking-wide opacity-70",children:"New deliberation"}),(0,a.jsx)("textarea",{className:"min-h-[80px] w-full rounded border border-zinc-300 bg-white p-2 text-sm",placeholder:"Describe the branch you're stuck on…",value:n,onChange:e=>l(e.target.value),disabled:m}),(0,a.jsx)("textarea",{className:"min-h-[40px] w-full rounded border border-zinc-200 bg-zinc-50 p-2 text-xs",placeholder:"Optional mission context (task list digest, etc.)",value:d,onChange:e=>u(e.target.value),disabled:m}),(0,a.jsx)("div",{className:"flex justify-end",children:(0,a.jsx)("button",{type:"submit",className:"rounded bg-zinc-900 px-3 py-1 text-sm text-white disabled:opacity-50",disabled:!n.trim()||m,children:m?"asking lanes…":"ask the lanes"})})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[0===S.length&&(0,a.jsx)("p",{className:"text-sm opacity-70",children:"No deliberations yet."}),S.map(e=>(0,a.jsx)(o.l,{decision:e,onDecide:w?void 0:N,decidingChoice:x},e.ts))]})]})}function c(e){if(e instanceof n){let t="object"==typeof e.body&&e.body&&"detail"in e.body?e.body.detail:null;return 404===e.status?"Mission room not found.":409===e.status?t?"Conflict: ".concat(t):"Conflict — room may be archived or no open decision.":401===e.status?"Authentication required.":"Mission room error (".concat(e.status,").")}return e instanceof Error?e.message:String(e)}function d(){var e;let t=(0,r.useParams)(),s=decodeURIComponent(null!=(e=null==t?void 0:t.id)?e:""),o=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch,i=e.authHeader;async function r(e,t){let r={"content-type":"application/json"};i&&(r.authorization=i),(null==t?void 0:t.headers)&&Object.assign(r,t.headers);let o=await a("".concat(s).concat(e),{...t,headers:r}),l=await o.json().catch(()=>null);if(!o.ok)throw new n(o.status,e,l);return l}function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"/v1/missions/".concat(encodeURIComponent(e),"/showroom").concat(t)}return{spawn:async e=>await r(o(e)),deliberate:async(e,t,s)=>(await r(o(e,"/deliberate"),{method:"POST",body:JSON.stringify({question:t,...void 0!==s?{missionContext:s}:{}})})).decision,decide:async(e,t)=>(await r(o(e,"/decision"),{method:"POST",body:JSON.stringify({chosen:t})})).decision,archive:async e=>(await r(o(e,"/archive"),{method:"POST"})).state}})({baseUrl:window.location.origin}),[]);return s?(0,a.jsx)(l,{missionId:s,api:o}):(0,a.jsx)("div",{className:"p-4 text-sm",children:"Mission id missing in URL."})}},58603:(e,t,s)=>{"use strict";var a=s(99027);s.o(a,"useParams")&&s.d(t,{useParams:function(){return a.useParams}}),s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},62483:(e,t,s)=>{"use strict";s.d(t,{l:()=>r});var a=s(55539),i=s(46124);function r(e){let[t,s]=(0,i.useState)("");if("onChoose"in e){let{decision:t,onChoose:s,busy:i}=e;return(0,a.jsxs)("article",{className:"rounded border border-border bg-card p-3","data-decision-card":t.id,children:[(0,a.jsx)("h3",{className:"text-sm font-semibold",children:t.title}),(0,a.jsx)("p",{className:"mt-1 whitespace-pre-wrap text-sm text-muted-foreground",children:t.situation}),(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:t.options.map(e=>(0,a.jsxs)("button",{type:"button",disabled:i,onClick:()=>s(e),className:"rounded-md border border-border px-2 py-1 text-sm hover:bg-muted disabled:opacity-50",children:[e.label,"option"in t.recommendation&&t.recommendation.option===e.id&&(0,a.jsx)("span",{className:"ml-1 text-primary",children:"추천"})]},e.id))})]})}let{decision:r,onDecide:n,decidingChoice:o}=e,l=r.resolution.status,c="decided"===r.resolution.status?r.resolution.chosen:null;return(0,a.jsxs)("article",{className:"rounded border border-zinc-200 bg-white p-3",children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:r.question}),(0,a.jsx)("time",{className:"shrink-0 text-xs opacity-60",dateTime:new Date(r.ts).toISOString(),children:new Date(r.ts).toLocaleString()})]}),(0,a.jsx)("ul",{className:"mt-2 flex flex-col gap-2",children:r.opinions.map((e,t)=>(0,a.jsxs)("li",{className:"rounded bg-zinc-50 p-2 text-xs",children:[(0,a.jsxs)("div",{className:"font-medium",children:[e.role,e.modelId?(0,a.jsxs)("span",{className:"opacity-60",children:[" \xb7 ",e.modelId]}):null]}),(0,a.jsx)("pre",{className:"mt-1 whitespace-pre-wrap text-xs leading-snug",children:e.text})]},"".concat(e.role,"-").concat(t)))}),(0,a.jsxs)("footer",{className:"mt-3 flex items-center justify-between gap-2",children:[(0,a.jsxs)("span",{className:"text-xs opacity-70",children:["resolution:"," ","decided"===l?(0,a.jsxs)("span",{className:"font-medium text-emerald-700",children:["decided → ",c]}):(0,a.jsx)("span",{className:"text-amber-700",children:"open"})]}),n&&"open"===l&&(0,a.jsxs)("form",{className:"flex items-center gap-1",onSubmit:e=>{e.preventDefault(),t.trim()&&n(t.trim())},children:[(0,a.jsx)("input",{className:"w-32 rounded border border-zinc-300 px-2 py-0.5 text-xs",placeholder:"chosen…",value:t,onChange:e=>s(e.target.value),disabled:null!==o}),(0,a.jsx)("button",{type:"submit",className:"rounded bg-emerald-700 px-2 py-0.5 text-xs text-white disabled:opacity-50",disabled:!t.trim()||null!==o,children:o===t?"…":"apply"})]})]})]})}}},e=>{e.O(0,[2463,2196,7358],()=>e(e.s=27150)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5354],{1745:(e,t,n)=>{"use strict";n.d(t,{ChecklistView:()=>c});var r=n(55539),s=n(46124),a=n(15151),l=n(43537);function o(e){return"".concat(String(e.getHours()).padStart(2,"0"),":").concat(String(e.getMinutes()).padStart(2,"0"))}function i(e,t){let n=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),r=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()+1).getTime(),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=s===n?"오늘":s===r?"내일":"".concat(String(e.getMonth()+1).padStart(2,"0"),"/").concat(String(e.getDate()).padStart(2,"0")," (").concat(["일","월","화","수","목","금","토"][e.getDay()],")");return"".concat(a," ").concat(o(e))}function d(e){let{schedule:t,now:n}=e;if(!t)return(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"판 일정 없음"});let s=new Date(t.cutAt),a=null===t.landBy?null:new Date(t.landBy),l=a&&null!==n?a.getTime()-n:null,d=null!==l&&l>0?Math.ceil(l/6e4):0,u="".concat(Math.floor(d/60)?"".concat(Math.floor(d/60),"시간"):"").concat(d%60?"".concat(Math.floor(d/60)?" ":"").concat(d%60,"분"):d<60?"0분":"");return(0,r.jsxs)("p",{"aria-label":"판 일정",className:"text-sm ".concat(null!==l&&l<=0?"text-red-600":null!==l&&l<=108e5?"text-orange-600":"text-muted-foreground"),children:["컷 ",i(s,null===n?null:new Date(n)),a&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 착지 마감 ",a.toDateString()===s.toDateString()?o(a):i(a,null===n?null:new Date(n)),null!==l&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 ",l<=0?"착지 마감 지남":"마감까지 ".concat(u)]})]})]})}function u(e){var t;let{result:n,version:s,owner:a,status:l,pendingOnly:o,expandedId:i,onVersion:u,onOwner:c,onStatus:m,onPending:p,onExpand:h,now:y=null}=e;if((null==n?void 0:n.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let v=(null==n?void 0:n.kind)==="ready"?n.data:null,g=null!=(t=null==v?void 0:v.items.filter(e=>(!a||e.owner===a)&&(!l||e.status===l)&&(!o||"yellow"===e.status)))?t:[];return(0,r.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-4xl space-y-6 overflow-x-hidden px-4 py-6 text-foreground",children:[(0,r.jsxs)("header",{className:"space-y-1",children:[(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"운영 / 판별 피처"}),(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"판별 피처"})]}),(0,r.jsxs)("label",{className:"block space-y-2 text-sm font-medium",children:["판",(0,r.jsx)("input",{"aria-label":"판",list:"ops-checklist-versions",value:s,onChange:e=>u(e.target.value),className:"block w-full max-w-xs rounded-md border bg-background p-2"}),(0,r.jsxs)("datalist",{id:"ops-checklist-versions",children:[(0,r.jsx)("option",{value:"0.2.8"}),(0,r.jsx)("option",{value:"0.2.9"}),(0,r.jsx)("option",{value:"0.2.10"})]})]}),null===n&&(0,r.jsx)("p",{role:"status",children:"칸을 불러오는 중…"}),(null==n?void 0:n.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["칸을 불러오지 못했습니다 (",n.status,")"]}),v&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d,{schedule:v.schedule,now:y}),(0,r.jsx)("section",{"aria-label":"상태별 수",className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[["\uD83D\uDFE2","green"],["\uD83D\uDFE1","yellow"],["\uD83D\uDD34","red"],["✅","done"]].map(e=>{let[t,n]=e;return(0,r.jsxs)("div",{className:"rounded-md border p-3 text-sm",children:[t," ",v[n]]},n)})}),(0,r.jsxs)("section",{className:"flex min-w-0 flex-wrap items-end gap-3","aria-label":"거르기",children:[(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["자리",(0,r.jsxs)("select",{"aria-label":"자리",className:"block rounded-md border bg-background p-2",value:a,onChange:e=>c(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["OP","MK","TC","UX"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["상태",(0,r.jsxs)("select",{"aria-label":"상태",className:"block rounded-md border bg-background p-2",value:l,onChange:e=>m(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["green","yellow","red","done"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"flex items-center gap-2 p-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:o,onChange:e=>p(e.target.checked)}),"판정 대기만"]})]}),(0,r.jsxs)("section",{className:"min-w-0 space-y-2","aria-label":"칸 목록",children:[(0,r.jsx)("h2",{className:"font-semibold",children:"칸 목록"}),0===g.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"해당하는 칸이 없습니다."}),g.map(e=>{var t,n;return(0,r.jsxs)("div",{className:"min-w-0 rounded-md border",children:[(0,r.jsxs)("button",{type:"button",className:"flex w-full min-w-0 items-center gap-2 overflow-hidden p-3 text-left hover:bg-muted","aria-expanded":i===e.id,onClick:()=>h(i===e.id?null:e.id),children:[(0,r.jsx)("span",{className:"max-w-[35%] shrink-0 truncate text-sm font-medium",children:e.id}),(0,r.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.title}),(0,r.jsxs)("span",{className:"shrink-0 text-xs",children:[null!=(t=e.owner)?t:"—"," \xb7 ",e.status]})]}),i===e.id&&(0,r.jsxs)("div",{className:"min-w-0 space-y-2 border-t p-3 text-sm",children:[(0,r.jsx)("p",{className:"break-all font-medium",children:e.title}),(0,r.jsx)("p",{className:"whitespace-pre-wrap break-all",children:null!=(n=e.evidence)?n:"근거 없음"})]})]},e.id)})]})]})]})}function c(){let{client:e}=(0,a.Q)(),[t,n]=(0,s.useState)("0.2.9"),[o,i]=(0,s.useState)(null),[d,c]=(0,s.useState)(""),[m,p]=(0,s.useState)(""),[h,y]=(0,s.useState)(!1),[v,g]=(0,s.useState)(null),[f,b]=(0,s.useState)(null);(0,s.useEffect)(()=>{let e;if("undefined"==typeof document)return;let t=()=>{void 0!==e&&(window.clearInterval(e),e=void 0),document.hidden||(b(Date.now()),e=window.setInterval(()=>b(Date.now()),6e4))};return t(),document.addEventListener("visibilitychange",t),()=>{void 0!==e&&window.clearInterval(e),document.removeEventListener("visibilitychange",t)}},[]);let[w,x]=(0,s.useState)(!1),k=(0,s.useRef)(!1),j=(0,s.useRef)(e);return((0,s.useEffect)(()=>{let n=!0;return(j.current!==e&&(j.current=e,k.current=!1,x(!1)),k.current)?()=>{n=!1}:/^\d+\.\d+\.\d+(?:-(?:rc|alpha|beta)\.\d+)?$/.test(t)?(i(null),(0,l.HG)(e,t).then(e=>{n&&!k.current&&("forbidden"===e.kind&&(k.current=!0,x(!0)),i(e))}),()=>{n=!1}):(i(null),()=>{n=!1})},[e,t]),w)?(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"}):(0,r.jsx)(u,{result:o,version:t,owner:d,status:m,pendingOnly:h,now:f,expandedId:v,onVersion:e=>{n(e),g(null)},onOwner:c,onStatus:p,onPending:y,onExpand:g})}},5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>s,oD:()=>a});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function l(){let e=s();return localStorage.setItem(r,e),e}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(55539),s=n(46124),a=n(8101),l=n(5997),o=n(18060),i=n(72215);let d=(0,s.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,s.useState)(n),[m,p]=(0,s.useState)(""),[h]=(0,s.useState)(()=>new o.ki(n));(0,s.useEffect)(()=>{let e=(0,a.Fp)();c(e),h.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();h.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let y=e=>{c(t=>{let n={...t,...e};return(0,a.Qc)(e),h.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,s.useMemo)(()=>({config:u,setConfig:y,client:h,sessionId:m,setSessionId:v}),[u,h,m]);return(0,r.jsx)(d.Provider,{value:g,children:t})}function c(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},43537:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function s(e){return"string"==typeof e}function a(e){return s(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function l(e){return r(e)&&s(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&s(e.summary)&&(void 0===e.startedAt||null===e.startedAt||s(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||s(e.endedAt))}n.d(t,{HG:()=>f,Kh:()=>g,Nn:()=>y,oc:()=>v});let o=new Set(["pending","running","done","retry","timeout","failed"]),i=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function d(e){return!!(r(e)&&s(e.runId)&&s(e.status)&&s(e.startedAt)&&(null===e.version||s(e.version))&&Array.isArray(e.path)&&e.path.every(s)&&Array.isArray(e.nodes)&&e.nodes.every(l))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!s(e.version)||!s(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&s(e.id)&&o.has(e.state)&&i(e.plannedMin)&&i(e.installSec)&&i(e.rc)&&(void 0===e.waitReason||s(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&s(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function u(e){return r(e)&&s(e.id)&&s(e.title)&&s(e.status)&&(void 0===e.owner||s(e.owner))&&s(e.updatedAt)&&(void 0===e.evidence||s(e.evidence))}let c=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&s(e.id)&&s(e.title)&&(null===e.open||c(e.open))&&(null===e.landed||c(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||s(e.role))&&(null===e.now||r(e.now)&&s(e.now.text)&&s(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&c(e.pr)&&s(e.title)&&s(e.at)&&(null===e.checklistId||s(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||c(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>c(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let s=n(await r.json());return null===s?{kind:"error",status:r.status}:{kind:"ready",data:s}}catch(e){return{kind:"error",status:0}}}function y(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&s(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function v(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(d)?e:null)}function g(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&s(e.log)?{log:e.log}:null)}function f(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,l,o;if(!(r(e)&&s(e.version)&&(void 0===e.codename||s(e.codename))&&Array.isArray(e.items)&&e.items.every(u)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(s))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let i={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in i&&i[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&a(e.schedule.cutAt)&&(null===e.schedule.landBy||a(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:i.green,yellow:null!=(n=e.yellow)?n:i.yellow,red:null!=(l=e.red)?l:i.red,done:null!=(o=e.done)?o:i.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},72553:(e,t,n)=>{Promise.resolve().then(n.bind(n,1745))}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=72553)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6231],{20793:(e,n,l)=>{"use strict";l.d(n,{EF:()=>d,m6:()=>s});var t=l(55539);let r=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),a=/fail|error|block|stall|cancel|abort/i;function s(e,n){if((null==e?void 0:e.kind)!=="ready")return null;let l=e.data.reduce((e,n)=>!e||Date.parse(n.startedAt)>Date.parse(e.startedAt)?n:e,null);return!l||r.has(l.status.toLowerCase())&&n-Date.parse(l.startedAt)>864e5?null:l}function d(e){var n,l;let{result:d,onSelect:u,selectedRun:i,now:o=Date.now()}=e,c=void 0===i?s(d,o):i;if(!c)return null;let m=Math.max(0,c.path.findIndex(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)!==!0})),h=c.path.length>0&&c.path.every(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)===!0})?c.path.length-1:m,p=c.path[h],x=c.nodes.find(e=>e.nodeId===p),f="done"===c.status.toLowerCase()&&(null==x?void 0:x.ok)===!1,v=!f&&((null==x?void 0:x.ok)===!1||a.test(c.status))?null==x||null==(n=x.summary.split(/\r?\n/,1)[0])?void 0:n.trim():null,b=Math.max(0,Math.floor((o-Date.parse(c.startedAt))/6e4)),w=r.has(c.status.toLowerCase()),k=w?function(e){let n=Date.parse(e.startedAt),l=e.nodes.map(e=>e.endedAt?Date.parse(e.endedAt):NaN).filter(Number.isFinite);return Number.isFinite(n)&&0!==l.length?Math.max(0,Math.floor((Math.max(...l)-n)/6e4)):null}(c):null;return(0,t.jsxs)("section",{"aria-label":"발행 진행",className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>u(c),className:"flex w-full min-w-0 items-center gap-2 text-left text-sm hover:text-primary",children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap font-semibold",children:["발행 ",null!=(l=c.version)?l:"판 미상"]}),w?(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==k?" \xb7 걸린 시간 ".concat(k,"분"):""]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=p?p:"노드 미상"," (",c.path.length?h+1:0,"/",c.path.length,")"]}),(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(b)?b:0,"분"]})]}),(0,t.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:c.path.map((e,n)=>{let l=c.nodes.find(n=>n.nodeId===e),r=!w&&n===h,a=w||n<h;return(0,t.jsxs)("span",{"aria-current":r?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(r?"border-primary bg-primary/10 font-semibold":!w&&n>h?"opacity-50":""),children:[a?(null==l?void 0:l.ok)===!0?"✓ ":(null==l?void 0:l.ok)===!1?"✗ ":"":"",e]},"".concat(e,"-").concat(n))})})]}),(0,t.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["상태: ",c.status]}),f&&(0,t.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,t.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},40140:(e,n,l)=>{"use strict";l.d(n,{ReleaseRunsView:()=>m});var t=l(55539),r=l(46124),a=l(15151),s=l(43537),d=l(20793),u=l(18993);let i=["done","completed","failed","cancelled","aborted","success","succeeded","error"],o=new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",year:"numeric",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function c(e){var n,l,r;let{result:a,version:s,versions:i=[],selectedRunId:c,openedNodeId:m,log:h,onVersion:p,onRun:x,onNode:f,releaseStrip:v}=e;if((null==a?void 0:a.kind)==="forbidden"||(null==h?void 0:h.kind)==="forbidden")return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let b=(null==a?void 0:a.kind)==="ready"?a.data:[],w=s?b.filter(e=>e.version===s):b,k=null!=(l=null!=(n=w.find(e=>e.runId===c))?n:(0,d.m6)({kind:"ready",data:w},Date.now()))?l:w[0],N=[...new Set([...i,...b.map(e=>e.version).filter(e=>!!e)])];return s&&!N.includes(s)&&N.push(s),(0,t.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-4xl space-y-6 overflow-x-hidden px-4 py-6 text-foreground",children:[v,(0,t.jsxs)("header",{className:"space-y-1",children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"운영 / 릴리스"}),(0,t.jsx)("h1",{className:"text-2xl font-semibold",children:"릴리스"})]}),(0,t.jsxs)("label",{className:"block space-y-2 text-sm font-medium",children:["판",(0,t.jsx)("input",{"aria-label":"판",list:"ops-release-versions",className:"block w-full max-w-xs rounded-md border bg-background p-2",value:s,onChange:e=>p(e.target.value),placeholder:"전체 판"}),(0,t.jsx)("datalist",{id:"ops-release-versions",children:N.map(e=>(0,t.jsx)("option",{value:e},e))})]}),null===a?(0,t.jsx)("p",{role:"status",children:"런을 불러오는 중…"}):"error"===a.kind?(0,t.jsxs)("p",{role:"alert",children:["런을 불러오지 못했습니다 (",a.status,")"]}):null,(null==a?void 0:a.kind)==="ready"&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("section",{className:"min-w-0 space-y-2","aria-label":"런 목록",children:[(0,t.jsx)("h2",{className:"font-semibold",children:"런 목록"}),0===w.length&&(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 판의 런이 없습니다."}),w.map(e=>{var n;return(0,t.jsxs)("button",{type:"button","aria-pressed":(null==k?void 0:k.runId)===e.runId,onClick:()=>x(e.runId),className:"block w-full min-w-0 rounded-md border p-3 text-left hover:bg-muted aria-pressed:border-primary",children:[(0,t.jsxs)("span",{className:"block truncate font-medium",children:[null!=(n=e.version)?n:"판 미상"," \xb7 ",e.status]}),(0,t.jsx)("time",{"aria-label":"시작 시각 (KST)",className:"block break-all text-sm text-muted-foreground",dateTime:e.startedAt,children:Number.isFinite(Date.parse(e.startedAt))?"".concat(o.format(new Date(e.startedAt))," KST"):"시각 미기록"})]},e.runId)})]}),k&&(0,t.jsxs)("section",{className:"min-w-0 space-y-3","aria-label":"노드 진행",children:[(0,t.jsxs)("h2",{className:"font-semibold",children:["노드 흐름 ",(0,t.jsxs)("span",{className:"text-sm font-normal text-muted-foreground",children:["\xb7 ",null!=(r=k.version)?r:"판 미상"," \xb7 ",k.status]})]}),(0,t.jsx)(u.af,{run:k,openedNodeId:m,onNode:f}),m&&k.path.includes(m)?(0,t.jsx)(u.Jv,{run:k,nodeId:m,log:h}):(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"노드를 누르면 요약 전문과 로그 꼬리가 열립니다."})]})]})]})}function m(){var e,n,l;let{client:u}=(0,a.Q)(),[o,m]=(0,r.useState)(null),[h,p]=(0,r.useState)([]),[x,f]=(0,r.useState)(null),[v,b]=(0,r.useState)(null),[w,k]=(0,r.useState)(null),[N,j]=(0,r.useState)(null),[g,y]=(0,r.useState)(null),[I,S]=(0,r.useState)(!1),D=(0,r.useRef)(0),R=(0,r.useRef)(!1),C=(0,r.useRef)(null),A=(0,r.useRef)([]),E=(0,r.useRef)(u);(0,r.useEffect)(()=>{var e,n;let l=new URLSearchParams(null!=(n=null==(e=window.location)?void 0:e.search)?n:"").get("run");l&&k(l)},[]),(0,r.useEffect)(()=>{let e=!0;return(E.current!==u&&(E.current=u,R.current=!1,S(!1),p([]),C.current=null,f(null)),R.current)?()=>{e=!1}:(D.current++,j(null),y(null),b(null),A.current=[],null===o&&(C.current=null,f(null)),(0,s.oc)(u,o||void 0).then(n=>{if(e&&!R.current&&(b(n),"forbidden"===n.kind&&(R.current=!0,S(!0)),"ready"===n.kind)&&(A.current=n.data,p(e=>[...new Set([...e,...n.data.map(e=>e.version).filter(e=>!!e)])]),null===o&&null===C.current)){var l,t,r,a,s,u,i,c;let e=new URLSearchParams(null!=(s=null==(l=window.location)?void 0:l.search)?s:"").get("run");C.current=null!=(c=null!=(i=null!=(u=null==(t=n.data.find(n=>n.runId===e))?void 0:t.version)?u:null==(r=(0,d.m6)(n,Date.now()))?void 0:r.version)?i:null==(a=n.data[0])?void 0:a.version)?c:null,f(C.current)}}),()=>{e=!1})},[u,o]);let F=!I&&((null==v?void 0:v.kind)==="ready"||(null==v?void 0:v.kind)==="error")&&A.current.some(e=>!i.includes(e.status.toLowerCase()));(0,r.useEffect)(()=>{if(!F)return;let e=!0,n=!1,l=async()=>{if(n||document.hidden||!e||R.current||!A.current.some(e=>!i.includes(e.status.toLowerCase())))return;n=!0;let l=await (0,s.oc)(u,o||void 0);n=!1,e&&!R.current&&(b(l),"ready"===l.kind&&(A.current=l.data),"forbidden"===l.kind&&(R.current=!0,S(!0)))},t=window.setInterval(()=>{l()},1e4),r=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",r),()=>{e=!1,window.clearInterval(t),document.removeEventListener("visibilitychange",r)}},[u,o,F]);let L=null===o?x:o,M=(null==v?void 0:v.kind)==="ready"?v.data.filter(e=>!L||e.version===L):[],_=null!=(n=null!=(e=M.find(e=>e.runId===w))?e:(0,d.m6)({kind:"ready",data:M},Date.now()))?n:M[0],K=null!=(l=null!=L?L:null==_?void 0:_.version)?l:"",T=null==_?void 0:_.runId;(0,r.useEffect)(()=>{D.current++,j(null),y(null)},[T]);let P=(0,r.useCallback)(e=>{(e!==x||null!==o)&&(D.current++,f(null),m(e),k(null),j(null),y(null))},[o,x]),O=e=>{D.current++,k(e),j(null),y(null)};if(I)return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let U=N&&N.runId===T?N.nodeId:null,V=g&&g.runId===T&&g.nodeId===U?g.result:null;return(0,t.jsx)(c,{result:v,version:K,versions:h,selectedRunId:w,openedNodeId:U,log:V,onVersion:P,onRun:O,onNode:e=>{if(!_||(null==v?void 0:v.kind)!=="ready")return;let n=++D.current,l=_.runId;if((null==N?void 0:N.runId)===l&&N.nodeId===e){j(null),y(null);return}j({runId:l,nodeId:e}),y(null),(0,s.Kh)(u,l,e).then(t=>{n!==D.current||R.current||("forbidden"===t.kind&&(R.current=!0,S(!0)),y({runId:l,nodeId:e,result:t}))})},releaseStrip:(0,t.jsx)(d.EF,{result:v,selectedRun:null!=_?_:null,onSelect:e=>{if(e.version!==L){var n;m(null!=(n=e.version)?n:""),f(null)}O(e.runId)}})})}},50207:(e,n,l)=>{Promise.resolve().then(l.bind(l,40140))}},e=>{e.O(0,[8060,5755,2463,2196,7358],()=>e(e.s=50207)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>a,oD:()=>s});let r="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=a();return localStorage.setItem(r,t),t}function l(){let e=a();return localStorage.setItem(r,e),e}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var r=n(55539),a=n(46124),s=n(8101),l=n(5997),o=n(18060),i=n(72215);let d=(0,a.createContext)(null);function c(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[c,u]=(0,a.useState)(n),[m,p]=(0,a.useState)(""),[h]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.Fp)();u(e),h.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();h.updateConfig(t),u(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let f=e=>{u(t=>{let n={...t,...e};return(0,s.Qc)(e),h.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},v=(0,a.useMemo)(()=>({config:c,setConfig:f,client:h,sessionId:m,setSessionId:b}),[c,h,m]);return(0,r.jsx)(d.Provider,{value:v,children:t})}function u(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},17595:(e,t,n)=>{Promise.resolve().then(n.bind(n,99864))},20793:(e,t,n)=>{"use strict";n.d(t,{EF:()=>o,m6:()=>l});var r=n(55539);let a=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),s=/fail|error|block|stall|cancel|abort/i;function l(e,t){if((null==e?void 0:e.kind)!=="ready")return null;let n=e.data.reduce((e,t)=>!e||Date.parse(t.startedAt)>Date.parse(e.startedAt)?t:e,null);return!n||a.has(n.status.toLowerCase())&&t-Date.parse(n.startedAt)>864e5?null:n}function o(e){var t,n;let{result:o,onSelect:i,selectedRun:d,now:c=Date.now()}=e,u=void 0===d?l(o,c):d;if(!u)return null;let m=Math.max(0,u.path.findIndex(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)!==!0})),p=u.path.length>0&&u.path.every(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)===!0})?u.path.length-1:m,h=u.path[p],f=u.nodes.find(e=>e.nodeId===h),b="done"===u.status.toLowerCase()&&(null==f?void 0:f.ok)===!1,v=!b&&((null==f?void 0:f.ok)===!1||s.test(u.status))?null==f||null==(t=f.summary.split(/\r?\n/,1)[0])?void 0:t.trim():null,x=Math.max(0,Math.floor((c-Date.parse(u.startedAt))/6e4)),y=a.has(u.status.toLowerCase()),g=y?function(e){let t=Date.parse(e.startedAt),n=e.nodes.map(e=>e.endedAt?Date.parse(e.endedAt):NaN).filter(Number.isFinite);return Number.isFinite(t)&&0!==n.length?Math.max(0,Math.floor((Math.max(...n)-t)/6e4)):null}(u):null;return(0,r.jsxs)("section",{"aria-label":"발행 진행",className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>i(u),className:"flex w-full min-w-0 items-center gap-2 text-left text-sm hover:text-primary",children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap font-semibold",children:["발행 ",null!=(n=u.version)?n:"판 미상"]}),y?(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==g?" \xb7 걸린 시간 ".concat(g,"분"):""]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=h?h:"노드 미상"," (",u.path.length?p+1:0,"/",u.path.length,")"]}),(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(x)?x:0,"분"]})]}),(0,r.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:u.path.map((e,t)=>{let n=u.nodes.find(t=>t.nodeId===e),a=!y&&t===p,s=y||t<p;return(0,r.jsxs)("span",{"aria-current":a?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(a?"border-primary bg-primary/10 font-semibold":!y&&t>p?"opacity-50":""),children:[s?(null==n?void 0:n.ok)===!0?"✓ ":(null==n?void 0:n.ok)===!1?"✗ ":"":"",e]},"".concat(e,"-").concat(t))})})]}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["상태: ",u.status]}),b&&(0,r.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,r.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},37037:(e,t,n)=>{"use strict";n.d(t,{Es:()=>l,Wf:()=>a,q9:()=>s});let r=/\u{1F451}|`[^`]+`|\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{7,40}\b|\/Users\/|\/(?:home|root)\/|\/\.ssh\/|~\/\.elanous|elt_|\$\s*[-+]?\d[\d,.]*|run-[0-9a-f]{8}\b|\b(?:test|mirror):|\b(?:account|remote)-\d+\b|\bmsb\d+\b|\.ts\.net\b|\bgcpvm\b|user|[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/iu;function a(e){return!r.test(e)}function s(e){return(e.replace(/^\s*\*\*\[[A-Za-z]{1,4}\]\*\*\s*/,"").replace(/^(?:\{\{TS\}\}|\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}(?::\d{2})?\s*(?:KST)?)\s*/,"").replace(/^→\s*(?:(?:[A-Z]{2,4}|전원|전체)(?=[\s·,(]|$)[\s·,]*)+/u,"").replace(/^—\s*/,"").replace(/^(?:보고|요청|정정|결정|사고|안내)\s*·\s*/,"").trim()||e.trim()).replace(/\*\*/g,"")}function l(e){return e.replace(/#\d{4,6}\b/g,"PR")}},43537:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function a(e){return"string"==typeof e}function s(e){return a(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function l(e){return r(e)&&a(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&a(e.summary)&&(void 0===e.startedAt||null===e.startedAt||a(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||a(e.endedAt))}n.d(t,{HG:()=>x,Kh:()=>v,Nn:()=>f,oc:()=>b});let o=new Set(["pending","running","done","retry","timeout","failed"]),i=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function d(e){return!!(r(e)&&a(e.runId)&&a(e.status)&&a(e.startedAt)&&(null===e.version||a(e.version))&&Array.isArray(e.path)&&e.path.every(a)&&Array.isArray(e.nodes)&&e.nodes.every(l))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!a(e.version)||!a(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&a(e.id)&&o.has(e.state)&&i(e.plannedMin)&&i(e.installSec)&&i(e.rc)&&(void 0===e.waitReason||a(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&a(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function c(e){return r(e)&&a(e.id)&&a(e.title)&&a(e.status)&&(void 0===e.owner||a(e.owner))&&a(e.updatedAt)&&(void 0===e.evidence||a(e.evidence))}let u=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&a(e.id)&&a(e.title)&&(null===e.open||u(e.open))&&(null===e.landed||u(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&a(e.id)&&a(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||a(e.role))&&(null===e.now||r(e.now)&&a(e.now.text)&&a(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&a(e.title)&&a(e.at)&&(null===e.checklistId||a(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&a(e.id)&&a(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||u(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>u(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let a=n(await r.json());return null===a?{kind:"error",status:r.status}:{kind:"ready",data:a}}catch(e){return{kind:"error",status:0}}}function f(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&a(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function b(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(d)?e:null)}function v(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&a(e.log)?{log:e.log}:null)}function x(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,l,o;if(!(r(e)&&a(e.version)&&(void 0===e.codename||a(e.codename))&&Array.isArray(e.items)&&e.items.every(c)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(a))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let i={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in i&&i[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&s(e.schedule.cutAt)&&(null===e.schedule.landBy||s(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:i.green,yellow:null!=(n=e.yellow)?n:i.yellow,red:null!=(l=e.red)?l:i.red,done:null!=(o=e.done)?o:i.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},58603:(e,t,n)=>{"use strict";var r=n(99027);n.o(r,"useParams")&&n.d(t,{useParams:function(){return r.useParams}}),n.o(r,"usePathname")&&n.d(t,{usePathname:function(){return r.usePathname}}),n.o(r,"useRouter")&&n.d(t,{useRouter:function(){return r.useRouter}}),n.o(r,"useSearchParams")&&n.d(t,{useSearchParams:function(){return r.useSearchParams}})},99864:(e,t,n)=>{"use strict";n.d(t,{SeatBoardView:()=>f});var r=n(55539),a=n(46124),s=n(58603),l=n(15151),o=n(43537),i=n(20793),d=n(37037);let c=[{seat:"OP",role:"COO"},{seat:"MK",role:"CMO"},{seat:"TC",role:"CTO"},{seat:"UX",role:"CXO"}];function u(e){return null===e?"못 읽음":String(e)}function m(e,t,n){let r=e.split(/\r?\n/);return t?r.filter(e=>(0,d.Wf)(e)&&!n.some(t=>e.includes(t))).map(d.Es):r}function p(e){var t,n,a,s,l,o;let{seat:i,role:c,publicCapture:p,identifiers:h}=e,f=null!=(t=null==i?void 0:i.landed)?t:null,b=null!=(n=null==i?void 0:i.blocked)?n:null,v=null!=(a=null==i?void 0:i.checklist)?a:null;return(0,r.jsxs)("article",{className:"min-w-0 space-y-5 rounded-2xl border bg-card p-5 shadow-sm","aria-label":"".concat(c," 자리"),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-3xl font-bold tracking-tight",children:c}),(0,r.jsx)("div",{className:"mt-3 min-h-12 break-words text-muted-foreground","aria-label":"지금 하는 일",children:(null==i?void 0:i.now)?m((0,d.q9)(i.now.text),p,h).map((e,t)=>(0,r.jsx)("p",{children:e},t)):"못 읽음"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 착지",children:[(0,r.jsxs)("h3",{className:"font-semibold",children:["오늘 착지 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===f?"text-muted-foreground":""),children:u(null!=(s=null==f?void 0:f.length)?s:null)})]}),f&&(0,r.jsx)("ul",{className:"mt-2 space-y-1",children:f.slice(-5).reverse().flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"#".concat(e.pr," \xb7 ").concat(t)},"".concat(e.pr,"-").concat(n))))})]}),(0,r.jsxs)("section",{"aria-label":"막힘",children:[(0,r.jsxs)("h3",{className:"font-semibold text-red-600 dark:text-red-400",children:["막힘 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===b?"text-muted-foreground":""),children:u(null!=(l=null==b?void 0:b.length)?l:null)})]}),b&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:b.flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"".concat(e.id," \xb7 ").concat(t)},"".concat(e.id,"-").concat(n))))})]}),(0,r.jsxs)("p",{children:["대표 결정 대기 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat((null==i?void 0:i.pendingDecisions)==null?"text-muted-foreground":""),children:u(null!=(o=null==i?void 0:i.pendingDecisions)?o:null)})]}),(0,r.jsx)("section",{"aria-label":"칸 상태",className:"flex flex-wrap gap-2 border-t pt-3",children:v?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,t)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(v[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][t]," ",v[e]]},e))}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"못 읽음"})}),(null==i?void 0:i.subSeats)&&i.subSeats.length>0&&(0,r.jsx)("ul",{"aria-label":"하위 자리",className:"space-y-1 border-t pt-3",children:i.subSeats.map(e=>{var t,n,a;let s="└ ".concat(e.id," ").concat(e.title," \xb7 열린 칸 ").concat(u(e.open)," \xb7 오늘 착지 ").concat(u(e.landed)," \xb7 막힘 ").concat(u(null!=(a=null==(t=e.blocked)?void 0:t.length)?a:null)),l=(null==(n=e.blocked)?void 0:n.length)?" \xb7 ".concat(e.blocked.map(e=>e.id).join(", ")):"",o=p?m(s,!0,h):[s],i=p?m(l,!0,h):[l];return o.map((t,n)=>(0,r.jsxs)("li",{className:"break-words",children:[t,i.join("")]},"".concat(e.id,"-").concat(n)))})})]})}function h(e){let{result:t,refreshedAt:n,publicCapture:a=!1,releaseStrip:s}=e;if((null==t?void 0:t.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let l=(null==t?void 0:t.kind)==="ready"?t.data.seats:[],o=l.flatMap(e=>{var t,n,r;return[...(null!=(t=e.landed)?t:[]).flatMap(e=>[String(e.pr),...e.checklistId?[e.checklistId]:[]]),...(null!=(n=e.blocked)?n:[]).map(e=>e.id),...(null!=(r=e.subSeats)?r:[]).flatMap(e=>{var t;return(null!=(t=e.blocked)?t:[]).map(e=>e.id)})]});return(0,r.jsxs)("main",{className:"mx-auto w-full max-w-[1920px] space-y-6 p-4 text-foreground md:p-8 ".concat(a?"flex min-h-screen flex-col text-base":""),children:[!a&&s,(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-muted-foreground",children:"운영 / 자리 현황"}),(0,r.jsx)("h1",{className:"text-3xl font-bold",children:"자리 현황"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 합계",className:"flex flex-wrap items-center gap-x-8 gap-y-3 rounded-2xl border bg-card p-5",children:[["landed","blocked","pendingDecisions"].map(e=>{let n=(null==t?void 0:t.kind)!=="ready"||c.some(t=>{var n;let{seat:r}=t;return!l.find(e=>e.seat===r)||(null==(n=l.find(e=>e.seat===r))?void 0:n[e])===null})?"못 읽음":String(l.reduce((t,n)=>t+("pendingDecisions"===e?n.pendingDecisions:n[e].length),0));return(0,r.jsxs)("p",{children:["landed"===e?"오늘 착지":"blocked"===e?"막힘":"결정 대기"," ",(0,r.jsx)("strong",{className:"".concat(a?"text-5xl":"text-3xl").concat("못 읽음"===n?" text-muted-foreground":""),children:n})]},e)}),(0,r.jsxs)("p",{children:["마지막 갱신 ",(0,r.jsx)("time",{dateTime:null!=n?n:void 0,children:n?new Date(n).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"}):"못 읽음"})]})]}),null===t&&(0,r.jsx)("p",{role:"status",children:"자리 현황을 불러오는 중…"}),(null==t?void 0:t.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["자리 현황을 불러오지 못했습니다 (",t.status,")"]}),(null==t?void 0:t.kind)==="ready"&&(0,r.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 min-[1440px]:grid-cols-4",children:c.map(e=>{let{seat:t,role:n}=e;return(0,r.jsx)(p,{seat:l.find(e=>e.seat===t),role:n,publicCapture:a,identifiers:o},t)})}),a&&(0,r.jsx)("footer",{className:"mt-auto border-t pt-4 text-center font-semibold tracking-wide",children:"PUBLIC CAPTURE \xb7 가린 화면"})]})}function f(){let{client:e}=(0,l.Q)(),t=(0,s.useRouter)(),[n,d]=(0,a.useState)(null),[c,u]=(0,a.useState)(null),[m,p]=(0,a.useState)(null),[f,b]=(0,a.useState)(null);return((0,a.useEffect)(()=>{b("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,a.useEffect)(()=>{let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),s=await (0,o.Nn)(e,a);n=!1,t&&(u(s),"forbidden"===s.kind&&(r=!0),"ready"===s.kind&&p(new Date().toISOString()))};u(null),p(null),a();let s=window.setInterval(()=>{a()},3e4),l=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",l),()=>{t=!1,window.clearInterval(s),document.removeEventListener("visibilitychange",l)}},[e]),(0,a.useEffect)(()=>{if(!1!==f||(null==c?void 0:c.kind)==="forbidden")return;let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=await (0,o.oc)(e);n=!1,t&&(d(a),"forbidden"===a.kind&&(r=!0))};d(null),a();let s=window.setInterval(()=>{a()},1e4),l=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",l),()=>{t=!1,window.clearInterval(s),document.removeEventListener("visibilitychange",l)}},[e,f,(null==c?void 0:c.kind)==="forbidden"]),null===f)?null:(0,r.jsx)(h,{result:c,refreshedAt:m,publicCapture:f,releaseStrip:(0,r.jsx)(i.EF,{result:n,onSelect:e=>t.push("/ops/release?run=".concat(encodeURIComponent(e.runId)))})})}}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=17595)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4635],{1789:(e,t,r)=>{Promise.resolve().then(r.bind(r,66485))},5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>a,f6:()=>s,oD:()=>o});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function o(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function a(){let e=s();return localStorage.setItem(n,e),e}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var n=r(55539),s=r(46124),o=r(8101),a=r(5997),l=r(18060),i=r(72215);let c=(0,s.createContext)(null);function d(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[d,u]=(0,s.useState)(r),[m,f]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new l.ki(r));(0,s.useEffect)(()=>{let e=(0,o.Fp)();u(e),p.updateConfig(e),f((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,o.Fp)();p.updateConfig(t),u(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&f(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,o.Qc)(e),p.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},g=e=>{f(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:d,setConfig:x,client:p,sessionId:m,setSessionId:g}),[d,p,m]);return(0,n.jsx)(c.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},66485:(e,t,r)=>{"use strict";r.d(t,{OutputsList:()=>i});var n=r(55539),s=r(46124),o=r(15151);let a={OP:"COO",MK:"CMO",TC:"CTO",UX:"CXO"},l=new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function i(){let{client:e}=(0,o.Q)(),[t,r]=(0,s.useState)([]),[a,l]=(0,s.useState)("all"),[i,d]=(0,s.useState)("loading");return(0,s.useEffect)(()=>{let t=!0;return(function(e){let{limit:t,source:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new URLSearchParams;void 0!==t&&n.set("limit",String(t)),void 0!==r&&n.set("source",r);let s=n.toString();return e.fetchJson("/v1/outputs".concat(s?"?".concat(s):""))})(e).then(e=>{let{outputs:n}=e;t&&(r(n),d("ready"))}).catch(()=>{t&&d("error")}),()=>{t=!1}},[e]),(0,n.jsx)(c,{outputs:t,selected:a,onSelect:l,status:i})}function c(e){let{outputs:t,selected:r,onSelect:s,status:o}=e,i=Array.from(new Map(t.map(e=>[e.kind,e.kindLabel])).entries()),c="all"===r?t:t.filter(e=>e.kind===r);return(0,n.jsxs)("main",{className:"mx-auto w-full max-w-3xl space-y-8 px-5 py-10 sm:py-16",children:[(0,n.jsxs)("header",{className:"space-y-2",children:[(0,n.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"산출물"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"엘라누스가 만든 문서\xb7슬라이드\xb7보고서\xb7영상을 한곳에서 봅니다."})]}),"loading"===o&&(0,n.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"산출물을 불러오는 중…"}),"error"===o&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:"산출물 목록을 읽지 못했습니다"}),"ready"===o&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{role:"group","aria-label":"종류 고르기",className:"flex flex-wrap gap-2",children:[["all","전부"],...i].map(e=>{let[o,a]=e;return(0,n.jsxs)("button",{type:"button",onClick:()=>s(o),"aria-pressed":r===o,className:"rounded-full border px-3 py-1.5 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(r===o?"border-primary bg-primary text-primary-foreground":"border-border bg-card text-foreground hover:bg-muted"),children:[a," ","all"===o?t.length:t.filter(e=>e.kind===o).length]},o)})}),0===t.length?(0,n.jsx)("p",{className:"rounded-xl border border-dashed border-border px-5 py-10 text-center text-sm text-muted-foreground",children:"아직 만든 산출물이 없습니다 — 일을 맡기면 여기에 쌓입니다"}):(0,n.jsx)("ul",{className:"space-y-3","aria-label":"산출물 목록",children:c.map((e,t)=>{var r;return(0,n.jsxs)("li",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,n.jsx)("span",{className:"rounded-md bg-muted px-2 py-1 font-medium text-foreground",children:e.kindLabel}),e.seat&&(0,n.jsx)("span",{children:null!=(r=a[e.seat])?r:e.seat}),(0,n.jsx)("time",{dateTime:e.at,children:function(e){let t=Object.fromEntries(l.formatToParts(new Date(e)).map(e=>{let{type:t,value:r}=e;return[t,r]}));return"".concat(t.month,"월 ").concat(t.day,"일 ").concat(t.hour,":").concat(t.minute)}(e.at)}),(0,n.jsx)("span",{children:"exec"===e.source?"맡긴 일":"현장"})]}),(0,n.jsx)("h2",{className:"mt-3 font-semibold leading-snug",children:e.title}),e.url?(0,n.jsx)("a",{href:e.url,target:"_blank",rel:"noopener",className:"mt-3 inline-block text-sm font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"열기"}):e.fileName&&(0,n.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:e.fileName})]},"".concat(e.at,"-").concat(e.kind,"-").concat(t))})})]})]})}}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=1789)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8517],{9734:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var r=s(55539),i=s(89545),a=s(17154),n=s(44373);let l=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:s="default",size:a="default",...o}=e;return(0,r.jsx)(i.$,{"data-slot":"button",className:(0,n.cn)(l({variant:s,size:a,className:t})),...o})}},14794:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var r=s(55539),i=s(3558),a=s.n(i),n=s(46124),l=s(9734),o=s(94306);let d=[{anchor:"channels",label:"Channels",description:"Telegram / Discord 봇 연결",primary:!0},{anchor:"voice",label:"Voice",description:"TTS \xb7 STT 모델 + voice 환경설정",primary:!0},{anchor:"ios",label:"iOS / mobile",description:"PWA install \xb7 iOS companion 페어링",primary:!0},{anchor:"personas",label:"Personas",description:"4 인격 (default \xb7 contrarian \xb7 pragmatist \xb7 sage) 편집",primary:!1},{anchor:"tools",label:"Tool surface",description:"chat 이 사용할 tool 셋 (readonly / chat / webterm / all)",primary:!1},{anchor:"advanced",label:"Advanced",description:"Model tier \xb7 budget guard \xb7 OCR \xb7 기타 카드 17 종",primary:!1}];var c=s(58046),u=s(55918);function h(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(null),[i,a]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{if(!e)return;let t=!0;return s(null),a(!1),e.getChatFastPath().then(e=>{let{enabled:r}=e;if("boolean"!=typeof r)throw Error("chat.fastPath is unavailable");t&&s(r)}).catch(()=>{t&&a(!0)}),()=>{t=!1}},[e]),(0,r.jsx)("section",{"aria-label":"셋업 추천","data-testid":"setup-recommendations",className:"flex flex-col gap-2 rounded border border-border bg-card p-3 text-sm",children:null===t?(0,r.jsx)("p",{role:"status",children:i?"chat.fastPath 값을 읽을 수 없습니다. 다시 접속해 확인하세요.":"추천 설정 확인 중…"}):["고칠 것 고치기 — 권한\xb7PATH\xb7서비스 파일\xb7파이썬 환경 등 고칠 수 있는 항목을 고칩니다(로그인\xb7서비스 재시작은 별도): `elanous doctor --fix --yes`",{fastPath:t}.fastPath?"짧은 물음은 빠르게 — 켜져 있음(chat.fastPath=true): 짧은 물음에 도구 없이 먼저 답합니다. 끄기: `elanous config set chat.fastPath false`":"짧은 물음은 빠르게 — 꺼져 있음(chat.fastPath=false): 켜면 짧은 물음에 도구 없이 먼저 답합니다. 켜기: `elanous config set chat.fastPath true`"].map(e=>(0,r.jsx)("p",{children:e},e))})}function p(){let[e,t]=(0,n.useState)(!1),[s,i]=(0,n.useState)(!1);return(0,r.jsxs)("section",{className:"flex flex-col gap-3","aria-labelledby":"setup-next-steps-title","data-testid":"setup-next-steps",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{id:"setup-next-steps-title",className:"text-sm font-semibold",children:"다음 셋업(선택)"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"필요한 것만 지금 연결하세요. 나중에 해도 됩니다."})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":e,"aria-controls":"setup-next-bots",onClick:()=>t(e=>!e),children:"텔레그램\xb7디스코드 봇 연결"}),e&&(0,r.jsxs)("div",{id:"setup-next-bots",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(c.W,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>t(!1),children:"나중에"})]})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":s,"aria-controls":"setup-next-vault",onClick:()=>i(e=>!e),children:"Obsidian 볼트\xb7스킬 폴더"}),s&&(0,r.jsxs)("div",{id:"setup-next-vault",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(u.Q,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>i(!1),children:"나중에"})]})]})]})}function f(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(!1),[i,d]=(0,n.useState)({status:"idle"});return((0,n.useEffect)(()=>{s(!0)},[]),(0,n.useEffect)(()=>{t&&e&&(d({status:"loading"}),e.getLlmProviders().then(e=>{d({status:"ok",active:{provider:e.activeProvider||"(unset)"}})}).catch(e=>{d({status:"error",message:e.message})}))},[t,e]),t&&e)?(0,r.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,r.jsx)(h,{}),(0,r.jsx)(m,{load:i}),(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"곧장 chat 으로"}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["LLM 만 셋업해도 chat 은 바로 사용 가능합니다. 나머지는 필요할 때",(0,r.jsx)("span",{className:"font-mono",children:" /settings"})," 에서 추가하세요."]}),(0,r.jsx)("div",{children:(0,r.jsx)(a(),{href:"/chat","data-testid":"setup-done-chat-link",children:(0,r.jsx)(l.$,{size:"lg",children:"Chat 시작 →"})})})]}),(0,r.jsx)(p,{}),(0,r.jsx)(x,{})]}):null}function m(e){let{load:t}=e;if("loading"===t.status||"idle"===t.status)return(0,r.jsx)("section",{className:"rounded border border-border bg-card p-4",children:(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"상태 확인 중…"})});if("error"===t.status)return(0,r.jsx)("section",{className:"rounded border border-destructive/40 bg-destructive/5 p-4",children:(0,r.jsxs)("p",{className:"text-sm text-destructive",children:["LLM 상태 로드 실패: ",t.message]})});let s=t.active.provider,i="(unset)"===s;return(0,r.jsx)("section",{className:"rounded border border-primary/40 bg-primary/5 p-4","data-testid":"setup-done-active-llm",children:(0,r.jsxs)("header",{className:"flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:"현재 LLM provider"}),(0,r.jsx)("p",{className:"mt-1 font-mono text-base font-semibold",children:s})]}),i?(0,r.jsx)(a(),{href:"/setup",children:(0,r.jsx)(l.$,{variant:"outline",size:"sm",children:"셋업"})}):(0,r.jsx)("span",{className:"rounded bg-primary/10 px-2 py-1 text-xs font-medium text-primary",children:"✓ 준비됨"})]})})}function x(){let e=d.filter(e=>e.primary),t=d.filter(e=>!e.primary);return(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"필요하면 더 셋업하기"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"모두 선택. 안 만져도 chat 은 잘 됩니다."})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-3",children:e.map(e=>(0,r.jsx)(b,{link:e},e.anchor))}),(0,r.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,r.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 (",t.length,")"]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-3",children:t.map(e=>(0,r.jsx)(b,{link:e},e.anchor))})]})]})}function b(e){let{link:t}=e,s="/settings#".concat(t.anchor);return(0,r.jsxs)(a(),{href:s,"data-testid":"setup-done-link-".concat(t.anchor),className:"flex flex-col gap-1 rounded border border-border bg-card p-3 transition-colors hover:border-primary/40",children:[(0,r.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:t.description})]})}},18068:(e,t,s)=>{"use strict";s.d(t,{Qb:()=>n,SI:()=>o,dJ:()=>l});let r="elanous:auth-required",i=null,a=!1;function n(e){null===i&&(i=e,window.dispatchEvent(new CustomEvent(r,{detail:{path:e}})))}function l(e){let t=window,s=t=>e(t.detail);return t.addEventListener(r,s),null===i||a||e({path:i}),()=>t.removeEventListener(r,s)}function o(){a=!0}},30158:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var r=s(55539);s(46124);var i=s(8085),a=s(44373);function n(e){let{className:t,type:s,...n}=e;return(0,r.jsx)(i.p,{type:s,"data-slot":"input",className:(0,a.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...n})}},44373:(e,t,s)=>{"use strict";s.d(t,{cn:()=>a});var r=s(20852),i=s(30984);function a(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,i.QP)((0,r.$)(t))}},55918:(e,t,s)=>{"use strict";s.d(t,{Q:()=>c});var r=s(55539),i=s(46124),a=s(9734),n=s(30158),l=s(94306),o=s(79247);function d(e){if(e instanceof o.Iu&&e.body&&"object"==typeof e.body){var t;let s=e.body;return[null!=(t=s.reason)?t:s.error,s.path].filter(Boolean).join(": ")}return e instanceof Error?e.message:String(e)}function c(){let e=(0,l.Qj)(),[t,s]=(0,i.useState)(!1),[o,c]=(0,i.useState)(null),[u,h]=(0,i.useState)({vault:"",selection:"custom",dirs:""}),{vault:p,selection:f,dirs:m}=u,[x,b]=(0,i.useState)(!0),[g,v]=(0,i.useState)(!1),[j,y]=(0,i.useState)(""),[k,w]=(0,i.useState)(""),[N,S]=(0,i.useState)("");(0,i.useEffect)(()=>{s(!0)},[]);let C=(0,i.useCallback)(async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"all";if(e){b(!0);try{let s=await e.getObsidianSkills();c(s),h(e=>({vault:"skills"===t?e.vault:s.obsidian.vault,selection:"vault"===t?e.selection:s.skills.activeSet,dirs:"vault"===t?e.dirs:s.skills.dirs.join("\n")})),y("")}catch(e){y(d(e))}finally{b(!1)}}},[e]);(0,i.useEffect)(()=>{t&&e&&C()},[t,e,C]);let O=async()=>{if(e){v(!0),w("");try{var t;let s=await e.setObsidian({vault:p.trim()});await C("vault"),w(null!=(t=s.warning)?t:"Vault saved.")}catch(e){w(d(e))}finally{v(!1)}}},F=async()=>{if(e){v(!0),S("");try{await e.setSkills("custom"===f?{dirs:m.split("\n").map(e=>e.trim()).filter(Boolean)}:{activeSet:f}),await C("skills"),S("Skills saved.")}catch(e){S(d(e))}finally{v(!1)}}};return t&&e?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"obsidian-skills-card",children:[(0,r.jsxs)("header",{className:"flex items-center justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"Obsidian & Skills"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Choose directories on the machine running NEXUS."})]}),(0,r.jsx)(a.$,{size:"sm",variant:"outline",onClick:()=>void C("all"),disabled:x||g,children:"Refresh"})]}),x&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Loading paths…"}),j&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:j}),o&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("label",{htmlFor:"obsidian-vault",className:"text-sm font-medium",children:"Obsidian vault path"}),(0,r.jsx)(n.p,{id:"obsidian-vault",value:p,onChange:e=>{h(t=>({...t,vault:e.target.value})),w("")},placeholder:"/absolute/path/to/vault"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"vault-validation",children:p===o.obsidian.vault?o.obsidian.looksLikeVault?"Vault found (.obsidian detected)":o.obsidian.exists?"Directory found; .obsidian not detected":"Directory not found":"Save to validate this path on the NEXUS host."}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void O(),disabled:g||!p.trim(),children:"Save vault"}),k&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"vault-feedback",children:k})]}),(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("label",{htmlFor:"skills-preset",className:"text-sm font-medium",children:"Skills source"}),(0,r.jsxs)("select",{id:"skills-preset",value:f,onChange:e=>{h(t=>({...t,selection:e.target.value})),S("")},className:"flex h-9 w-full rounded-md border border-input bg-background px-3 text-sm",children:[o.skills.presets.map(e=>{var t;return(0,r.jsxs)("option",{value:e.key,children:[e.label," — ",null!=(t=e.dir)?t:"(no path)"," ",e.exists?"✓":"(missing)"]},e.key)}),(0,r.jsx)("option",{value:"custom",children:"Custom directories"})]}),"custom"===f&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("label",{htmlFor:"skills-dirs",className:"block text-xs text-muted-foreground",children:"One absolute directory per line"}),(0,r.jsx)("textarea",{id:"skills-dirs",value:m,onChange:e=>{h(t=>({...t,dirs:e.target.value})),S("")},rows:3,className:"w-full rounded-md border border-input bg-background px-3 py-2 font-mono text-xs",placeholder:"/absolute/path/to/skills"})]}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void F(),disabled:g,children:"Save skills"}),N&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"skills-feedback",children:N})]})]})]}):null}},58046:(e,t,s)=>{"use strict";s.d(t,{W:()=>d});var r=s(55539),i=s(46124),a=s(9734),n=s(30158),l=s(94306);let o=["telegram","discord"];function d(){let{client:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,l.Qj)(),s=null!=e?e:t,[d,c]=(0,i.useState)([]),[u,h]=(0,i.useState)({}),[p,f]=(0,i.useState)({}),[m,x]=(0,i.useState)({}),[b,g]=(0,i.useState)(null),[v,j]=(0,i.useState)({}),[y,k]=(0,i.useState)("");(0,i.useEffect)(()=>{if(!s)return;let e=!1;return s.getChannelBots().then(t=>{let{platforms:s}=t;e||(c(s),f(e=>{let t={...e};for(let e of s)Object.hasOwn(t,e.platform)||(t[e.platform]=e.allowedUsers.join(", "));return t}))}).catch(()=>{e||k("봇 상태를 불러오지 못했습니다.")}),()=>{e=!0}},[s]);let w=async e=>{var t;if(!s)return;g(e),k("");let r=null==(t=u[e])?void 0:t.trim(),i=Object.hasOwn(p,e)?p[e].split(",").map(e=>e.trim()).filter(Boolean):void 0;h(t=>({...t,[e]:""}));try{let t=await s.setChannelBot({platform:e,...r?{token:r}:{},...void 0!==i?{allowedUsers:i}:{}});t.botName&&x(s=>({...s,[e]:t.botName})),j(s=>({...s,[e]:t.restartNeeded}));try{let e=await s.getChannelBots();c(e.platforms)}catch(e){k("저장됐지만 봇 상태를 다시 불러오지 못했습니다.")}}catch(t){k("".concat(e," 저장에 실패했습니다. 토큰과 허용 사용자 ID를 확인하세요."))}finally{g(null)}};return s?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"channel-bot-setup-card",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"봇 연결"}),o.map(e=>{var t,s;let i=d.find(t=>t.platform===e);return(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("h3",{className:"text-sm font-medium capitalize",children:e}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:(null==i?void 0:i.configured)?"연결됨 (".concat(i.source,")"):"미연결"}),m[e]&&(0,r.jsxs)("p",{className:"text-xs",children:["봇 이름: ",m[e]]}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-bot-token"),className:"block text-xs",children:"봇 토큰"}),(0,r.jsx)(n.p,{id:"".concat(e,"-bot-token"),type:"password",autoComplete:"off",value:null!=(t=u[e])?t:"",onChange:t=>h(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-allowed-users"),className:"block text-xs",children:"허용 사용자 ID (쉼표로 구분)"}),(0,r.jsx)(n.p,{id:"".concat(e,"-allowed-users"),value:null!=(s=p[e])?s:"",onChange:t=>f(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)(a.$,{type:"button",size:"sm",disabled:null!==b,onClick:()=>void w(e),children:"확인하고 저장"}),v[e]&&(0,r.jsx)("p",{role:"status",className:"text-xs",children:"봇을 재시작해야 반영됩니다"})]},e)}),y&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:y})]}):null}},72215:(e,t,s)=>{"use strict";let r;s.d(t,{cY:()=>c,x8:()=>l});let i={debug:0,info:1,warn:2,error:3},a="/v1/debug-logs/batch",n=null;function l(e){n=e}class o{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(i[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<i[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,s=JSON.stringify({records:e});try{var r,i;t=await (r=this.fetchFn(s),i=this.postTimeoutMs,new Promise((e,t)=>{let s=setTimeout(()=>t(Error("debug-forward timeout after ".concat(i,"ms"))),i);r.then(t=>{clearTimeout(s),e(t)},e=>{clearTimeout(s),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&n)try{await n(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let a=this.lastOkAt;this.lastOkAt=Date.now();let l=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:l,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:a},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(a,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=d,t="debug",s=1e4,r=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=s,this.flushMs=r,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function d(e){return(await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function c(e,t){if("undefined"==typeof console)return;let s=new Date().toISOString();if(void 0!==t){let r="";try{let e=new WeakSet;r=JSON.stringify(t,(t,s)=>{if("bigint"==typeof s)return"".concat(s.toString(),"n");if("function"==typeof s)return"[fn ".concat(s.name||"anon","]");if(s&&"object"==typeof s){if(e.has(s))return"[circular]";e.add(s)}return s})}catch(e){r="[unserializable: ".concat(String(e),"]")}r&&r.length>800&&(r=r.slice(0,797)+"..."),console.debug("[".concat(s,"] ").concat(e," ").concat(r),t),u(s,e,r)}else console.debug("[".concat(s,"] ").concat(e)),u(s,e,void 0)}function u(e,t,s){let i,a=function(){if(void 0!==r)return r;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return r=null,null;let t=new o(d,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return r=t,t}();if(!a)return;let n=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==s&&""!==s)try{i=JSON.parse(s)}catch(e){i=s}a.push({ts:e,category:t,event:n,...void 0!==i?{data:i}:{},source:{platform:"pwa"}})}},93831:(e,t,s)=>{Promise.resolve().then(s.bind(s,14794))},94306:(e,t,s)=>{"use strict";s.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var r=s(55539),i=s(46124),a=s(76642),n=s(50363);let l=(0,i.createContext)(null);function o(e){let{client:t,queryClient:s,defaultStaleTimeMs:o,children:d}=e,c=(0,i.useMemo)(()=>null!=s?s:new a.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[s,o]);return(0,r.jsx)(l.Provider,{value:t,children:(0,r.jsx)(n.Ht,{client:c,children:d})})}function d(){let e=(0,i.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,i.useContext)(l)}}},e=>{e.O(0,[211,3324,8682,3558,8085,9247,2463,2196,7358],()=>e(e.s=93831)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(55539),a=r(89545),n=r(17154),i=r(44373);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},14786:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(55539),a=r(97479),n=r(52982);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(20852),a=r(30984);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},52982:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(46124);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},58603:(e,t,r)=>{"use strict";var s=r(99027);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},70514:(e,t,r)=>{Promise.resolve().then(r.bind(r,75649))},75649:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(55539),a=r(58603),n=r(46124),i=r(96375),l=r(14786),o=r(98136),d=r(9734),c=r(30158),u=r(44373);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(94306),g=r(18060),v=r(8101);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},94306:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(55539),a=r(46124),n=r(76642),i=r(50363);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},97479:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(46124);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[211,3324,8682,8085,8060,9247,3194,2463,2196,7358],()=>e(e.s=70514)),_N_E=e.O()}]);
|