elanous 0.2.15 → 0.2.17
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-33ffcc49ab45123b.js → 1307-aac7332576c4d6fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6877-7c6208705c284124.js → 6877-fe94e76a5841ee9b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8401-4ce1c42c8d89903f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/899-f41be85e8a680651.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9103-7a3ae7f60af3b99f.js → 9103-60fbef33e66f0a46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9247-269e4464cc4b491c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/{page-0e2c57fe6add4b2a.js → page-3143b07a817d1da9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-e05a77df7e005b04.js → page-17ba086ef82d339b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7eb661ff23af7da2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-6b8444914da74ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/{page-b8c49f6b4fa2df91.js → page-6e5c3a867557298b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-7110f732f45bf944.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-976813c91d7394ea.js → page-9a41d65355fc25b9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-5e77cd1802567c89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/{page-1d4901eb7c2d8822.js → page-41afec0b255ed2bb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-72d3e7ff35a8c954.js → page-4187666132fc98c4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-60c7a8e1a4fe62ce.js → page-09328d499162bae4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-2a52b316cb143d9c.js → page-29ff3a8f84f03b6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-c3ce483c8d5db370.js → page-80ec7401bc83f511.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ab93b240f687d69a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-96f074f6538e8a2c.js → page-fc7d86467291ae38.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{layout-e97be5334d83a9f5.js → layout-de43a186e5ba5683.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-8b08cafad27759c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-0e2d6985fb42cd2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-13e4108999f58d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e8296ee284aa1293.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-c1343f9499d86f3f.js → page-043a9111e74f6b24.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-8739a2e0ae793130.js → not-found-23a4601ceb7f452e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1ed1324b1dc36754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-d23b12bb92242558.js → page-10d958605a77b3bd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-166745e51ac0c7b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/{page-c7fea475488201a8.js → page-a04260b8ccc968d4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-7a1d85e121065cc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-1f50e3d4e13435f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-5efbf81124c474ae.js → page-12916918988ac97e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d8a3347a9d0c3f4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a9117d2cd3093d36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-06ee266953d9c879.js → page-5a64cb5208c6a8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/{page-153c2b3bcc89e8de.js → page-1407ec83ea64c1f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-1d824510df025d18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-6e878ebbe1737d00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-0d6d23b40263a7ea.js → page-7f49fe645d5132f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-81a4e7f8dbfe74cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-27d71f131acd9320.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-3ab59d19913b200e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-bf85b2f5bf077925.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/{page-73735b64bfe1ae67.js → page-424659bacfb8cdd7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ab32a8f522a60371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-f7e631e9b4daf66e.js → page-fc2df261f8a2c7df.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-09461366af82ef13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-9817c7f9007466cc.js → page-5d4fef9ccd7d406b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ea90a8ac73ce2749.js +1 -0
- package/apps/pwa/out/_next/static/css/001d5fbaee388a25.css +1 -0
- package/apps/pwa/out/_next/static/css/{04dabcbcc4bfa6db.css → 085673d826b98b62.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +15 -15
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +15 -15
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +15 -15
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +15 -15
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +15 -15
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +15 -15
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +15 -15
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +15 -15
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +15 -15
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +15 -15
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +15 -15
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +15 -15
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +15 -15
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +15 -15
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +15 -15
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +15 -15
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +15 -15
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +15 -15
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +15 -15
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +15 -15
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +15 -15
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +15 -15
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +15 -15
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +15 -15
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +15 -15
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +15 -15
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +16 -16
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +15 -15
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +15 -15
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +15 -15
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +15 -15
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +15 -15
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +15 -15
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +15 -15
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +15 -15
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +15 -15
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +15 -15
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +15 -15
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +15 -15
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +15 -15
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +15 -15
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +15 -15
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +15 -15
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +15 -15
- package/graphs/doc-gen/doc-gen.yaml +24 -0
- package/graphs/doc-gen/recipes.yaml +3 -0
- package/graphs/intake/intake-daily.yaml +9 -2
- package/graphs/intake/news-sources.yaml +4 -0
- package/graphs/intake/recipes.yaml +6 -1
- package/graphs/orchestrator/orchestrator.yaml +7 -0
- package/graphs/orchestrator/recipes.yaml +3 -0
- package/graphs/steward/recipes.yaml +2 -1
- package/package.json +1 -1
- package/scripts/__fixtures__/intake-news.xml +7 -0
- package/scripts/ci-public-export-import-gate.ts +154 -0
- package/scripts/ci-test-interference-gate.ts +5 -1
- package/scripts/ci-typecheck-changed.ts +34 -15
- package/scripts/docs/doc-rot.ts +164 -0
- package/scripts/docs/generate-graph-anatomy.ts +131 -9
- package/scripts/docs-cli-check.ts +4 -4
- package/scripts/goals/goal-census.ts +343 -0
- package/scripts/intake-news.ts +169 -0
- package/scripts/measure/author-section-contribution.ts +84 -0
- package/scripts/release-loop/cut-branch.ts +43 -13
- package/scripts/release-loop/docs-land-node.ts +69 -10
- package/scripts/release-loop/gate-node.ts +3 -1
- package/scripts/release-loop/publish-node.ts +2 -2
- package/scripts/release-loop/release-docs.ts +134 -0
- package/scripts/release-loop/vault-note-node.ts +19 -2
- package/scripts/release-loop/version-node.ts +7 -4
- package/scripts/release-story/draft.ts +42 -14
- package/scripts/rhythm/monthly.ts +97 -0
- package/src/acp/client.ts +17 -2
- package/src/agent-mission/driver.ts +104 -11
- package/src/agent-mission/supervisor-metrics-cli.ts +40 -0
- package/src/agent-mission/supervisor-metrics.ts +218 -0
- package/src/autopilot/track-agent-shadow.ts +2 -1
- package/src/autopilot/track-agent.ts +5 -3
- package/src/briefing/brief-items.ts +191 -36
- package/src/budget/usage-outcomes.ts +204 -0
- package/src/cli/autopilot-cli.ts +66 -0
- package/src/cli/brief-cli.ts +73 -0
- package/src/cli/decisions-cli.ts +4 -1
- package/src/cli/intake-cli.ts +1 -1
- package/src/cli/know-cli.ts +20 -0
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/logs-cli.ts +43 -1
- package/src/cli/pr-cli.ts +92 -13
- package/src/cli/provider-cli.ts +14 -0
- package/src/cli/release-cli.ts +11 -8
- package/src/cli/self-update-canary.ts +46 -0
- package/src/cli/self-update.ts +399 -1
- package/src/cli/usage-cli.ts +26 -0
- package/src/context-card/index.ts +45 -0
- package/src/context-card/task.ts +76 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
- package/src/decisions/decision-ledger.ts +10 -1
- package/src/discord-self-message.ts +9 -0
- package/src/flow-loop/split.ts +24 -0
- package/src/harness/harness-cli-command.ts +178 -12
- package/src/harness/harness-pod-dispatch.ts +36 -55
- package/src/harness/harness-queue.ts +86 -7
- package/src/harness/harness-seams.ts +13 -3
- package/src/harness/helper-repair.ts +139 -8
- package/src/harness/helper-scan.ts +13 -2
- package/src/harness/nested-elanous-policy.ts +133 -0
- package/src/hq/fence-wrapper.ts +123 -0
- package/src/hq/hq.ts +16 -2
- package/src/hq/lease.ts +5 -3
- package/src/hq/transfer.ts +185 -0
- package/src/index.ts +168 -13
- package/src/intake-plane/digest.ts +85 -28
- package/src/knowledge/know-find.ts +105 -0
- package/src/llm.ts +75 -19
- package/src/loops/orchestrator/finish-rate.ts +14 -3
- package/src/loops/orchestrator/tick.ts +96 -25
- package/src/maturity/bot-slash-catalog.ts +11 -2
- package/src/maturity/feature-maturity.ts +2 -2
- package/src/maturity/tui-slash-availability.ts +9 -0
- package/src/nexus/api/grid.ts +61 -0
- package/src/nexus/api/http-server.ts +19 -1
- package/src/nexus/api/task-cards-api.ts +19 -0
- package/src/oauth/codex.ts +82 -2
- package/src/oauth/overload-failover-launch.ts +75 -0
- package/src/oauth/overload-failover.ts +137 -0
- package/src/release-loop/checklist.ts +10 -5
- package/src/release-loop/feature-store.ts +10 -9
- package/src/release-loop/landing-freeze.ts +18 -10
- package/src/release-loop/placement.ts +17 -8
- package/src/seat-dispatch/seat-ask.ts +33 -6
- package/src/seat-loop/seat-loop.ts +172 -21
- package/src/self-dev/ask-launch-flow.ts +48 -8
- package/src/self-dev/authored-goal-trace.ts +64 -0
- package/src/self-dev/dev-cli.ts +19 -1
- package/src/self-dev/dev-pipeline.ts +6 -5
- package/src/self-dev/entrance-registry.ts +10 -6
- package/src/self-dev/old-door.ts +73 -0
- package/src/self-dev/run-store.ts +5 -1
- package/src/self-dev/run-supervisor.ts +7 -1
- package/src/self-dev/supervisor-verdict-edges.ts +46 -0
- package/src/self-implement/app-api-budget.ts +166 -0
- package/src/self-implement/budget-gate.ts +7 -5
- package/src/self-implement/follow-up-goals.ts +289 -0
- package/src/self-implement/frozen-merges.ts +25 -20
- package/src/self-implement/goal-author-clarification.ts +81 -0
- package/src/self-implement/goal-author-cli.ts +33 -5
- package/src/self-implement/goal-author.ts +107 -25
- package/src/self-implement/goal-clarification-escalation.ts +37 -1
- package/src/self-implement/goal-document-write.ts +28 -0
- package/src/self-implement/heal-intake.ts +4 -0
- package/src/self-implement/heal-triage.ts +44 -0
- package/src/self-implement/host-regate.ts +3 -1
- package/src/self-implement/orchestrator.ts +157 -8
- package/src/self-implement/run-ledger.ts +4 -0
- package/src/self-implement/seams.ts +44 -15
- package/src/session-runtime/index.ts +2 -0
- package/src/session-runtime/retry-api.ts +87 -0
- package/src/session-runtime/retry-policy.ts +107 -6
- package/src/steward/working-backwards.ts +16 -1
- package/src/task-agent/actions.ts +118 -0
- package/src/task-agent/judge.ts +96 -0
- package/src/task-cards/card-cli.ts +25 -0
- package/src/task-cards/card-store.ts +9 -4
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +33 -4
- package/src/task-orchestrator/surfaces/pod-lease.ts +5 -2
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +4 -3
- package/src/task-orchestrator/surfaces/pod-ledger-prod-sink.ts +75 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +95 -18
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +37 -1
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +168 -37
- package/src/task-orchestrator/surfaces/self-implement.ts +2 -0
- package/src/telegram-commands.ts +6 -1
- package/src/telegram-loops-command.ts +21 -14
- package/src/telegram.ts +47 -0
- package/src/user-config.ts +59 -4
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/8827-e2f5b09a8d37e83b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/899-46946fe8363e1262.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-29d889b809288e65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-f544338193a9a762.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5491c115b1f9a923.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-96398e364fbd4548.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-28b9448091776c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-13c7b53e0c2519a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-65e484302921a932.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-34d08facaf08f556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-955ec2da3be4c560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-9f88fbc15d9058d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-c9fc5706b8abaa11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8d47f45a0dc044ac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-e2ee2896811e98d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-83b19dae8619de05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f1a1fc0a82738c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-da6c08aae0f92768.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-87a11e6a05f15199.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-7d4182964407c09c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-7e8c39241f8eb6d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-008c1a96618a4887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5597e894c02cd33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-0337fdf7fb5e37b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8fcec4c9ea2e7f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-4881b8f9f63694b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-97f9f43172a3a90e.js +0 -1
- package/apps/pwa/out/_next/static/css/1f7c958c41ffa3b9.css +0 -1
- package/src/launch-head/seat-goal-queue-lock.fixture.ts +0 -15
- package/src/launch-head/seat-goal-queue.ts +0 -198
- /package/apps/pwa/out/_next/static/{LZcstaO9_NXypPFmujolv → yRA5ur6DcPl0YHSRheH2O}/_buildManifest.js +0 -0
- /package/apps/pwa/out/_next/static/{LZcstaO9_NXypPFmujolv → yRA5ur6DcPl0YHSRheH2O}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[899],{12958:(e,t,n)=>{n.d(t,{a:()=>o});var r=n(55539),a=n(46124),l=n(74780);let s=e=>JSON.stringify([e.graphId,e.runId]);function o(e){let{client:t,approvals:n,onDecided:o,onPendingChange:i}=e,c=(0,a.useMemo)(()=>(0,l.ll)({client:t}),[t]),[d,u]=(0,a.useState)([]),[m,h]=(0,a.useState)({}),[p,f]=(0,a.useState)(null),[g,x]=(0,a.useState)(""),b=(0,a.useRef)(0),v=n.map(s).join("|");function y(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:m;u(e),i(n.filter(n=>!t[s(n)]&&e.some(e=>s(e)===s(n))).length)}async function w(e,t){let r=s(e);if(p||m[r]||!n.some(e=>s(e)===r)||!d.some(e=>s(e)===r))return;let a=b.current;f(r),x("");try{if(await c.decide(e.graphId,e.runId,t),b.current!==a)return;let n={...m,[r]:t};h(n),y(d,n),o();let l=await c.list();b.current===a&&y(l.items,n)}catch(e){b.current===a&&x((0,l.LP)(e,"decide"))}finally{b.current===a&&f(null)}}return((0,a.useEffect)(()=>{let e=++b.current;return(u([]),x(""),v)?(c.list().then(t=>{b.current===e&&y(t.items)}).catch(t=>{b.current===e&&x((0,l.LP)(t,"list"))}),()=>{b.current+=1}):(i(0),()=>{b.current+=1})},[c,v]),0===n.length)?null:(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"게시 승인"}),g&&(0,r.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:g}),(0,r.jsx)("ul",{className:"space-y-2",children:n.map(e=>{let t=s(e),n=d.some(e=>s(e)===t);return(0,r.jsxs)("li",{className:"rounded-lg border border-border bg-background px-4 py-3 text-sm",children:[(0,r.jsx)("p",{children:e.message}),m[t]?(0,r.jsx)("p",{className:"mt-2 text-muted-foreground",children:"approved"===m[t]?"승인됨":"보류됨"}):n?(0,r.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:null!==p,onClick:()=>void w(e,"approved"),className:"rounded-lg bg-primary px-3 py-1 text-primary-foreground disabled:opacity-50",children:"승인"}),(0,r.jsx)("button",{type:"button",disabled:null!==p,onClick:()=>void w(e,"rejected"),className:"rounded-lg border border-border px-3 py-1 disabled:opacity-50",children:"보류"})]}):(0,r.jsx)("p",{className:"mt-2 text-muted-foreground",children:"대기 중인 승인이 아닙니다."})]},t)})})]})}},33626:(e,t,n)=>{async function r(e){let t=await e.fetchResponse("/v1/decisions?status=open");if(!t.ok)throw Error("decisions list failed: ".concat(t.status));return(await t.json()).decisions}async function a(e,t,n){let r=await e.fetchResponse("/v1/decisions/".concat(encodeURIComponent(t),"/decide"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({choice:n})});if(!r.ok)throw Error("decision failed: ".concat(r.status))}n.d(t,{L:()=>a,q:()=>r})},43537:(e,t,n)=>{function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function a(e){return"string"==typeof e}function l(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 s(e){return r(e)&&a(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&a(e.summary)}function o(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(s)}function i(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))}n.d(t,{HG:()=>g,Kh:()=>f,Nn:()=>h,oc:()=>p});let c=e=>Number.isInteger(e)&&e>=0;function d(e){return r(e)&&a(e.id)&&a(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)&&a(e.id)&&a(e.title)))}function u(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)&&c(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||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(d))}async function m(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 h(e,t){return m(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&a(e.date)&&Array.isArray(e.seats)&&e.seats.every(u)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function p(e,t){return m(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(o)?e:null)}function f(e,t,n){return m(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&a(e.log)?{log:e.log}:null)}function g(e,t){return m(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,s,o;if(!(r(e)&&a(e.version)&&(void 0===e.codename||a(e.codename))&&Array.isArray(e.items)&&e.items.every(i)&&["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 c={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in c&&c[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&l(e.schedule.cutAt)&&(null===e.schedule.landBy||l(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:c.green,yellow:null!=(n=e.yellow)?n:c.yellow,red:null!=(s=e.red)?s:c.red,done:null!=(o=e.done)?o:c.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},50899:(e,t,n)=>{n.d(t,{ChatPanel:()=>e1});var r=n(55539),a=n(46124),l=n(92156),s=n(94226),o=n(16190),i=n(46586),c=n(71923),d=n(15151),u=n(43537),m=n(37768);function h(){let{client:e}=(0,d.Q)(),[t,n]=(0,a.useState)([]);if((0,a.useEffect)(()=>{if("undefined"==typeof document)return;let t=!0,r=!1,a=async()=>{if(!t||r||document.hidden)return;r=!0;let a=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),l=await (0,u.Nn)(e,a);r=!1,t&&n((0,m.z)("ready"===l.kind?l.data:null,Date.now()))};n([]),a();let l=globalThis.setInterval(()=>{a()},6e4),s=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",s),()=>{t=!1,globalThis.clearInterval(l),document.removeEventListener("visibilitychange",s)}},[e]),0===t.length)return null;let l=t.map(e=>{let{seat:t,text:n,ago:r}=e;return"".concat(t," ").concat(n," \xb7 ").concat(r)}).join(" | ");return(0,r.jsx)("div",{role:"status","aria-label":"지금 자리들이 하는 일",title:l,className:"h-8 min-h-8 min-w-0 shrink-0 overflow-hidden text-ellipsis whitespace-nowrap border-b border-border bg-background px-3 text-xs leading-8 text-muted-foreground",children:t.map((e,t)=>{let{seat:n,text:a,ago:l}=e;return(0,r.jsxs)("span",{children:[t>0&&" | ",n," ",a," \xb7 ",l]},n)})})}var p=n(3180),f=n(72215);function g(){let{client:e}=(0,d.Q)(),[t,n]=(0,a.useState)(!1),[l,s]=(0,a.useState)(!1),[o,i]=(0,a.useState)(""),c=(0,a.useRef)(!1),u=(0,a.useRef)(0),m=(0,a.useRef)(!1);(0,a.useEffect)(()=>(n("speechSynthesis"in window&&"undefined"!=typeof SpeechSynthesisUtterance),()=>{u.current++,m.current&&"speechSynthesis"in window&&window.speechSynthesis.cancel()}),[]);let h=async()=>{if(c.current||!t)return;c.current=!0;let n=++u.current;s(!0),i(""),m.current&&window.speechSynthesis.cancel(),m.current=!1;try{let t=await e.fetchResponse("/v1/context/now?format=voice",{method:"GET"});if(!t.ok)throw Error("HTTP ".concat(t.status));let r=await t.json();if(!r||"object"!=typeof r||!("text"in r)||"string"!=typeof r.text||!r.text.trim())throw Error("invalid voice summary");if(n!==u.current)return;let a=new SpeechSynthesisUtterance(r.text);a.lang="ko-KR",a.onend=()=>{n===u.current&&(m.current=!1)},a.onerror=()=>{n===u.current&&(m.current=!1)},m.current=!0,window.speechSynthesis.speak(a),(0,f.cY)("chat.now.speak",{outcome:"spoken"})}catch(e){if(n!==u.current)return;m.current=!1,i("지금 상황을 읽지 못했습니다. 다시 시도해 주세요."),(0,f.cY)("chat.now.speak",{outcome:"error",reason:String(e)})}finally{n===u.current&&(c.current=!1,s(!1))}};return(0,r.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,r.jsxs)("button",{type:"button","data-elanous-action":"chat-now-speak","aria-label":"지금 상황 듣기",title:t?"지금 상황 두 문장 듣기":"이 브라우저는 음성 읽기를 지원하지 않습니다",disabled:!t||l,onClick:()=>void h(),className:"inline-flex min-h-9 items-center gap-1.5 rounded-full border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50",children:[(0,r.jsx)(p.A,{className:"h-4 w-4","aria-hidden":"true"}),(0,r.jsx)("span",{children:"지금 상황 듣기"})]}),o&&(0,r.jsx)("span",{role:"alert",className:"text-xs text-rose-600",children:o})]})}var x=n(12958),b=n(74780);function v(){let{client:e}=(0,d.Q)(),t=(0,a.useMemo)(()=>(0,b.ll)({client:e}),[e]),[n,l]=(0,a.useState)({client:e,items:[],pending:0,expanded:!1}),s=(0,a.useRef)(e);s.current=e;let o=(0,a.useRef)(!1),i=(0,a.useRef)(0),c=n.client===e?n:null,u=(0,a.useCallback)(async()=>{if(!o.current||s.current!==e||"undefined"!=typeof document&&document.hidden)return;let n=++i.current;try{let r=await t.list();if(!o.current||s.current!==e||i.current!==n)return;l(t=>s.current===e&&i.current===n?{client:e,items:r.items,pending:r.items.length,expanded:r.items.length>0&&t.client===e&&t.expanded}:t)}catch(t){if(!o.current||s.current!==e||i.current!==n)return;l(t=>s.current===e&&i.current===n?{client:e,items:[],pending:0,expanded:!1}:t)}},[t,e]);return((0,a.useEffect)(()=>{o.current=!0,l({client:e,items:[],pending:0,expanded:!1}),u();let t=globalThis.setInterval(()=>{u()},3e4),n=()=>{document.hidden||u()};return"undefined"!=typeof document&&document.addEventListener("visibilitychange",n),()=>{o.current=!1,i.current+=1,globalThis.clearInterval(t),"undefined"!=typeof document&&document.removeEventListener("visibilitychange",n)}},[e,u]),(0,a.useEffect)(()=>{var e,t;(0,f.cY)("chat.approvals",{pending:null!=(e=null==c?void 0:c.pending)?e:0,expanded:null!=(t=null==c?void 0:c.expanded)&&t})},[null==c?void 0:c.pending,null==c?void 0:c.expanded]),null==c?void 0:c.pending)?(0,r.jsxs)("div",{className:"shrink-0 border-b border-border bg-background px-3 py-1.5 text-sm",children:[(0,r.jsxs)("button",{type:"button","aria-expanded":c.expanded,"aria-controls":"chat-approvals-panel",onClick:()=>l(t=>t.client===e?{...t,expanded:!t.expanded}:t),className:"rounded-full border border-border bg-muted px-3 py-1 font-medium text-foreground hover:bg-muted/70",children:["승인 대기 ",c.pending]}),c.expanded&&(0,r.jsx)("div",{id:"chat-approvals-panel",className:"mt-2 max-h-[min(50vh,24rem)] overflow-y-auto rounded-lg border border-border p-3",children:(0,r.jsx)(x.a,{client:e,approvals:c.items,onDecided:()=>{u()},onPendingChange:t=>{s.current===e&&l(n=>n.client===e?{...n,pending:t,...0===t?{items:[],expanded:!1}:{}}:n)}})})]}):null}var y=n(33626);function w(){var e;let{client:t}=(0,d.Q)(),[n,l]=(0,a.useState)({client:t,items:[],expanded:!1,decided:{},busy:null}),s=(0,a.useRef)(t);s.current=t;let o=(0,a.useRef)(!1),i=(0,a.useRef)(0),c=(0,a.useRef)(null),u=n.client===t?n:null,m=(0,a.useCallback)(async()=>{if(!o.current||s.current!==t||"undefined"!=typeof document&&document.hidden)return;let e=++i.current;try{let n=await (0,y.q)(t);if(!o.current||s.current!==t||i.current!==e)return;l(e=>e.client===t?{...e,items:[...n,...e.items.filter(t=>e.decided[t.id]&&!n.some(e=>e.id===t.id))],expanded:e.expanded&&(n.length>0||e.items.some(t=>e.decided[t.id]))}:e)}catch(n){if(!o.current||s.current!==t||i.current!==e)return;l(e=>e.client===t?{...e,items:[],expanded:!1}:e)}},[t]);(0,a.useEffect)(()=>{o.current=!0,c.current=null,l({client:t,items:[],expanded:!1,decided:{},busy:null}),m();let e=globalThis.setInterval(()=>{m()},3e4),n=()=>{document.hidden||m()};return"undefined"!=typeof document&&document.addEventListener("visibilitychange",n),()=>{o.current=!1,c.current=null,i.current+=1,globalThis.clearInterval(e),"undefined"!=typeof document&&document.removeEventListener("visibilitychange",n)}},[t,m]);let h=async(e,r)=>{if(!c.current&&!n.busy&&!n.decided[e.id]){c.current=e.id,l(n=>n.client===t?{...n,busy:e.id}:n);try{if(await (0,y.L)(t,e.id,r.id),!o.current||s.current!==t)return;c.current=null,l(n=>n.client===t?{...n,busy:null,decided:{...n.decided,[e.id]:r.label}}:n),await m()}catch(e){o.current&&s.current===t&&(c.current=null,l(e=>e.client===t?{...e,busy:null}:e))}}},p=null!=(e=null==u?void 0:u.items.filter(e=>!u.decided[e.id]).length)?e:0;return u&&(p||u.expanded&&u.items.some(e=>u.decided[e.id]))?(0,r.jsxs)("div",{className:"shrink-0 border-b border-border bg-background px-3 py-1.5 text-sm",children:[(0,r.jsxs)("button",{type:"button","aria-expanded":u.expanded,"aria-controls":"chat-decisions-panel",onClick:()=>l(e=>e.client===t?{...e,expanded:!e.expanded}:e),className:"rounded-full border border-border bg-muted px-3 py-1 font-medium text-foreground hover:bg-muted/70",children:["대표 결정 ",p]}),u.expanded&&(0,r.jsx)("ul",{id:"chat-decisions-panel",className:"mt-2 max-h-[min(50vh,24rem)] space-y-2 overflow-y-auto rounded-lg border border-border p-3",children:u.items.map(e=>(0,r.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[(0,r.jsx)("h3",{className:"font-semibold",children:e.title}),(0,r.jsx)("p",{className:"truncate text-muted-foreground",title:e.situation,children:e.situation}),u.decided[e.id]?(0,r.jsxs)("p",{role:"status",children:["결정함 — ",u.decided[e.id]]}):(0,r.jsx)("div",{className:"mt-2 flex flex-wrap gap-2",children:e.options.map(t=>(0,r.jsxs)("button",{type:"button",disabled:!!u.busy,onClick:()=>{h(e,t)},className:"rounded-md border border-border px-2 py-1 hover:bg-muted disabled:opacity-50",children:[t.label,"option"in e.recommendation&&e.recommendation.option===t.id&&(0,r.jsx)("span",{className:"ml-1 text-primary",children:"추천"})]},t.id))})]},e.id))})]}):null}var j=n(84968),k=n(9851);function N(e){let{queue:t,onRemove:n,onClear:a}=e;return 0===t.length?null:(0,r.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 border-t border-border bg-background px-3 py-2","aria-label":"보낼 차례",children:[t.map((e,t)=>(0,r.jsxs)("span",{className:"inline-flex max-w-full items-center gap-1 rounded-full border border-border bg-muted px-2 py-1 text-xs",children:[(0,r.jsxs)("span",{className:"max-w-[160px] truncate",title:e.text,children:[t+1," \xb7 ",Array.from(e.text).slice(0,20).join("")]}),(0,r.jsx)("button",{type:"button",onClick:()=>n(e.id),"aria-label":"".concat(t+1,"번 지우기"),className:"rounded-full px-1 hover:bg-background",children:"\xd7"})]},e.id)),(0,r.jsx)("button",{type:"button",onClick:a,className:"rounded px-2 py-1 text-xs text-muted-foreground hover:bg-muted",children:"모두 지우기"})]})}function S(e){let t={files:[],tooLarge:0,tooMany:0};for(let n of e)n.file.size>0x1400000?t.tooLarge+=1:t.files.length>=10?t.tooMany+=1:t.files.push(n);return t}function I(e){return!!(e&&Array.from(e.types).includes("Files"))}function C(){return(0,r.jsx)("div",{role:"status","aria-label":"여기에 놓으면 첨부","data-elanous-chat-drop-overlay":"",className:"pointer-events-none absolute inset-0 z-30 flex items-center justify-center bg-background/80 backdrop-blur-sm",children:(0,r.jsxs)("div",{className:"mx-4 rounded-2xl border-2 border-dashed border-primary/60 bg-card/90 px-8 py-6 text-center shadow-lg",children:[(0,r.jsx)("p",{className:"text-lg font-semibold text-foreground",children:"여기에 놓으면 첨부"}),(0,r.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["파일 ",10,"개까지 \xb7 큰 파일은 빠집니다"]})]})})}function A(e,t,n){if("drop"===t||"end"===t||!n)return{visible:!1,depth:0};let r="enter"===t?e.depth+1:Math.max(0,e.depth-1);return{visible:r>0,depth:r}}var E=n(64667),R=n(3155),D=n(25503);class T{list(){return this.client.fetchJson("/v1/projects")}create(e){return this.client.fetchJson("/v1/projects",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:e})})}assign(e,t){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({projectId:t})})}constructor(e){this.client=e}}let q="elanous.chat.projectSelection",L="elanous-chat-pending-projects-changed",U="elanous-chat-projects-changed";function O(){window.dispatchEvent(new Event(U))}let M="elanous.chat.pendingProjects";function F(){try{var e;let t=JSON.parse(null!=(e=localStorage.getItem(M))?e:"{}");if(t&&"object"==typeof t&&!Array.isArray(t))return Object.fromEntries(Object.entries(t).filter(e=>{let[t,n]=e;return t&&"string"==typeof n&&n}))}catch(e){}return{}}function P(e){try{localStorage.setItem(M,JSON.stringify(e))}catch(e){return!1}return window.dispatchEvent(new Event(L)),!0}function Y(e){let{projects:t,selection:n,onChange:l,onCreate:s}=e,[o,i]=(0,a.useState)(!1),[c,d]=(0,a.useState)(""),[u,m]=(0,a.useState)(!1);return(0,r.jsxs)("div",{className:"space-y-2",children:[0===t.length&&!o&&(0,r.jsx)("button",{type:"button",onClick:()=>i(!0),className:"text-sm text-muted-foreground hover:text-foreground",children:"+ 프로젝트 만들기"}),t.length>0&&(0,r.jsxs)("select",{"aria-label":"프로젝트 바꾸기",value:n,onChange:e=>{if("create"===e.target.value)return void i(!0);l(e.target.value)},className:"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm",children:[(0,r.jsx)("option",{value:"all",children:"모든 대화"}),(0,r.jsx)("option",{value:"none",children:"받은 대화(프로젝트 없음)"}),t.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name},e.id)),(0,r.jsx)("option",{value:"create",children:"+ 프로젝트 만들기"})]}),o&&(0,r.jsxs)("form",{onSubmit:e=>{e.preventDefault();let t=c.trim();t&&s(t).then(()=>{i(!1),d(""),m(!1)}).catch(()=>m(!0))},className:"flex gap-2",children:[(0,r.jsx)("input",{"aria-label":"프로젝트 이름",autoFocus:!0,value:c,maxLength:80,onChange:e=>d(e.target.value),className:"min-w-0 flex-1 rounded-lg border border-border bg-background px-2 py-1 text-sm"}),(0,r.jsx)("button",{type:"submit",className:"rounded-lg border border-border px-2 text-sm",children:"만들기"}),u&&(0,r.jsx)("span",{role:"alert",children:"프로젝트를 만들지 못했습니다"})]})]})}function _(e){var t,n;let{compact:l=!1}=e,{client:s,sessionId:o}=(0,d.Q)(),i=(0,D.t)(),[c,u]=(0,a.useState)([]),[m,h]=(0,a.useState)(!0),[p,f]=(0,a.useState)(!1),[g,x]=(0,a.useState)(0),[b,v]=(0,a.useState)(!1),[y,w]=(0,a.useState)(null),[j,k]=(0,a.useState)(!1),[N,S]=(0,a.useState)(!0),[I,C]=(0,a.useState)([]),[A,E]=(0,a.useState)(0),[q,M]=(0,a.useState)(null),Y=(0,a.useRef)(null),_=(0,a.useRef)(null),J=(0,a.useRef)(null),z=(0,a.useRef)(new Set),$=!!(o&&I.includes(o)),Q=(0,a.useRef)(null),G=(0,a.useRef)(o);G.current=o;let[K,B]=(0,a.useState)(""),[H,W]=(0,a.useState)(!1),[Z,V]=(0,a.useState)("");(0,a.useEffect)(()=>{let e=!0,t=0;u([]),f(!1);let n=()=>{let n=++t;h(!0),new T(s).list().then(r=>{let{projects:a}=r;e&&n===t&&(u(null!=a?a:[]),f(!1))}).catch(()=>{e&&n===t&&f(!0)}).finally(()=>{e&&n===t&&h(!1)})};return n(),window.addEventListener(U,n),()=>{e=!1,window.removeEventListener(U,n)}},[s,g]),(0,a.useEffect)(()=>{let e=!0;return(S(!0),M(null),k(!1),Q.current=null,w(null),o)?(s.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(o),"?ifExists=1")).then(t=>{var n,r,a,l;e&&(k(!!t.meta),Q.current=null!=(r=null==(n=t.meta)?void 0:n.projectId)?r:null,z.current.has(o)||w(t.meta?null!=(a=t.meta.projectId)?a:null:null!=(l=F()[o])?l:null),M(o),S(!1))}).catch(()=>{e&&(M(null),B("프로젝트를 확인하지 못했습니다"),S(!1))}),()=>{e=!1}):void S(!1)},[s,o,A]),(0,a.useEffect)(()=>{B(""),W(!1),Y.current=null,J.current=null},[o]),(0,a.useEffect)(()=>{if(!o)return;let e=()=>{let e=F()[o];e&&(J.current=null),z.current.has(o)||(q===o&&j&&e!==Q.current?E(e=>e+1):q===o&&w(null!=e?e:null))};return window.addEventListener(L,e),()=>window.removeEventListener(L,e)},[o,q,j]),(0,a.useEffect)(()=>{o&&q===o&&!j&&!$&&Y.current!==o&&i.some(e=>e.id===o)&&(Y.current=o,M(null),E(e=>e+1))},[o,q,j,$,i]),(0,a.useEffect)(()=>{if(!o||!j||N||$)return;let e=F()[o];!e||z.current.has(o)||_.current===o||J.current==="".concat(o,":").concat(e)||(_.current=o,new T(s).assign(o,e).then(()=>{G.current===o&&(Q.current=e);let t=F();t[o]===e&&(delete t[o],P(t),G.current!==o||z.current.has(o)||w(e)),(0,R.hG)(s).forceRefresh()}).catch(()=>{J.current="".concat(o,":").concat(e);let t=F();t[o]===e&&(delete t[o],P(t)),G.current===o&&(w(Q.current),B("프로젝트를 바꾸지 못했습니다"))}).finally(()=>{_.current=null}))},[s,o,j,N,$,A]);let X=async function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!o||q!==o||N||p&&!t||z.current.has(o)||_.current===o)return!1;z.current.add(o),C(e=>[...e,o]),B("");try{if(j){await new T(s).assign(o,e),G.current===o&&(Q.current=e),(0,R.hG)(s).forceRefresh();let t=F();t[o]&&(delete t[o],P(t))}else{let t=F();if(e?t[o]=e:delete t[o],!P(t))throw Error("pending project storage unavailable")}return G.current===o&&w(e),!0}catch(e){return G.current===o&&B("프로젝트를 바꾸지 못했습니다"),!1}finally{z.current.delete(o),C(e=>e.filter(e=>e!==o))}},ee=y?null!=(n=null==(t=c.find(e=>e.id===y))?void 0:t.name)?n:"알 수 없는 프로젝트":"프로젝트 없음";return(0,r.jsxs)("div",{className:l?"relative flex min-w-0 items-center gap-1.5 text-xs":"flex min-w-0 items-center gap-1.5 text-xs",children:[(0,r.jsx)("label",{htmlFor:"chat-current-project",className:l?"sr-only":"shrink-0 text-muted-foreground",children:"프로젝트"}),(0,r.jsxs)("select",{id:"chat-current-project","aria-label":"현재 대화 프로젝트",title:o&&q===o&&!N?"현재 프로젝트: ".concat(ee):"프로젝트 확인 중…",value:o&&q===o&&!N?null!=y?y:"":"loading",disabled:!o||q!==o||N||m||$||_.current===o||p,onChange:e=>{if("create"===e.target.value){m||p||W(!0);return}X(e.target.value||null)},className:"".concat(l?"w-20 max-w-[24vw]":"max-w-36"," min-w-0 truncate rounded-md border border-border bg-background px-2 py-1 text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring"),children:[(!o||q!==o||N)&&(0,r.jsx)("option",{value:"loading",children:"프로젝트 확인 중…"}),(0,r.jsx)("option",{value:"",children:"프로젝트 없음"}),y&&!c.some(e=>e.id===y)&&(0,r.jsx)("option",{value:y,children:"알 수 없는 프로젝트"}),c.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name},e.id)),l&&(0,r.jsx)("option",{value:"create",children:"+ 프로젝트 만들기"})]}),!l&&(0,r.jsx)("button",{type:"button","aria-label":"프로젝트 만들기",title:"프로젝트 만들기",disabled:!o||q!==o||N||m||$||p,onClick:()=>W(e=>!e),className:"shrink-0 rounded px-1 hover:bg-muted",children:"+"}),H&&(0,r.jsxs)("form",{onSubmit:e=>{e.preventDefault();let t=Z.trim();!t||!o||q!==o||N||m||p||$||b||(v(!0),B(""),new T(s).create(t).then(async e=>{let{project:t}=e;u(e=>[...e,t]);let n=await X(t.id,!0);O(),n&&(W(!1),V(""))}).catch(()=>B("프로젝트를 만들지 못했습니다")).finally(()=>v(!1)))},className:l?"absolute right-0 top-full z-50 mt-1 flex items-center gap-1 rounded-lg border border-border bg-popover p-2 shadow-lg":"flex min-w-0 items-center gap-1",children:[(0,r.jsx)("input",{"aria-label":"새 프로젝트 이름",autoFocus:!0,maxLength:80,value:Z,onChange:e=>V(e.target.value),className:"w-24 rounded border border-border bg-background px-1 py-1"}),(0,r.jsx)("button",{type:"submit",disabled:$||b||!o||q!==o||m||p,className:"rounded border border-border px-1",children:"만들기"})]}),(o&&q!==o&&!N||p)&&(0,r.jsx)("button",{type:"button","aria-label":"프로젝트 다시 확인",onClick:()=>{B(""),E(e=>e+1),p&&x(e=>e+1)},className:"rounded border border-border px-1",children:"다시 시도"}),(K||p)&&(0,r.jsx)("span",{role:"alert",className:"text-destructive",children:K||"프로젝트 목록을 불러오지 못했습니다"})]})}var J=n(44373),z=n(8114);function $(e){let{segmentKey:t,value:n,glyph:a}=e,l=function(e){var t;let n=/(\d{1,3})\s*%/.exec(e);if(!n)return null;let r=Number.parseInt(null!=(t=n[1])?t:"",10);return Number.isFinite(r)?Math.max(0,Math.min(100,r)):null}(n);if(null===l)return(0,r.jsxs)("span",{"data-elanous-hud-key":t,"data-elanous-hud-gauge":"false",className:"inline-flex items-center gap-1 font-mono text-[11px] text-muted-foreground",children:[a?(0,r.jsx)("span",{"aria-hidden":"true",children:a}):null,(0,r.jsx)("span",{children:n})]});let{bar:s,text:o}=l>=80?{bar:"bg-pink-400",text:"text-pink-300"}:l>=60?{bar:"bg-amber-400",text:"text-amber-300"}:{bar:"bg-emerald-500",text:"text-emerald-300"};return(0,r.jsxs)("span",{"data-elanous-hud-key":t,"data-elanous-hud-gauge":"true","data-elanous-hud-percent":String(l),className:"inline-flex items-center gap-1.5 font-mono text-[11px]",children:[a?(0,r.jsx)("span",{"aria-hidden":"true",className:"text-muted-foreground",children:a}):null,(0,r.jsx)("span",{role:"progressbar","aria-valuenow":l,"aria-valuemin":0,"aria-valuemax":100,"aria-label":"".concat(t," ").concat(l,"%"),className:"relative h-2 w-20 overflow-hidden rounded bg-muted/30",children:(0,r.jsx)("span",{"aria-hidden":"true",style:{width:"".concat(l,"%")},className:(0,J.cn)("block h-full",s)})}),(0,r.jsx)("span",{className:(0,J.cn)("tabular-nums",o),children:n})]})}let Q=new Set(["variant","workspace","model","token-gauge","ctx","agent-activity","agents"]),G=new Set(["token-gauge","ctx"]),K={normal:"text-foreground",warn:"text-amber-300",danger:"text-pink-300",success:"text-emerald-300",info:"text-sky-300",muted:"text-muted-foreground"};function B(e){var t,n;let{segment:a}=e;if(G.has(a.key))return(0,r.jsx)($,{segmentKey:a.key,value:a.value,...void 0!==a.glyph?{glyph:a.glyph}:{}});let l=a.tone?K[a.tone]:K.normal;return(0,r.jsxs)("span",{"data-elanous-hud-key":a.key,"data-elanous-hud-tone":null!=(t=a.tone)?t:"normal","data-elanous-hud-priority":String(null!=(n=a.priority)?n:50),className:(0,J.cn)("inline-flex items-center gap-1 font-mono text-[11px]",l),children:[a.glyph?(0,r.jsx)("span",{"aria-hidden":"true",children:a.glyph}):null,(0,r.jsx)("span",{children:a.value})]})}function H(e){let{segments:t,row:n,className:a}=e;return 0===t.length?null:(0,r.jsx)("div",{"data-elanous-hud-row":n,className:(0,J.cn)("flex flex-wrap items-center gap-x-3 gap-y-1",a),children:t.map((e,t)=>(0,r.jsxs)("span",{className:"flex items-center gap-x-3",children:[t>0?(0,r.jsx)("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"\xb7"}):null,(0,r.jsx)(B,{segment:e})]},e.key))})}function W(e){let{segments:t}=e;if(0===t.length)return null;let{top:n,bottom:a}=function(e){let t=[],n=[];for(let r of e)Q.has(r.key)?t.push(r):n.push(r);return{top:t,bottom:n}}(t);return(0,r.jsxs)("div",{"data-elanous-hud":"strip",role:"status","aria-label":"HUD status",className:"flex flex-col gap-0.5 border-b border-border/40 bg-muted/10 px-3 py-1.5",children:[(0,r.jsx)(H,{segments:n,row:"top"}),(0,r.jsx)(H,{segments:a,row:"bottom",className:"hidden sm:flex"})]})}let Z=[];function V(){return Z}function X(){let e=(0,a.useSyncExternalStore)(z.er,z.Wl,V);return(0,r.jsx)(W,{segments:e})}function ee(e,t){if("string"!=typeof e)return t;let n=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-](\d{2}):(\d{2}))$/.exec(e);if(!n)return t;let[,r,a,l,s,o,i,c,d]=n,u=Number(r),m=Number(a),h=Number(l),p=[31,u%4==0&&(u%100!=0||u%400==0)?29:28,31,30,31,30,31,31,30,31,30,31][m-1];if(h<1||void 0===p||h>p||Number(s)>23||Number(o)>59||Number(i)>59||void 0!==c&&(Number(c)>23||Number(d)>59))return t;let f=Date.parse(e);return Number.isFinite(f)?f:t}var et=n(5997),en=n(65194),er=n(67903),ea=n(36898),el=n(56360),es=n(76573),eo=n(75342),ei=n(14222);let ec={idle:"음성 대기",connecting:"데몬 연결 중…",listening:"듣는 중",processing:"생각 중…",speaking:"말하는 중",error:"음성 오류"},ed={idle:"마이크를 켜서 대화를 시작하세요.",connecting:"잠시만 기다려주세요.",listening:"문장이 끝나면 자동으로 전송됩니다.",processing:"서버가 응답을 생성하는 중입니다.",speaking:"음성 응답을 재생하는 중입니다.",error:"아래 메시지를 확인하고 다시 시도하세요."},eu={idle:"bg-slate-400",connecting:"bg-amber-500",listening:"bg-emerald-500",processing:"bg-sky-500",speaking:"bg-fuchsia-500",error:"bg-rose-600"};function em(e){let{active:t,phase:n,errorMsg:a,onToggle:l,ttsSupported:i=!1,ttsMuted:c=!1,onTtsToggle:d,onInterrupt:u}=e,m="speaking"===n&&"function"==typeof u;return(0,r.jsxs)("div",{"data-elanous-voice-overlay":!0,"aria-hidden":!t,className:(0,J.cn)("pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300",t?"pointer-events-auto opacity-100":"opacity-0"),children:[(0,r.jsx)("div",{className:"absolute inset-0 bg-background/60 backdrop-blur-md"}),(0,r.jsxs)("div",{className:"relative mx-4 flex w-full max-w-sm flex-col items-center gap-5 rounded-xl border border-border bg-card px-6 py-7 text-center shadow-xl",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-sm",children:[(0,r.jsx)("span",{className:(0,J.cn)("h-2.5 w-2.5 rounded-full",eu[n],("listening"===n||"speaking"===n||"connecting"===n)&&"animate-pulse"),"aria-hidden":!0}),(0,r.jsx)("span",{className:"font-medium tracking-wide",children:ec[n]})]}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:ed[n]}),(0,r.jsx)("button",{type:"button",onClick:m?u:l,"data-elanous-action":m?"voice-overlay-interrupt":"voice-overlay-toggle",className:(0,J.cn)("inline-flex h-16 w-16 items-center justify-center rounded-full text-white transition-colors",m?"bg-amber-500 hover:bg-amber-400 animate-pulse":"connecting"===n||"processing"===n?"bg-sky-500 hover:bg-sky-400":"error"===n?"bg-rose-600 hover:bg-rose-500":"bg-rose-500 hover:bg-rose-400"),"aria-label":m?"끼어들기":"마이크 끄기",children:m?(0,r.jsx)(el.A,{className:"h-7 w-7"}):"connecting"===n||"processing"===n?(0,r.jsx)(es.A,{className:"h-7 w-7 animate-spin"}):"error"===n?(0,r.jsx)(eo.A,{className:"h-7 w-7"}):(0,r.jsx)(s.A,{className:"h-7 w-7"})}),a&&(0,r.jsx)("p",{className:"max-w-xs text-xs text-rose-500",children:a}),(0,r.jsxs)("div",{className:"flex items-center gap-4",children:[i&&d&&(0,r.jsxs)("button",{type:"button",onClick:d,"data-elanous-action":"voice-overlay-tts-toggle",className:"inline-flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground","aria-label":c?"음성 응답 켜기":"음성 응답 끄기","aria-pressed":!c,children:[c?(0,r.jsx)(ei.A,{className:"h-3.5 w-3.5"}):(0,r.jsx)(p.A,{className:"h-3.5 w-3.5"}),(0,r.jsx)("span",{children:c?"음성 응답 OFF":"음성 응답 ON"})]}),(0,r.jsxs)("button",{type:"button",onClick:l,className:"inline-flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground","aria-label":"음성 닫고 텍스트로 돌아가기",children:[(0,r.jsx)(o.A,{className:"h-3.5 w-3.5"}),(0,r.jsx)("span",{children:"음성 끄기"})]})]})]})]})}function eh(e){let{open:t,onClose:n,lines:l}=e,[s,o]=(0,a.useState)(""),i=(0,a.useMemo)(()=>{if(!s.trim())return null;try{return RegExp(s,"i")}catch(e){return null}},[s]),c=(0,a.useMemo)(()=>s.trim().toLowerCase(),[s]),d=(0,a.useMemo)(()=>{let e=l.length>200?l.slice(l.length-200):l;return i?e.filter(e=>i.test(e.category)||i.test(e.event)):c?e.filter(e=>e.category.toLowerCase().includes(c)||e.event.toLowerCase().includes(c)):e},[l,i,c]);return(0,r.jsx)("div",{"data-elanous-debug-tap-drawer":t?"open":"closed",className:(0,J.cn)("fixed bottom-0 left-0 right-0 z-50 transition-transform duration-200 ease-out","pointer-events-none",t?"translate-y-0":"translate-y-full"),role:"region","aria-label":"Debug Tap Drawer","aria-hidden":!t,children:(0,r.jsxs)("div",{className:(0,J.cn)("pointer-events-auto mx-auto flex max-h-[60vh] w-full max-w-[1100px] flex-col","rounded-t-md border border-b-0 border-border bg-card shadow-xl"),children:[(0,r.jsxs)("header",{className:"flex items-center justify-between gap-2 border-b border-border/60 px-3 py-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:"Debug Tap"}),(0,r.jsxs)("span",{className:"text-[10px] text-muted-foreground/70","data-elanous-debug-tap-count":d.length,"data-elanous-debug-tap-total":l.length,children:[d.length,"/",l.length]})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("input",{type:"text",placeholder:"regex filter…",value:s,onChange:e=>o(e.target.value),spellCheck:!1,autoComplete:"off",className:(0,J.cn)("w-40 rounded border border-border bg-background px-2 py-1 text-[11px] font-mono","focus:outline-none focus:ring-1 focus:ring-primary"),"data-elanous-debug-tap-filter":"","aria-label":"Filter debug lines"}),(0,r.jsx)("button",{type:"button",onClick:n,className:"rounded px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground","aria-label":"Close debug drawer","data-elanous-debug-tap-close":"",children:"✕"})]})]}),(0,r.jsx)("ul",{className:"flex-1 overflow-y-auto px-3 py-2 text-[11px] font-mono","data-elanous-debug-tap-list":"",children:0===d.length?(0,r.jsx)("li",{className:"italic text-muted-foreground/60",children:0===l.length?"(no debug lines yet)":"(no matches for filter)"}):d.map((e,t)=>(0,r.jsx)(ep,{line:e},"".concat(e.loggedAt,"-").concat(e.seq,"-").concat(t)))})]})})}function ep(e){let{line:t}=e,n=new Date(t.loggedAt).toISOString().slice(11,23);return(0,r.jsxs)("li",{"data-elanous-debug-tap-line":"","data-elanous-category":t.category,"data-elanous-event":t.event,className:"py-0.5",children:[(0,r.jsxs)("span",{className:"text-muted-foreground/70",children:["[",n,"]"]})," ",(0,r.jsxs)("span",{className:"text-amber-400",children:["[",t.category,"]"]})," ",(0,r.jsx)("span",{className:"text-foreground",children:t.event}),void 0!==t.data&&(0,r.jsxs)("details",{className:"ml-4 text-muted-foreground",children:[(0,r.jsx)("summary",{className:"cursor-pointer select-none text-[10px]",children:"data"}),(0,r.jsx)("pre",{className:"m-0 mt-1 whitespace-pre-wrap break-all text-[10px] text-muted-foreground/80",children:function(e){try{return JSON.stringify(e,null,2)}catch(t){return String(e)}}(t.data)})]})]})}var ef=n(60516),eg=n(56974),ex=n(87969),eb=n(25042),ev=n(9734),ey=n(30158),ew=n(2021);let ej="Other";function ek(e){let{request:t,onSubmit:n,onCancel:a,onChatAboutThis:l}=e;return(0,r.jsx)(eb.lG,{open:null!==t,onOpenChange:e=>{e||a()},children:(0,r.jsx)(eb.Cf,{className:"max-w-2xl",children:t?(0,r.jsx)(eN,{request:t,onSubmit:n,onCancel:a,onChatAboutThis:l}):null})})}function eN(e){let{request:t,onSubmit:n,onCancel:l,onChatAboutThis:s}=e,[o,i]=(0,a.useState)(()=>Object.fromEntries(t.questions.map(e=>[e.id,new Set]))),[c,d]=(0,a.useState)({}),[u,m]=(0,a.useState)({}),h=1===t.questions.length?t.questions[0].header:"Pick options",p=(0,a.useMemo)(()=>{for(let n of t.questions){var e;let t=null!=(e=o[n.id])?e:new Set,r=eC(n,o,u);if(0===t.size&&!r)return!1}return!0},[t.questions,o,u]);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(eb.c7,{children:[(0,r.jsx)(eb.L3,{children:h}),1===t.questions.length?(0,r.jsx)(eb.rr,{children:t.questions[0].question}):(0,r.jsxs)(eb.rr,{children:[t.questions.length," questions"]})]}),(0,r.jsx)(ew.F,{className:"max-h-[60vh] pr-2",children:(0,r.jsx)("div",{className:"flex flex-col gap-6 py-2",children:t.questions.map(e=>{var t;return(0,r.jsx)(eS,{question:e,isSelected:t=>{var n,r,a;return n=e.id,null!=(a=null==(r=o[n])?void 0:r.has(t))&&a},onToggle:t=>{i(n=>{var r;let a={...n},l=new Set(null!=(r=a[e.id])?r:[]);return e.multiSelect?l.has(t)?l.delete(t):l.add(t):(l.clear(),l.add(t),m(t=>({...t,[e.id]:!1}))),a[e.id]=l,a})},otherActive:eC(e,o,u),onToggleOther:()=>{e.multiSelect?m(t=>{var n;return{...t,[e.id]:!(null!=(n=t[e.id])&&n)}}):i(t=>{let n={...t};return n[e.id]=new Set([ej]),n})},otherText:null!=(t=c[e.id])?t:"",onOtherText:t=>d(n=>({...n,[e.id]:t}))},e.id)})})}),(0,r.jsxs)(eb.Es,{className:"flex-wrap gap-2 sm:justify-between",children:[(0,r.jsx)(ev.$,{variant:"ghost",onClick:s,"aria-label":"Chat about this",children:"\uD83D\uDCAC Chat about this"}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(ev.$,{variant:"outline",onClick:l,children:"Cancel"}),(0,r.jsx)(ev.$,{onClick:function(){let e={},r={};for(let n of t.questions){var a,l;let t=Array.from(null!=(a=o[n.id])?a:[]);if(eC(n,o,u)&&!t.includes(ej)&&t.push(ej),0!==t.length&&(n.multiSelect?e[n.id]=t:e[n.id]=t[0],t.includes(ej))){let e=(null!=(l=c[n.id])?l:"").trim();e.length>0&&(r[n.id]=e)}}let s={answers:e};Object.keys(r).length>0&&(s.otherText=r),n(s)},disabled:!p,children:"Submit"})]})]})]})}function eS(e){var t,n;let{question:a}=e;return(0,r.jsxs)("section",{className:"flex flex-col gap-2",children:[""!==e.question.id?(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"rounded-full bg-primary/15 px-2 py-0.5 text-xs font-medium text-primary",children:a.header}),a.multiSelect?(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:"multi-select"}):null]}):null,(0,r.jsxs)("div",{className:"flex flex-col gap-1.5",children:[a.options.map(t=>{var n;return(0,r.jsx)(eI,{multi:null!=(n=a.multiSelect)&&n,option:t,selected:e.isSelected(t.label),onToggle:()=>e.onToggle(t.label)},t.label)}),null==(t=a.includeOther)||t?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(eI,{multi:null!=(n=a.multiSelect)&&n,option:{label:"Other",description:"Type your own response"},selected:e.otherActive,onToggle:e.onToggleOther}),e.otherActive?(0,r.jsx)(ey.p,{value:e.otherText,onChange:t=>e.onOtherText(t.target.value),placeholder:"Type your own response","aria-label":"Other response",className:"ml-8"}):null]}):null]})]})}function eI(e){let{multi:t,option:n,selected:a,onToggle:l}=e;return(0,r.jsxs)("button",{type:"button",role:t?"checkbox":"radio","aria-checked":a,onClick:l,className:"\n flex items-start gap-3 rounded-md border p-3 text-left\n transition-colors\n ".concat(a?"border-primary bg-primary/10":"border-border hover:bg-muted/40","\n "),children:[(0,r.jsx)("span",{className:"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center ".concat(t?"rounded":"rounded-full"," border ").concat(a?"border-primary bg-primary text-primary-foreground":"border-muted-foreground/40"),"aria-hidden":"true",children:a?t?"✓":"●":null}),(0,r.jsxs)("span",{className:"flex flex-col gap-0.5",children:[(0,r.jsx)("span",{className:"font-medium",children:n.label}),(0,r.jsx)("span",{className:"text-sm text-muted-foreground",children:n.description}),n.preview?(0,r.jsx)("span",{className:"mt-1 rounded bg-muted/40 px-2 py-1 text-xs font-mono text-muted-foreground",children:n.preview}):null]})]})}function eC(e,t,n){var r,a,l;return e.multiSelect?null!=(a=n[e.id])&&a:null!=(l=null==(r=t[e.id])?void 0:r.has(ej))&&l}function eA(e){if(void 0===e)return"";if("string"==typeof e)return e;try{var t;return null!=(t=JSON.stringify(e,null,2))?t:""}catch(e){return""}}function eE(e){let{request:t,receivedAt:n,onChoose:l,onCancel:s}=e,[o,i]=(0,a.useState)(()=>Date.now());(0,a.useEffect)(()=>{if(!t)return;i(Date.now());let e=setInterval(()=>i(Date.now()),1e3);return()=>clearInterval(e)},[t]);let c=t?eA(t.toolCall.rawInput):"",d=t?function(e){if(e&&"object"==typeof e&&!Array.isArray(e)){for(let t of["file_path","filePath","path","command","cmd"])if("string"==typeof e[t])return e[t].slice(0,80)}return eA(e).replace(/\s+/g," ").slice(0,80)}(t.toolCall.rawInput):"",u=Math.max(0,Math.ceil((n+6e4-o)/1e3));return(0,r.jsx)(eb.lG,{open:null!==t,onOpenChange:e=>{!e&&t&&s(t)},children:(0,r.jsx)(eb.Cf,{className:"max-w-lg",children:t&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(eb.c7,{children:[(0,r.jsx)(eb.L3,{children:"이 작업을 실행할까요?"}),(0,r.jsxs)(eb.rr,{children:["도구: ",t.toolCall.title]})]}),d&&(0,r.jsx)("p",{className:"truncate font-mono text-sm",title:d,children:d}),c&&(0,r.jsxs)("details",{className:"text-sm",children:[(0,r.jsx)("summary",{className:"cursor-pointer",children:"자세히"}),(0,r.jsx)("pre",{className:"mt-2 max-h-48 overflow-auto whitespace-pre-wrap break-all rounded bg-muted p-2",children:c})]}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground","aria-live":"off",children:["남은 시간: ",u,"초"]}),(0,r.jsxs)(eb.Es,{className:"flex-wrap gap-2",children:[(0,r.jsx)(ev.$,{onClick:()=>l(t,"allow_once"),children:"이번만 허용"}),(0,r.jsx)(ev.$,{variant:"outline",onClick:()=>l(t,"allow_always"),children:"이 도구는 항상 허용"}),(0,r.jsx)(ev.$,{variant:"outline",onClick:()=>l(t,"reject_once"),children:"거절"})]})]})})})}let eR={outcome:{outcome:"cancelled"}},eD=["allow_once","allow_always","reject_once","reject_always"],eT="unverified";var eq=n(60750),eL=n(67327);function eU(e,t){var n;return"error"!==t.kind?null:null!=(n=function(e){if(!e||"object"!=typeof e)return null;let{error:t,message:n,holder:r}=e;return"turn_busy"!==t?null:{message:"string"==typeof n?n:"This session is currently receiving input. Please try again when that turn finishes.",holder:"string"==typeof r&&r.trim()?r:null}}(t.payload))?n:e}var eO=n(61897);function eM(e){return"string"==typeof e.mediaType&&e.mediaType.toLowerCase().startsWith("image/")}async function eF(e,t){let n=e.downloadUrl.startsWith("http")?e.downloadUrl:"".concat(t.baseUrl.replace(/\/$/,"")).concat(e.downloadUrl),r={};t.token&&(r.authorization="Bearer ".concat(t.token));let a=await fetch(n,{headers:r});if(!a.ok)throw Error("fetch attachment ".concat(e.id," failed: ").concat(a.status));return function(e){let t=new Uint8Array(e),n="";for(let e=0;e<t.length;e+=32768)n+=String.fromCharCode(...t.subarray(e,e+32768));return btoa(n)}(await a.arrayBuffer())}async function eP(e,t,n){if(0===t.length)return null;let r=[];for(let a of(e.length>0&&r.push({type:"text",text:e}),t))if(eM(a))try{let e=await eF(a,n);r.push({type:"image",mimeType:a.mediaType,data:e})}catch(t){let e=t instanceof Error?t.message:String(t);r.push({type:"text",text:"[image fetch failed: ".concat(a.filename," — ").concat(e,"]")})}else r.push({type:"resource_link",uri:a.path?"file://".concat(a.path):a.downloadUrl,mimeType:a.mediaType,name:a.filename});return r}let eY="elanous.pwa.pendingCardFollowups";function e_(e,t){try{var n;let r=JSON.parse(null!=(n=e.getItem(eY))?n:"[]");if(!Array.isArray(r))return[];return r.filter(e=>!!e&&"object"==typeof e&&"string"==typeof e.sessionId&&e.sessionId.length>0&&"string"==typeof e.id&&e.id.length>0&&"number"==typeof e.startedAt&&Number.isFinite(e.startedAt)&&e.startedAt<=t&&t-e.startedAt<9e5)}catch(e){return[]}}function eJ(e,t){try{t.length?e.setItem(eY,JSON.stringify(t)):e.removeItem(eY)}catch(e){}}function ez(){try{return window.localStorage}catch(e){return}}async function e$(e,t,n,r){let a=await e.fetchResponse("/v1/card-followup",{...r?{signal:r}:{},method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({attachmentId:t,...void 0===n?{}:{context:n}})});if(!a.ok)throw Error("card followup start failed: ".concat(a.status));let l=await a.json();if("string"!=typeof l.id||!l.id)throw Error("card followup start returned no id");return l.id}async function eQ(e,t){let n,{intervalMs:r=3e3,signal:a,onStatus:l,startedAt:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=void 0===s?6e5:Math.max(0,s+9e5-Date.now()),i=Date.now()+o,c={status:"failed"},d=new AbortController,u=a?AbortSignal.any([a,d.signal]):d.signal,m=!1,h=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new Promise((n,r)=>{let l;if(u.aborted){var s;r(null!=(s=null==a?void 0:a.reason)?s:Error("aborted"));return}let o="undefined"==typeof document?void 0:document,i=()=>{clearTimeout(l),null==o||o.removeEventListener("visibilitychange",c),u.removeEventListener("abort",d)},c=()=>{(null==o?void 0:o.visibilityState)!=="hidden"&&(i(),n())},d=()=>{var e;i(),r(null!=(e=null==a?void 0:a.reason)?e:Error("aborted"))};l=setTimeout(()=>{i(),n()},e),t&&(null==o||o.addEventListener("visibilitychange",c)),u.addEventListener("abort",d,{once:!0})})},p=async()=>{for(;Date.now()<i;){var n,s;if(null==a?void 0:a.aborted)throw null!=(n=a.reason)?n:Error("aborted");if("undefined"!=typeof document&&"hidden"===document.visibilityState){await h(i-Date.now(),!0);continue}let o=await e.fetchResponse("/v1/card-followup/".concat(encodeURIComponent(t)),{signal:u});if(!o.ok)throw Error("card followup poll failed: ".concat(o.status));let d=await o.json();if(null==a?void 0:a.aborted)throw null!=(s=a.reason)?s:Error("aborted");if(m)return c;if(null==l||l(d.status),"done"===d.status||"not-card"===d.status||"failed"===d.status)return d;await h(Math.min(Math.max(0,r),Math.max(0,i-Date.now())))}return null==l||l("failed"),c};try{return await Promise.race([p(),new Promise(e=>{n=setTimeout(()=>{m=!0,d.abort(),null==l||l("failed"),e(c)},o)})])}finally{clearTimeout(n)}}function eG(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{compact:n}=(0,c.K)(),[u,m]=(0,a.useState)(!1),p=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(!u)return;let e=e=>{p.current&&p.current.contains(e.target)||m(!1)},t=e=>{"Escape"===e.key&&m(!1)};return document.addEventListener("pointerdown",e),document.addEventListener("keydown",t),()=>{document.removeEventListener("pointerdown",e),document.removeEventListener("keydown",t)}},[u]),(0,a.useEffect)(()=>{n||m(!1)},[n]);let{client:x,config:b,sessionId:y,setSessionId:R}=(0,d.Q)(),[D,T]=(0,a.useState)([]),[q,L]=(0,a.useState)(),[U,O]=(0,a.useState)(!1),[M,F]=(0,a.useState)([]),P=(0,a.useRef)([]),Y=(0,a.useRef)(y),$=(0,a.useRef)(y),Q=(0,a.useRef)(null),G=(0,a.useRef)(0),K=(0,a.useRef)(0),B=(0,a.useRef)(!1),[H,W]=(0,a.useState)(null),Z=Y.current!==y&&Q.current!==y?[]:M;(0,a.useLayoutEffect)(()=>{$.current=y,Y.current!==y&&(Q.current!==y&&(G.current++,P.current=[],F([]),T([]),eu.current&&O(!1)),Y.current=y,Q.current=null)},[y]);let V=e=>{P.current=e,F(e)},[el,es]=(0,a.useState)(null),[eo,ei]=(0,a.useState)(null),[ec,ed]=(0,a.useState)([]),eu=(0,a.useRef)(null),ep=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{var e;ep.current!==$.current&&(null==(e=eu.current)||e.abort())},[y]),(0,a.useEffect)(()=>()=>{var e;null==(e=eu.current)||e.abort()},[]);let[eb,ev]=(0,a.useState)({visible:!1,depth:0});(0,a.useEffect)(()=>{let e=()=>ev(e=>A(e,"end",!1));return window.addEventListener("dragend",e),()=>window.removeEventListener("dragend",e)},[]);let ey=(0,a.useRef)(!1),ew=(0,a.useRef)(null),ej=(0,a.useRef)(null),[eN,eS]=(0,a.useState)(null),eI=(0,a.useMemo)(()=>{try{let e=new URLSearchParams(window.location.search);return"on"===e.get("debug-tap")}catch(e){return!1}},[]),[eC,eA]=(0,a.useState)(eI),eF=(0,a.useMemo)(()=>{let e=[];for(let t of D)if(Array.isArray(t.blocks)){for(let n of t.blocks)if("debug_session"===n.kind)for(let t of n.lines)e.push({seq:t.seq,category:t.category,event:t.event,...void 0!==t.data?{data:t.data}:{},loggedAt:t.loggedAt})}return e},[D]),eY=(0,a.useRef)(async()=>{}),eG=(0,a.useRef)(!1);eG.current=U;let eK=(0,a.useRef)(async()=>{}),eB=x.voiceWsUrl(),eH=(0,a.useCallback)(e=>{let t=e.trim();if(t){if(eG.current)return void(0,f.cY)("chat.voice.skip-pending",{len:t.length});(0,f.cY)("chat.voice.auto-send",{len:t.length}),eY.current(t)}},[]),eW=(0,eg.sS)({wsUrl:eB,...b.token?{token:b.token}:{},onTranscript:eH}),eZ=!!b.baseUrl;eK.current=()=>eW.toggle();let[eV,eX]=(0,a.useState)(!1),e0=(0,ex.$)({enabled:eW.active&&!eV,language:"ko-KR"}),e1=(0,a.useCallback)(()=>{null==eo||eo.abort(),(0,f.cY)("webterm.chat.stop",{had:!!eo})},[eo]);(0,a.useEffect)(()=>{if(!eo)return;let e=e=>{var t;if("Escape"!==e.key)return;let n=e.target,r=null==n||null==(t=n.tagName)?void 0:t.toLowerCase();"input"===r||"textarea"===r||null!=n&&n.isContentEditable||(e.preventDefault(),e1())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[eo,e1]),(0,a.useEffect)(()=>{let e=e=>{"m"===e.key.toLowerCase()&&e.shiftKey&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),(0,f.cY)("chat.voice.shortcut.toggle"),eK.current())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]);let e2=(0,a.useCallback)(e=>{ed(t=>[...t,...e]),(0,f.cY)("webterm.chat.attach.queue",{added:e.length,filenames:e.map(e=>e.filename)})},[]),e3=async e=>{let{files:t,tooLarge:n,tooMany:r}=e;if(n&&eL.oR.error("".concat(n," files exceed the 20 MB attachment limit")),r&&eL.oR.error("".concat(r," files exceed the 10-file attachment limit")),0===t.length)return;if(!b.baseUrl)return void eL.oR.error("Daemon URL 미설정 — Settings 에서 입력");let a=await (0,eO.K)(t,{baseUrl:b.baseUrl,...b.token?{token:b.token}:{}}),l=a.filter(e=>e.ok).map(e=>e.meta),s=a.filter(e=>!e.ok);l.length&&(e2(l),eL.oR.success(1===l.length?"\uD83D\uDCCE ".concat(l[0].filename):"\uD83D\uDCCE ".concat(l.length," files attached"))),s.length&&eL.oR.error(1===s.length?"업로드 실패: ".concat(s[0].reason.slice(0,80)):"".concat(s.length," 파일 업로드 실패"))};(0,a.useEffect)(()=>{try{let e=window.sessionStorage.getItem("elanous.pwa.shareAttachments");if(!e)return;window.sessionStorage.removeItem("elanous.pwa.shareAttachments");let t=JSON.parse(e);if(!Array.isArray(t)||0===t.length)return;ed(e=>[...e,...t]);let n=1===t.length?"1 file shared from another app":"".concat(t.length," files shared from another app");eL.oR.success(n),(0,f.cY)("pwa.chat.share-attachments.consume",{count:t.length})}catch(e){(0,f.cY)("pwa.chat.share-attachments.parse-failed",{reason:e instanceof Error?e.message:String(e)})}},[]),(0,a.useEffect)(()=>{if(!y)return;let e=!0;return(async()=>{try{let t=await x.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(y),"?ifExists=1"));if(!e||!(null==t?void 0:t.messages)||0===t.messages.length)return;T(e=>e.some(e=>!e.id.startsWith("m-card-resume-"))?e:[...function(e,t){let n,r,a=[],l=[];for(let o of e){var s;if("tool"===o.role){for(let e of(0===l.length&&(r=o.ts),function(e,t){let n,r=function(e,t){var n,r;let a,l=String(null!=(n=e.toolName)?n:"");try{a=JSON.parse(String(null!=(r=e.toolResult)?r:""))}catch(e){a=void 0}let s=a&&"object"==typeof a&&!Array.isArray(a)?a:void 0,o=null==s?void 0:s._meta,i=o&&"object"==typeof o&&!Array.isArray(o)?o.ui:void 0,c=i&&"object"==typeof i&&!Array.isArray(i)?i.resourceUri:void 0,d=null==s?void 0:s["ui/resourceUri"],u="string"==typeof c?c:"string"==typeof d?d:void 0;return void 0!==u&&""!==u.trim()?{kind:"mcp_app",toolId:t,toolName:l,screenUrl:u,...void 0!==a?{toolResult:a}:{}}:{kind:"tool_use",id:t,name:l,status:"done",...void 0!==s&&void 0!==e.toolArgs?{args:{raw:String(e.toolArgs)}}:{}}}(e,t);try{var a;n=JSON.parse(String(null!=(a=e.toolResult)?a:""))}catch(e){n=void 0}let l=(0,z.uS)(n).map(e=>({kind:"image",...e})),s=[];return(0,z.ki)(s,null!=n?n:e.toolResult),[...l,r,...s]}(o,"restore-tool-".concat(l.length,"-").concat(a.length))))"image"===e.kind&&l.some(t=>"image"===t.kind&&t.src===e.src)||l.push(e);continue}if("user"!==o.role&&"assistant"!==o.role)continue;let e=String(null!=(s=o.content)?s:""),i=String(null!=e?e:"").split("\n").filter(e=>!/^\[tool_(use|result)\]$/.test(e.trim())).join("\n"),c="assistant"===o.role?"assistant":"user";if(""===i.trim()){l.length>0&&"assistant"===c&&(a.push({id:"restore-".concat(a.length),role:c,text:"",blocks:l,timestamp:ee(r,t+a.length)}),l=[],r=void 0);continue}let d=i!==e,u=void 0!==n&&n.role===c&&n.text===i&&(d||n.wasStripped)&&0===l.length;if(n={role:c,text:i,wasStripped:d},u)continue;let m=l.length>0&&"assistant"===c?[...l,{kind:"text",text:i}]:void 0,h=ee(void 0!==m?r:o.ts,t+a.length);void 0!==m&&(l=[],r=void 0),a.push({id:"restore-".concat(a.length),role:c,text:i,...void 0!==m?{blocks:m}:{},timestamp:h})}return l.length>0&&a.push({id:"restore-".concat(a.length),role:"assistant",text:"",blocks:l,timestamp:ee(r,t+a.length)}),a}(t.messages,Date.now()),...e])}catch(e){}})(),()=>{e=!1}},[y,x]);let e5=(0,a.useCallback)(e=>{ed(t=>t.filter(t=>t.id!==e))},[]),e4={client:x,sessionId:y,provider:b.provider,setSessionId:R,daemon:{baseUrl:b.baseUrl,...b.token?{token:b.token}:{}},messages:D},e6=e=>{T(t=>[...t,e])},e8=async(e,t,n,r,a)=>{var l;let s=await eQ(x,e,{signal:r.signal,...void 0===a?{}:{startedAt:a},onStatus:e=>(0,f.cY)("pwa.chat.card-followup",{phase:"poll",status:e})});if(r.signal.aborted||$.current!==t)return"terminal";let o=ez();return(o&&function(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Date.now();eJ(e,e_(e,r).filter(e=>e.sessionId!==t||e.id!==n))}(o,t,e),"not-card"===s.status)?(T(e=>e.filter(e=>e.id!==n)),(0,f.cY)("pwa.chat.card-followup",{phase:"fallback",status:s.status}),"not-card"):("done"===s.status&&(null==(l=s.replies)?void 0:l.length)===3&&s.replies.every(e=>"string"==typeof e)?(T(e=>[...e.filter(e=>e.id!==n),...s.replies.map((e,t)=>({id:"".concat(n,"-").concat(t),role:"assistant",text:e,timestamp:Date.now(),meta:{provider:b.provider}}))]),(0,f.cY)("pwa.chat.card-followup",{phase:"complete",status:"done"})):(T(e=>e.map(e=>e.id===n?{...e,text:"명함 정리에 실패했습니다 — 다시 보내 주세요"}:e)),(0,f.cY)("pwa.chat.card-followup",{phase:"complete",status:"failed"})),"terminal")};(0,a.useEffect)(()=>{if(!y)return;let e=ez();if(!e)return;let t=(function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now(),r=e_(e,n);return eJ(e,r),r.filter(e=>e.sessionId===t)})(e,y).map(e=>{let{id:t,startedAt:n}=e,r=new AbortController,a="m-card-resume-".concat(t);return T(e=>e.some(e=>e.id===a)?e:[...e,{id:a,role:"assistant",text:"명함 읽는 중… 조사 중…",timestamp:n,meta:{provider:b.provider}}]),e8(t,y,a,r,n).catch(()=>{r.signal.aborted||$.current!==y||T(e=>e.map(e=>e.id===a?{...e,text:"명함 정리에 실패했습니다 — 다시 보내 주세요"}:e))}),r});return()=>{t.forEach(e=>e.abort())}},[x,y]);let e7=async function(e){let n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];es(e=>eU(e,{kind:"turn-begin"})),(0,f.cY)("webterm.chat.input",{len:e.length,attachCount:ec.length});let r=n?[]:ec;n||ed([]);let a=n?{ok:!1}:function(e,t){if(1!==t.length||!t[0]||!eM(t[0])||!t[0].id)return{ok:!1};let n=e.trim();if(!n)return{ok:!0,attachmentId:t[0].id};let r=n.replace(/메일\s*초안/g,"메일초안").split(/[\s,]+/).filter(Boolean);return!r.length||r.some(e=>!/^(?:명함|전략|메일초안|crm)$/i.test(e))?{ok:!1}:{ok:!0,attachmentId:t[0].id,context:n}}(e,r),l=!1;if(a.ok){let n=$.current;if(!n){var s;Q.current=n=(0,et.f6)(),$.current=n,null==(s=t.onSessionAdopt)||s.call(t,n),R(n)}let o=new AbortController;eu.current=o,ep.current=n,l=!0,e.length>0&&e6((0,z.tw)(e)),e6((0,z.$Q)("\uD83D\uDCCE attached: ".concat(r.map(e=>e.filename).join(", "))));let i="m-card-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6));e6({id:i,role:"assistant",text:"명함 읽는 중… 조사 중…",timestamp:Date.now(),meta:{provider:b.provider}}),O(!0),(0,f.cY)("pwa.chat.card-followup",{phase:"start",status:"judging"});try{let e=await e$(x,a.attachmentId,a.context,o.signal);if(o.signal.aborted||$.current!==n)return;let t=ez(),r=Date.now();t&&function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now(),r=e_(e,n).filter(e=>e.sessionId!==t.sessionId||e.id!==t.id);if(!t.sessionId||!t.id||!Number.isFinite(t.startedAt)||t.startedAt>n||n-t.startedAt>=9e5)return eJ(e,r);eJ(e,[...r,t])}(t,{sessionId:n,id:e,startedAt:r});let l=await e8(e,n,i,o,r);if("terminal"===l||o.signal.aborted||$.current!==n)return}catch(e){if(o.signal.aborted||$.current!==n)return;T(e=>e.map(e=>e.id===i?{...e,text:"명함 정리에 실패했습니다 — 다시 보내 주세요"}:e)),(0,f.cY)("pwa.chat.card-followup",{phase:"complete",status:"failed"});return}finally{eu.current===o&&(eu.current=null),o.signal.aborted||$.current!==n||(O(!1),es(e=>eU(e,{kind:"turn-end"})))}}let o=r.filter(eM),i=r.filter(e=>!eM(e)),c=function(e){if(!e)return!0;let t=e.toLowerCase();return!!("auto"===t||t.startsWith("anthropic")||"anthropic"===t||t.startsWith("codex")||"openai-codex"===t||t.startsWith("openai")||"openai"===t||t.startsWith("gemini")||"gemini"===t||t.startsWith("grok")||"grok"===t||t.startsWith("local"))}(b.provider),d=o.length>0&&c;o.length>0&&!c&&eL.oR.warning("이 모델은 이미지 입력을 지원하지 않습니다 — ".concat(o.length,"개 이미지가 무시됩니다. (vision 모델로 전환 후 재첨부)"));let u=i.map(e=>e.path?"[attached] ".concat(e.path):"").filter(e=>e.length>0),m=u.length>0?"".concat(u.join("\n"),"\n\n").concat(e).trimEnd():e,h=null;if(d&&b.baseUrl)try{h=await eP(m,o,{baseUrl:b.baseUrl,token:b.token})}catch(t){let e=t instanceof Error?t.message:String(t);(0,f.cY)("webterm.chat.attach.contentblock.error",{msg:e}),eL.oR.error("이미지 첨부 변환 실패 — 텍스트만 전송: ".concat(e)),h=null}!l&&(e.length>0&&e6((0,z.tw)(e)),r.length>0&&e6((0,z.$Q)("\uD83D\uDCCE attached: ".concat(r.map(e=>e.filename).join(", ")))));let p=e?await (0,z.yN)(e,e4):null;if(p){if("__CLEAR__"===p.text)T([]);else{let e=(0,z.$Q)(p.text);p.harnessAsk&&(e.blocks=[{kind:"harness_ask",acceptanceId:p.harnessAsk.acceptanceId}]),e6(e)}p.newSessionId&&(G.current++,V([]),Y.current=p.newSessionId,$.current=p.newSessionId,R(p.newSessionId));return}if(!b.baseUrl)return void e6((0,z.$Q)("error: daemon baseUrl not configured. Visit /settings."));O(!0),ey.current=!0;let g="m-stream-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6));e6({id:g,role:"assistant",text:"",timestamp:Date.now(),meta:{provider:b.provider}});let v=new AbortController;ei(v);let w=0,j=ej.current,k=!!(j&&y&&b.baseUrl),N=null;(0,f.cY)("webterm.chat.runturn.path",{useAcpPath:k,hasAcp:!!j,hasSession:!!y});let S=e=>{T(t=>t.map(t=>t.id===g?{...t,text:e}:t)),e.length>w&&(e0.pushText(e.slice(w)),w=e.length)},I=e=>{T(t=>t.map(t=>t.id===g?{...t,blocks:e}:t))};try{k&&(N=x.connectAcp({sessionId:y}));let{message:e,newSessionId:t}=k?await (0,z.py)(N,m,{...e4,sessionId:await N.ready||y},{signal:v.signal,...h?{userContent:h}:{},onPartial:S,onPartialBlocks:I}):await (0,z.HD)(m,e4,{signal:v.signal,...h?{userContent:h}:{},...eC?{debugTap:!0}:{},onPartial:S,onPartialBlocks:I,onError:e=>es(t=>eU(t,{kind:"error",payload:e}))});es(e=>eU(e,{kind:"turn-end"})),T(t=>t.map(t=>t.id===g?e:t)),t&&t!==y&&$.current===y&&(Q.current=t,$.current=t,R(t)),e0.flush()}catch(n){let e=v.signal.aborted,t=n instanceof Error?n.message:String(n);e0.cancel(),e?(T(e=>e.map(e=>e.id===g?{...e,meta:{...e.meta,stopReason:"aborted"}}:e)),(0,f.cY)("webterm.chat.runturn.stream.abort",{reason:t})):(T(e=>e.filter(e=>e.id!==g)),e6((0,z.$Q)("error: ".concat(t))),eL.oR.error("chat failed: ".concat(t)),(0,f.cY)("webterm.chat.runturn.error",{reason:t,useAcpPath:k}))}finally{null==N||N.close(),O(!1),ei(null),ey.current=!1}},e9=async function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(B.current||!t&&P.current.length>0){var n,r;if(!t&&(ec.length>0||/^[\s]*[:/]/.test(e))){eL.oR.info("답이 끝난 뒤 보내 주세요"),L(t=>{var n;return{text:e,id:(null!=(n=null==t?void 0:t.id)?n:0)+1}});return}let a=(n=P.current,(r={id:++K.current,text:e}).text.trim()?n.length>=5?{queue:[...n],error:"줄이 찼습니다"}:{queue:[...n,{...r,text:r.text.trim()}]}:{queue:[...n]});a.error?(eL.oR.info(a.error),L(t=>{var n;return{text:e,id:(null!=(n=null==t?void 0:t.id)?n:0)+1}})):V(a.queue);return}B.current=!0;let a=G.current,l=$.current;try{await e7(e,t)}finally{B.current=!1,a!==G.current&&(0,f.cY)("webterm.chat.queue.session-changed",{turnSessionId:l,currentSessionId:$.current}),W({generation:G.current,sessionId:$.current})}};(0,a.useEffect)(()=>{var e;if(B.current||0===P.current.length||!H||H.generation!==G.current||H.sessionId!==y)return;let{entry:t,queue:n}={entry:(e=P.current)[0],queue:e.slice(1)};t&&(V(n),eY.current(t.text,!0))},[H]),eY.current=e9,(0,a.useEffect)(()=>{es(e=>eU(e,{kind:"session-change"}))},[y]),(0,a.useEffect)(()=>{if(!y||!b.baseUrl)return;let e=(0,z.lY)(x,y,{isLocalTurnInFlight:()=>ey.current,provider:b.provider,onPlaceholder:e=>{let{sessionId:t}=e;es(e=>eU(e,{kind:"turn-begin"}));let n="m-obs-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6)),r={id:n,role:"assistant",text:"",timestamp:Date.now(),meta:{provider:b.provider}};return(0,f.cY)("webterm.chat.observer.placeholder",{id:n,turnSessionId:t}),T(e=>[...e,r]),ew.current=n,n},onPartialBlocks:(e,t)=>{T(n=>n.map(n=>n.id===e?{...n,blocks:t}:n))},onFinalize:(e,t)=>{es(e=>eU(e,{kind:"turn-end"})),T(n=>n.map(n=>n.id===e?t:n)),ew.current===e&&(ew.current=null)},onError:(e,t)=>{es(e=>eU(e,{kind:"error",payload:t})),(0,f.cY)("webterm.chat.observer.error",{placeholderId:e,error:t.error}),T(n=>n.map(n=>n.id===e?{...n,meta:{...n.meta,stopReason:t.error}}:n)),ew.current===e&&(ew.current=null)}});return()=>{e()}},[x,y,b.baseUrl,b.provider]),(0,a.useEffect)(()=>{if(!y||!b.baseUrl)return;let e=x.subscribeChatFeedbackEvents(y,{agentStatus:{onFeedback:e=>{T(t=>{if(0===t.length)return t;for(let n=t.length-1;n>=0;n--){if("assistant"!==t[n].role)continue;let r=t[n],a=Array.isArray(r.blocks)?[...r.blocks]:[];if("applied"!==(0,ef.K4)(a,e))break;let l={...r,blocks:a};return[...t.slice(0,n),l,...t.slice(n+1)]}return t})},onError:e=>{(0,f.cY)("webterm.agent-status.error",e)}},hudSegment:{onFeedback:e=>(0,z.Ju)(e),onError:e=>{(0,f.cY)("webterm.hud-segment.error",e)}}});return()=>{e()}},[x,y,b.baseUrl]),(0,a.useEffect)(()=>{if(!y||!b.baseUrl)return;let e=null;try{e=x.connectAcp({sessionId:y,onSession:e=>{if(e&&e!==y){var n;(0,f.cY)("webterm.chat.acp.session-adopt",{previous:y,issued:e}),$.current===y&&(Q.current=e,$.current=e,null==(n=t.onSessionAdopt)||n.call(t,e),R(e))}}})}catch(e){(0,f.cY)("webterm.chat.acp.connect-failed",{reason:String(e)});return}ej.current=e,eS(e);let n=e;(0,f.x8)(async e=>{let t=JSON.parse(e);return await n.send("elanous/debug-logs/ingest",{records:t.records}),!0});let r=(0,z.ZH)(e,y,{isLocalTurnInFlight:()=>ey.current,isRemoteSseTurnInFlight:()=>null!==ew.current,onPlaceholder:e=>{let{sessionId:t}=e;es(e=>eU(e,{kind:"turn-begin"}));let n="m-acp-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6)),r={id:n,role:"assistant",text:"",timestamp:Date.now(),meta:{provider:b.provider}};return(0,f.cY)("webterm.chat.acp.foreign-placeholder",{id:n,turnSessionId:t}),T(e=>[...e,r]),n},onPartialBlocks:(e,t)=>{let n=t.find(e=>"text"===e.kind),r=t.some(e=>"image"===e.kind||"tool_use"===e.kind);T(a=>a.map(a=>a.id===e?{...a,...n?{text:n.text}:{},...r?{blocks:t}:{}}:a))},onFinalize:e=>{(0,f.cY)("webterm.chat.acp.foreign-finalize",{placeholderId:e})}});return()=>{r(),(0,f.x8)(null);try{null==e||e.close()}catch(e){}ej.current===e&&(ej.current=null),eS(null)}},[x,y,b.baseUrl,b.provider]);let te=function(e){var t;let{acp:n,onComposerPrefill:r}=e,[l,s]=(0,a.useState)(null),o=(0,a.useRef)(null),i=(0,a.useCallback)(e=>{o.current=e,s(e)},[]),c=(0,a.useCallback)(e=>{let t=o.current;t&&(t.resolve(e),i(null))},[i]);(0,a.useEffect)(()=>{if(!n)return;let e=n.onRequest("elanous/ask/request",async e=>{let t=function(e){if(!e||"object"!=typeof e||"string"!=typeof e.id||!e.id||!e.request||"object"!=typeof e.request)return null;let t=e.request;return Array.isArray(t.questions)&&0!==t.questions.length?{id:e.id,request:e.request}:null}(e);if(!t)return{answers:{},cancelled:!0};let n=o.current;return n&&n.resolve({answers:{},cancelled:!0}),await new Promise(e=>{i({request:t.request,resolve:e,askId:t.id})})}),t=n.on("sessionUpdate",()=>{}),r=n.onAny(e=>{var t;if("elanous/ask/cancel"!==e.method||void 0!==e.id)return;let n=(t=e.params)&&"object"==typeof t&&"string"==typeof t.id&&t.id?{id:t.id,..."string"==typeof t.reason?{reason:t.reason}:{}}:null;if(!n)return;let r=o.current;r&&r.askId===n.id&&c({answers:{},cancelled:!0})});return()=>{e(),t(),r();let n=o.current;n&&(n.resolve({answers:{},cancelled:!0}),o.current=null)}},[n,i,c]);let d=(0,a.useCallback)(e=>{c(e)},[c]),u=(0,a.useCallback)(()=>{c({answers:{},cancelled:!0})},[c]),m=(0,a.useCallback)(()=>{let e=o.current;e&&r&&r(e.request),c({answers:{},cancelled:!0})},[c,r]);return{pendingRequest:null!=(t=null==l?void 0:l.request)?t:null,submit:d,cancel:u,chatAboutThis:m}}({acp:eN,onComposerPrefill:e=>{let t=e.questions[0];if(!t)return;let n="[ Q: ".concat(t.question.trim()," ]\n\n");(0,en.vn)(n),L(e=>{var t;return{text:n,id:(null!=(t=null==e?void 0:e.id)?t:0)+1}}),eL.oR.info("\uD83D\uDCAC 입력 영역에 질문 prefill 됨 (Chat about this)")}}),tt=function(e){var t,n;let{acp:r,sessionId:l}=e,[s,o]=(0,a.useState)(null),i=(0,a.useRef)(null),c=(0,a.useRef)(l);c.current=l;let d=(0,a.useCallback)((e,t,n)=>{let r=i.current;r&&(!n||r.request===n)&&(i.current=null,clearTimeout(r.timer),o(null),(0,f.cY)("pwa.tool-approval.".concat("cancelled"===t?"cancelled":"decided"),{tool:eT,choice:t}),r.resolve(e))},[]);(0,a.useEffect)(()=>{if(!r)return;let e=r.onRequest("session/request_permission",e=>{let t=function(e){try{if(!e||"object"!=typeof e)return null;let t=e.toolCall;if(!t||"object"!=typeof t||"string"!=typeof e.sessionId||!e.sessionId||"string"!=typeof t.toolCallId||!t.toolCallId||"string"!=typeof t.title||!t.title||!Array.isArray(e.options))return null;let n=e.options.map(e=>{if(!e||"object"!=typeof e||"string"!=typeof e.optionId||!e.optionId||"string"!=typeof e.kind||!eD.includes(e.kind))throw Error("invalid option");return{optionId:e.optionId,kind:e.kind}});if(new Set(n.map(e=>e.optionId)).size!==n.length||new Set(n.map(e=>e.kind)).size!==n.length||["allow_once","allow_always","reject_once"].some(e=>!n.some(t=>t.kind===e)))return null;return{sessionId:e.sessionId,toolCall:{toolCallId:t.toolCallId,title:t.title,...void 0!==t.rawInput?{rawInput:t.rawInput}:{}},options:n}}catch(e){return null}}(e);return t&&t.sessionId===c.current?((0,f.cY)("pwa.tool-approval.requested",{tool:eT,choice:null}),d(eR,"cancelled"),new Promise(e=>{let n={request:t,receivedAt:Date.now(),resolve:e,timer:setTimeout(()=>{i.current===n&&d(eR,"cancelled")},6e4)};i.current=n,o(n)})):((0,f.cY)("pwa.tool-approval.cancelled",{tool:eT,choice:"cancelled"}),eR)}),t="function"==typeof r.onState?r.onState(e=>{("CLOSED"===e||"FAILED"===e)&&d(eR,"cancelled")}):()=>{};return()=>{e(),t(),d(eR,"cancelled")}},[r,d]),(0,a.useEffect)(()=>{i.current&&i.current.request.sessionId!==l&&d(eR,"cancelled")},[l,d]);let u=(0,a.useCallback)((e,t)=>{var n;if((null==(n=i.current)?void 0:n.request)!==e)return;let r=e.options.find(e=>e.kind===t);r&&d({outcome:{outcome:"selected",optionId:r.optionId}},t,e)},[d]),m=(0,a.useCallback)(e=>d(eR,"cancelled",e),[d]);return{pendingRequest:null!=(t=null==s?void 0:s.request)?t:null,receivedAt:null!=(n=null==s?void 0:s.receivedAt)?n:0,choose:u,cancel:m}}({acp:eN,sessionId:y}),tn=(0,r.jsxs)("button",{type:"button",onClick:()=>void eW.toggle(),disabled:!eZ,title:eZ?null!=(e=eW.errorMsg)?e:eq.g[eW.phase]:"daemon URL 미설정 — Settings 에서 Base URL 입력","data-elanous-action":"chat-voice-toggle",className:(0,J.cn)("inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors",eW.active?"border-rose-500/40 bg-rose-500/10 text-rose-600 hover:bg-rose-500/20":"border-border bg-background text-foreground hover:bg-muted",!eZ&&"cursor-not-allowed opacity-50"),children:[(0,r.jsx)("span",{className:(0,J.cn)("h-2 w-2 rounded-full",eq.x[eW.phase],("listening"===eW.phase||"speaking"===eW.phase)&&"animate-pulse"),"aria-hidden":!0}),eW.active?(0,r.jsx)(s.A,{className:"h-3.5 w-3.5"}):(0,r.jsx)(o.A,{className:"h-3.5 w-3.5"}),(0,r.jsx)("span",{className:"hidden sm:inline",children:eq.g[eW.phase]})]});return(0,r.jsxs)("div",{className:"relative flex h-full flex-col",onPaste:e=>{let t=function(e,t){if(!e)return S([]);let n=[];if(e.items.length>0)for(let t of Array.from(e.items)){if("file"!==t.kind)continue;let e=t.getAsFile();e&&n.push(e)}else n.push(...Array.from(e.files));return S(n.map(e=>({file:e,filename:e.name||"paste-".concat(t,".png")})))}(e.clipboardData,Date.now());(0!==t.files.length||0!==t.tooLarge||0!==t.tooMany)&&(e.preventDefault(),e3(t))},onDragEnter:e=>{ev(t=>A(t,"enter",I(e.dataTransfer)))},onDragLeave:e=>{ev(t=>A(t,"leave",I(e.dataTransfer)))},onDragOver:e=>{I(e.dataTransfer)&&e.preventDefault()},onDrop:e=>{var t;ev(t=>A(t,"drop",I(e.dataTransfer)));let n=S((t=e.dataTransfer)?Array.from(t.files,e=>({file:e,filename:e.name})):[]);(0!==n.files.length||0!==n.tooLarge||0!==n.tooMany)&&(e.preventDefault(),e3(n))},children:[eb.visible&&(0,r.jsx)(C,{}),n?(0,r.jsxs)("div",{"data-elanous-chat-compact-header":"",className:"flex h-11 max-h-11 min-w-0 shrink-0 items-center gap-2 border-b border-border bg-background px-3 whitespace-nowrap",children:[t.leading&&(0,r.jsx)("div",{className:"shrink-0",children:t.leading}),(0,r.jsx)("div",{className:"min-w-0 flex-1 [&>div]:min-w-0 [&>div]:max-w-full [&>div>div:first-child]:min-w-0 [&>div>div:first-child]:max-w-full [&>div>div:first-child]:overflow-hidden [&>div>div:first-child>span:last-child]:shrink-0 [&>div>div:first-child_span]:min-w-0 [&>div>div:first-child_span]:truncate [&>div>div[role=menu]]:max-w-[calc(100vw-4rem)]",children:(0,r.jsx)(E.Qh,{sessionId:y,...t.onAttachRequest?{onAttachRequest:t.onAttachRequest}:{},...t.onForgetRequest?{onForgetRequest:t.onForgetRequest}:{}})}),(0,r.jsx)("div",{className:"min-w-0 shrink-0",children:(0,r.jsx)(_,{compact:!0})}),(0,r.jsx)(g,{}),(0,r.jsxs)("div",{ref:p,className:"relative shrink-0",children:[(0,r.jsx)("button",{type:"button","aria-label":"채팅 더보기","aria-expanded":u,"aria-controls":"chat-header-more",onClick:()=>m(e=>!e),className:"inline-flex h-8 w-8 items-center justify-center rounded-lg hover:bg-muted",children:(0,r.jsx)(i.A,{className:"h-5 w-5","aria-hidden":"true"})}),u&&(0,r.jsxs)("div",{id:"chat-header-more",className:"absolute right-0 top-full z-50 mt-1 flex max-w-[calc(100vw-1.5rem)] flex-col gap-2 rounded-lg border border-border bg-popover p-3 shadow-lg",children:[(0,r.jsx)(l.vG,{children:(0,r.jsx)(er.rm,{})}),(0,r.jsx)(l.vG,{children:(0,r.jsx)(ea.D,{})}),tn]})]})]}):(0,r.jsxs)("div",{className:"flex shrink-0 items-center justify-between gap-3 border-b border-border bg-background px-4 py-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(E.Qh,{sessionId:y,...t.onAttachRequest?{onAttachRequest:t.onAttachRequest}:{},...t.onForgetRequest?{onForgetRequest:t.onForgetRequest}:{}}),(0,r.jsx)(l.vG,{children:(0,r.jsx)(er.rm,{})}),(0,r.jsx)(l.vG,{children:(0,r.jsx)(ea.D,{})})]}),(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,r.jsx)(_,{}),(0,r.jsx)(g,{}),tn]})]}),(0,r.jsx)(h,{}),(0,r.jsx)(v,{}),(0,r.jsx)(w,{}),(0,r.jsx)(X,{}),(0,r.jsxs)("div",{className:"relative flex flex-1 min-h-0 flex-col",children:[(0,r.jsx)(j.D,{messages:D,pending:U,...t.tabId?{tabId:t.tabId}:{}}),el&&(0,r.jsxs)("div",{role:"alert",className:"mx-4 mb-3 flex shrink-0 items-start justify-between gap-3 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-sm text-foreground","data-elanous-turn-busy-banner":"",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"font-medium",children:"이 대화는 지금 응답 중입니다"}),(0,r.jsx)("p",{className:"text-muted-foreground",children:el.message}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:el.holder?"Current input holder: ".concat(el.holder):"The current input holder is not available."})]}),(0,r.jsx)("button",{type:"button",onClick:()=>es(null),className:"rounded px-2 py-1 text-xs text-muted-foreground hover:bg-amber-500/10 hover:text-foreground","aria-label":"응답 중 알림 닫기",children:"Dismiss"})]}),(0,r.jsx)(em,{active:eW.active,phase:eW.phase,errorMsg:eW.errorMsg,onToggle:()=>void eW.toggle(),ttsSupported:e0.supported,ttsMuted:eV,onTtsToggle:()=>eX(e=>!e),onInterrupt:()=>{try{e0.cancel()}catch(e){}eW.interrupt()}})]}),U&&eo&&(0,r.jsxs)("div",{className:"flex shrink-0 items-center justify-end gap-2 border-t border-border bg-muted/30 px-4 py-1.5 text-xs",children:[(0,r.jsx)("span",{className:"text-muted-foreground",children:"streaming…"}),(0,r.jsx)("button",{type:"button",onClick:e1,className:"rounded border border-border bg-background px-2 py-0.5 font-mono hover:bg-muted","data-elanous-action":"chat-stop",title:"Stop the running turn (Esc)",children:"Stop ⎋"})]}),(0,r.jsx)(N,{queue:Z,onRemove:e=>{var t;return V((t=P.current,t.filter(t=>t.id!==e)))},onClear:()=>V([])}),(0,r.jsx)(k.V,{onSubmit:e9,prefill:q,attachments:ec,onAttached:e2,onRemoveAttachment:e5,voice:{active:eW.active,phase:eW.phase,dotColor:eq.x[eW.phase],phaseLabel:eq.g[eW.phase],disabled:!eZ,onToggle:()=>void eW.toggle()},...t.tabId?{tabId:t.tabId}:{},onListFiles:eN&&y?async e=>{var t,n;let r=await eN.send("elanous/fs/list",{sessionId:y,query:e,limit:50}),a=(null!=(t=r.entries)?t:[]).filter(e=>"string"==typeof(null==e?void 0:e.name)&&"boolean"==typeof(null==e?void 0:e.isDir)&&"string"==typeof(null==e?void 0:e.relPath)).map(e=>({name:e.name,isDir:e.isDir,relPath:e.relPath}));return{cwd:null!=(n=r.cwd)?n:"",entries:a}}:void 0,onListSkills:eN&&y?async e=>{var t;return{entries:(null!=(t=(await eN.send("elanous/skills/list",{sessionId:y,query:e})).entries)?t:[]).filter(e=>"string"==typeof(null==e?void 0:e.name)&&"string"==typeof(null==e?void 0:e.description)).map(e=>({name:e.name,description:e.description}))}}:void 0}),eI&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(eh,{open:eC,onClose:()=>eA(!1),lines:eF}),!eC&&(0,r.jsxs)("button",{type:"button",onClick:()=>eA(!0),"data-elanous-debug-tap-reopen":"",className:(0,J.cn)("fixed bottom-3 right-3 z-40 rounded-full border border-border bg-card px-3 py-1.5","text-[11px] font-mono text-muted-foreground shadow hover:bg-muted hover:text-foreground"),"aria-label":"Reopen debug drawer",title:"Reopen Debug Tap drawer",children:["⌁ debug (",eF.length,")"]})]}),(0,r.jsx)(ek,{request:te.pendingRequest,onSubmit:te.submit,onCancel:te.cancel,onChatAboutThis:te.chatAboutThis}),(0,r.jsx)(eE,{request:tt.pendingRequest,receivedAt:tt.receivedAt,onChoose:tt.choose,onCancel:tt.cancel})]})}var eK=n(8819),eB=n(21383);function eH(e,t){var n,r;return(null==t?void 0:t.trim())||(null==(r=e.lastMsgPreview)||null==(n=r.trim().split(/\r?\n/)[0])?void 0:n.trim())||"대화"}function eW(e,t){try{"undefined"!=typeof localStorage&&localStorage.setItem(e,t)}catch(e){}}function eZ(e){let{onSelect:t}=e,n=(0,d.Q)(),l=(0,D.t)({activePoll:!0}),[s,o]=(0,a.useState)({}),[i,c]=(0,a.useState)(""),[u,m]=(0,a.useState)([]),[h,p]=(0,a.useState)("all"),[f,g]=(0,a.useState)([]),[x,b]=(0,a.useState)(F);(0,a.useEffect)(()=>{let e=()=>{b(F()),j({})};return window.addEventListener(L,e),()=>window.removeEventListener(L,e)},[]);let[v,y]=(0,a.useState)({}),[w,j]=(0,a.useState)({}),k=(0,a.useRef)(new Set),N=e=>{let t=e(F());P(t),b(t)};(0,a.useEffect)(()=>{var e;p(null!=(e=function(e){try{return"undefined"==typeof localStorage?null:localStorage.getItem(e)}catch(e){return null}}(q))?e:"all");let t=!0,r=0,a=()=>{let e=++r;new T(n.client).list().then(n=>{var a;t&&e===r&&m(null!=(a=n.projects)?a:[])}).catch(()=>{})};return a(),window.addEventListener(U,a),()=>{t=!1,window.removeEventListener(U,a)}},[n.client]),(0,a.useEffect)(()=>{let e=!0,t=u.length>0&&"all"!==h&&"none"!==h?"?projectId=".concat(encodeURIComponent(h)):"";return n.client.fetchJson("/v1/sessions/store".concat(t)).then(t=>{var n;if(!e)return;let r=null!=(n=t.sessions)?n:[];g(r),o(Object.fromEntries(r.map(e=>[e.id,e.title])))}).catch(()=>{}),()=>{e=!1}},[n.client,l,u,h]),(0,a.useEffect)(()=>{let e=Object.keys(x).filter(e=>l.some(t=>t.id===e)&&!f.some(t=>t.id===e));if(0===e.length)return;let t=!0;for(let r of e)n.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(r),"?ifExists=1")).then(e=>{t&&e.meta&&g(t=>t.some(e=>e.id===r)?t:[...t,e.meta])}).catch(()=>{});return()=>{t=!1}},[f,n.client,x,l]),(0,a.useEffect)(()=>{for(let[e,t]of Object.entries(x)){if(e===n.sessionId||w[e]===t||!l.some(t=>t.id===e)||k.current.has(e))continue;let r=f.find(t=>t.id===e);if(r&&F()[e]===t){if(r.projectId===t||v[e]===t){N(t=>{let n={...t};return delete n[e],n});continue}k.current.add(e),new T(n.client).assign(e,t).then(()=>{y(n=>({...n,[e]:t})),g(n=>n.map(n=>n.id===e?{...n,projectId:t}:n)),F()[e]===t&&N(t=>{let n={...t};return delete n[e],n})}).catch(()=>{j(n=>({...n,[e]:t})),F()[e]===t&&N(t=>{let n={...t};return delete n[e],n})}).finally(()=>{k.current.delete(e)})}}},[v,w,f,n.client,n.sessionId,x,l]);let S=u.some(e=>e.id===h)||"none"===h?h:"all",I=0===u.length||"all"===S?l:l.filter(e=>x[e.id]?x[e.id]===S:"none"===S?!f.some(t=>t.id===e.id&&t.projectId)&&!v[e.id]:v[e.id]===S||f.some(t=>t.id===e.id&&t.projectId===S)),C=[...I].filter(e=>{var t;return"".concat(eH(e,s[e.id])," ").concat(null!=(t=e.lastMsgPreview)?t:"").toLocaleLowerCase().includes(i.trim().toLocaleLowerCase())}).sort((e,t)=>Date.parse(t.lastTurnAt)-Date.parse(e.lastTurnAt)),A=()=>{let e=(0,et.Zr)();u.length>0&&"all"!==S&&"none"!==S&&N(t=>({...t,[e]:S})),n.setSessionId(e),null==t||t()};return(0,r.jsxs)("nav",{"aria-label":"대화 목록",className:"flex h-full min-h-0 flex-col bg-background",children:[(0,r.jsxs)("div",{className:"shrink-0 space-y-3 border-b border-border p-3",children:[(0,r.jsx)(Y,{projects:u,selection:S,onChange:e=>{p(e),eW(q,e)},onCreate:async e=>{let{project:t}=await new T(n.client).create(e);m(e=>[...e,t]),p(t.id),eW(q,t.id),O()}}),(0,r.jsxs)("button",{type:"button",onClick:A,className:"flex w-full items-center gap-2 rounded-lg bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",children:[(0,r.jsx)(eK.A,{className:"h-4 w-4","aria-hidden":"true"})," 새 대화"]}),(0,r.jsxs)("label",{className:"flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-2.5 py-2 focus-within:ring-2 focus-within:ring-ring",children:[(0,r.jsx)(eB.A,{className:"h-4 w-4 shrink-0 text-muted-foreground","aria-hidden":"true"}),(0,r.jsx)("input",{"aria-label":"대화 검색",type:"search",value:i,onChange:e=>c(e.target.value),placeholder:"대화 검색",className:"min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"})]})]}),(0,r.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto p-2",children:0===I.length?(0,r.jsxs)("div",{className:"space-y-3 px-2 py-8 text-center text-sm text-muted-foreground",children:[(0,r.jsx)("p",{children:"아직 대화가 없습니다"}),(0,r.jsx)("button",{type:"button",onClick:A,className:"rounded-lg border border-border px-3 py-2 text-foreground hover:bg-muted",children:"+ 새 대화"})]}):0===C.length?(0,r.jsx)("p",{className:"px-2 py-8 text-center text-sm text-muted-foreground",children:"검색 결과가 없습니다"}):(0,r.jsx)("ul",{className:"space-y-1",children:C.map(e=>(0,r.jsx)("li",{children:(0,r.jsxs)("button",{type:"button","aria-current":n.sessionId===e.id?"page":void 0,onClick:()=>{O(),n.setSessionId(e.id),null==t||t()},className:"w-full rounded-lg px-3 py-2.5 text-left transition-colors ".concat(n.sessionId===e.id?"bg-primary/10 text-primary ring-1 ring-inset ring-primary/25":"text-foreground hover:bg-muted"),children:[(0,r.jsx)("span",{className:"block truncate text-sm font-medium",children:eH(e,s[e.id])}),(0,r.jsxs)("span",{className:"mt-1 block truncate text-xs text-muted-foreground",children:[function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),n=Date.parse(e);if(!Number.isFinite(n))return"";let r=Math.max(0,Math.floor((t-n)/6e4));if(r<1)return"방금 전";if(r<60)return"".concat(r,"분 전");let a=Math.floor(r/60);if(a<24)return"".concat(a,"시간 전");let l=Math.floor(a/24);return l<7?"".concat(l,"일 전"):new Date(n).toLocaleDateString()}(e.lastTurnAt)," \xb7 ",e.msgCount,"개 메시지"]})]})},e.id))})})]})}var eV=n(35622),eX=n(69147),e0=n(44614);function e1(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{compact:n}=(0,c.K)(),l=(0,e0.tg)(),{client:s,sessionId:o,setSessionId:i}=(0,d.Q)(),[u,m]=(0,a.useState)(o||"default"),[h,p]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if(!h)return;let e=e=>{"Escape"===e.key&&p(!1)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[h]);let f=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(f.current===o){f.current=null;return}f.current=null,m(o||"default")},[o]);let g=(0,a.useRef)(t.sessionId),x=(0,a.useRef)(o),b=null!=(e=null==l?void 0:l.state.activeId)?e:null;(0,a.useEffect)(()=>{let e=t.sessionId;if(l&&t.tabId&&e&&o){var n,r;let a=function(e){if(!e.isActive||e.tabSessionId===e.daemonSessionId)return"none";let t=e.prevTabSessionId!==e.tabSessionId,n=e.prevDaemonSessionId!==e.daemonSessionId;return t||!n?"adopt-tab":"record-global"}({isActive:b===t.tabId,tabSessionId:e,daemonSessionId:o,prevTabSessionId:null!=(n=g.current)?n:e,prevDaemonSessionId:null!=(r=x.current)?r:o});"adopt-tab"===a?i(e):"record-global"===a&&l.updateChatTab(t.tabId,{sessionId:o})}g.current=t.sessionId,x.current=o},[l,b,t.tabId,t.sessionId,o,i]);let v=l&&t.tabId?()=>l.openPicker({kind:"attachToTab",tabId:t.tabId}):void 0,y=l&&t.sessionId?async()=>{let e=(0,R.hG)(s);await e.forget(t.sessionId)}:void 0,w=(0,r.jsx)("button",{type:"button",onClick:()=>p(!0),"aria-label":"대화 목록","aria-expanded":h,"aria-controls":"chat-conversation-drawer",className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg hover:bg-muted",children:(0,r.jsx)(eV.A,{className:"h-4 w-4","aria-hidden":"true"})}),j=(0,r.jsx)(eG,{onSessionAdopt:e=>{f.current=e},...t.showConversationList&&n?{leading:w}:{},...v?{onAttachRequest:v}:{},...y?{onForgetRequest:y}:{},...t.tabId?{tabId:t.tabId}:{}},u);return t.showConversationList?(0,r.jsxs)("div",{className:"flex h-full min-h-0 min-w-0",children:[(0,r.jsx)("aside",{className:n?"hidden":"hidden h-full w-[260px] shrink-0 border-r border-border md:block",children:(0,r.jsx)(eZ,{})}),(0,r.jsxs)("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col",children:[!n&&(0,r.jsx)("div",{className:"shrink-0 border-b border-border bg-background px-3 py-2 md:hidden",children:(0,r.jsxs)("button",{type:"button",onClick:()=>p(!0),"aria-label":"대화 목록","aria-expanded":h,"aria-controls":"chat-conversation-drawer",className:"inline-flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm font-medium hover:bg-muted",children:[(0,r.jsx)(eV.A,{className:"h-4 w-4","aria-hidden":"true"})," 대화 목록"]})}),(0,r.jsx)("div",{className:"min-h-0 min-w-0 flex-1",children:j})]}),h&&(0,r.jsxs)("div",{className:n?"fixed inset-0 z-50":"fixed inset-0 z-50 md:hidden",children:[(0,r.jsx)("button",{type:"button","aria-label":"대화 목록 닫기",onClick:()=>p(!1),className:"absolute inset-0 bg-black/50"}),(0,r.jsxs)("aside",{id:"chat-conversation-drawer",role:"dialog","aria-modal":"true","aria-label":"대화 목록",className:"relative h-full w-[min(260px,85vw)] bg-background shadow-xl",children:[(0,r.jsx)("button",{type:"button","aria-label":"대화 목록 닫기",onClick:()=>p(!1),className:"absolute right-2 top-2 z-10 rounded p-1 hover:bg-muted",children:(0,r.jsx)(eX.A,{className:"h-4 w-4"})}),(0,r.jsx)(eZ,{onSelect:()=>p(!1)})]})]})]}):j}},74780:(e,t,n)=>{function r(e){return{slides:e.slides.map(e=>{let{image:t,caption:n,include:r}=e;return{image:t,caption:n,include:r}}),caption:{hook:e.caption.hook,body:e.caption.body},hashtags:[...e.hashtags],cover:{text:e.cover.text,sub:e.cover.sub},location:e.location}}n.d(t,{$Y:()=>s,LP:()=>i,Mz:()=>r,ll:()=>d,rH:()=>o});class a extends Error{constructor(e,t){super(t),this.status=e,this.name="GraphApprovalsApiError"}}let l={list:"목록을 보려면",decide:"승인하려면",save:"초안을 저장하려면"},s="/app/settings/#bearer-token";function o(e){return e instanceof a&&(401===e.status||403===e.status)}function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"decide";return e instanceof a?401===e.status||403===e.status?"".concat(l[t]," 이 기기를 데몬에 연결해야 합니다 — 설정 › 데몬 연결 › 연결 토큰 칸에 토큰을 넣어 주세요."):404===e.status?"이 실행을 찾지 못했습니다. 목록을 다시 확인해 주세요.":409===e.status?"이미 결정된 실행입니다. 목록을 다시 확인해 주세요.":400===e.status?"결정 내용을 확인한 뒤 다시 시도해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요.":e instanceof TypeError?"서버에 연결하지 못했습니다. 연결 상태를 확인해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요."}let c="/v1/graph-approvals";function d(e){var t,n;let r=(null!=(t=e.baseUrl)?t:"").replace(/\/+$/,""),l=null!=(n=e.fetchImpl)?n:fetch;async function s(t,n){let s={...n,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},o=e.client?await e.client.fetchResponse(t,s):await l("".concat(r).concat(t),s),i=await o.json().catch(()=>null);if(!o.ok){let e=i&&"object"==typeof i&&"error"in i&&"string"==typeof i.error?i.error:"request-failed";throw new a(o.status,e)}return i}return{list:()=>s(c),decide:(e,t,n)=>s("".concat(c,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t)),{method:"POST",body:JSON.stringify({decision:n})}),saveFeedDraft:(e,t,n)=>s("".concat(c,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t),"/feed-draft"),{method:"PUT",body:JSON.stringify(n)}),feedMedia:async(t,n,s)=>{let o="".concat(c,"/").concat(encodeURIComponent(t),"/").concat(encodeURIComponent(n),"/media?path=").concat(encodeURIComponent(s)),i={headers:e.authHeader?{authorization:e.authHeader}:{}},d=e.client?await e.client.fetchResponse(o,i):await l("".concat(r).concat(o),i);if(!d.ok)throw new a(d.status,"media-failed");return d.blob()}}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9247],{79247:(e,t,n)=>{n.d(t,{I7:()=>c,Iu:()=>a,xX:()=>i});var o=n(18068),r=n(72215);let s="/v1/task-cards";class a extends Error{constructor(e,t,n){super("nexus ".concat(e," on ").concat(t,": ").concat(function(e){try{return JSON.stringify(e)}catch(t){return String(e)}}(n))),this.status=e,this.path=t,this.body=n,this.name="NexusApiError"}}class c extends a{constructor(e,t){super(400,e,t),this.name="MissingUpstreamError",this.nodes=t.nodes}}class l extends Error{constructor(e,t){super("NEXUS 가 ".concat(t/1e3,"초 안에 답하지 않았습니다 (").concat(e,") — 방금 켰다면 잠시 뒤 다시 시도하세요.")),this.path=e,this.timeoutMs=t,this.name="NexusTimeoutError"}}function i(e){var t,n;let i=e.baseUrl.replace(/\/$/,""),d=null!=(t=e.fetchImpl)?t:fetch,v=null!=(n=e.timeoutMs)?n:8e3,u=e.token;async function p(e,t,n,r){let s="".concat(i).concat(t);for(let i=0;;i++){let p=v>0||(null==r?void 0:r.signal)?new AbortController:null,g=!1,w=null;if(p&&(null==r?void 0:r.signal)){let e=r.signal;if(e.aborted)p.abort();else{let t=()=>p.abort();e.addEventListener("abort",t),w=()=>e.removeEventListener("abort",t)}}let T=p&&v>0?setTimeout(()=>{p.signal.aborted||(g=!0,p.abort())},v):null;try{let r=await d(s,{method:e,...p?{signal:p.signal}:{},...void 0!==n||u?{headers:{...void 0!==n?{"content-type":"application/json"}:{},...u?{authorization:"Bearer ".concat(u)}:{}}}:{},...void 0!==n?{body:JSON.stringify(n)}:{}});401===r.status&&(0,o.Qb)(t);let l=null;try{l=await r.json()}catch(e){if(!(e instanceof SyntaxError))throw e}if(!r.ok){if(400===r.status&&t.startsWith("/v1/workflows/")&&t.endsWith("/run")&&l&&"object"==typeof l&&"error"in l&&"missing-upstream"===l.error&&"nodes"in l&&Array.isArray(l.nodes)&&l.nodes.every(e=>"string"==typeof e))throw new c(t,l);throw new a(r.status,t,l)}return l}catch(n){if(!g||!(n instanceof Error)||"AbortError"!==n.name)throw n;if("GET"!==e||i>0)throw new l(t,v)}finally{null!=T&&clearTimeout(T),null==w||w()}await new Promise((e,t)=>{let n=null==r?void 0:r.signal;if(null==n?void 0:n.aborted)return void t(new DOMException("aborted","AbortError"));let o=()=>{clearTimeout(s),null==n||n.removeEventListener("abort",o),t(new DOMException("aborted","AbortError"))},s=setTimeout(()=>{null==n||n.removeEventListener("abort",o),e()},100);null==n||n.addEventListener("abort",o,{once:!0})})}}async function g(e,t,n){let r="/v1/plugins/install",s=await d("".concat(i).concat(r),{method:"POST",headers:{"content-type":"application/json",...u?{authorization:"Bearer ".concat(u)}:{}},body:JSON.stringify({spec:e,acceptedCapabilities:t})});if(401===s.status&&(0,o.Qb)(r),!s.ok)throw new a(s.status,r,await s.json());if(!s.body)throw Error("설치 진행 정보를 읽을 수 없습니다.");let c=s.body.getReader(),l=new TextDecoder,v="";try{for(;;){let e,{done:t,value:o}=await c.read();if(t)break;for(v+=l.decode(o,{stream:!0});-1!==(e=v.indexOf("\n"));){let t=v.slice(0,e).trim();v=v.slice(e+1),t&&n(t)}}(v+=l.decode()).trim()&&n(v.trim())}finally{c.releaseLock()}}return{baseUrl:i,getHealth:()=>p("GET","/v1/health"),getNexus:()=>p("GET","/v1/nexus"),getTabs:e=>{let t=(null==e?void 0:e.kind)?"?kind=".concat(encodeURIComponent(e.kind)):"";return p("GET","/v1/nexus/tabs".concat(t))},getTab:e=>p("GET","/v1/nexus/tabs/".concat(encodeURIComponent(e))),getTaskCards:()=>p("GET",s),getTaskCard:e=>p("GET","".concat(s,"/").concat(encodeURIComponent(e))),getChatBackendDetection:()=>p("GET","/v1/nexus/chat-backend-detection"),mintConnectToken:()=>p("POST","/v1/nexus/connect-info/mint-token",{}),createTab:e=>p("POST","/v1/nexus/tabs",e),deleteTab:e=>p("DELETE","/v1/nexus/tabs/".concat(encodeURIComponent(e))),patchTab:(e,t)=>p("PATCH","/v1/nexus/tabs/".concat(encodeURIComponent(e)),t),startTab:e=>p("POST","/v1/nexus/tabs/".concat(encodeURIComponent(e),"/start")),stopTab:(e,t)=>{let n=(null==t?void 0:t.graceMs)!==void 0?"?graceMs=".concat(t.graceMs):"";return p("POST","/v1/nexus/tabs/".concat(encodeURIComponent(e),"/stop").concat(n))},restartTab:(e,t)=>{let n=(null==t?void 0:t.graceMs)!==void 0?"?graceMs=".concat(t.graceMs):"";return p("POST","/v1/nexus/tabs/".concat(encodeURIComponent(e),"/restart").concat(n))},getTemplates:()=>p("GET","/v1/nexus/templates"),getTemplate:e=>p("GET","/v1/nexus/templates/".concat(encodeURIComponent(e))),saveTemplate:e=>p("POST","/v1/nexus/templates",e),getPluginsIndex:()=>p("GET","/v1/plugins/index"),getInstalledPlugins:()=>p("GET","/v1/plugins"),refreshPluginMarket:e=>p("POST","/v1/plugins/markets/".concat(encodeURIComponent(e),"/refresh"),{}),installMarketPlugin:g,removeMarketPlugin:e=>p("DELETE","/v1/plugins/".concat(encodeURIComponent(e))),getPluginCredentials:e=>p("GET","/v1/plugins/".concat(encodeURIComponent(e),"/credentials")),putPluginCredentials:(e,t)=>p("PUT","/v1/plugins/".concat(encodeURIComponent(e),"/credentials"),{fields:t}),getRunGraphs:()=>p("GET","/v1/graphs"),getRunGraph:e=>p("GET","/v1/graphs/".concat(encodeURIComponent(e))),getRunGraphYaml:e=>p("GET","/v1/graphs/".concat(encodeURIComponent(e),"/yaml")),putRunGraphYaml:(e,t)=>p("PUT","/v1/graphs/".concat(encodeURIComponent(e),"/yaml"),{yaml:t}),cloneRunGraph:(e,t)=>p("POST","/v1/graphs/".concat(encodeURIComponent(e),"/clone"),{newId:t}),getGraphKinds:e=>p("GET","/v1/graph/kinds?graph=".concat(e)),validateGraph:async(e,t)=>{try{return await p("POST","/v1/graphs/validate",{graph:e,yaml:t})}catch(e){if(e instanceof a&&422===e.status&&e.body&&"object"==typeof e.body&&"ok"in e.body)return e.body;throw e}},getWorkflows:()=>p("GET","/v1/workflows"),getWorkflow:e=>p("GET","/v1/workflows/".concat(encodeURIComponent(e))),getWorkflowHistory:e=>p("GET","/v1/workflows/".concat(encodeURIComponent(e),"/history")),getWorkflowHistoryVersion:(e,t)=>p("GET","/v1/workflows/".concat(encodeURIComponent(e),"/history/").concat(encodeURIComponent(t))),getWorkflowPins:e=>p("GET","/v1/workflows/".concat(encodeURIComponent(e),"/pins")),putWorkflowPin:(e,t,n,o)=>p("PUT","/v1/workflows/".concat(encodeURIComponent(e),"/pins/").concat(encodeURIComponent(t)),{value:n,...void 0!==o?{note:o}:{}}),deleteWorkflowPin:(e,t)=>p("DELETE","/v1/workflows/".concat(encodeURIComponent(e),"/pins/").concat(encodeURIComponent(t))),saveWorkflow:(e,t)=>p("PUT","/v1/workflows/".concat(encodeURIComponent(e)),t),deleteWorkflow:(e,t)=>{let n=(null==t?void 0:t.scope)?"?scope=".concat(encodeURIComponent(t.scope)):"";return p("DELETE","/v1/workflows/".concat(encodeURIComponent(e)).concat(n))},validateWorkflow:(e,t)=>p("POST","/v1/workflows/validate",{yaml:e},t),generateWorkflow:(e,t)=>p("POST","/v1/workflows/generate",e,t),synthesizeWorkflow:(e,t)=>p("POST","/v1/workflows/synth",e,t),getTriggersSnapshot:e=>p("GET","/v1/triggers",void 0,e),getWorkflowTemplates:e=>p("GET","/v1/workflows/templates",void 0,e),runWorkflow:(e,t,n)=>p("POST","/v1/workflows/".concat(encodeURIComponent(e),"/run"),{arguments:t,...(null==n?void 0:n.dryRun)?{dryRun:!0}:{},...(null==n?void 0:n.onlyNode)!==void 0?{onlyNode:n.onlyNode}:{},...(null==n?void 0:n.fromNode)!==void 0?{fromNode:n.fromNode}:{},...(null==n?void 0:n.fromRunId)!==void 0?{fromRunId:n.fromRunId}:{}}),getWorkflowRun:e=>p("GET","/v1/workflows/runs/".concat(encodeURIComponent(e))),getWorkflowRuns:()=>p("GET","/v1/workflows/runs"),workflowsEventsUrl:()=>i?"".concat(i,"/v1/workflows/events"):null,getPendingApprovals:()=>p("GET","/v1/workflows/runs/pending"),approveRun:(e,t)=>p("POST","/v1/workflows/runs/".concat(encodeURIComponent(e),"/approve"),null!=t?t:{}),rejectRun:(e,t)=>p("POST","/v1/workflows/runs/".concat(encodeURIComponent(e),"/reject"),null!=t?t:{}),getConfig:()=>p("GET","/v1/config"),getChatFastPath:()=>p("GET","/v1/config/chat-fast-path"),getSwitches:()=>p("GET","/v1/config/switches"),getSwitch:e=>p("GET","/v1/config/switches/".concat(encodeURIComponent(e))),putSwitch:(e,t)=>p("PUT","/v1/config/switches/".concat(encodeURIComponent(e)),t),postSecret:e=>p("POST","/v1/config/secrets",e),deleteSecret:e=>p("DELETE","/v1/config/secrets/".concat(encodeURIComponent(e))),getSecrets:()=>p("GET","/v1/config/secrets"),getModelTier:()=>p("GET","/v1/config/model-tier"),putModelTier:e=>p("PUT","/v1/config/model-tier",e),getPlatforms:()=>p("GET","/v1/platforms"),getLlmProviders:()=>p("GET","/v1/setup/llm-providers"),setLlmProvider:e=>p("POST","/v1/setup/llm-provider",e),getObsidianSkills:()=>p("GET","/v1/setup/obsidian-skills"),setObsidian:e=>p("POST","/v1/setup/obsidian",e),setSkills:e=>p("POST","/v1/setup/skills",e),getChannelBots:()=>p("GET","/v1/setup/channel-bots"),setChannelBot:e=>p("POST","/v1/setup/channel-bot",e),getChildLlmPreference:()=>p("GET","/v1/setup/child-llm"),setChildLlmPreference:e=>p("POST","/v1/setup/child-llm",e),getAnswerPriority:()=>p("GET","/v1/setup/answer-priority"),setAnswerPriority:e=>p("POST","/v1/setup/answer-priority",{value:e}),getPersonas:()=>p("GET","/v1/personas"),getPersonaPresets:()=>p("GET","/v1/persona-presets"),createPersona:e=>p("POST","/v1/personas",e),patchPersona:(e,t)=>p("PATCH","/v1/personas/".concat(encodeURIComponent(e)),t),patchPersonaDescription:(e,t)=>p("PATCH","/v1/personas/".concat(encodeURIComponent(e)),{description:t}),getRegistryCatalog:()=>p("GET","/v1/registry/catalog"),getWorktrees:()=>p("GET","/v1/worktrees"),getDesignCheck:()=>p("GET","/v1/design-check"),getHarnessRuns:()=>p("GET","/v1/harness/runs"),getLogs:e=>{let t=new URLSearchParams;for(let[n,o]of Object.entries(e))void 0!==o&&""!==o&&t.set(n,String(o));return p("GET","/v1/logs?".concat(t.toString()))},getLogInstances:()=>p("GET","/v1/logs/instances"),getLiveDetail:()=>p("GET","/v1/live/detail"),getTrace:e=>{let t=new URLSearchParams({level:e.level});return e.runId&&t.set("runId",e.runId),e.store&&t.set("store",e.store),e.limit&&t.set("limit",String(e.limit)),e.kind&&t.set("kind",e.kind),e.q&&t.set("q",e.q),e.from&&t.set("from",new Date(e.from).toISOString()),p("GET","/v1/trace?".concat(t))},getTraceEvidence:e=>p("GET","/v1/trace/evidence/".concat(e)),getLiveShipped:e=>p("GET","/v1/live/shipped?since=".concat(encodeURIComponent(e))),getRunScreen:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:60;return p("GET","/v1/harness/run-screen?runId=".concat(encodeURIComponent(e),"&lines=").concat(t))},stopHarness:e=>p("POST","/v1/harness/stop",{spaceId:e}),setLiveDetail:e=>p("POST","/v1/live/detail",e),setDesignDirection:e=>p("POST","/v1/design-direction",{id:e}),createDesignSystem:e=>p("POST","/v1/design-system",e),listDesignPreviews:()=>p("GET","/v1/design-previews"),getDesignPreview:e=>p("GET","/v1/design-previews/".concat(encodeURIComponent(e))),disposeWorktree:e=>p("POST","/v1/worktrees/dispose",e),getLogsTail:(e,t)=>{let n=(null==t?void 0:t.lines)!==void 0?"?lines=".concat(t.lines):"";return p("GET","/v1/nexus/tabs/".concat(encodeURIComponent(e),"/logs").concat(n))},subscribeEvents:e=>{var t,n;let o=null!=(t=e.EventSourceImpl)?t:globalThis.EventSource;if(!o)throw Error("EventSource not available \xb7 pass EventSourceImpl");let s=(null!=(n=e.topics)?n:[]).join(","),a="".concat(i,"/v1/events").concat(s?"?topics=".concat(encodeURIComponent(s)):""),c=new o(a),l=t=>{try{let n=JSON.parse(t.data);e.onEvent(n)}catch(t){var n;null==(n=e.onError)||n.call(e,t)}},d=["nexus.boot","nexus.shutdown","tab.created","tab.up","tab.down","tab.unhealthy","tab.restart","tab.halt","config.changed","workflow.approval.pending","workflow.approval.resolved","workflow.run.started","workflow.run.node-started","workflow.run.node-skipped","workflow.run.node-done","workflow.run.completed","workflow.run.failed","hitl.banner.show","hitl.banner.cancel","intent-prediction.ranking"],v=e.kinds?[...new Set([...d,...e.kinds])]:d;for(let e of(c.addEventListener("message",l),v))c.addEventListener(e,l);return c.addEventListener("error",()=>{var t;try{(0,r.cY)("nexus.sse.error",{url:a,readyState:c.readyState,connectionState:0===c.readyState?"reconnecting":2===c.readyState?"closed":"open"})}catch(e){}null==(t=e.onError)||t.call(e,Error("SSE error"))}),()=>{try{c.close()}catch(e){}}},subscribeLogs:(e,t)=>{var n;let o=null!=(n=t.EventSourceImpl)?n:globalThis.EventSource;if(!o)throw Error("EventSource not available \xb7 pass EventSourceImpl");let s="".concat(i,"/v1/nexus/tabs/").concat(encodeURIComponent(e),"/logs?stream=1"),a=new o(s),c=e=>{try{let n=JSON.parse(e.data);t.onLine(n)}catch(e){var n;null==(n=t.onError)||n.call(t,e)}};return a.addEventListener("message",c),a.addEventListener("log",c),a.addEventListener("error",()=>{var e;try{(0,r.cY)("nexus.sse.error",{url:s,readyState:a.readyState,connectionState:0===a.readyState?"reconnecting":2===a.readyState?"closed":"open"})}catch(e){}null==(e=t.onError)||e.call(t,Error("SSE error"))}),()=>{try{a.close()}catch(e){}}}}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7081],{542:(e,t,n)=>{Promise.resolve().then(n.bind(n,99850))},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}},7456:(e,t,n)=>{"use strict";n.d(t,{Er:()=>a,cj:()=>c,dc:()=>l,yR:()=>i});let r=/^(oauth\.|harness\.decision|llm\.router)/;function a(e){let t=[],n=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var a;let e=null!=(a=t.data)?a:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])n(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)n(null==t?void 0:t.name);continue}if(r.test(t.category))for(let t of(n(e.account),["what","why","reason"])){let r=e[t];if("string"==typeof r)for(let e of r.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))n(e[1])}}return t}function s(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function l(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),n=e.length?RegExp("(^|[^\\w-])(".concat(e.map(s).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,r=new Map;return(e,a)=>{let s=e.replace(/\b[a-z0-9-]+\.tail[0-9a-f]+\.ts\.net\b/gi,"tailnet-host").replace(/\bmsb\d+\b/gi,e=>(e=>{let t=e.toLowerCase();r.has(t)||r.set(t,"remote-".concat(r.size+1));let n=r.get(t);return e===e.toUpperCase()?n.toUpperCase():n})(e)).replace(/\bmbp\b/gi,e=>e===e.toUpperCase()?"LOCAL":"local").replace(/\/Users\/[^/\s"']+/g,"~").replace(/(크레딧|credits?|💳)(\s*[:=]?\s*)[\d][\d,.]*/gi,"$1$2•••").replace(/[\d][\d,.]*(\s*)(크레딧|credits?)/gi,"•••$1$2").replace(/\$\s?[\d][\d,.]*/g,"$•••").replace(/(잔량?|remaining|left)(\s*[:=]?\s*)(?:[A-Za-z0-9][\w.-]*\s+)?\d+(?:\.\d+)?\s?%/gi,"$1$2•••");return a&&n&&(s=s.replace(n,(e,n,r)=>{var a;return"".concat(n).concat(null!=(a=t.get(r))?a:"account")})),s}}function o(e,t){if("string"==typeof e)return t(e);if(Array.isArray(e))return e.map(e=>o(e,t));if(e&&"object"==typeof e){let n={};for(let[r,a]of Object.entries(e))"apiEquivalentUsd"===r||"usd"===r||/credit(s|Balance)?$/i.test(r)||(n[r]=o(a,t));return n}return e}function i(e){let t=l(a(e));return e.map(e=>{let n=r.test(e.category);return{...e,event:t(e.event,!1),data:e.data?o(e.data,e=>t(e,n)):e.data}})}function c(e,t){let n=l(t);return o(e,e=>n(e,!0))}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var r=n(55539),a=n(46124),s=n(8101),l=n(5997),o=n(18060),i=n(72215);let c=(0,a.createContext)(null);function d(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[d,u]=(0,a.useState)(n),[m,p]=(0,a.useState)(""),[f]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.Fp)();u(e),f.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.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)},[f]);let h=e=>{u(t=>{let n={...t,...e};return(0,s.Qc)(e),f.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},g=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},x=(0,a.useMemo)(()=>({config:d,setConfig:h,client:f,sessionId:m,setSessionId:g}),[d,f,m]);return(0,r.jsx)(c.Provider,{value:x,children:t})}function u(){let e=(0,a.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},99850:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>k});var r=n(55539),a=n(7456);function s(e){return e.map(e=>({...(0,a.cj)(e,[]),taskId:e.taskId,...e.wishReply?{wishReply:{surface:e.wishReply.surface,address:null}}:{}}))}var l=n(46124),o=n(15151);function i(e){var t;for(let t of[e.sections.triage,e.sections.intake]){let e=null==t?void 0:t.data.title;if("string"==typeof e&&e.trim())return e.trim()}return(null==(t=e.apiTitle)?void 0:t.trim())||e.taskId}var c=n(79247);let d={green:"순항",yellow:"진행 중",red:"막힘",done:"완료"},u=["intake","triage","gates","relations","memory","workspace","run","landing","release"];function m(e){return null==e?"—":"string"==typeof e?e:JSON.stringify(e)}function p(e){let{entry:t}=e;return(0,r.jsxs)("details",{className:"mt-2 text-xs",children:[(0,r.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"JSON"}),(0,r.jsx)("pre",{className:"mt-2 max-h-64 overflow-auto rounded-lg bg-muted p-2 text-xs whitespace-pre-wrap break-all",children:JSON.stringify(t.data,null,2)})]})}function f(e){let{entry:t}=e,n=new Date(t.ts).toISOString();return(0,r.jsxs)("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[(0,r.jsxs)("span",{children:["Owner: ",t.owner]}),(0,r.jsx)("time",{dateTime:n,children:n})]})}function h(e){var t,n;let{card:a,placements:s}=e,l=null==(t=a.sections.gates)?void 0:t.data;return(0,r.jsxs)("section",{"aria-label":"Task card detail",className:"min-w-0 space-y-4 rounded-2xl border border-border bg-card p-4",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:i(a)}),(0,r.jsx)("p",{className:"break-all text-xs text-muted-foreground",children:a.taskId})]}),void 0!==a.wishReply&&(0,r.jsxs)("section",{"aria-label":"Wish reply destination",className:"rounded-xl border border-border p-3 text-sm",children:[(0,r.jsx)("h3",{className:"mb-1 font-semibold",children:"어디로 회신하나"}),(0,r.jsx)("p",{className:"break-all",children:a.wishReply?"".concat(null!=(n=({telegram:"텔레그램 대화",pwa:"PWA",tui:"TUI",linear:"Linear"})[a.wishReply.surface])?n:a.wishReply.surface).concat(a.wishReply.address?" \xb7 ".concat(a.wishReply.address):""):"회신 주소 없음"})]}),void 0!==a.wishReply&&(0,r.jsxs)("section",{"aria-label":"Wish reply history",className:"rounded-xl border border-border p-3 text-sm",children:[(0,r.jsx)("h3",{className:"mb-1 font-semibold",children:"회신 이력"}),(0,r.jsx)("p",{className:"text-muted-foreground",children:"카드 원장에는 회신 발송 이력이 기록되지 않습니다"})]}),s&&(0,r.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Wish placement and progress",children:["배치 \xb7 ",s.length?s.map(e=>{let{cellId:t,cellTitle:n,version:r,status:a}=e;return"".concat(t," ").concat(n," \xb7 ").concat(r,"판 \xb7 ").concat(d[a])}).join(" / "):"아직 배치되지 않음"]}),l&&(0,r.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Gate decisions",children:["Gate \xb7 budget: ",m(l.budget)," \xb7 location: ",m(l.location)]}),u.map(e=>{let t=a.sections[e];return t?(0,r.jsxs)("section",{"aria-label":"".concat(e," section"),className:"rounded-xl border border-border p-3",children:[(0,r.jsx)("h3",{className:"mb-1 text-sm font-semibold capitalize",children:e}),(0,r.jsx)(f,{entry:t}),(0,r.jsx)(p,{entry:t})]},e):null}),(0,r.jsxs)("section",{"aria-label":"Incidents",className:"space-y-2",children:[(0,r.jsxs)("h3",{className:"text-sm font-semibold",children:["Incidents (",a.incidents.length,")"]}),a.incidents.length?(0,r.jsx)("ol",{className:"space-y-2",children:a.incidents.map(e=>(0,r.jsxs)("li",{className:"rounded-xl border border-border p-3",children:[(0,r.jsx)(f,{entry:e}),(0,r.jsx)(p,{entry:e})]},e.key))}):(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"No incidents."})]})]})}let g=["steward","execution","landing","release","done"],x=new Set(["intake","triage","gates","relations","memory","workspace","run","landing","release","incidents"]);function b(e){let t=[],n=Date.parse(e.createdAt),r=e.sections.find(e=>"intake:reply:0"===e.key),a=null;if(r)try{let e=JSON.parse(r.content);if(e&&"object"==typeof e&&!Array.isArray(e)){let{surface:t,address:n}=e;"string"==typeof t&&("string"==typeof n||null===n)&&(a={surface:t,address:n})}}catch(e){}for(let r of e.sections){let a;if(!x.has(r.key))continue;try{let e=JSON.parse(r.content);a=e&&"object"==typeof e&&!Array.isArray(e)?e:{content:r.content}}catch(e){a={content:r.content}}let s=Date.parse(r.createdAt);t.push({taskId:e.id,section:r.key,key:"".concat(r.key,":").concat(r.createdAt,":").concat(t.length),owner:r.owner,ts:Number.isFinite(s)?s:n,data:a,..."string"==typeof a.runId?{runId:a.runId}:{}})}if(0===t.length&&t.push({taskId:e.id,section:"triage",key:"api:title",owner:"task-card API",ts:n,data:{title:e.title}}),"closed"===e.status){let r=t.filter(e=>"release"===e.section).sort((e,t)=>t.ts-e.ts)[0];t.push({taskId:e.id,section:"release",key:"api:closed",owner:"task-card API",ts:Math.max(n,...t.map(e=>e.ts)),data:{...null==r?void 0:r.data,status:"done"}})}return{...function(e){let t,n=e[0];if(!n)return null;let r={},a=[],s=new Set,l=n.ts,o=-1/0;for(let i of e)if(!(i.taskId!==n.taskId||s.has(i.key)))if(s.add(i.key),l=Math.max(l,i.ts),i.runId&&i.ts>=o&&(t=i.runId,o=i.ts),"incidents"===i.section)a.push(i);else{let e=r[i.section];(!e||i.ts>=e.ts)&&(r[i.section]=i)}return{taskId:n.taskId,sections:r,incidents:a,updatedAt:l,...t?{runId:t}:{}}}(t),apiTitle:e.title,...e.goalId.startsWith("wish:")?{wishReply:a}:{}}}function y(e){let{cards:t,selectedId:n,onSelect:a,selectedCard:s,detailError:l,placements:o}=e,c=(null==s?void 0:s.taskId)===n?s:null;return(0,r.jsxs)("div",{className:"space-y-4 p-4",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold",children:"보드"}),(0,r.jsx)("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-5",children:g.map(e=>(0,r.jsxs)("section",{"aria-label":"".concat(e," column"),className:"min-w-0 space-y-2 rounded-xl border border-border p-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold capitalize",children:e}),t.filter(t=>(function(e){var t;let n=null==(t=e.sections.release)?void 0:t.data;return(null==n?void 0:n.status)==="done"||(null==n?void 0:n.status)==="completed"?"done":n?"release":e.sections.landing?"landing":e.sections.run||e.sections.workspace||e.sections.gates||e.sections.relations||e.sections.memory?"execution":"steward"})(t)===e).map(e=>{var t,s;return(0,r.jsxs)("button",{type:"button",onClick:()=>a(e.taskId),"aria-pressed":n===e.taskId,className:"w-full rounded-lg border border-border bg-card p-3 text-left text-sm hover:bg-accent/40",children:[(0,r.jsx)("span",{className:"block font-medium",children:i(e)}),(0,r.jsx)("span",{className:"block text-xs text-muted-foreground",children:(0,r.jsx)("time",{dateTime:new Date(e.updatedAt).toISOString(),title:new Date(e.updatedAt).toLocaleString(),children:(t=function(e){let t=new Map;for(let r of e.incidents){var n;let e=null!=(n=r.data.incidentId)?n:r.data.id,a="string"==typeof e&&e.trim()?e:r.key,s=t.get(a);(!s||r.ts>=s.ts)&&t.set(a,r)}return Array.from(t.values()).filter(e=>"closed"!==e.data.status&&"resolved"!==e.data.status).length}(e),s=Date.now(),[...t>0?["사고 ".concat(t)]:[],...e.runId?["런 ".concat(e.runId.replace(/^run-/,"").slice(0,8))]:[],function(e,t,n){let r=Math.floor((t-e)/6e4);if(!Number.isFinite(r)||r<1)return"방금";if(r<60)return"".concat(r,"분 전");if(r<1440)return"".concat(Math.floor(r/60),"시간 전");let a=new Intl.DateTimeFormat("ko-KR",{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,...n?{timeZone:n}:{}}).formatToParts(new Date(e)),s=e=>{var t,n;return null!=(n=null==(t=a.find(t=>t.type===e))?void 0:t.value)?n:""};return"".concat(s("month"),"/").concat(s("day")," ").concat(s("hour"),":").concat(s("minute"))}(e.updatedAt,s,void 0)]).join(" \xb7 ")})})]},e.taskId)})]},e))}),n&&(0,r.jsxs)("aside",{className:"max-w-3xl space-y-2","aria-label":"Selected card",children:[(0,r.jsx)("button",{type:"button",onClick:()=>a(null),"aria-label":"Close card detail",className:"text-sm text-muted-foreground",children:"Close"}),c?(0,r.jsx)(h,{card:c,placements:o}):(0,r.jsx)("p",{role:"status",children:null!=l?l:"Loading card detail…"})]})]})}function w(){let{config:e}=(0,o.Q)(),t=(0,l.useMemo)(()=>e.baseUrl?(0,c.xX)({baseUrl:e.baseUrl,...e.token?{token:e.token}:{}}):null,[e.baseUrl,e.token]),[n,i]=(0,l.useState)([]),[d,u]=(0,l.useState)(null),[m,p]=(0,l.useState)(null),[f,h]=(0,l.useState)(void 0),[g,x]=(0,l.useState)(null),[w,k]=(0,l.useState)(null),[v,j]=(0,l.useState)(!1);(0,l.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&j(!0)},[]);let I=(0,l.useMemo)(()=>v?s(n):n,[n,v]),N=v&&m?s([m])[0]:m,S=v&&f?(0,a.cj)(f,[]):f;return(0,l.useEffect)(()=>{let e=!1;if(i([]),u(null),p(null),h(void 0),x(null),!t)return void k("Connect to NEXUS to load task cards.");k(null);let n=()=>t.getTaskCards().then(t=>{let{cards:n}=t;e||(i(n.map(b)),k(null))}).catch(t=>{e||k(t instanceof c.Iu&&404===t.status?"Task cards are not available yet (pre-E1).":t instanceof Error?t.message:String(t))});n();let r=setInterval(()=>{n()},1e4);return()=>{e=!0,clearInterval(r)}},[t]),(0,l.useEffect)(()=>{if(!t||!d)return;let e=!1;return p(null),h(void 0),x(null),t.getTaskCard(d).then(t=>{let{card:n,placements:r}=t;e||(h(r),p(b(n)))}).catch(t=>{e||x(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[t,d]),(0,r.jsxs)(r.Fragment,{children:[w&&(0,r.jsx)("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:w}),(0,r.jsx)(y,{cards:I,selectedId:d,selectedCard:N,detailError:g,placements:S,onSelect:e=>{(null===e||d!==e)&&(p(null),h(void 0),x(null),u(e))}})]})}function k(){return(0,r.jsx)(w,{})}}},e=>{e.O(0,[8060,9247,2463,2196,7358],()=>e(e.s=542)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7955],{57438:(e,t,s)=>{Promise.resolve().then(s.bind(s,66307))},66307:(e,t,s)=>{"use strict";s.d(t,{BotlabPageContent:()=>h});var r,l=s(55539),a=s(46124);let o=(null!=(r=s(11041).env.NEXT_PUBLIC_ELANOUS_BOTLAB_HOST)?r:"").trim(),n="elanous.botlab.wallHost",d=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;function i(e){return e.length>0&&e.length<=253&&d.test(e)}function c(e){var t;let{search:s,remembered:r=null}=e,d=(0,a.useMemo)(()=>(function(e){var t,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=null;try{l=new URLSearchParams(e).get("host")}catch(e){l=null}let a=null!=(t=null==l?void 0:l.trim())?t:"";if(""!==a&&i(a))return{host:a,source:"query",rejected:null};let n=""===a?null:a,d=null!=(s=null==r?void 0:r.trim())?s:"";return""!==d&&i(d)?{host:d,source:"remembered",rejected:n}:""!==o&&i(o)?{host:o,source:"default",rejected:n}:{host:"",source:"unset",rejected:n}})(s,r),[s,r]),c="unset"===d.source?null:(t=d.host,"https://".concat(t).concat("/bot3/bot-wall.html"));return(0,a.useEffect)(()=>{if("query"===d.source)try{window.localStorage.setItem(n,d.host)}catch(e){}},[d.source,d.host]),(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-6xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"botlab-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot screens"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Botlab"}),(0,l.jsxs)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:["Live noVNC screens for the bots, served through Tailscale. One document holds all four sessions, so the VNC password is asked ",(0,l.jsx)("strong",{children:"once"}),", not four times."]}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"View-only by default. This surface cannot send commands or control the bots."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-4","aria-label":"Wall address",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Wall address"}),(0,l.jsx)("p",{className:"mt-1 break-all font-mono text-xs text-muted-foreground","data-testid":"botlab-wall-url",children:null!=c?c:"(no host configured)"}),(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground","data-testid":"botlab-host-source",children:"query"===d.source?"Host came from the ?host= query parameter (remembered on this device).":"remembered"===d.source?"Host is the one remembered on this device; override it with ?host=<tailnet-name>.":"default"===d.source?"Host is the build default (NEXT_PUBLIC_ELANOUS_BOTLAB_HOST); override it with ?host=<tailnet-name>.":"No wall host is configured. Open this page once with ?host=<the VM tailnet name> — it is remembered on this device."}),null!==d.rejected&&(0,l.jsxs)("p",{role:"alert",className:"mt-2 text-xs text-destructive","data-testid":"botlab-host-rejected",children:["Ignored ?host=",d.rejected," — not a valid hostname."]}),null!==c&&(0,l.jsxs)("p",{className:"mt-3 text-xs text-muted-foreground",children:[(0,l.jsx)("a",{className:"underline",href:c,target:"_blank",rel:"noreferrer","data-testid":"botlab-open-tab",children:"Open the wall in a new tab"})," — ","use this if the embedded frame stays blank."]})]}),null!==c&&(0,l.jsx)("section",{"aria-label":"Bot screen wall",children:(0,l.jsx)("iframe",{src:c,title:"Bot screen wall","data-testid":"botlab-wall-frame",className:"h-[70vh] w-full rounded-xl border border-border bg-background"})}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-5","aria-label":"If the wall is blank",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"If the wall stays blank"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"A blank frame is not necessarily a broken bot. There are three separate reasons, with different fixes:"}),(0,l.jsxs)("ol",{className:"mt-3 list-decimal space-y-2 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"This device is outside the tailnet."})," The address simply does not exist here. Join the tailnet, or view the screens from a device that is on it."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Tailscale serve is not published."})," Re-run"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"bash scripts/botlab/deploy-bot-wall.sh"}),", which re-publishes the paths and then verifies each one returns 200."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"The wall loaded but did not connect."})," That is a VNC-level failure, not a page failure — the wall itself reports connected/failed counts once you enter the password."]})]}),(0,l.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"The VNC password is deliberately not carried in this page or in the URL: any page a bot browser opens could otherwise reach the local websocket, and websockets have no CORS."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-dashed border-border p-5","aria-label":"Not wired yet",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Not wired yet"}),(0,l.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:["Per-bot cell headers (name \xb7 last round verdict \xb7 whether CDP is alive) need"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"browserPort"})," and round results on the daemon's persona route. That route is owned by another track and is not published today."]}),(0,l.jsx)("li",{children:"Running a command from this surface needs a POST route that does not exist yet."})]})]})]})}function h(){let e=window.location.search,t=null;try{t=window.localStorage.getItem(n)}catch(e){t=null}return(0,l.jsx)(c,{search:e,remembered:t})}}},e=>{e.O(0,[2463,2196,7358],()=>e(e.s=57438)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9084],{5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>l,oD:()=>s});let r="elanous.daemon.sessionId";function l(){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=l();return localStorage.setItem(r,t),t}function a(){let e=l();return localStorage.setItem(r,e),e}},13685:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(55539),l=n(46124),s=n(15151),a=n(42006),o=n(33626),i=n(43537);let u={release:null,loops:null,decisions:null,merged:null};function d(e){return null!==e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.name&&"string"==typeof e.source&&(null===e.category||"string"==typeof e.category)&&(null===e.domain||"string"==typeof e.domain)&&(null===e.runVia||"string"==typeof e.runVia)&&["live","firing","stale","off"].includes(e.state)&&(null===e.cron||"string"==typeof e.cron)&&(null===e.intervalMs||"number"==typeof e.intervalMs&&Number.isFinite(e.intervalMs))&&Array.isArray(e.next)&&e.next.every(e=>"string"==typeof e)&&(null===e.lastRun||"object"==typeof e.lastRun&&null!==e.lastRun&&"string"==typeof e.lastRun.at&&(null===e.lastRun.status||"string"==typeof e.lastRun.status)&&(null===e.lastRun.exit||"number"==typeof e.lastRun.exit))}async function c(e){try{var t;let n=await e.fetchResponse(a.i6);if(!n.ok)return null;let r=await n.json();if(null===r||"object"!=typeof r||!("schedules"in r))return null;let l=r.schedules;if(!Array.isArray(l)||!l.every(d))return null;let s={};for(let e of(0,a.Yy)(l,Date.now()))s[e.verdict]=(null!=(t=s[e.verdict])?t:0)+1;return s}catch(e){return null}}async function f(e,t){try{let n=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(t),r=Date.parse("".concat(n,"T00:00:00+09:00")),l=await e.fetchResponse("/v1/harness/runs?finishedSince=".concat(r));if(!l.ok)return null;let s=await l.json();if(null===s||"object"!=typeof s||!("landed"in s)||"landedTruncated"in s&&!1!==s.landedTruncated||"landedError"in s&&null!=s.landedError)return null;let a=s.landed;if(!Array.isArray(a)||!a.every(e=>e&&"number"==typeof e.number&&"string"==typeof e.mergedAt&&Number.isFinite(Date.parse(e.mergedAt))))return null;return new Set(a.filter(e=>Date.parse(e.mergedAt)>=r).map(e=>e.number)).size}catch(e){return null}}async function y(e){var t;let[n,r,l,s]=await Promise.all([(0,i.Nn)(e),c(e),(0,o.q)(e).then(e=>Array.isArray(e)?e.length:null).catch(()=>null),f(e,new Date(Date.now()))]);return{release:"ready"===n.kind?4!==(t=n.data).seats.length||t.seats.some(e=>null===e.checklist)?null:{green:t.seats.reduce((e,t)=>e+t.checklist.green,0),yellow:t.seats.reduce((e,t)=>e+t.checklist.yellow,0)}:null,loops:r,decisions:l,merged:s}}function m(e){let{title:t,children:n}=e;return(0,r.jsxs)("section",{"aria-label":t,className:"min-w-0 rounded-xl border border-border bg-card p-3 sm:p-4",children:[(0,r.jsx)("h2",{className:"text-xs font-medium text-muted-foreground sm:text-sm",children:t}),(0,r.jsx)("div",{className:"mt-2 text-lg font-semibold leading-snug tabular-nums sm:text-xl",children:n})]})}function p(){var e,t;let{client:n}=(0,s.Q)(),[a,o]=(0,l.useState)(u);return(0,l.useEffect)(()=>{let e=!0;return o(u),y(n).then(t=>{e&&o(t)}),()=>{e=!1}},[n]),(0,r.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-3xl px-3 py-4 text-foreground sm:px-6",children:[(0,r.jsxs)("header",{className:"mb-4",children:[(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"운영 \xb7 오늘"}),(0,r.jsx)("h1",{className:"text-xl font-semibold",children:"대표 조망판"})]}),(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:gap-4","aria-label":"대표 조망 카드",children:[(0,r.jsx)(m,{title:"릴리스 판 진행",children:a.release?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"text-emerald-600",children:["green ",a.release.green]}),(0,r.jsxs)("span",{className:"block text-amber-600",children:["노랑 ",a.release.yellow]})]}):"못 읽음"}),(0,r.jsx)(m,{title:"루프 판정",children:null===a.loops?"못 읽음":0===Object.keys(a.loops).length?"등록 0":(0,r.jsx)("div",{className:"flex flex-wrap gap-1 text-xs font-medium",children:Object.entries(a.loops).map(e=>{let[t,n]=e;return(0,r.jsxs)("span",{className:"rounded-full bg-muted px-2 py-1",children:[t," ",n]},t)})})}),(0,r.jsx)(m,{title:"결정 대기 카드",children:null!=(e=a.decisions)?e:"못 읽음"}),(0,r.jsx)(m,{title:"오늘 병합 PR",children:null!=(t=a.merged)?t:"못 읽음"})]})]})}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>u,DaemonProvider:()=>d,Q:()=>c});var r=n(55539),l=n(46124),s=n(8101),a=n(5997),o=n(18060),i=n(72215);let u=(0,l.createContext)(null);function d(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[d,c]=(0,l.useState)(n),[f,y]=(0,l.useState)(""),[m]=(0,l.useState)(()=>new o.ki(n));(0,l.useEffect)(()=>{let e=(0,s.Fp)();c(e),m.updateConfig(e),y((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[m]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();m.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&&y(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)},[m]);let p=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),m.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{y(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,l.useMemo)(()=>({config:d,setConfig:p,client:m,sessionId:f,setSessionId:v}),[d,m,f]);return(0,r.jsx)(u.Provider,{value:h,children:t})}function c(){let e=(0,l.useContext)(u);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},29325:(e,t,n)=>{"use strict";function r(e,t){if(!e.enabled||"off"===e.scheduleState)return"off";if("failed"===e.lastStatus||"error"===e.lastStatus||"failure"===e.lastStatus||"abandoned"===e.lastStatus||"expired"===e.lastStatus)return"failed";if("stale"===e.scheduleState)return"late";let n=null===e.lastRunAt?NaN:Date.parse(e.lastRunAt);if(void 0!==e.secondDueAt){let r=null===e.secondDueAt?NaN:Date.parse(e.secondDueAt);return Number.isFinite(n)&&Number.isFinite(t)&&Number.isFinite(r)&&r>n&&t>r?"late":"alive"}return Number.isFinite(t)&&Number.isFinite(n)&&null!==e.intervalMs&&Number.isFinite(e.intervalMs)&&e.intervalMs>0&&t-n>2*e.intervalMs?"late":"alive"}n.d(t,{u:()=>r})},33626:(e,t,n)=>{"use strict";async function r(e){let t=await e.fetchResponse("/v1/decisions?status=open");if(!t.ok)throw Error("decisions list failed: ".concat(t.status));return(await t.json()).decisions}async function l(e,t,n){let r=await e.fetchResponse("/v1/decisions/".concat(encodeURIComponent(t),"/decide"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({choice:n})});if(!r.ok)throw Error("decision failed: ".concat(r.status))}n.d(t,{L:()=>l,q:()=>r})},42006:(e,t,n)=>{"use strict";n.d(t,{i6:()=>s,Pz:()=>o,Em:()=>a,Yy:()=>i});var r=n(29325);let l={alive:"살아 있음",late:"늦음",failed:"실패",off:"꺼짐"},s="/v1/schedules?includeOff=1";async function a(e,t){var n,a,o,u,d,c,f,y;let[m,p]=await Promise.allSettled([e(s),e("/v1/dashboard/loops")]),v="fulfilled"===m.status?null==(n=m.value)?void 0:n.schedules:null,h="fulfilled"===p.status?null==(o=p.value)||null==(a=o.loops)?void 0:a.loops:null;if(!Array.isArray(v)&&!Array.isArray(h))throw Error("loop registries unavailable");if(!Array.isArray(v))throw Error("스케줄 레지스트리 조회 실패");if(!Array.isArray(h))throw Error("루프 레지스트리 조회 실패");let b=i(v,t).map(e=>({...e,id:"schedule:".concat(e.id)}));for(let e of h){let n=e.last?Date.parse(e.last.at):NaN,s=(0,r.u)({enabled:!1!==e.armed,lastRunAt:null!=(c=null==(u=e.last)?void 0:u.at)?c:null,lastStatus:null!=(f=null==(d=e.last)?void 0:d.status.toLowerCase())?f:null,intervalMs:null},t);b.push({id:"loop:".concat(e.name),name:e.label,layer:null!=(y=e.category)?y:"루프",owner:"미지정",mode:null===e.armed?"관측":e.armed?"armed":"off",lastRun:Number.isFinite(n)?e.last.at:null,verdict:"alive"===s?"판정 불가":l[s]})}return b}function o(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now,r=0,l=!0;return{async refresh(){let s=++r;try{let o=await a(e,n());l&&s===r&&t({rows:o,state:"ready"})}catch(e){l&&s===r&&t({rows:[],state:"error"})}},dispose(){l=!1}}}function i(e,t){return e.map(e=>{var n,s,a,o,i,u,d;let c=e.lastRun?Date.parse(e.lastRun.at):NaN,f=(0,r.u)({enabled:"off"!==e.state,lastRunAt:null!=(u=null==(n=e.lastRun)?void 0:n.at)?u:null,lastStatus:(null==(s=e.lastRun)?void 0:s.exit)!=null&&0!==e.lastRun.exit?"failed":(null==(a=e.lastRun)?void 0:a.status)==null||["ok","success","completed"].includes(e.lastRun.status.toLowerCase())?null!=(d=null==(i=e.lastRun)||null==(o=i.status)?void 0:o.toLowerCase())?d:null:"failed",intervalMs:e.cron?null:e.intervalMs,...e.cron?{scheduleState:e.state}:{}},t),y=!e.cron&&!(e.intervalMs&&e.intervalMs>0),m="alive"===f&&(!Number.isFinite(c)||y)?"판정 불가":l[f];return{id:e.id,name:e.name,layer:e.domain||e.category||e.source,owner:"미지정",mode:e.runVia||e.source,lastRun:Number.isFinite(c)?e.lastRun.at:null,verdict:m}})}},43537:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e}function s(e){return l(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 a(e){return r(e)&&l(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&l(e.summary)}function o(e){return r(e)&&l(e.runId)&&l(e.status)&&l(e.startedAt)&&(null===e.version||l(e.version))&&Array.isArray(e.path)&&e.path.every(l)&&Array.isArray(e.nodes)&&e.nodes.every(a)}function i(e){return r(e)&&l(e.id)&&l(e.title)&&l(e.status)&&(void 0===e.owner||l(e.owner))&&l(e.updatedAt)&&(void 0===e.evidence||l(e.evidence))}n.d(t,{HG:()=>v,Kh:()=>p,Nn:()=>y,oc:()=>m});let u=e=>Number.isInteger(e)&&e>=0;function d(e){return r(e)&&l(e.id)&&l(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)&&l(e.id)&&l(e.title)))}function c(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||l(e.role))&&(null===e.now||r(e.now)&&l(e.now.text)&&l(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&l(e.title)&&l(e.at)&&(null===e.checklistId||l(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(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(d))}async function f(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 l=n(await r.json());return null===l?{kind:"error",status:r.status}:{kind:"ready",data:l}}catch(e){return{kind:"error",status:0}}}function y(e,t){return f(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&l(e.date)&&Array.isArray(e.seats)&&e.seats.every(c)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function m(e,t){return f(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(o)?e:null)}function p(e,t,n){return f(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&l(e.log)?{log:e.log}:null)}function v(e,t){return f(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,a,o;if(!(r(e)&&l(e.version)&&(void 0===e.codename||l(e.codename))&&Array.isArray(e.items)&&e.items.every(i)&&["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(l))&&(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 u={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in u&&u[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:u.green,yellow:null!=(n=e.yellow)?n:u.yellow,red:null!=(a=e.red)?a:u.red,done:null!=(o=e.done)?o:u.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},81273:(e,t,n)=>{Promise.resolve().then(n.bind(n,13685))}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=81273)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3933],{5997:(e,t,s)=>{"use strict";s.d(t,{Zr:()=>l,f6:()=>n,oD:()=>r});let a="elanous.daemon.sessionId";function n(){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 r(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(a,e),e):localStorage.getItem(a)}();if(e)return e;let t=n();return localStorage.setItem(a,t),t}function l(){let e=n();return localStorage.setItem(a,e),e}},15151:(e,t,s)=>{"use strict";s.d(t,{C:()=>i,DaemonProvider:()=>d,Q:()=>m});var a=s(55539),n=s(46124),r=s(8101),l=s(5997),o=s(18060),c=s(72215);let i=(0,n.createContext)(null);function d(e){let{children:t}=e,s={baseUrl:"",token:"",provider:""},[d,m]=(0,n.useState)(s),[u,p]=(0,n.useState)(""),[x]=(0,n.useState)(()=>new o.ki(s));(0,n.useEffect)(()=>{let e=(0,r.Fp)();m(e),x.updateConfig(e),p((0,l.oD)()),(0,c.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[x]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,r.Fp)();x.updateConfig(t),m(t),(0,c.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,c.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[x]);let f=e=>{m(t=>{let s={...t,...e};return(0,r.Qc)(e),x.updateConfig(s),(0,c.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),s})},h=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,c.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,n.useMemo)(()=>({config:d,setConfig:f,client:x,sessionId:u,setSessionId:h}),[d,x,u]);return(0,a.jsx)(i.Provider,{value:g,children:t})}function m(){let e=(0,n.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},29744:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>c});var a=s(55539),n=s(46124),r=s(15151);let l="user@elanvital.ai",o={name:"이름",org:"회사명",kind:"회사/개인",interest:"관심 분야",contact:"연락처",consent:"동의"};function c(){let{client:e}=(0,r.Q)(),[t,s]=(0,n.useState)(""),[c,i]=(0,n.useState)(""),[d,m]=(0,n.useState)("personal"),[u,p]=(0,n.useState)("A"),[x,f]=(0,n.useState)(""),[h,g]=(0,n.useState)(!1),[b,y]=(0,n.useState)(!1),[j,v]=(0,n.useState)(""),[k,N]=(0,n.useState)(!1);async function w(s){if(s.preventDefault(),!h||b)return;let a={name:t.trim(),..."company"===d?{org:c.trim()}:{},kind:d,interest:u,contact:x.trim(),consent:!0},n=a.name?"company"!==d||a.org?a.contact?null:"contact":"org":"name";if(n){N(!0),v("".concat(o[n]," 항목을 입력해 주세요."));return}y(!0),v("");try{let t=await e.submitConsultRequest(a);if("receiptId"in t)N(!1),v("접수했습니다 \xb7 ".concat(t.receiptId," — 곧 연락드리겠습니다"));else{var r;N(!0),v("".concat(null!=(r=o[t.field])?r:"필수"," 항목을 확인해 주세요."))}}catch(e){N(!0),v("접수하지 못했습니다. 연결 상태를 확인하고 다시 보내 주세요.")}finally{y(!1)}}return(0,a.jsxs)("main",{className:"mx-auto w-full max-w-xl px-5 py-10 sm:py-16",children:[(0,a.jsxs)("header",{className:"mb-8",children:[(0,a.jsx)("p",{className:"mb-2 text-sm font-medium text-primary",children:"AX \xb7 상담 문의"}),(0,a.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"어떤 도움이 필요하신가요?"}),(0,a.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"도입 상담이나 교육 과정에 대해 남겨 주세요. 확인 후 연락드리겠습니다."}),(0,a.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["메일로 바로 문의: ",(0,a.jsx)("a",{className:"underline",href:"mailto:".concat(l),children:l})]})]}),(0,a.jsxs)("form",{onSubmit:w,noValidate:!0,className:"space-y-6 rounded-xl border border-border bg-card p-5 sm:p-8",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-name",className:"block text-sm font-medium",children:"이름"}),(0,a.jsx)("input",{id:"consult-name",name:"name",required:!0,autoComplete:"name",value:t,onChange:e=>s(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("fieldset",{className:"space-y-2",children:[(0,a.jsx)("legend",{className:"text-sm font-medium",children:"회사/개인"}),(0,a.jsxs)("div",{className:"flex gap-5 text-sm",children:[(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"kind",value:"company",checked:"company"===d,onChange:()=>m("company")}),"회사"]}),(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"kind",value:"personal",checked:"personal"===d,onChange:()=>m("personal")}),"개인"]})]})]}),"company"===d&&(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-org",className:"block text-sm font-medium",children:"회사명"}),(0,a.jsx)("input",{id:"consult-org",name:"org",required:!0,autoComplete:"organization",value:c,onChange:e=>i(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("fieldset",{className:"space-y-2",children:[(0,a.jsx)("legend",{className:"text-sm font-medium",children:"관심 분야"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2 text-sm",children:[(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"interest",value:"A",checked:"A"===u,onChange:()=>p("A")}),"A \xb7 AX 도입 상담"]}),(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"interest",value:"B",checked:"B"===u,onChange:()=>p("B")}),"B \xb7 과정\xb7교육 문의"]})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-contact",className:"block text-sm font-medium",children:"연락처 (메일 또는 전화)"}),(0,a.jsx)("input",{id:"consult-contact",name:"contact",required:!0,value:x,onChange:e=>f(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("label",{className:"flex items-start gap-3 text-sm leading-6",children:[(0,a.jsx)("input",{type:"checkbox",name:"consent",checked:h,onChange:e=>g(e.target.checked),className:"mt-1"}),(0,a.jsx)("span",{children:"입력한 정보는 상담 연락을 위해 서버로 전송하며, 상담 연락에만 사용합니다"})]}),j&&(0,a.jsx)("p",{role:k?"alert":"status",className:k?"text-sm text-destructive":"text-sm text-primary",children:j}),(0,a.jsx)("button",{type:"submit",disabled:!h||b,className:"w-full rounded-md bg-primary px-4 py-2.5 text-sm font-medium text-primary-foreground disabled:cursor-not-allowed disabled:opacity-50",children:b?"보내는 중…":"보내기"})]})]})}},36218:(e,t,s)=>{Promise.resolve().then(s.bind(s,29744))}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=36218)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8891],{9407:(e,t,n)=>{"use strict";n.d(t,{InsidePage:()=>ei});var l=n(55539),r=n(46124),s=n(58603),a=n(58298);let i=[{id:"mission-fabric",title:"미션 패브릭",oneLine:"들어온 일을 미션으로 정하고 실행에 잇습니다.",docs:["docs/manual/MANUAL-mission-fabric-integration-2026-09-03.md"],code:["src/mission-loop/composite-cycle.ts","src/harness/mission-solve-loop.ts"]},{id:"graph-engineering",title:"그래프 엔지니어링",oneLine:"실행의 노드와 경로를 그래프로 읽습니다.",docs:["docs/manual/MANUAL-graph-operations-2026-09-10.md"],code:["src/self-implement/graph-templates.ts","src/self-implement/graph-authority.ts"]},{id:"pty-intelligence",title:"PTY 인텔리전스",oneLine:"에이전트가 터미널의 실행과 관측을 연결합니다.",docs:["docs/manual/MANUAL-external-agent-pty-missions-2026-08-11.md"],code:["src/self-dev/dev-cli.ts"]},{id:"loop-agent",title:"루프 에이전트",oneLine:"일을 반복 관측하고 다음 행동을 고릅니다.",docs:["docs/manual/MANUAL-execution-and-landing-loops-2026-09-29.md"],code:["src/harness/mission-solve-loop.ts","src/mission-loop/composite-cycle.ts"]},{id:"observation",title:"바닥 \xb7 관측\xb7인지\xb7힐링",oneLine:"본 것을 이해하고 스스로 고치는 바닥입니다.",docs:["docs/manual/MANUAL-self-cognition-observability-2026-07-14.md"],code:["src/self-implement/orchestrator.ts"]},{id:"harness",title:"받침 \xb7 하니스",oneLine:"구현과 검증이 지나가는 실행 받침입니다.",docs:["docs/TECH-harness-execution-anatomy-current-state-2026-08-10.md"],code:["src/self-implement/orchestrator.ts","src/self-dev/dev-cli.ts"]}];var o=n(81969);function d(e){let{entry:t}=e,[n,s]=(0,r.useState)(!1);return(0,l.jsxs)("details",{open:n,style:{minWidth:0,border:"1px solid #68788f",borderRadius:12,padding:18,background:"#16263b"},children:[(0,l.jsx)("summary",{onClick:e=>{e.preventDefault(),s(e=>!e)},style:{cursor:"pointer",fontWeight:700,overflowWrap:"anywhere"},children:(0,o.t)(t.title)}),(0,l.jsx)("p",{children:(0,o.t)(t.oneLine)}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:"문서"}),(0,l.jsx)("ul",{children:t.docs.map(e=>(0,l.jsx)("li",{style:{overflowWrap:"anywhere"},children:(0,o.t)(e)},e))}),(0,l.jsx)("strong",{children:"코드"}),(0,l.jsx)("ul",{children:t.code.map(e=>(0,l.jsx)("li",{style:{overflowWrap:"anywhere"},children:(0,o.t)(e)},e))})]})]})}function c(){return(0,l.jsxs)("div",{"data-architecture-scene":!0,style:{width:"100%",maxWidth:1600,margin:"auto",display:"grid",gap:20,fontSize:18},children:[(0,l.jsx)("h2",{style:{fontSize:28,margin:0},children:"엘라누스의 구조"}),(0,l.jsx)("div",{"aria-label":"네 기둥",style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(min(100%, 240px), 1fr))",gap:16},children:i.slice(0,4).map(e=>(0,l.jsx)(d,{entry:e},e.id))}),(0,l.jsx)("div",{"aria-label":"받침",style:{width:"100%",maxWidth:480,justifySelf:"center"},children:(0,l.jsx)(d,{entry:i[5]})}),(0,l.jsx)("div",{"aria-label":"바닥",children:(0,l.jsx)(d,{entry:i[4]})})]})}var u=n(15151),p=n(69370);let m={currentMissionId:null,missions:{}},f=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),h=e=>"string"==typeof e&&e.trim().length>0;function b(e){let t=e;if("string"==typeof t)try{t=JSON.parse(t)}catch(e){return null}if(!t||"object"!=typeof t||Array.isArray(t))return null;let n=t;if("wizard.step"!==n.category||"wizard.step"!==n.event||!n.data||"object"!=typeof n.data||Array.isArray(n.data))return null;let l=n.data;return"string"==typeof l.ts&&Number.isFinite(Date.parse(l.ts))&&"string"==typeof l.wizardId&&l.wizardId&&["request","research","draft","validate","install","done"].includes(l.step)&&"string"==typeof l.text?{ts:l.ts,wizardId:l.wizardId,step:l.step,text:l.text,...void 0===l.detail?{}:{detail:l.detail}}:null}function y(e,t){let n=e.logsStreamUrl({exactCategory:"wizard.step"});return n?(0,p.BX)(n,{events:{log:e=>{let n=b(e.data);n&&t(n)}}}):()=>{}}let g={currentRunId:null,runs:{}},v={start:"border-sky-400 bg-sky-500/15 text-sky-200",ok:"border-green-500 bg-green-500/15 text-green-300",fail:"border-red-500 bg-red-500/15 text-red-300"};function x(e){let{state:t,now:n,receivedAt:r,lastSettlement:s,lastActivityTs:a=null,activityStatus:i="loading",wizardSteps:d=[]}=e,c=t.currentRunId?t.runs[t.currentRunId]:null,u=!c||n-r>6e4,p=null==c?void 0:c.order.some(e=>"start"===c.nodes[e].phase),m=s&&!p&&n-s.receivedAt<15e3,f=s&&!p&&n-s.receivedAt>=15e3,h=c?Math.max(0,Math.floor((n-Date.parse(c.startedAt))/1e3)):0,b=c&&s?Math.max(0,Math.floor((Date.parse(s.ts)-Date.parse(c.startedAt))/1e3)):0,y=f?"fail"===s.phase?"실패 \xb7 ".concat(s.nodeId):"완료 \xb7 ".concat(b,"초"):null;return(0,l.jsxs)("section",{"aria-label":"라이브 트레이스",className:"min-w-0 space-y-6 p-6 text-lg leading-relaxed",children:[d.length>0&&(0,l.jsx)("ol",{"aria-label":"플러그인 마법사 흐름",children:d.map(e=>(0,l.jsxs)("li",{children:["마법사 ",e.step," \xb7 ",(0,o.t)(e.text)]},"".concat(e.wizardId,":").concat(e.step)))}),u?(0,l.jsxs)("div",{className:"space-y-4 text-muted-foreground",children:[(0,l.jsx)("p",{children:"지금 도는 런이 없습니다"}),(0,l.jsxs)("p",{role:"status",children:["마지막 활동: ",a&&Number.isFinite(Date.parse(a))?(0,l.jsxs)("time",{dateTime:a,children:[new Date(a).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"})," KST"]}):"loading"===i?"확인 중":"unavailable"===i?"못 읽음":"기록 없음"]}),(0,l.jsx)("button",{type:"button",className:"rounded-lg border border-border px-5 py-3 text-lg",disabled:!0,children:"녹화 보기"})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("header",{className:"flex flex-wrap items-center gap-x-5 gap-y-2 break-all text-lg",children:[(0,l.jsx)("h2",{className:"font-semibold",children:c.graphId}),(0,l.jsxs)("span",{children:["런 ",c.runId.slice(0,6)]}),(0,l.jsxs)("span",{children:["경과 ",h,"초"]}),y&&(0,l.jsx)("span",{role:"status",children:y})]}),(0,l.jsxs)("div",{role:"list","aria-label":"노드 흐름",className:"flex flex-wrap gap-3",children:[m&&(0,l.jsx)("span",{className:"rounded-lg border border-border bg-muted px-3 py-1 text-sm text-muted-foreground",children:"다음 단계 준비 중"}),c.order.map(e=>{let t=c.nodes[e];return(0,l.jsxs)("div",{role:"listitem",className:"min-w-0 max-w-full break-all rounded-lg border px-5 py-3 ".concat(v[t.phase]),children:[(0,l.jsxs)("span",{className:"start"===t.phase?"animate-pulse":"",children:[t.nodeId," \xb7 ","start"===t.phase?"진행 중":"ok"===t.phase?"ok":"fail"]}),t.retries>0&&(0,l.jsxs)("span",{className:"ml-3","aria-label":"다시 ".concat(t.retries,"회"),children:["↻",t.retries]})]},e)})]})]})]})}function w(){let{client:e,config:t}=(0,u.Q)(),[n,s]=(0,r.useState)(()=>({client:e,baseUrl:t.baseUrl,token:t.token,state:g,receivedAt:0,lastSettlement:null,lastActivityTs:null,activityStatus:"loading"})),[a,i]=(0,r.useState)(0),[o,d]=(0,r.useState)([]),c=n.client===e&&n.baseUrl===t.baseUrl&&n.token===t.token;return(0,r.useEffect)(()=>{let n=!0;s({client:e,baseUrl:t.baseUrl,token:t.token,state:g,receivedAt:0,lastSettlement:null,lastActivityTs:null,activityStatus:"loading"}),d([]),e.listLogs({category:"graph.run",event:"node",limit:"1"}).then(l=>{n&&s(n=>{var r,s;if(n.client!==e||n.baseUrl!==t.baseUrl||n.token!==t.token)return n;let a=null==(s=l.logs)||null==(r=s[0])?void 0:r.ts,i="string"==typeof a&&Number.isFinite(Date.parse(a))?a:null,o=i&&(!n.lastActivityTs||Date.parse(i)>Date.parse(n.lastActivityTs))?i:n.lastActivityTs;return{...n,lastActivityTs:o,activityStatus:l.ok&&Array.isArray(l.logs)?"ready":"unavailable"}})}).catch(()=>{n&&s(n=>n.client===e&&n.baseUrl===t.baseUrl&&n.token===t.token?{...n,activityStatus:"unavailable"}:n)});let l=y(e,e=>{n&&d(t=>"request"===e.step?[e]:[...t.filter(t=>t.wizardId===e.wizardId),e].slice(-6))}),r=function(e,t){let n=e.logsStreamUrl({category:"graph.run"});return n?(0,p.BX)(n,{events:{log:e=>{let n=function(e){let t=e;if("string"==typeof t)try{t=JSON.parse(t)}catch(e){return null}if("object"!=typeof t||null===t||Array.isArray(t))return null;let n=t;if("graph.run"!==n.category||"node"!==n.event)return null;let l=n.data;return"object"!=typeof l||null===l||Array.isArray(l)?null:["graphId","runId","nodeId"].every(e=>"string"==typeof l[e]&&l[e].trim().length>0)&&("start"===l.phase||"ok"===l.phase||"fail"===l.phase)&&"string"==typeof n.ts&&Number.isFinite(Date.parse(n.ts))&&(void 0===l.seconds||"number"==typeof l.seconds&&Number.isFinite(l.seconds)&&!(l.seconds<0))?{kind:"node",graphId:l.graphId,runId:l.runId,nodeId:l.nodeId,phase:l.phase,ts:n.ts,...void 0===l.seconds?{}:{seconds:l.seconds}}:null}(e.data);n&&t(n)}}}):()=>{}}(e,l=>{if(!n)return;let r=Date.now();s(s=>{var a,i;if(!n)return s;let o=s.client===e&&s.baseUrl===t.baseUrl&&s.token===t.token,d=o?s.state:g,c=d.currentRunId===l.runId&&"start"!==l.phase&&(null==(i=d.runs[l.runId])||null==(a=i.nodes[l.nodeId])?void 0:a.phase)===l.phase,u=d.currentRunId!==l.runId&&d.runs[l.runId]?s.lastSettlement:"start"===l.phase||d.currentRunId!==l.runId?null:c?s.lastSettlement:{receivedAt:r,nodeId:l.nodeId,phase:l.phase,ts:l.ts},p=!o||!s.lastActivityTs||Date.parse(l.ts)>Date.parse(s.lastActivityTs)?l.ts:s.lastActivityTs;return{client:e,baseUrl:t.baseUrl,token:t.token,receivedAt:r,lastSettlement:u,lastActivityTs:p,activityStatus:o?s.activityStatus:"loading",state:function(e,t){var n,l,r,s;let a=Object.hasOwn(e.runs,t.runId)?e.runs[t.runId]:void 0,i=a&&Object.hasOwn(a.nodes,t.nodeId)?a.nodes[t.nodeId]:void 0,o={nodeId:t.nodeId,phase:t.phase,retries:(null!=(n=null==i?void 0:i.retries)?n:0)+("start"===t.phase&&i?1:0)},d={graphId:t.graphId,runId:t.runId,startedAt:null!=(l=null==a?void 0:a.startedAt)?l:t.ts,order:i?a.order:[...null!=(r=null==a?void 0:a.order)?r:[],t.nodeId],nodes:{...null==a?void 0:a.nodes,[t.nodeId]:o}};return{currentRunId:a&&null!=(s=e.currentRunId)?s:t.runId,runs:{...e.runs,[t.runId]:d}}}(d,l)}}),i(r)}),a=setInterval(()=>i(Date.now()),1e3);return()=>{n=!1,r(),l(),clearInterval(a)}},[e,t.baseUrl,t.token]),(0,l.jsx)(x,{state:c?n.state:g,now:a,receivedAt:n.receivedAt,lastSettlement:c?n.lastSettlement:null,lastActivityTs:c?n.lastActivityTs:null,activityStatus:c?n.activityStatus:"loading",wizardSteps:c?o:[]})}var j=n(43431),k=n(75764),A=n(55519);let N=A.DN.map(e=>({graph:"harness",kind:e,plugin:null,description:"",schema:{},core:!0})),I=A.CF.map(e=>({graph:"workflow",kind:e,plugin:null,description:"",schema:{},core:!0}));function S(){let{GraphEditor:e=j.F,WorkflowEditor:t=k.N}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[n,s]=(0,r.useState)("harness");return(0,l.jsxs)("section",{"aria-label":"그래프 편집기",className:"flex h-full min-h-[640px] min-w-0 flex-col",children:[(0,l.jsx)("div",{role:"tablist","aria-label":"그래프 편집 모드",className:"flex shrink-0 gap-2 border-b border-border px-4 py-3",children:["harness","workflow"].map(e=>(0,l.jsx)("button",{type:"button",role:"tab",id:"inside-editor-tab-".concat(e),"aria-controls":"inside-editor-panel-".concat(e),"aria-selected":n===e,onClick:()=>s(e),className:"rounded-lg px-4 py-2 text-lg min-[1440px]:text-[22px] ".concat(n===e?"bg-accent/15 text-text-primary":"text-text-tertiary hover:bg-surface-elevated"),children:"harness"===e?"실행 그래프":"워크플로"},e))}),(0,l.jsx)("div",{id:"inside-editor-panel-harness",role:"tabpanel","aria-labelledby":"inside-editor-tab-harness",hidden:"harness"!==n,className:"harness"===n?"flex min-h-0 min-w-0 flex-1 flex-col":"hidden",children:(0,l.jsx)(e,{palette:N,initialGraphId:"self-implement"})}),(0,l.jsx)("div",{id:"inside-editor-panel-workflow",role:"tabpanel","aria-labelledby":"inside-editor-tab-workflow",hidden:"workflow"!==n,className:"workflow"===n?"flex min-h-0 min-w-0 flex-1 flex-col":"hidden",children:(0,l.jsx)(t,{palette:I})})]})}var C=n(43537),R=n(79247),D=n(40385),M=n(42006),T=n(88928),U=n(69280);n(71588);var O=n(29325);let E={alive:"살아 있음",late:"늦음",failed:"실패",off:"꺼짐"},z={OP:"COO",MK:"CMO",TC:"CTO",UX:"CXO"},L=["OP","MK","TC","UX"],F=new Set(["request","decision","report","card","run"]),K=/^[a-zA-Z0-9_-]{1,128}$/;function P(e,t){let n=(null==t?void 0:t.kind)==="run"?t.ref:e;if((null==t?void 0:t.kind)==="card"&&K.test(t.ref))return"/trace?q=".concat(encodeURIComponent(t.ref));if(n.startsWith("loop:")&&K.test(n.slice(5))){let e=n.slice(5);return e.startsWith("run-")?"/trace?level=L2&run=".concat(encodeURIComponent(e)):"/trace?q=".concat(encodeURIComponent(e))}return n.startsWith("schedule:")&&K.test(n.slice(9))?"/trace?q=".concat(encodeURIComponent(n.slice(9))):n.startsWith("card:")&&K.test(n.slice(5))?"/trace?q=".concat(encodeURIComponent(n.slice(5))):(null==t?void 0:t.kind)==="run"&&K.test(n)?"/trace?level=L2&run=".concat(encodeURIComponent(n)):"/trace"}function q(e){return JSON.stringify([e.at,e.kind,e.from,e.to,e.ref])}let W={"살아 있음":"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-slate-700 text-slate-300 ring-slate-500","판정 불가":"bg-slate-700 text-slate-300 ring-slate-500"},Z={request:"요청",decision:"결정",report:"보고",card:"카드",run:"런"},_={activity:function(e){let{data:t}=e;return(0,l.jsxs)("div",{className:"relative flex flex-col items-center gap-1 text-center text-white",children:[(0,l.jsx)(T.h7,{type:"target",position:U.yX.Left,className:"!border-sky-400 !bg-sky-400"}),(0,l.jsx)("div",{className:"flex items-center justify-center rounded-full border-2 border-sky-400 bg-[#173556] px-2 font-bold ".concat("seat"===t.type?"h-[90px] w-[90px] text-lg":"h-[64px] w-[64px] text-xs"),children:(0,l.jsx)("span",{className:"line-clamp-2 break-all",children:(0,o.t)(t.label)})}),t.verdict&&(0,l.jsx)("span",{"data-loop-verdict":t.verdict,className:"rounded-full px-2 py-0.5 text-xs font-semibold ring-1 ".concat(W[t.verdict]),children:t.verdict}),(0,l.jsx)(T.h7,{type:"source",position:U.yX.Right,className:"!border-sky-400 !bg-sky-400"})]})}};function X(e){let{rows:t,edges:n,seenAt:s,now:a,state:i,seatIds:d}=e,c=(0,r.useMemo)(()=>(function(e,t){var n,l;let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:L,s=new Map;for(let e of r)s.set(e,{id:e,type:"seat",label:null!=(n=z[e])?n:(0,o.t)(e)});let a=new Set(r),i=new Set;for(let t of e){let e=a.has(t.owner)?t.owner:"미지정",n=t.id,l=(0,o.t)(t.name),r=i.has(l)?"".concat(l," \xb7 ").concat((0,o.t)(t.id)):l;i.add(l),s.set(n,{id:n,type:"loop",label:r,owner:e,verdict:t.verdict})}for(let e of t)for(let t of[e.from,e.to]){if(s.has(t))continue;let[e,n]=t.split(":",2);"loop"===e&&n&&K.test(n)?s.set(t,{id:t,type:"other",label:n.startsWith("run-")?"런 \xb7 ".concat((0,o.t)(n)):"칸 \xb7 ".concat((0,o.t)(n))}):"card"===e||"surface"===e?s.set(t,{id:t,type:"other",label:"card"===e?"카드":"입구 \xb7 ".concat((0,o.t)(null!=n?n:""))}):a.has(t)&&s.set(t,{id:t,type:"seat",label:null!=(l=z[t])?l:(0,o.t)(t)})}return[...s.values()]})(t,n,d),[t,n,d]),u=(0,r.useMemo)(()=>{let e=c.filter(e=>"seat"===e.type);return[...e.map(e=>e.id),"미지정"].map((t,n)=>({owner:t,column:n,nodes:[..."미지정"===t?[]:e.filter(e=>e.id===t),...c.filter(e=>"loop"===e.type&&e.owner===t)]})).filter(e=>e.nodes.length>0)},[c]),p=new Map(c.map((e,t)=>[e.id,"node-".concat(t)])),m=u.flatMap(e=>{let{column:t,nodes:n}=e;return n.map((e,n)=>({id:p.get(e.id),type:"activity",position:{x:220*t,y:138*n},data:{label:e.label,type:e.type,verdict:e.verdict}}))});c.filter(e=>"other"===e.type).forEach((e,t)=>m.push({id:p.get(e.id),type:"activity",position:{x:180*t,y:138*Math.max(...u.map(e=>e.nodes.length),1)+40},data:{label:e.label,type:e.type}}));let f=n.filter(e=>p.has(e.from)&&p.has(e.to)).map((e,t)=>{var n;let l=a-(null!=(n=s[q(e)])?n:0)<1500;return{id:"edge-".concat(t),source:p.get(e.from),target:p.get(e.to),label:Z[e.kind],data:{edge:e},animated:!1,focusable:!0,interactionWidth:24,style:{stroke:l?"#7dd3fc":"#7492a8",strokeWidth:l?4:2,opacity:l?1:.55,transition:"stroke 1.5s ease, stroke-width 1.5s ease, opacity 1.5s ease"},labelStyle:{fill:l?"#e0f2fe":"#a8b7c7",fontSize:12}}});return(0,l.jsxs)("section",{"aria-label":"루프 활동 지도",className:"min-w-0 space-y-3",children:[(0,l.jsx)("p",{className:"text-sm text-slate-300",children:"자리(큰 원) \xb7 루프(작은 원) \xb7 최근 60분 실제 사건. 노드나 간선을 누르면 Trace로 이동합니다."}),"error"===i&&(0,l.jsx)("p",{role:"alert",className:"text-red-300",children:"지도 원천을 읽지 못했습니다. 이전 지도가 보이면 현재 데이터가 아닙니다. 데몬 연결을 확인하세요."}),"loading"===i&&(0,l.jsx)("p",{role:"status",children:"지도를 읽는 중…"}),(0,l.jsx)("div",{className:"h-[440px] min-w-0 w-full overflow-hidden rounded-2xl border border-slate-600 bg-[#10243b]","aria-label":"자리와 루프 관계도",children:(0,l.jsxs)(T.Gc,{nodes:m,edges:f,nodeTypes:_,fitView:!0,minZoom:.25,maxZoom:1.5,nodesDraggable:!1,nodesConnectable:!1,edgesReconnectable:!1,deleteKeyCode:null,onNodeClick:(e,t)=>{let n=c.find(e=>p.get(e.id)===t.id);n&&window.location.assign(P(n.id))},onEdgeClick:(e,t)=>{var n;let l=null==(n=t.data)?void 0:n.edge;l&&window.location.assign(P(l.to,l))},children:[(0,l.jsx)(T.VS,{color:"#355470"}),(0,l.jsx)(T.H2,{showInteractive:!1})]},"loading"===i?"loading":"loaded")}),(0,l.jsx)("div",{"aria-label":"지도 목록",className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:u.map(e=>{var t;return(0,l.jsxs)("section",{className:"min-w-0 rounded-xl border border-slate-600 p-3",children:[(0,l.jsx)("h3",{className:"mb-2 font-semibold",children:null!=(t=z[e.owner])?t:(0,o.t)(e.owner)}),(0,l.jsx)("ul",{className:"space-y-2",children:e.nodes.map(e=>(0,l.jsx)("li",{children:(0,l.jsxs)("button",{type:"button",onClick:()=>window.location.assign(P(e.id)),className:"flex w-full min-w-0 items-center gap-2 rounded-lg border border-slate-600 px-2 py-2 text-left text-sm focus-visible:outline-2 focus-visible:outline-sky-400",children:[(0,l.jsx)("span",{"aria-hidden":"true",className:"shrink-0 rounded-full border border-sky-400 bg-[#173556] ".concat("seat"===e.type?"h-8 w-8":"h-5 w-5")}),(0,l.jsx)("span",{className:"min-w-0 break-words",children:(0,o.t)(e.label)}),e.verdict&&(0,l.jsx)("span",{"data-loop-verdict":e.verdict,className:"ml-auto shrink-0 rounded-full px-2 py-0.5 text-xs ring-1 ".concat(W[e.verdict]),children:e.verdict})]})},e.id))})]},e.owner)})}),(0,l.jsx)("ul",{"aria-label":"최근 간선 사건",className:"space-y-2",children:n.map((e,t)=>{var n,r,i,d,u;return(0,l.jsx)("li",{children:(0,l.jsxs)("button",{type:"button",onClick:()=>window.location.assign(P(e.to,e)),className:"block w-full min-w-0 break-words rounded-lg border border-slate-600 px-3 py-2 text-left text-sm focus-visible:outline-2 focus-visible:outline-sky-400 ".concat(a-(null!=(i=s[q(e)])?i:0)<1500?"bg-sky-500/20 text-sky-100 transition-colors duration-[1500ms] motion-reduce:transition-none":"bg-slate-800/50 text-slate-300"),children:[(0,o.t)(null!=(d=null==(n=c.find(t=>t.id===e.from))?void 0:n.label)?d:"출발")," → ",(0,o.t)(null!=(u=null==(r=c.find(t=>t.id===e.to))?void 0:r.label)?u:"도착")," \xb7 ",Z[e.kind]," \xb7 ",(0,l.jsx)("time",{dateTime:e.at,children:new Date(e.at).toLocaleTimeString("ko-KR",{timeZone:"Asia/Seoul"})})]})},"edge-".concat(t))})}),"ready"===i&&0===n.length&&(0,l.jsx)("p",{role:"status",className:"text-slate-300",children:"최근 사건이 없습니다."})]})}let J=(0,D.g)(null,null);function Y(e){let{view:t,runsUnreadable:n,refreshedAt:r}=e;return(0,l.jsxs)("section",{"aria-label":"루프 에이전트 활동",className:"min-w-0 space-y-6 p-4 text-lg min-[1440px]:text-[22px]",children:[(0,l.jsx)("div",{className:"grid grid-cols-2 gap-3 min-[1440px]:grid-cols-4",children:t.seats.map(e=>(0,l.jsxs)("article",{"aria-label":"".concat(e.seat," 자리"),className:"min-w-0 space-y-3 rounded-2xl border border-border bg-card p-3 min-[1440px]:p-6",children:[(0,l.jsx)("h2",{className:"font-bold",children:e.seat}),(0,l.jsx)("p",{className:"break-words","aria-label":"지금 하는 일",children:e.now}),(0,l.jsxs)("dl",{className:"space-y-1 text-base min-[1440px]:text-[22px]",children:[(0,l.jsxs)("div",{className:"flex flex-wrap justify-between gap-x-2",children:[(0,l.jsx)("dt",{children:"오늘 착지"}),(0,l.jsx)("dd",{children:e.landedToday})]}),(0,l.jsxs)("div",{className:"flex flex-wrap justify-between gap-x-2",children:[(0,l.jsx)("dt",{children:"막힘"}),(0,l.jsx)("dd",{children:e.blocked})]}),(0,l.jsxs)("div",{className:"flex flex-wrap justify-between gap-x-2",children:[(0,l.jsx)("dt",{children:"대표 결정 대기"}),(0,l.jsx)("dd",{children:e.decisionsWaiting})]})]})]},e.seat))}),(0,l.jsxs)("section",{"aria-label":"지금 도는 런",className:"min-w-0 rounded-2xl border border-border bg-card p-4",children:[(0,l.jsx)("h2",{className:"font-semibold",children:"지금 도는 런"}),n?(0,l.jsx)("p",{className:"text-muted-foreground",children:"못 읽음"}):0===t.runs.length?(0,l.jsx)("p",{className:"text-muted-foreground",children:"지금 도는 런이 없습니다"}):(0,l.jsx)("ul",{className:"mt-3 flex flex-wrap gap-3",children:t.runs.map((e,t)=>(0,l.jsxs)("li",{className:"min-w-0 break-words rounded-lg border border-border px-3 py-2",children:["런 ",e.id6," \xb7 ",e.stage," \xb7 경과 ","못 읽음"===e.elapsedSec?e.elapsedSec:"".concat(e.elapsedSec,"초")]},"".concat(e.id6,"-").concat(t)))})]}),(0,l.jsxs)("p",{className:"text-sm text-muted-foreground",children:["마지막 갱신 ",(0,l.jsx)("time",{dateTime:null!=r?r:void 0,children:r?new Date(r).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"}):"못 읽음"})]})]})}function B(){var e,t,n,s,a,i,d,c;let{client:p,config:m}=(0,u.Q)(),[f,h]=(0,r.useState)(null),[b,y]=(0,r.useState)("activity"),[g,v]=(0,r.useState)(null),[x,w]=(0,r.useState)(0),j="".concat(m.baseUrl,"\0").concat(m.token),k="".concat(j,"\0").concat(b),A=(null==f?void 0:f.source)===j?f:null,N=null!=(t=null==A||null==(e=A.seats)?void 0:e.seats.flatMap(e=>{var t,n;return null!=(n=null==(t=e.subSeats)?void 0:t.map(e=>e.id))?n:[]}))?t:[];(0,r.useEffect)(()=>{let e=!0,t=!1,n=(0,R.xX)({baseUrl:m.baseUrl,token:m.token});h({source:j,seats:null,runs:null,runsUnreadable:!0,refreshedAt:null});let l=async()=>{var l;if(!e||t||document.hidden)return;t=!0;let r=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),[s,a]=await Promise.allSettled([(0,C.Nn)(p,r),n.getHarnessRuns()]);if(t=!1,!e)return;let i="fulfilled"===s.status&&"ready"===s.value.kind?s.value.data:null,o="fulfilled"===a.status&&Array.isArray(null==(l=a.value)?void 0:l.entries)?a.value:null;h({source:j,seats:i,runs:o,runsUnreadable:null===o,refreshedAt:i||o?new Date().toISOString():null})};l();let r=window.setInterval(()=>{l()},1e4),s=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",s),()=>{e=!1,window.clearInterval(r),document.removeEventListener("visibilitychange",s)}},[p,m.baseUrl,m.token,j]),(0,r.useEffect)(()=>{if("map"!==b)return;let e=!0,t=!1;v(null),w(Date.now());let n=async()=>{if(!e||t||document.hidden)return;t=!0;let n=Date.now();try{let[t,l,r]=await Promise.all([(0,M.Em)(e=>p.fetchJson(e),n),p.fetchJson("/v1/schedules?includeOff=1&includeOwners=1"),p.fetchJson("/v1/loops/edges?since=".concat(encodeURIComponent(new Date(n-36e5).toISOString()),"&limit=200"))]),s=l.owners;if(!Array.isArray(s))throw Error("루프 주인 조회 실패");let a=function(e,t){let n=e&&"object"==typeof e&&"edges"in e?e.edges:null;if(!Array.isArray(n))throw Error("간선 조회 실패");return n.filter(e=>{if(!e||"object"!=typeof e||!F.has(e.kind)||"string"!=typeof e.at||"string"!=typeof e.from||"string"!=typeof e.to||"string"!=typeof e.ref)return!1;let n=Date.parse(e.at);return Number.isFinite(n)&&n<=t&&n>=t-36e5})}(r,n);e&&v(e=>{var l;return{source:k,rows:function(e,t,n){let l=new Map(t.flatMap(e=>e.jobs.map(t=>[t,e.owner]))),r=new Map(t.map(e=>[e.id,e.owner])),s=e.map(e=>{var t;return{...e,owner:null!=(t=e.id.startsWith("schedule:")?l.get(e.id.slice(9)):r.get(e.id.slice(5)))?t:"미지정"}});for(let e of t){var a,i,d,c,u,p,m;if(s.some(t=>t.id==="loop:".concat(e.id)))continue;let t=(0,O.u)({enabled:e.enabled,lastRunAt:null!=(c=null==(a=e.lastRun)?void 0:a.at)?c:null,lastStatus:null!=(u=null==(i=e.lastRun)?void 0:i.status.toLowerCase())?u:null,intervalMs:null},n);s.push({id:"loop:".concat(e.id),name:(0,o.t)(e.title),layer:"그래프",owner:null!=(p=e.owner)?p:"미지정",mode:"등록",lastRun:null!=(m=null==(d=e.lastRun)?void 0:d.at)?m:null,verdict:"alive"!==t||e.lastRun?E[t]:"판정 불가"})}return s}(t,s,n),edges:a,seenAt:(l=(null==e?void 0:e.source)===k?e.seenAt:null,Object.fromEntries(a.map(e=>{var t;let r=q(e);return[r,null!=(t=null==l?void 0:l[r])?t:null===l?n-1500:n]}))),state:"ready"}})}catch(t){e&&v(e=>({source:k,rows:(null==e?void 0:e.source)===k?e.rows:[],edges:(null==e?void 0:e.source)===k?e.edges:[],seenAt:(null==e?void 0:e.source)===k?e.seenAt:{},state:"error"}))}finally{t=!1}};n();let l=window.setInterval(()=>{n()},5e3),r=window.setInterval(()=>{document.hidden||w(Date.now())},250),s=()=>{document.hidden||n()};return document.addEventListener("visibilitychange",s),()=>{e=!1,window.clearInterval(l),window.clearInterval(r),document.removeEventListener("visibilitychange",s)}},[p,b,k]);let I=(null==g?void 0:g.source)===k?g:null;return(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{role:"group","aria-label":"루프 에이전트 보기",className:"flex gap-2 px-4 pt-4",children:[(0,l.jsx)("button",{type:"button","aria-pressed":"activity"===b,onClick:()=>y("activity"),className:"min-h-11 rounded-lg border border-slate-500 px-4 py-2 aria-pressed:bg-sky-800",children:"현황"}),(0,l.jsx)("button",{type:"button","aria-pressed":"map"===b,onClick:()=>y("map"),className:"min-h-11 rounded-lg border border-slate-500 px-4 py-2 aria-pressed:bg-sky-800",children:"지도"})]}),"activity"===b?(0,l.jsx)(Y,{view:A?(0,D.g)(A.seats,A.runs):J,runsUnreadable:null==(n=null==A?void 0:A.runsUnreadable)||n,refreshedAt:null!=(s=null==A?void 0:A.refreshedAt)?s:null}):(0,l.jsx)("div",{className:"min-w-0 p-4",children:(0,l.jsx)(X,{rows:null!=(a=null==I?void 0:I.rows)?a:[],edges:null!=(i=null==I?void 0:I.edges)?i:[],seatIds:["OP","MK","TC","UX",...N],seenAt:null!=(d=null==I?void 0:I.seenAt)?d:{},now:x,state:null!=(c=null==I?void 0:I.state)?c:"loading"})})]})}let H=/^\s*(승인|거부|반려|보류|허용|차단|중단|취소)(?=$|[\s.,!?;:])/;function $(e){let{decisions:t,now:n=Date.now()}=e,r=Object.values(t.missions).flat().filter(e=>"answer"===e.step).sort((e,t)=>Date.parse(t.ts)-Date.parse(e.ts)||t.seq-e.seq),s=r[0],a=s?Math.max(0,Math.floor((n-Date.parse(s.ts))/6e4)):null,i=r.flatMap(e=>{var t;let l=null==(t=H.exec(e.detail.answer))?void 0:t[1];return l&&n-Date.parse(e.ts)<3e5?[{item:e,outcome:l}]:[]});return(0,l.jsxs)("section",{"aria-label":"PTY 인텔리전스",className:"min-w-0 rounded-xl border border-slate-600 p-5 text-lg leading-relaxed min-[1440px]:text-[22px]",children:[(0,l.jsx)("h2",{className:"mb-5 font-semibold",children:"PTY 판단"}),0===i.length?(0,l.jsxs)("p",{role:"status",children:["지금 PTY 판단이 없습니다 — 마지막 판단 ",null===a?"기록 없음":"".concat(a,"분 전")]}):(0,l.jsx)("ol",{"aria-label":"최근 PTY 판단",className:"space-y-4",children:i.slice(0,3).map(e=>{let{item:t,outcome:n}=e;return(0,l.jsxs)("li",{className:"min-w-0 rounded-lg border border-slate-600 p-4",children:[(0,l.jsx)("time",{dateTime:t.ts,children:(0,o.t)(t.ts)})," \xb7 ",(0,o.t)(n)]},"".concat(t.missionId,":").concat(t.seq))})})]})}let Q=[{step:"request",label:"요청"},{step:"research",label:"조사"},{step:"draft",label:"초안"},{step:"validate",label:"검증"},{step:"install",label:"설치"},{step:"done",label:"끝"}],G={done:"border-green-500 bg-green-500/15 text-green-300",now:"border-sky-400 bg-sky-500/15 text-sky-200",todo:"border-slate-500 bg-slate-500/15 text-slate-300",failed:"border-red-500 bg-red-500/15 text-red-300"},V={done:"완료",now:"진행 중",todo:"대기",failed:"실패"};function ee(e){let{events:t}=e,n=function(e){if(0===e.length)return[];let t=e[e.length-1].wizardId,n=e.filter(e=>e.wizardId===t),l=n[n.length-1],r=Q.findIndex(e=>e.step===l.step);return Q.map((e,t)=>{let{step:s,label:a}=e,i=n.findLast(e=>e.step===s),o=(null==i?void 0:i.detail)!=null&&"object"==typeof i.detail&&!Array.isArray(i.detail)&&!1===i.detail.ok;return{step:s,label:a,state:"done"===l.step?"done":o?"failed":t<r?"done":t===r?"now":"todo",...i?{text:i.text,at:i.ts}:{}}})}(t);return(0,l.jsx)("section",{"aria-label":"마법사 → 마켓",className:"min-w-0 space-y-6 p-4 text-lg min-[1440px]:text-[22px]",children:0===n.length?(0,l.jsxs)("p",{children:["마법사가 아직 돌지 않았습니다 — ",(0,l.jsx)("code",{children:'elanous plugin make "<한 줄>"'})," 로 시작"]}):(0,l.jsx)("ol",{"aria-label":"마법사 단계",className:"grid grid-cols-1 gap-3 min-[900px]:grid-cols-6",children:n.map(e=>(0,l.jsxs)("li",{"data-wizard-step":e.step,"data-state":e.state,className:"min-w-0 rounded-xl border p-4 ".concat(G[e.state]),children:[(0,l.jsxs)("div",{className:"font-semibold",children:[e.label," ",(0,l.jsxs)("span",{className:"font-normal",children:["\xb7 ",V[e.state]]})]}),e.text&&(0,l.jsx)("p",{className:"mt-3 overflow-hidden text-ellipsis whitespace-nowrap",title:(0,o.t)(e.text),children:(0,o.t)(e.text)})]},e.step))})})}let et=e=>"".concat(e.wizardId,":").concat(e.step,":").concat(e.ts,":").concat(e.text);function en(){let{client:e}=(0,u.Q)(),[t,n]=(0,r.useState)(()=>({client:e,events:[]}));return(0,r.useEffect)(()=>{let t=!0;n({client:e,events:[]});let l=l=>{t&&l.length&&n(t=>({client:e,events:function(e,t){let n=new Map;for(let l of[...e,...t])n.set(et(l),l);return[...n.values()].sort((e,t)=>e.ts.localeCompare(t.ts)).slice(-50)}(t.client===e?t.events:[],l)}))},r=e.fetchJson;"function"==typeof r&&r.call(e,"/v1/logs?exactCategory=wizard.step&limit=".concat(50)).then(e=>{let t=null==e?void 0:e.logs;l(Array.isArray(t)?t.map(b).filter(e=>null!==e):[])}).catch(()=>{});let s=y(e,e=>l([e]));return()=>{t=!1,s()}},[e]),(0,l.jsx)(ee,{events:t.client===e?t.events:[]})}let el=["문서 아키텍처","라이브 트레이스","루프 에이전트","그래프 편집기","마법사 → 마켓","PTY 인텔리전스"],er=el.length,es="elanous.inside.demo";function ea(e){return null!==e&&/^[1-9]$/.test(e)&&Number(e)<=er?Number(e):1}function ei(){let e=(0,s.useSearchParams)();return(0,l.jsx)(eo,{search:e})}function eo(e){let{search:t,liveTrace:n=(0,l.jsx)(w,{}),editorScene:s=(0,l.jsx)(S,{}),loopScene:i=(0,l.jsx)(B,{}),wizardScene:d=(0,l.jsx)(en,{}),ptyScene:u=(0,l.jsx)(ed,{})}=e,[p,m]=(0,r.useState)(()=>ea(t.get("scene"))),[f,h]=(0,r.useState)(()=>"1"===t.get("demo")),b=(0,r.useRef)(null),y=(0,r.useRef)(p),g=(0,r.useRef)(f);y.current=p,g.current=f;let v=(0,r.useCallback)(e=>{let t=new URL(window.location.href);for(let[n,l]of Object.entries(e))t.searchParams.set(n,l);window.history.replaceState(window.history.state,"",t.toString())},[]),x=(0,r.useCallback)(e=>{e<1||e>er||(y.current=e,m(e),v({scene:String(e)}))},[v]),j=(0,r.useCallback)(()=>{let e=!g.current;g.current=e,h(e),v({demo:e?"1":"0"});try{window.localStorage.setItem(es,e?"1":"0")}catch(e){}},[v]);return(0,r.useEffect)(()=>{let e=t.get("demo"),n="1"===e;if(null===e)try{n="1"===window.localStorage.getItem(es)}catch(e){}else try{window.localStorage.setItem(es,n?"1":"0")}catch(e){}g.current=n,h(n);let l=ea(t.get("scene"));y.current=l,m(l)},[t]),(0,r.useEffect)(()=>{window.dispatchEvent(new window.Event("elanous:inside-demo"))},[f]),(0,r.useEffect)(()=>{let e=e=>{if(!(e.altKey||e.ctrlKey||e.metaKey||(0,a._i)(e.target))){if("ArrowLeft"===e.key||"ArrowRight"===e.key){e.preventDefault();let t="ArrowRight"===e.key?1:-1;x(Math.min(er,Math.max(1,y.current+t)))}else if("d"===e.key.toLowerCase())j();else if("f"===e.key.toLowerCase()){var t;"function"==typeof(null==(t=b.current)?void 0:t.requestFullscreen)&&b.current.requestFullscreen().catch(()=>{})}}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[x,j]),(0,l.jsxs)("main",{ref:b,"data-inside-page":!0,style:{width:"100%",minHeight:"100vh",minWidth:0,padding:20,boxSizing:"border-box",background:"#0c1828",color:"#f1f5fa",fontSize:18},children:[(0,l.jsx)("style",{children:'@media (min-width: 1440px) {\n [data-inside-page] h1 { font-size: 40px !important; }\n [data-inside-page] nav button { font-size: 22px !important; }\n [data-inside-page] [data-inside-scene="1"] [data-architecture-scene],\n [data-inside-page] [data-inside-scene="2"] section,\n [data-inside-page] [data-inside-scene="2"] header,\n [data-inside-page] [data-inside-scene="2"] button,\n [data-inside-page] [data-inside-scene="2"] .text-sm { font-size: 22px !important; }\n }'}),(0,l.jsxs)("header",{style:{display:"flex",alignItems:"center",gap:16},children:[(0,l.jsx)("h1",{style:{fontSize:28,margin:0},children:"엘라누스 안쪽"}),f&&(0,l.jsx)("span",{"aria-label":"시연 모드",style:{fontSize:18},children:"시연"})]}),(0,l.jsx)("nav",{"aria-label":"장면 선택",style:{display:"flex",minHeight:48,overflowX:"auto",gap:8,margin:"18px 0",whiteSpace:"nowrap"},children:el.map((e,t)=>(0,l.jsx)("button",{type:"button","aria-current":p===t+1?"page":void 0,onClick:()=>x(t+1),style:{flexShrink:0,minHeight:48,padding:"8px 16px",fontSize:18,borderRadius:8,border:"1px solid #7188a5",color:"#fff",background:p===t+1?"#22558b":"#203147"},children:(0,o.t)("".concat(t+1," ").concat(e))},e))}),el.map((e,t)=>(0,l.jsx)("section",{"data-inside-scene":t+1,hidden:p!==t+1,"aria-label":(0,o.t)("".concat(t+1," ").concat(e)),style:{minWidth:0},children:0===t?(0,l.jsx)(c,{}):1===t?n:2===t?i:3===t?s:4===t?d:u},e))]})}function ed(){let{client:e}=(0,u.Q)(),[t,n]=(0,r.useState)(()=>({client:e,decisions:m})),[s,a]=(0,r.useState)(()=>Date.now());return(0,r.useEffect)(()=>{let e=setInterval(()=>a(Date.now()),6e4);return()=>clearInterval(e)},[]),(0,r.useEffect)(()=>{let t=!0;n({client:e,decisions:m});let l=function(e,t){let n=e.logsStreamUrl({exactCategory:"pty.decision"});return n?(0,p.BX)(n,{events:{log:e=>{let n;try{n=JSON.parse(e.data)}catch(e){return}if(!n||"object"!=typeof n||Array.isArray(n))return;let l=n;if("pty.decision"!==l.category)return;let r=function(e){if(!f(e))return null;let{ts:t,missionId:n,seq:l,sessionId:r,terminalId:s,agent:a,step:i,text:o,detail:d}=e;if(!h(t)||!Number.isFinite(Date.parse(t))||!h(n)||!Number.isSafeInteger(l)||l<0||!h(r)||!h(s)||!h(a)||!h(o)||void 0!==d&&!f(d)||f(d)&&(void 0!==d.keys&&"string"!=typeof d.keys||void 0!==d.row&&(!Number.isSafeInteger(d.row)||d.row<0)))return null;let c={ts:t,missionId:n,seq:l,sessionId:r,terminalId:s,agent:a,text:o},u=f(d)?{...void 0!==d.keys?{keys:d.keys}:{},...void 0!==d.row?{row:d.row}:{}}:{};return"answer"===i?f(d)&&h(d.question)&&h(d.answer)?{...c,step:i,detail:{...u,question:d.question,answer:d.answer}}:null:"recover"===i?f(d)&&h(d.blocked)&&h(d.action)?{...c,step:i,detail:{...u,blocked:d.blocked,action:d.action}}:null:"done"===i?f(d)&&f(d.result)&&h(d.result.ref)&&("pr"===d.result.kind||"file"===d.result.kind||"text"===d.result.kind)?{...c,step:i,detail:{...u,result:{kind:d.result.kind,ref:d.result.ref}}}:null:"read"===i||"judge"===i||"input"===i?{...c,step:i,...void 0!==d?{detail:u}:{}}:null}(l.data);r&&l.event===r.step&&t(r)}}}):()=>{}}(e,l=>{t&&n(t=>({client:e,decisions:function(e,t){let n=Object.hasOwn(e.missions,t.missionId)?e.missions[t.missionId]:[];if(n.some(e=>e.seq===t.seq))return e;let l=[...n,t].sort((e,t)=>e.seq-t.seq),r={...e.missions,[t.missionId]:l},s=e.currentMissionId?r[e.currentMissionId]:void 0,a=l.at(-1),i=null==s?void 0:s.at(-1);return{missions:r,currentMissionId:!i||Date.parse(a.ts)>Date.parse(i.ts)?t.missionId:e.currentMissionId}}(t.client===e?t.decisions:m,l)}))});return()=>{t=!1,l()}},[e]),(0,l.jsx)($,{decisions:t.client===e?t.decisions:m,now:s})}},18912:(e,t,n)=>{Promise.resolve().then(n.bind(n,9407))},29325:(e,t,n)=>{"use strict";function l(e,t){if(!e.enabled||"off"===e.scheduleState)return"off";if("failed"===e.lastStatus||"error"===e.lastStatus||"failure"===e.lastStatus||"abandoned"===e.lastStatus||"expired"===e.lastStatus)return"failed";if("stale"===e.scheduleState)return"late";let n=null===e.lastRunAt?NaN:Date.parse(e.lastRunAt);if(void 0!==e.secondDueAt){let l=null===e.secondDueAt?NaN:Date.parse(e.secondDueAt);return Number.isFinite(n)&&Number.isFinite(t)&&Number.isFinite(l)&&l>n&&t>l?"late":"alive"}return Number.isFinite(t)&&Number.isFinite(n)&&null!==e.intervalMs&&Number.isFinite(e.intervalMs)&&e.intervalMs>0&&t-n>2*e.intervalMs?"late":"alive"}n.d(t,{u:()=>l})},40385:(e,t,n)=>{"use strict";n.d(t,{g:()=>i,q:()=>a});var l=n(81969);let r=[{id:"OP",seat:"COO"},{id:"MK",seat:"CMO"},{id:"TC",seat:"CTO"},{id:"UX",seat:"CXO"}];function s(e){return(0,l.t)(e.replace(/\s+/g," ")).trim()}function a(e){var t;let n=e.split("\n"),l=(e,t)=>{let n=e.trim();return t&&(n=(n=n.replace(/^\*\*\[[^\]]+\]\*\*\s*/,"")).replace(/^(?:📌\S*\s*)?\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}\s*KST\s*/,"")),s(n=(n=(n=(n=(n=(n=n.replace(/^→\s*(?:[A-Z]{1,4}|전원|전체)(?=\s|·|$)(?:\s*·\s*(?:[A-Z]{1,4}|전원|전체)(?=\s|·|$))*\s*(?:·)?\s*/u,"")).replace(/^—\s*/,"")).replace(/^[-*]\s+/,"").replace(/\*\*|`|__/g,"").replace(/^#+\s*/,"").trim()).replace(/^(?:보고|요청|정정|결정|사고|안내)\s*·\s*/,"")).replace(RegExp("^(?:\\p{Extended_Pictographic}\\uFE0F?)+\\s*","u"),"")).replace(/^(?:보고|요청|정정|결정|사고|안내)\s*·\s*/,""))},r=l(null!=(t=n[0])?t:"",!0);if(r)return r;let a=n.slice(1).find(e=>e.trim());return a?l(a,!1):""}function i(e,t){var n;let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now();return{seats:r.map(t=>{var n;let{id:l,seat:r}=t,s=null==e?void 0:e.seats.find(e=>e.seat===l);return{seat:r,now:(null==s?void 0:s.now)&&Array.from(a(s.now.text)).slice(0,40).join("")||"못 읽음",landedToday:(null==s?void 0:s.landed)==null?"못 읽음":s.landed.length,blocked:(null==s?void 0:s.blocked)==null?"못 읽음":s.blocked.length,decisionsWaiting:null!=(n=null==s?void 0:s.pendingDecisions)?n:"못 읽음"}}),runs:(null!=(n=null==t?void 0:t.entries)?n:[]).filter(e=>"running"===e.status).sort((e,t)=>{var n,l;return(Date.parse(null!=(n=t.lastActivityTimestamp)?n:"")||0)-(Date.parse(null!=(l=e.lastActivityTimestamp)?l:"")||0)}).slice(0,6).map(e=>{var t;let n=Date.parse(null!=(t=e.lastActivityTimestamp)?t:"");return{id6:function(e){let t=e.replace(/^run-/i,"");return/^[a-z0-9]{6}/i.test(t)&&s(t.slice(0,6))||"못 읽음"}(e.runId),stage:s(e.lastPhase||e.status)||"못 읽음",elapsedSec:Number.isFinite(n)?Math.max(0,Math.floor((l-n)/1e3)):"못 읽음"}})}}},42006:(e,t,n)=>{"use strict";n.d(t,{i6:()=>s,Pz:()=>i,Em:()=>a,Yy:()=>o});var l=n(29325);let r={alive:"살아 있음",late:"늦음",failed:"실패",off:"꺼짐"},s="/v1/schedules?includeOff=1";async function a(e,t){var n,a,i,d,c,u,p,m;let[f,h]=await Promise.allSettled([e(s),e("/v1/dashboard/loops")]),b="fulfilled"===f.status?null==(n=f.value)?void 0:n.schedules:null,y="fulfilled"===h.status?null==(i=h.value)||null==(a=i.loops)?void 0:a.loops:null;if(!Array.isArray(b)&&!Array.isArray(y))throw Error("loop registries unavailable");if(!Array.isArray(b))throw Error("스케줄 레지스트리 조회 실패");if(!Array.isArray(y))throw Error("루프 레지스트리 조회 실패");let g=o(b,t).map(e=>({...e,id:"schedule:".concat(e.id)}));for(let e of y){let n=e.last?Date.parse(e.last.at):NaN,s=(0,l.u)({enabled:!1!==e.armed,lastRunAt:null!=(u=null==(d=e.last)?void 0:d.at)?u:null,lastStatus:null!=(p=null==(c=e.last)?void 0:c.status.toLowerCase())?p:null,intervalMs:null},t);g.push({id:"loop:".concat(e.name),name:e.label,layer:null!=(m=e.category)?m:"루프",owner:"미지정",mode:null===e.armed?"관측":e.armed?"armed":"off",lastRun:Number.isFinite(n)?e.last.at:null,verdict:"alive"===s?"판정 불가":r[s]})}return g}function i(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now,l=0,r=!0;return{async refresh(){let s=++l;try{let i=await a(e,n());r&&s===l&&t({rows:i,state:"ready"})}catch(e){r&&s===l&&t({rows:[],state:"error"})}},dispose(){r=!1}}}function o(e,t){return e.map(e=>{var n,s,a,i,o,d,c;let u=e.lastRun?Date.parse(e.lastRun.at):NaN,p=(0,l.u)({enabled:"off"!==e.state,lastRunAt:null!=(d=null==(n=e.lastRun)?void 0:n.at)?d:null,lastStatus:(null==(s=e.lastRun)?void 0:s.exit)!=null&&0!==e.lastRun.exit?"failed":(null==(a=e.lastRun)?void 0:a.status)==null||["ok","success","completed"].includes(e.lastRun.status.toLowerCase())?null!=(c=null==(o=e.lastRun)||null==(i=o.status)?void 0:i.toLowerCase())?c:null:"failed",intervalMs:e.cron?null:e.intervalMs,...e.cron?{scheduleState:e.state}:{}},t),m=!e.cron&&!(e.intervalMs&&e.intervalMs>0),f="alive"===p&&(!Number.isFinite(u)||m)?"판정 불가":r[p];return{id:e.id,name:e.name,layer:e.domain||e.category||e.source,owner:"미지정",mode:e.runVia||e.source,lastRun:Number.isFinite(u)?e.lastRun.at:null,verdict:f}})}},43537:(e,t,n)=>{"use strict";function l(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function r(e){return"string"==typeof e}function s(e){return r(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 a(e){return l(e)&&r(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&r(e.summary)}function i(e){return l(e)&&r(e.runId)&&r(e.status)&&r(e.startedAt)&&(null===e.version||r(e.version))&&Array.isArray(e.path)&&e.path.every(r)&&Array.isArray(e.nodes)&&e.nodes.every(a)}function o(e){return l(e)&&r(e.id)&&r(e.title)&&r(e.status)&&(void 0===e.owner||r(e.owner))&&r(e.updatedAt)&&(void 0===e.evidence||r(e.evidence))}n.d(t,{HG:()=>b,Kh:()=>h,Nn:()=>m,oc:()=>f});let d=e=>Number.isInteger(e)&&e>=0;function c(e){return l(e)&&r(e.id)&&r(e.title)&&(null===e.open||d(e.open))&&(null===e.landed||d(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>l(e)&&r(e.id)&&r(e.title)))}function u(e){return l(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||r(e.role))&&(null===e.now||l(e.now)&&r(e.now.text)&&r(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>l(e)&&d(e.pr)&&r(e.title)&&r(e.at)&&(null===e.checklistId||r(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>l(e)&&r(e.id)&&r(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||d(e.pendingDecisions))&&(null===e.checklist||l(e.checklist)&&["green","yellow","red","done"].every(t=>d(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(c))}async function p(e,t,n){try{let l=await e.fetchResponse(t,{method:"GET"});if(403===l.status)return{kind:"forbidden"};if(!l.ok)return{kind:"error",status:l.status};let r=n(await l.json());return null===r?{kind:"error",status:l.status}:{kind:"ready",data:r}}catch(e){return{kind:"error",status:0}}}function m(e,t){return p(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>l(e)&&r(e.date)&&Array.isArray(e.seats)&&e.seats.every(u)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function f(e,t){return p(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(i)?e:null)}function h(e,t,n){return p(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>l(e)&&r(e.log)?{log:e.log}:null)}function b(e,t){return p(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,a,i;if(!(l(e)&&r(e.version)&&(void 0===e.codename||r(e.codename))&&Array.isArray(e.items)&&e.items.every(o)&&["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(r))&&(void 0===e.byOwner||l(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let d={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in d&&d[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:l(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:d.green,yellow:null!=(n=e.yellow)?n:d.yellow,red:null!=(a=e.red)?a:d.red,done:null!=(i=e.done)?i:d.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},58298:(e,t,n)=>{"use strict";function l(e){return e.metaKey||e.ctrlKey}function r(e){let t=e.key.toLowerCase();return!l(e)||e.shiftKey||e.altKey||"k"!==t?l(e)&&e.shiftKey&&!e.altKey&&"j"===t?e.fromEditable?null:"toggle-role-judge":l(e)&&e.shiftKey&&!e.altKey&&"m"===t?e.fromEditable?null:"toggle-voice":l(e)&&e.shiftKey&&!e.altKey&&"y"===t?e.fromEditable?null:"toggle-tts":"?"!==e.key||l(e)||e.altKey?null:e.fromEditable?null:"open-help":"focus-broadcast-input"}function s(e){var t;if(!e)return!1;let n=e.tagName;if(!n)return!1;if("INPUT"===n||"TEXTAREA"===n||"SELECT"===n)return!0;let l=null==(t=e.getAttribute)?void 0:t.call(e,"contenteditable");return""===l||"true"===l}n.d(t,{ZQ:()=>r,_i:()=>s,nm:()=>a});let a=[{id:"focus-broadcast-input",combo:"⌘K / Ctrl+K",effect:"Focus broadcast input"},{id:"toggle-role-judge",combo:"⌘⇧J / Ctrl+⇧J",effect:"Toggle role-judge backend"},{id:"toggle-voice",combo:"⌘⇧M / Ctrl+⇧M",effect:"Toggle voice mode (mic)"},{id:"toggle-tts",combo:"⌘⇧Y / Ctrl+⇧Y",effect:"Toggle TTS mute"},{id:"open-help",combo:"?",effect:"Open this help overlay"}]},81969:(e,t,n)=>{"use strict";n.d(t,{t:()=>u});let l=/\brun-([0-9a-f]{8})-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,r=/(?:\/(?:Users|home|private)\/[\w.%@+~/-]+|\b[A-Za-z]:\\(?:[^\\\s,;<>"']+\\)*[^\\\s,;<>"']+)/g,s=/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,a=RegExp("(?<![A-Za-z0-9_-])(?:[A-Za-z0-9_]{40,}|(?:sk|ghp|gho|ghs|github_pat|xox[abpr])[-_][A-Za-z0-9_-]{20,})(?![A-Za-z0-9_-])","g"),i=/\b(?:OP|MK|TC|UX)\b/g,o=/\bmsb(\d+)\b/gi,d=/(?:\u{1F451}|🪑|🅞|🅜|🅣|🅤|🅢|🅕)\uFE0F?/gu,c={OP:"COO",MK:"CMO",TC:"CTO",UX:"CXO"};function u(e){let t,n=e;do t=n,n=n.replace(l,(e,t)=>"run-".concat(t.slice(0,6))).replace(r,"").replace(s,"").replace(d,"").replace(a,"").replace(i,e=>c[e]).replace(o,(e,t)=>"remote-".concat(t));while(n!==t&&function(e){return[l,r,s,a,i,d,o].flatMap(t=>[...e.matchAll(t)].map(e=>e[0]))}(n).length>0);return n}}},e=>{e.O(0,[9901,9182,3324,1844,1866,8868,8060,9247,8949,4554,2463,2196,7358],()=>e(e.s=18912)),_N_E=e.O()}]);
|