elanous 0.2.12 → 0.2.13
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/{1394-ee3795b112907122.js → 1394-931c9827067b2276.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3992-2e522a8ac5f2afde.js → 3992-fe5c06d6b31f8b25.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5250-c78ca295585bbf95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6511-ff8360be3d65aaa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6588-ba380869b67c4fa7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7758-0b018a9e4fc56200.js → 7758-85c2b53f731da024.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8605-0259994816604c49.js → 8605-9da4678f8a310d18.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9906-e7b8b5310a169dfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/{page-cb169620945d1952.js → page-e5b4e1b256f41076.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-cefe8169e36cf62a.js → page-e49b9b76c565a0b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b4f032c893b21cc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f14987d5850a31e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-b433308aad13ceb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-813c4a52c9d05ca8.js → page-4c1dbb21861beab2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-4731f2c215358937.js → page-c85b816e3b269dbb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/{page-a022b257950f39e6.js → page-f6bc66b919b2ea7d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-a2ffc717e04b8b0a.js → page-60603c1e056c9b25.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-b59ee4e70fc18fcf.js → page-a0ea8f5a2341ee6b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-45c5bf04b4a605e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/{page-c172dabd796eb7a3.js → page-36c6c4183353ac9e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/{page-1efd0cb9e0ed9d13.js → page-cb2eb0fd809980da.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-d5dc7ff69a37b4cf.js → page-31012264da8a341f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-50309aeb0bdd554a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-bc00e964e855f4df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/{page-dfca9b7d2de0b135.js → page-0696ee3fac9fe56c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-793fa536b3a6ef37.js → page-66c27608f651b866.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-6dd3bfbbde2a5c2c.js → page-6ddd2109b7fc3a80.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-4e50b7298c1f69a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/{page-77447356baad75d2.js → page-7a2bf830038a2264.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1f327f18694fabca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-e5cef2fe6e4028df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cf596128d2b420ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-6d604227e1664b71.js → page-f672536f14f0969f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b52365662232db89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-4048543b4b7ad5e0.js → page-e7a6c80f288b1948.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-4c3a3126abed551a.js → page-29a709616df9b050.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/{page-64b0aecb1ca75e75.js → page-fee842d7c2151129.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-78b40a344ed22f24.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-75d199f448171014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a011dd5b0bff29c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-9547b5cec7cf76bf.js → page-d92e32d51ab5157e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-5f21aed6932ef375.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-1e1a53946804debf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/{page-2cddeb9e2aeedc55.js → page-a1833cd43d832601.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/term/{page-e297866051595d81.js → page-63d14a4d8fe1e1c1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/{page-baba2e047872fb0f.js → page-2a511d320f762e06.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/{page-e895da4ec9cac345.js → page-1c3e03f88dac1e21.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-c4d5289c2ea97a89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b91f8952deaeaf27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-71b43a2588489987.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-2e9e2fb01c9da1c9.js → page-2b256feed331546f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-d62ceb13411ebba4.js → page-505bb96d69a8622c.js} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +13 -13
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +13 -13
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +13 -13
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +13 -13
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +13 -13
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +13 -13
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +13 -13
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +13 -13
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +13 -13
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +13 -13
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +13 -13
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +13 -13
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +13 -13
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +13 -13
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +13 -13
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +13 -13
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +13 -13
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +13 -13
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +13 -13
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +13 -13
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +13 -13
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +13 -13
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +13 -13
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +13 -13
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +14 -14
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +13 -13
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +13 -13
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +13 -13
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +13 -13
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +13 -13
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +13 -13
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +13 -13
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +13 -13
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +13 -13
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +13 -13
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +13 -13
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +13 -13
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +13 -13
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +13 -13
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +13 -13
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +13 -13
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +13 -13
- package/examples/teams/personas/backend.yaml +4 -0
- package/examples/teams/personas/pm.yaml +4 -0
- package/examples/teams/personas/qa.yaml +4 -0
- package/examples/teams/small-product.yaml +20 -0
- package/graphs/lecture/lecture-note.yaml +28 -0
- package/graphs/lecture/recipes.yaml +17 -0
- package/package.json +2 -1
- package/scripts/context-hooks/emit.ts +36 -14
- package/scripts/coord-channel-watch.sh +1 -0
- package/scripts/discord-seat-probe.ts +144 -0
- package/scripts/hq/hq-standby.sh +65 -0
- package/scripts/hq/standby-promote.ts +173 -0
- package/scripts/hq/standby-role.ts +59 -0
- package/scripts/hq/standby-snapshot.ts +226 -0
- package/scripts/hq/standby-verify.ts +219 -0
- package/scripts/lecture-note/node.ts +256 -0
- package/scripts/release-loop/gate-node.ts +53 -15
- package/scripts/release-loop/ops-upgrade-node.ts +17 -5
- package/scripts/test-deterministic.ts +53 -3
- package/skills/omni-crawl/SKILL.md +16 -16
- package/skills/omni-crawl/package-lock.json +1 -544
- package/skills/omni-crawl/package.json +3 -4
- package/skills/omni-crawl/scripts/main.ts +13 -13
- package/skills/omni-crawl/scripts/monitor.ts +8 -8
- package/skills/omni-crawl/src/apify.ts +13 -2
- package/skills/omni-crawl/src/capture.ts +6 -0
- package/skills/omni-crawl/src/registry.ts +2 -2
- package/skills/omni-crawl/src/stdout-json.ts +4 -0
- package/skills/omni-digest/SKILL.md +10 -11
- package/skills/omni-digest/package-lock.json +0 -545
- package/skills/omni-digest/package.json +2 -5
- package/skills/omni-digest/scripts/main.ts +3 -3
- package/skills/omni-digest/src/delegate.ts +5 -5
- package/skills/omni-digest/src/fetch.ts +2 -2
- package/skills/omni-digest/src/media.ts +25 -11
- package/skills/omni-digest/src/visual.ts +3 -2
- package/skills/omni-market/scripts/main.ts +1 -1
- package/skills/omni-market/scripts/stdout-json.ts +4 -0
- package/src/agent/identity-env.ts +11 -0
- package/src/agent-mission/driver.ts +12 -7
- package/src/agent-mission/duo.ts +94 -0
- package/src/agent-mission/pty-decision.ts +1 -1
- package/src/autopilot/track-agent-shadow.ts +2 -1
- package/src/autopilot/track-agent.ts +4 -1
- package/src/boot/daemon-prompt-request.ts +3 -0
- package/src/boot/daemon-prompt-turn.ts +6 -2
- package/src/boot/daemon-runtime.ts +48 -16
- package/src/cli/decisions-cli.ts +51 -19
- package/src/cli/outputs-cli.ts +92 -0
- package/src/cli/persona-cli.ts +29 -0
- package/src/cli/pod-cli.ts +10 -3
- package/src/cli/pr-cli.ts +15 -1
- package/src/cli/release-cli.ts +108 -28
- package/src/context-bus/condense.ts +194 -0
- package/src/context-bus/context-day.ts +82 -0
- package/src/context-bus/context-now-surfaces.ts +15 -2
- package/src/context-bus/long-term-memory.ts +118 -22
- package/src/context-bus/nightly-condense.ts +1 -1
- package/src/decisions/decision-cards.ts +13 -7
- package/src/decisions/decision-ledger.ts +43 -17
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/graph-approval-card.ts +2 -2
- package/src/graph-runner/graph-grow.ts +64 -11
- package/src/graph-runner/graph-tick.ts +9 -2
- package/src/graph-runner/runner.ts +81 -17
- package/src/harness/harness-cli-command.ts +27 -1
- package/src/harness/harness-queue-child.ts +37 -0
- package/src/harness/harness-queue.ts +306 -0
- package/src/hooks/github-shadow.ts +72 -2
- package/src/hooks/receiver.ts +4 -2
- package/src/hq/hq.ts +318 -0
- package/src/hq/lease.ts +210 -0
- package/src/hq/ledger-write-target.ts +41 -0
- package/src/index.ts +199 -7
- package/src/intake-plane/discord-seat-work.ts +13 -6
- package/src/intake-plane/linear-wish.ts +44 -0
- package/src/intake-plane/persona-answer.ts +5 -0
- package/src/intake-plane/telegram-seat-work.ts +13 -6
- package/src/intake-plane/wish-card.ts +1 -1
- package/src/loops/checker.ts +178 -0
- package/src/loops/loop-cli.ts +37 -3
- package/src/loops/observe.ts +49 -0
- package/src/loops/orchestrator/overlap.ts +141 -0
- package/src/loops/orchestrator/traffic.ts +150 -0
- package/src/loops/package/verify.ts +125 -0
- package/src/loops/verdict.ts +22 -0
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/memory.ts +37 -4
- package/src/nexus/api/card-followup-route.ts +118 -0
- package/src/nexus/api/decisions-route.ts +68 -0
- package/src/nexus/api/http-server.ts +47 -0
- package/src/nexus/api/personas.ts +2 -1
- package/src/nexus/api/skill-exec-route.ts +97 -0
- package/src/persona/loader.ts +18 -0
- package/src/persona/persona-todo.ts +14 -9
- package/src/persona/presets.ts +2 -1
- package/src/persona/team.ts +105 -0
- package/src/persona/types.ts +4 -0
- package/src/pod-lease/host-lease.ts +130 -20
- package/src/release-loop/landed-but-yellow.ts +12 -0
- package/src/seat-dispatch/seat-ask.ts +57 -12
- package/src/seat-loop/seat-loop.ts +90 -16
- package/src/seat-loop/seat-pack.ts +127 -0
- package/src/self-dev/ask-launch-flow.ts +3 -0
- package/src/self-implement/l8-merge-queue.ts +157 -1
- package/src/steward/launch.ts +5 -1
- package/src/steward/readiness.ts +125 -0
- package/src/steward/rescue.ts +75 -0
- package/src/steward/triage.ts +48 -9
- package/src/task-cards/card-cli.ts +78 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +18 -6
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -10
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +38 -8
- package/src/telegram-dispatch-forward.ts +1 -1
- package/src/telegram-fabric-plan.ts +90 -0
- package/src/telegram-project-command.ts +10 -4
- package/src/telegram.ts +5 -0
- package/src/tool-runtime/elanous-control-runtimes.ts +2 -1
- package/src/user-config.ts +94 -10
- package/src/version/packed-revision.json +1 -1
- package/src/workflow-runtime/executor.ts +4 -0
- package/src/workflow-runtime/node-catalog.ts +13 -0
- package/src/workflow-runtime/nodes/knowledge.ts +38 -0
- package/src/workflow-runtime/schema.ts +17 -1
- package/src/workflow-runtime/types.ts +13 -1
- package/apps/pwa/out/_next/static/chunks/1147-466ec15afacc1a65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7277-0b2fc7c16ba2d64b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9920-5cfdc5e8fd209825.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d2e35228bc497119.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5c05b0da4bc1392c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e0ccdb576812b523.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a67e11ba962337b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-e71c84189e8c683e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-1d6a533ce5a6efcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-490653e8d4cc8852.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-29e961191f6057df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-c822f55b884d9104.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fa4ccfc432424e52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-9c7e8f744a765daf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4292d0149020e8a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-db14d0be7f1c460c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-e5d8072cd7cfef73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e6dcb83265530636.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-45248f08d6aecae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4344faf20216233b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-698bb29f11864b89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-bd6a6dc1ddc273f2.js +0 -1
- /package/apps/pwa/out/_next/static/{-6XrAoD3eU7NyMHAE4xPS → D51l8jUBplJrIpWvENsDK}/_buildManifest.js +0 -0
- /package/apps/pwa/out/_next/static/{-6XrAoD3eU7NyMHAE4xPS → D51l8jUBplJrIpWvENsDK}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{1355:(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}},10080:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(54456),a=n(80247),s=n(13680),l=n(74591);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function i(e){let{className:t,variant:n="default",size:s="default",...i}=e;return(0,r.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(o({variant:n,size:s,className:t})),...i})}},26486:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>h});var r=n(54456),a=n(60500),s=n(36581),l=n(10080),o=n(71829),i=n(83750);function d(e){var t,n,r,a,s,l,o,i,d,u,c,m,x,g,p,f;return{id:e.id,name:e.name,cron:e.cron,intervalMs:e.intervalMs,category:null!=(l=e.category)?l:e.source,domain:null!=(o=e.domain)?o:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(i=e.runVia)?i:e.source,lastRun:null!=(d=null==(t=e.lastRun)?void 0:t.at)?d:null,lastStatus:null!=(u=null==(n=e.lastRun)?void 0:n.status)?u:null,lastExit:null!=(m=null!=(c=null==(r=e.lastRun)?void 0:r.exit)?c:e.lastExit)?m:null,lastDurationMs:null!=(x=null==(a=e.lastRun)?void 0:a.durationMs)?x:null,lastVia:null!=(g=null==(s=e.lastRun)?void 0:s.via)?g:null,stale:"stale"===e.state,command:null!=(p=e.command)?p:"",note:null!=(f=e.note)?f:null,state:e.state,next:e.next,flags:e.flags}}async function u(e){let t="Unknown error";for(let n of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let r=function(e){if(!e||"object"!=typeof e)return null;if(Array.isArray(e.schedules))return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString(),n=e.map(d),r={},a={},s={};for(let e of n){var l,o,i;r[e.category]=(null!=(l=r[e.category])?l:0)+1,a[e.source]=(null!=(o=a[e.source])?o:0)+1,e.state&&(s[e.state]=(null!=(i=s[e.state])?i:0)+1)}return{total:n.length,adopted:n.filter(e=>"elanous"===e.runVia).length,byCategory:r,bySource:a,byState:s,jobs:n,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(n));if(r)return{kind:"ready",data:r};t="unexpected response from ".concat(n)}catch(e){t=e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}return{kind:"error",reason:t}}let c={live:{label:"켜짐",tone:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",tip:"실제 발화 경로(crontab\xb7launchd\xb7trigger)에 올라 있다"},firing:{label:"발화 중",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30",tip:"발화 경로에 올라 있고 최근 실행 기록이 있다"},stale:{label:"유실 의심",tone:"bg-amber-500/15 text-amber-300 ring-amber-500/30",tip:"예정 시각이 지났는데 실행 기록이 없다"},off:{label:"꺼짐",tone:"bg-muted text-muted-foreground ring-border",tip:"어느 발화 경로에도 없다(레지스트리에만 있다)"}},m={elanous:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",daemon:"bg-sky-500/15 text-sky-200 ring-sky-500/30",crontab:"bg-muted text-muted-foreground ring-border"},x={finance:"Finance",elanous:"elanous (core)",general:"General"};function g(e){let{label:t,onClick:n,disabled:a,danger:s}=e;return(0,r.jsx)("button",{type:"button",onClick:n,disabled:a,className:["rounded-md px-1.5 py-0.5 text-[10px] ring-1 transition-colors disabled:opacity-40",s?"text-red-300 ring-red-500/30 hover:bg-red-500/15":"text-muted-foreground ring-border hover:bg-accent/40 hover:text-foreground"].join(" "),children:t})}function p(e){var t,n,a,s,l,o,i;let{job:d,onAction:u,acting:x}=e,p="daemon"===d.runVia||d.id.includes(":"),f=d.state?c[d.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let n=Math.round((t-Date.now())/6e4);if(n<1)return"next <1m";if(n<60)return"next ".concat(n,"m");let r=Math.floor(n/60);return r<24?"next ".concat(r,"h"):"next ".concat(Math.floor(r/24),"d")}(null==(t=d.next)?void 0:t[0]),h=d.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),n=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(n){let e=n[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let r=e.lastIndexOf("/");return r>=0?e.slice(r+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(d.command),v=d.note?"".concat(d.note,"\n\n").concat(d.command):d.command;return(0,r.jsxs)("div",{className:["flex flex-col gap-1 rounded-xl border border-border bg-card p-3 sm:flex-row sm:items-center sm:justify-between",d.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"truncate text-sm font-medium",children:d.name}),f?(0,r.jsx)("span",{className:"shrink-0 whitespace-nowrap rounded-full px-1.5 py-0.5 text-[10px] ring-1 ".concat(f.tone),title:f.tip,"data-schedule-state":d.state,children:f.label}):!d.enabled&&(0,r.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(n=d.flags)?void 0:n.includes("duplicate"))&&(0,r.jsx)("span",{className:"rounded-full bg-red-500/15 px-1.5 py-0.5 text-[10px] text-red-300 ring-1 ring-red-500/30",title:"같은 명령이 두 번 발화한다",children:"duplicate"})]}),(0,r.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(d.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,r.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:d.cron?d.cron:d.intervalMs?"every ".concat(Math.round(d.intervalMs/1e3),"s"):"—"}),b&&d.enabled&&(0,r.jsx)("span",{className:"text-muted-foreground",title:null==(a=d.next)?void 0:a.join("\n"),children:b}),(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:d.category}),(0,r.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=m[d.runVia])?s:m.crontab),children:d.runVia}),d.lastStatus&&(0,r.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===d.lastStatus?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-red-500/15 text-red-300 ring-red-500/30"),title:null!=(o=d.lastError)?o:"ok"===d.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=d.lastExit)?l:"?"),children:["ok"===d.lastStatus?"✓":"✗",null!=d.lastDurationMs?" ".concat(Math.round(d.lastDurationMs),"ms"):"",d.lastVia&&"crontab"!==d.lastVia?" ".concat(d.lastVia):""]}),d.stale&&!f&&(0,r.jsx)("span",{className:"rounded-full bg-amber-500/15 px-2 py-0.5 text-amber-300 ring-1 ring-amber-500/30",title:"예정 시각이 지났는데 미실행(유실 의심)",children:"stale"}),(0,r.jsx)("span",{className:"text-muted-foreground",title:null!=(i=d.lastRun)?i:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<60)return"".concat(n,"s ago");let r=Math.floor(n/60);if(r<60)return"".concat(r,"m ago");let a=Math.floor(r/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(d.lastRun)}),!p&&(0,r.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===d.runVia&&(0,r.jsx)(g,{label:"adopt",onClick:()=>u("adopt",d),disabled:x}),"elanous"===d.runVia&&(0,r.jsx)(g,{label:"release",onClick:()=>u("release",d),disabled:x}),(0,r.jsx)(g,{label:d.enabled?"disable":"enable",onClick:()=>u(d.enabled?"disable":"enable",d),disabled:x}),(0,r.jsx)(g,{label:"✕",onClick:()=>u("delete",d),disabled:x,danger:!0})]})]})]})}function f(e){let{load:t,groups:n,onRefresh:a,onAction:s,busy:o,acting:i}=e;return"loading"===t.kind?(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,r.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,r.jsx)("p",{children:"Failed to load schedules"}),(0,r.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,r.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:o,children:"Retry"})]}):0===t.data.jobs.length?(0,r.jsx)("div",{className:"rounded-xl border border-dashed border-border px-3 py-10 text-center text-sm text-muted-foreground",children:"no schedules"}):(0,r.jsx)("div",{className:"space-y-6",children:n.map(e=>{var t;return(0,r.jsxs)("section",{className:"space-y-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=x[e.domain])?t:e.domain}),(0,r.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,r.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,r.jsx)(p,{job:e,onAction:s,acting:i},e.id))})]},e.domain)})})}function b(){let{client:e}=(0,s.Q)(),[t,n]=(0,a.useState)({kind:"loading"}),[d,m]=(0,a.useState)(!1),[x,g]=(0,a.useState)(!1),p=(0,a.useRef)(0),b=(0,a.useRef)(null),h="ready"===t.kind?t.data:null,[v,y]=(0,a.useState)(null);(0,a.useEffect)(()=>{y(function(e){let t=new URLSearchParams(e).get("ids");if(!t)return null;let n=t.split(",").map(e=>e.trim()).filter(Boolean);return n.length?n:null}(window.location.search))},[]);let j=(0,a.useCallback)(async()=>{var t,r,a,s,l;if(b.current===e)return;b.current=e;let i=++p.current;m(!0),n({kind:"loading"});try{let s=await u(t=>e.fetchJson(t));t=p.current,r=b.current,i===t&&r===e&&(n(s),"error"===s.kind&&(a=s.reason,(0,o.oR.error)("scheduler load failed: ".concat(a))))}finally{s=p.current,l=b.current,i===s&&l===e&&(b.current=null,m(!1))}},[e]),k=(0,a.useCallback)(async(t,n,r)=>{if("delete"!==t||window.confirm("삭제: ".concat(n.name,"?\n(자동 백업되어 복구 가능)"))){g(!0);try{let a=await e.fetchJson("/v1/schedules/action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,id:n.id,...void 0!==r?{note:r}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?o.oR.error("".concat(t," 실패: ").concat(a.error)):(o.oR.success("note"===t?"설명 저장: ".concat(n.name):"".concat(t,": ").concat(n.name)),await j())}catch(e){o.oR.error("".concat(t," 실패: ").concat(e instanceof Error?e.message:e))}finally{g(!1)}}},[e,j]);(0,a.useEffect)(()=>{j();let e=window.setInterval(()=>void j(),3e4);return()=>window.clearInterval(e)},[j]);let N=(0,a.useMemo)(()=>{if(!h)return[];let e=new Map;for(let r of h.jobs){var t,n;if(v&&!v.includes(r.id))continue;let a=(n=r.domain)&&n.trim()?n:"general",s=null!=(t=e.get(a))?t:[];s.push(r),e.set(a,s)}let r=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let n=r.indexOf(e[0]),a=r.indexOf(t[0]);return(n<0?99:n)-(a<0?99:a)}).map(e=>{let[t,n]=e;return{domain:t,jobs:n.sort((e,t)=>{var n,r;return(Date.parse(null!=(n=t.lastRun)?n:"0")||0)-(Date.parse(null!=(r=e.lastRun)?r:"0")||0)})}})},[h,v]);return(0,r.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,r.jsx)(i.r,{active:"scheduler"}),(0,r.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[h&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.total})]}),h.byState?["live","firing","stale","off"].map(e=>{var t,n,a;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:c[e].label}),(0,r.jsx)("div",{className:"text-sm font-semibold ".concat("stale"===e&&(null==(t=h.byState)?void 0:t[e])?"text-amber-300":""),children:null!=(a=null==(n=h.byState)?void 0:n[e])?a:0})]},e)}):(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.adopted})]})]}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void j(),disabled:d,children:"Refresh"})]})]}),v&&(0,r.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-primary/40 bg-primary/10 px-3 py-2 text-xs","data-schedule-ids-filter":!0,children:[(0,r.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",v.length]}),h&&N.reduce((e,t)=>e+t.jobs.length,0)<v.length&&(0,r.jsxs)("span",{className:"text-amber-300",children:["— ",v.length-N.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,r.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{y(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,r.jsx)(f,{load:t,groups:N,onRefresh:()=>void j(),onAction:k,busy:d,acting:x})]})}function h(){return(0,r.jsx)(b,{})}},36581:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(54456),a=n(60500),s=n(86704),l=n(1355),o=n(39906),i=n(50733);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(n),[m,x]=(0,a.useState)(""),[g]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),g.updateConfig(e),x((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.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&&x(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)},[g]);let p=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),g.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},f=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,a.useMemo)(()=>({config:u,setConfig:p,client:g,sessionId:m,setSessionId:f}),[u,g,m]);return(0,r.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},45100:(e,t,n)=>{Promise.resolve().then(n.bind(n,26486))},74591:(e,t,n)=>{"use strict";n.d(t,{cn:()=>s});var r=n(49454),a=n(79946);function s(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,a.QP)((0,r.$)(t))}},83750:(e,t,n)=>{"use strict";n.d(t,{r:()=>o});var r=n(54456),a=n(86048),s=n.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,r.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,r.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,n)=>(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsxs)(s(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,r.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,r.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),n<l.length-1&&(0,r.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}}},e=>{e.O(0,[7777,3278,1829,6048,9906,6390,3170,7358],()=>e(e.s=45100)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{1355:(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}},10080:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(54456),a=n(80247),s=n(13680),l=n(74591);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function i(e){let{className:t,variant:n="default",size:s="default",...i}=e;return(0,r.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(o({variant:n,size:s,className:t})),...i})}},26486:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>h});var r=n(54456),a=n(60500),s=n(36581),l=n(10080),o=n(71829),i=n(83750);function d(e){var t,n,r,a,s,l,o,i,d,u,c,m,x,g,p,f;return{id:e.id,name:e.name,cron:e.cron,intervalMs:e.intervalMs,category:null!=(l=e.category)?l:e.source,domain:null!=(o=e.domain)?o:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(i=e.runVia)?i:e.source,lastRun:null!=(d=null==(t=e.lastRun)?void 0:t.at)?d:null,lastStatus:null!=(u=null==(n=e.lastRun)?void 0:n.status)?u:null,lastExit:null!=(m=null!=(c=null==(r=e.lastRun)?void 0:r.exit)?c:e.lastExit)?m:null,lastDurationMs:null!=(x=null==(a=e.lastRun)?void 0:a.durationMs)?x:null,lastVia:null!=(g=null==(s=e.lastRun)?void 0:s.via)?g:null,stale:"stale"===e.state,command:null!=(p=e.command)?p:"",note:null!=(f=e.note)?f:null,state:e.state,next:e.next,flags:e.flags}}async function u(e){let t="Unknown error";for(let n of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let r=function(e){if(!e||"object"!=typeof e)return null;if(Array.isArray(e.schedules))return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString(),n=e.map(d),r={},a={},s={};for(let e of n){var l,o,i;r[e.category]=(null!=(l=r[e.category])?l:0)+1,a[e.source]=(null!=(o=a[e.source])?o:0)+1,e.state&&(s[e.state]=(null!=(i=s[e.state])?i:0)+1)}return{total:n.length,adopted:n.filter(e=>"elanous"===e.runVia).length,byCategory:r,bySource:a,byState:s,jobs:n,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(n));if(r)return{kind:"ready",data:r};t="unexpected response from ".concat(n)}catch(e){t=e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}return{kind:"error",reason:t}}let c={live:{label:"켜짐",tone:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",tip:"실제 발화 경로(crontab\xb7launchd\xb7trigger)에 올라 있다"},firing:{label:"발화 중",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30",tip:"발화 경로에 올라 있고 최근 실행 기록이 있다"},stale:{label:"유실 의심",tone:"bg-amber-500/15 text-amber-300 ring-amber-500/30",tip:"예정 시각이 지났는데 실행 기록이 없다"},off:{label:"꺼짐",tone:"bg-muted text-muted-foreground ring-border",tip:"어느 발화 경로에도 없다(레지스트리에만 있다)"}},m={elanous:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",daemon:"bg-sky-500/15 text-sky-200 ring-sky-500/30",crontab:"bg-muted text-muted-foreground ring-border"},x={finance:"Finance",elanous:"elanous (core)",general:"General"};function g(e){let{label:t,onClick:n,disabled:a,danger:s}=e;return(0,r.jsx)("button",{type:"button",onClick:n,disabled:a,className:["rounded-md px-1.5 py-0.5 text-[10px] ring-1 transition-colors disabled:opacity-40",s?"text-red-300 ring-red-500/30 hover:bg-red-500/15":"text-muted-foreground ring-border hover:bg-accent/40 hover:text-foreground"].join(" "),children:t})}function p(e){var t,n,a,s,l,o,i;let{job:d,onAction:u,acting:x}=e,p="daemon"===d.runVia||d.id.includes(":"),f=d.state?c[d.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let n=Math.round((t-Date.now())/6e4);if(n<1)return"next <1m";if(n<60)return"next ".concat(n,"m");let r=Math.floor(n/60);return r<24?"next ".concat(r,"h"):"next ".concat(Math.floor(r/24),"d")}(null==(t=d.next)?void 0:t[0]),h=d.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),n=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(n){let e=n[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let r=e.lastIndexOf("/");return r>=0?e.slice(r+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(d.command),v=d.note?"".concat(d.note,"\n\n").concat(d.command):d.command;return(0,r.jsxs)("div",{className:["flex flex-col gap-1 rounded-xl border border-border bg-card p-3 sm:flex-row sm:items-center sm:justify-between",d.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"truncate text-sm font-medium",children:d.name}),f?(0,r.jsx)("span",{className:"shrink-0 whitespace-nowrap rounded-full px-1.5 py-0.5 text-[10px] ring-1 ".concat(f.tone),title:f.tip,"data-schedule-state":d.state,children:f.label}):!d.enabled&&(0,r.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(n=d.flags)?void 0:n.includes("duplicate"))&&(0,r.jsx)("span",{className:"rounded-full bg-red-500/15 px-1.5 py-0.5 text-[10px] text-red-300 ring-1 ring-red-500/30",title:"같은 명령이 두 번 발화한다",children:"duplicate"})]}),(0,r.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(d.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,r.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:d.cron?d.cron:d.intervalMs?"every ".concat(Math.round(d.intervalMs/1e3),"s"):"—"}),b&&d.enabled&&(0,r.jsx)("span",{className:"text-muted-foreground",title:null==(a=d.next)?void 0:a.join("\n"),children:b}),(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:d.category}),(0,r.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=m[d.runVia])?s:m.crontab),children:d.runVia}),d.lastStatus&&(0,r.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===d.lastStatus?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-red-500/15 text-red-300 ring-red-500/30"),title:null!=(o=d.lastError)?o:"ok"===d.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=d.lastExit)?l:"?"),children:["ok"===d.lastStatus?"✓":"✗",null!=d.lastDurationMs?" ".concat(Math.round(d.lastDurationMs),"ms"):"",d.lastVia&&"crontab"!==d.lastVia?" ".concat(d.lastVia):""]}),d.stale&&!f&&(0,r.jsx)("span",{className:"rounded-full bg-amber-500/15 px-2 py-0.5 text-amber-300 ring-1 ring-amber-500/30",title:"예정 시각이 지났는데 미실행(유실 의심)",children:"stale"}),(0,r.jsx)("span",{className:"text-muted-foreground",title:null!=(i=d.lastRun)?i:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<60)return"".concat(n,"s ago");let r=Math.floor(n/60);if(r<60)return"".concat(r,"m ago");let a=Math.floor(r/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(d.lastRun)}),!p&&(0,r.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===d.runVia&&(0,r.jsx)(g,{label:"adopt",onClick:()=>u("adopt",d),disabled:x}),"elanous"===d.runVia&&(0,r.jsx)(g,{label:"release",onClick:()=>u("release",d),disabled:x}),(0,r.jsx)(g,{label:d.enabled?"disable":"enable",onClick:()=>u(d.enabled?"disable":"enable",d),disabled:x}),(0,r.jsx)(g,{label:"✕",onClick:()=>u("delete",d),disabled:x,danger:!0})]})]})]})}function f(e){let{load:t,groups:n,onRefresh:a,onAction:s,busy:o,acting:i}=e;return"loading"===t.kind?(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,r.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,r.jsx)("p",{children:"Failed to load schedules"}),(0,r.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,r.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:o,children:"Retry"})]}):0===t.data.jobs.length?(0,r.jsx)("div",{className:"rounded-xl border border-dashed border-border px-3 py-10 text-center text-sm text-muted-foreground",children:"no schedules"}):(0,r.jsx)("div",{className:"space-y-6",children:n.map(e=>{var t;return(0,r.jsxs)("section",{className:"space-y-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=x[e.domain])?t:e.domain}),(0,r.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,r.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,r.jsx)(p,{job:e,onAction:s,acting:i},e.id))})]},e.domain)})})}function b(){let{client:e}=(0,s.Q)(),[t,n]=(0,a.useState)({kind:"loading"}),[d,m]=(0,a.useState)(!1),[x,g]=(0,a.useState)(!1),p=(0,a.useRef)(0),b=(0,a.useRef)(null),h="ready"===t.kind?t.data:null,[v,y]=(0,a.useState)(null);(0,a.useEffect)(()=>{y(function(e){let t=new URLSearchParams(e).get("ids");if(!t)return null;let n=t.split(",").map(e=>e.trim()).filter(Boolean);return n.length?n:null}(window.location.search))},[]);let j=(0,a.useCallback)(async()=>{var t,r,a,s,l;if(b.current===e)return;b.current=e;let i=++p.current;m(!0),n({kind:"loading"});try{let s=await u(t=>e.fetchJson(t));t=p.current,r=b.current,i===t&&r===e&&(n(s),"error"===s.kind&&(a=s.reason,(0,o.oR.error)("scheduler load failed: ".concat(a))))}finally{s=p.current,l=b.current,i===s&&l===e&&(b.current=null,m(!1))}},[e]),k=(0,a.useCallback)(async(t,n,r)=>{if("delete"!==t||window.confirm("삭제: ".concat(n.name,"?\n(자동 백업되어 복구 가능)"))){g(!0);try{let a=await e.fetchJson("/v1/schedules/action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,id:n.id,...void 0!==r?{note:r}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?o.oR.error("".concat(t," 실패: ").concat(a.error)):(o.oR.success("note"===t?"설명 저장: ".concat(n.name):"".concat(t,": ").concat(n.name)),await j())}catch(e){o.oR.error("".concat(t," 실패: ").concat(e instanceof Error?e.message:e))}finally{g(!1)}}},[e,j]);(0,a.useEffect)(()=>{j();let e=window.setInterval(()=>void j(),3e4);return()=>window.clearInterval(e)},[j]);let N=(0,a.useMemo)(()=>{if(!h)return[];let e=new Map;for(let r of h.jobs){var t,n;if(v&&!v.includes(r.id))continue;let a=(n=r.domain)&&n.trim()?n:"general",s=null!=(t=e.get(a))?t:[];s.push(r),e.set(a,s)}let r=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let n=r.indexOf(e[0]),a=r.indexOf(t[0]);return(n<0?99:n)-(a<0?99:a)}).map(e=>{let[t,n]=e;return{domain:t,jobs:n.sort((e,t)=>{var n,r;return(Date.parse(null!=(n=t.lastRun)?n:"0")||0)-(Date.parse(null!=(r=e.lastRun)?r:"0")||0)})}})},[h,v]);return(0,r.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,r.jsx)(i.r,{active:"scheduler"}),(0,r.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[h&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.total})]}),h.byState?["live","firing","stale","off"].map(e=>{var t,n,a;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:c[e].label}),(0,r.jsx)("div",{className:"text-sm font-semibold ".concat("stale"===e&&(null==(t=h.byState)?void 0:t[e])?"text-amber-300":""),children:null!=(a=null==(n=h.byState)?void 0:n[e])?a:0})]},e)}):(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.adopted})]})]}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void j(),disabled:d,children:"Refresh"})]})]}),v&&(0,r.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-primary/40 bg-primary/10 px-3 py-2 text-xs","data-schedule-ids-filter":!0,children:[(0,r.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",v.length]}),h&&N.reduce((e,t)=>e+t.jobs.length,0)<v.length&&(0,r.jsxs)("span",{className:"text-amber-300",children:["— ",v.length-N.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,r.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{y(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,r.jsx)(f,{load:t,groups:N,onRefresh:()=>void j(),onAction:k,busy:d,acting:x})]})}function h(){return(0,r.jsx)(b,{})}},36581:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(54456),a=n(60500),s=n(86704),l=n(1355),o=n(39906),i=n(50733);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(n),[m,x]=(0,a.useState)(""),[g]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),g.updateConfig(e),x((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.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&&x(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)},[g]);let p=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),g.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},f=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,a.useMemo)(()=>({config:u,setConfig:p,client:g,sessionId:m,setSessionId:f}),[u,g,m]);return(0,r.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},74591:(e,t,n)=>{"use strict";n.d(t,{cn:()=>s});var r=n(49454),a=n(79946);function s(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,a.QP)((0,r.$)(t))}},83750:(e,t,n)=>{"use strict";n.d(t,{r:()=>o});var r=n(54456),a=n(86048),s=n.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,r.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,r.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,n)=>(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsxs)(s(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,r.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,r.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),n<l.length-1&&(0,r.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},88307:(e,t,n)=>{Promise.resolve().then(n.bind(n,26486))}},e=>{e.O(0,[7777,3278,1829,6048,9906,6390,3170,7358],()=>e(e.s=88307)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{1355:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function o(){let e=s();return localStorage.setItem(n,e),e}},10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(54456),s=r(80247),a=r(13680),o=r(74591);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},36581:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(54456),s=r(60500),a=r(86704),o=r(1355),i=r(39906),l=r(50733);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},51608:(e,t,r)=>{Promise.resolve().then(r.bind(r,99066))},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(49454),s=r(79946);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},79450:(e,t,r)=>{"use strict";r.d(t,{KW:()=>a,jU:()=>n,nj:()=>s});class n{async list(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.client.fetchJson("/v1/sessions/store".concat(e?"?includeEmpty=1":""))}async transcript(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)))}async fork(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e),"/fork"),{method:"POST",...void 0!==t.beforeUser?{headers:{"content-type":"application/json"},body:JSON.stringify({beforeUser:t.beforeUser})}:{}})}async delete(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"DELETE"})}constructor(e){this.client=e}}function s(e,t){let r=t.trim().toLowerCase();if(!r)return{kind:"none"};let n=e.filter(e=>e.id.toLowerCase().startsWith(r));return 1===n.length?{kind:"one",id:n[0].id}:0===n.length?{kind:"none"}:{kind:"ambiguous",count:n.length}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=Date.parse(e);if(!Number.isFinite(r))return"";let n=Math.max(0,Math.floor((t-r)/1e3));return n<30?"방금":n<3600?"".concat(Math.floor(n/60),"분 전"):n<86400?"".concat(Math.floor(n/3600),"시간 전"):"".concat(Math.floor(n/86400),"일 전")}},80581:(e,t,r)=>{"use strict";var n=r(35793);r.o(n,"useParams")&&r.d(t,{useParams:function(){return n.useParams}}),r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}}),r.o(n,"useSearchParams")&&r.d(t,{useSearchParams:function(){return n.useSearchParams}})},99066:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>p});var n=r(54456),s=r(60500),a=r(80581),o=r(71829),i=r(36581),l=r(10080),d=r(79450);function c(e){return"pwa"===e.origin?"pwa":"telegram"===e.source||"tg"===e.origin?"telegram":"cli"}function u(e){let{source:t,origin:r}=e,s=c({source:t,origin:r}),a="telegram"===s?{label:"텔레그램",tone:"bg-sky-500/15 text-sky-300 ring-sky-500/30"}:"pwa"===s?{label:"PWA 챗",tone:"bg-fuchsia-500/15 text-fuchsia-300 ring-fuchsia-500/30"}:{label:"CLI",tone:"bg-slate-500/15 text-slate-300 ring-slate-500/30"};return(0,n.jsx)("span",{className:["rounded px-1.5 py-0.5 text-[11px] ring-1",a.tone].join(" "),children:a.label})}function m(e){let{messages:t,onTimeTravel:r,busy:s}=e,a=t.filter(e=>"user"===e.role||"assistant"===e.role);if(0===a.length)return(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"메시지 없음."});let o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}}},e=>{e.O(0,[7777,3278,1829,9906,6390,3170,7358],()=>e(e.s=51608)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{1355:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function o(){let e=s();return localStorage.setItem(n,e),e}},10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(54456),s=r(80247),a=r(13680),o=r(74591);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},36581:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(54456),s=r(60500),a=r(86704),o=r(1355),i=r(39906),l=r(50733);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},53291:(e,t,r)=>{Promise.resolve().then(r.bind(r,99066))},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(49454),s=r(79946);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},79450:(e,t,r)=>{"use strict";r.d(t,{KW:()=>a,jU:()=>n,nj:()=>s});class n{async list(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.client.fetchJson("/v1/sessions/store".concat(e?"?includeEmpty=1":""))}async transcript(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)))}async fork(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e),"/fork"),{method:"POST",...void 0!==t.beforeUser?{headers:{"content-type":"application/json"},body:JSON.stringify({beforeUser:t.beforeUser})}:{}})}async delete(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"DELETE"})}constructor(e){this.client=e}}function s(e,t){let r=t.trim().toLowerCase();if(!r)return{kind:"none"};let n=e.filter(e=>e.id.toLowerCase().startsWith(r));return 1===n.length?{kind:"one",id:n[0].id}:0===n.length?{kind:"none"}:{kind:"ambiguous",count:n.length}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=Date.parse(e);if(!Number.isFinite(r))return"";let n=Math.max(0,Math.floor((t-r)/1e3));return n<30?"방금":n<3600?"".concat(Math.floor(n/60),"분 전"):n<86400?"".concat(Math.floor(n/3600),"시간 전"):"".concat(Math.floor(n/86400),"일 전")}},80581:(e,t,r)=>{"use strict";var n=r(35793);r.o(n,"useParams")&&r.d(t,{useParams:function(){return n.useParams}}),r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}}),r.o(n,"useSearchParams")&&r.d(t,{useSearchParams:function(){return n.useSearchParams}})},99066:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>p});var n=r(54456),s=r(60500),a=r(80581),o=r(71829),i=r(36581),l=r(10080),d=r(79450);function c(e){return"pwa"===e.origin?"pwa":"telegram"===e.source||"tg"===e.origin?"telegram":"cli"}function u(e){let{source:t,origin:r}=e,s=c({source:t,origin:r}),a="telegram"===s?{label:"텔레그램",tone:"bg-sky-500/15 text-sky-300 ring-sky-500/30"}:"pwa"===s?{label:"PWA 챗",tone:"bg-fuchsia-500/15 text-fuchsia-300 ring-fuchsia-500/30"}:{label:"CLI",tone:"bg-slate-500/15 text-slate-300 ring-slate-500/30"};return(0,n.jsx)("span",{className:["rounded px-1.5 py-0.5 text-[11px] ring-1",a.tone].join(" "),children:a.label})}function m(e){let{messages:t,onTimeTravel:r,busy:s}=e,a=t.filter(e=>"user"===e.role||"assistant"===e.role);if(0===a.length)return(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"메시지 없음."});let o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}}},e=>{e.O(0,[7777,3278,1829,9906,6390,3170,7358],()=>e(e.s=53291)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{20136:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(54456),i=s(60500),c=s(98025);class l extends Error{constructor(e,t,s){super("devices ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="DevicesApiError"}}function n(e){let{api:t}=e,[s,c]=(0,i.useState)(null),[n,r]=(0,i.useState)(null),[o,d]=(0,i.useState)(!0);return((0,i.useEffect)(()=>{let e=!1;return t.fleet().then(t=>{e||(c(t),d(!1))}).catch(t=>{e||(r(t instanceof l?"(".concat(t.status,") ").concat(t.path):String(t)),d(!1))}),()=>{e=!0}},[t]),o)?(0,a.jsx)("div",{className:"text-sm opacity-70",children:"Loading device fleet…"}):n?(0,a.jsx)("div",{role:"alert",className:"rounded bg-rose-50 px-3 py-2 text-sm text-rose-900",children:n}):s?0===s.totalDevices?(0,a.jsxs)("div",{className:"rounded border border-zinc-200 bg-zinc-50 p-4 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"No Apple devices detected yet."}),(0,a.jsxs)("p",{className:"mt-1 opacity-70",children:["The iOS Companion writes ",(0,a.jsx)("code",{children:"~/.elanous/devices.json"})," on iCloud sync. Install it on at least one Apple device to populate this list."]})]}):(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsxs)("caption",{className:"text-xs opacity-60 text-left mb-2",children:["snapshot @ ",new Date(s.snapshotAt).toLocaleString()," \xb7 ",s.totalDevices," devices"]}),(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-zinc-200 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("th",{className:"text-left py-1",children:"kind"}),(0,a.jsx)("th",{className:"text-right py-1",children:"count"}),(0,a.jsx)("th",{className:"text-left py-1 pl-3",children:"capabilities"})]})}),(0,a.jsx)("tbody",{children:s.kinds.map(e=>(0,a.jsxs)("tr",{className:"border-b border-zinc-100 align-top",children:[(0,a.jsx)("td",{className:"py-1 font-medium",children:e.kind}),(0,a.jsx)("td",{className:"py-1 text-right tabular-nums",children:e.count}),(0,a.jsx)("td",{className:"py-1 pl-3 text-xs",children:0===e.capabilities.length?(0,a.jsx)("span",{className:"opacity-50",children:"(none advertised)"}):e.capabilities.map(e=>(0,a.jsx)("span",{className:"mr-1 inline-block rounded bg-zinc-100 px-1.5 py-0.5",children:e},e))})]},e.kind))})]}):(0,a.jsx)("div",{className:"text-sm opacity-70",children:"No fleet data."})}function r(){let e=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch;async function i(t,i){let c={"content-type":"application/json"};e.authHeader&&(c.authorization=e.authHeader);let n=await a("".concat(s).concat(t),{...i,headers:c}),r=await n.json().catch(()=>null);if(!n.ok)throw new l(n.status,t,r);return r}return{fleet:async()=>await i(c.WF),preview:async e=>await i(c.bR,{method:"POST",body:JSON.stringify(e)})}})({baseUrl:window.location.origin}),[]);return(0,a.jsxs)("section",{className:"flex flex-col gap-4 p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-lg font-semibold",children:"Device fleet"}),(0,a.jsx)("p",{className:"text-xs opacity-70",children:"Detected Apple devices \xb7 OMF v1 templates use this to decide which capabilities to fire vs gracefully degrade. iPhone-only fleets still get full template value via the fallback chain."})]}),(0,a.jsx)(n,{api:e})]})}},85165:(e,t,s)=>{Promise.resolve().then(s.bind(s,20136))},98025:(e,t,s)=>{"use strict";s.d(t,{GM:()=>n,J3:()=>l,WF:()=>a,bR:()=>c,m:()=>r,r5:()=>i});let a="/v1/devices",i="/v1/approvals/merges",c="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",n="/v1/morning-digest/showroom",r="/v1/next-fluent/dispatch"}},e=>{e.O(0,[6390,3170,7358],()=>e(e.s=85165)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{3389:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},13784:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},24197:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]])},26439:(e,t,r)=>{"use strict";r.d(t,{$L:()=>s,Kz:()=>l,Vm:()=>i,kv:()=>a});let n="elanous.pwa.chat.autoRouting",o="elanous-chat-routing-changed",a={autoRouting:!1};function i(){return{autoRouting:function(e,t){try{let r=window.localStorage.getItem(e);if("1"===r)return!0;if("0"===r)return!1;return t}catch(e){return t}}(n,a.autoRouting)}}function l(e){try{window.localStorage.setItem(n,e?"1":"0")}catch(e){}window.dispatchEvent(new CustomEvent(o))}function s(e){let t=()=>e(i()),r=t=>{t.key===n&&e(i())};return window.addEventListener(o,t),window.addEventListener("storage",r),()=>{window.removeEventListener(o,t),window.removeEventListener("storage",r)}}},39681:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},42411:(e,t,r)=>{Promise.resolve().then(r.bind(r,43591))},43591:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(54456),o=r(17758),a=r(77980);function i(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"mx-auto max-w-2xl px-6 pt-6",children:(0,n.jsx)(a.N,{})}),(0,n.jsx)(o.O,{})]})}},45086:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},50399:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},52561:(e,t,r)=>{"use strict";r.d(t,{hn:()=>a,qv:()=>i,sg:()=>l});let n="elanous.ocr.prefs",o={defaultUseLlmVision:!1,defaultPreferHandwriting:!1};function a(){if("undefined"==typeof localStorage)return{...o};try{let e=localStorage.getItem(n);if(!e)return{...o};let t=JSON.parse(e);return{defaultUseLlmVision:"boolean"==typeof t.defaultUseLlmVision?t.defaultUseLlmVision:o.defaultUseLlmVision,defaultPreferHandwriting:"boolean"==typeof t.defaultPreferHandwriting?t.defaultPreferHandwriting:o.defaultPreferHandwriting}}catch(e){return{...o}}}function i(e){if("undefined"==typeof localStorage)return{...o,...e};let t={...a(),...e};try{localStorage.setItem(n,JSON.stringify(t))}catch(e){}return t}function l(){if("undefined"==typeof localStorage)return{...o};try{localStorage.removeItem(n)}catch(e){}return{...o}}},56849:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("minus",[["path",{d:"M5 12h14",key:"1ays0h"}]])},67949:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var n=r(60500);let o="elanous.pwa.showBeta",a="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(o)}catch(e){return!1}}function l(){let[e,t]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===o||null===e.key)&&t(i())};return window.addEventListener(a,e),window.addEventListener("storage",r),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,n.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(o,"1"):window.localStorage.removeItem(o)}catch(e){}window.dispatchEvent(new CustomEvent(a,{detail:e}))},[])}}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var n=r(54456),o=r(96053),a=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,o.In)(),{showBeta:t,setShowBeta:r}=(0,a.hj)();return(0,n.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,n.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,n.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,n.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:a,description:i}=t;return(0,n.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,o.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,n.jsx)("span",{className:"block font-medium",children:a}),(0,n.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,n.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,n.jsx)("span",{children:"실험 기능 켜기"}),(0,n.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>o,In:()=>c,OG:()=>l});var n=r(60500);let o="elanous.pwa.role",a="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(o);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(o,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function s(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let t=t=>{(t.key===o||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",t)}}function c(){return(0,n.useSyncExternalStore)(s,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,1829,9656,7551,3454,9906,3869,4215,2176,7274,7758,6390,3170,7358],()=>e(e.s=42411)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8517],{4112:(e,t,s)=>{"use strict";s.d(t,{Q:()=>c});var r=s(54456),i=s(60500),a=s(10080),n=s(95564),l=s(43468),o=s(23869);function d(e){if(e instanceof o.Iu&&e.body&&"object"==typeof e.body){var t;let s=e.body;return[null!=(t=s.reason)?t:s.error,s.path].filter(Boolean).join(": ")}return e instanceof Error?e.message:String(e)}function c(){let e=(0,l.Qj)(),[t,s]=(0,i.useState)(!1),[o,c]=(0,i.useState)(null),[u,h]=(0,i.useState)({vault:"",selection:"custom",dirs:""}),{vault:p,selection:f,dirs:m}=u,[x,b]=(0,i.useState)(!0),[g,v]=(0,i.useState)(!1),[j,y]=(0,i.useState)(""),[k,w]=(0,i.useState)(""),[N,S]=(0,i.useState)("");(0,i.useEffect)(()=>{s(!0)},[]);let C=(0,i.useCallback)(async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"all";if(e){b(!0);try{let s=await e.getObsidianSkills();c(s),h(e=>({vault:"skills"===t?e.vault:s.obsidian.vault,selection:"vault"===t?e.selection:s.skills.activeSet,dirs:"vault"===t?e.dirs:s.skills.dirs.join("\n")})),y("")}catch(e){y(d(e))}finally{b(!1)}}},[e]);(0,i.useEffect)(()=>{t&&e&&C()},[t,e,C]);let O=async()=>{if(e){v(!0),w("");try{var t;let s=await e.setObsidian({vault:p.trim()});await C("vault"),w(null!=(t=s.warning)?t:"Vault saved.")}catch(e){w(d(e))}finally{v(!1)}}},F=async()=>{if(e){v(!0),S("");try{await e.setSkills("custom"===f?{dirs:m.split("\n").map(e=>e.trim()).filter(Boolean)}:{activeSet:f}),await C("skills"),S("Skills saved.")}catch(e){S(d(e))}finally{v(!1)}}};return t&&e?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"obsidian-skills-card",children:[(0,r.jsxs)("header",{className:"flex items-center justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"Obsidian & Skills"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Choose directories on the machine running NEXUS."})]}),(0,r.jsx)(a.$,{size:"sm",variant:"outline",onClick:()=>void C("all"),disabled:x||g,children:"Refresh"})]}),x&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Loading paths…"}),j&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:j}),o&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("label",{htmlFor:"obsidian-vault",className:"text-sm font-medium",children:"Obsidian vault path"}),(0,r.jsx)(n.p,{id:"obsidian-vault",value:p,onChange:e=>{h(t=>({...t,vault:e.target.value})),w("")},placeholder:"/absolute/path/to/vault"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"vault-validation",children:p===o.obsidian.vault?o.obsidian.looksLikeVault?"Vault found (.obsidian detected)":o.obsidian.exists?"Directory found; .obsidian not detected":"Directory not found":"Save to validate this path on the NEXUS host."}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void O(),disabled:g||!p.trim(),children:"Save vault"}),k&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"vault-feedback",children:k})]}),(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("label",{htmlFor:"skills-preset",className:"text-sm font-medium",children:"Skills source"}),(0,r.jsxs)("select",{id:"skills-preset",value:f,onChange:e=>{h(t=>({...t,selection:e.target.value})),S("")},className:"flex h-9 w-full rounded-md border border-input bg-background px-3 text-sm",children:[o.skills.presets.map(e=>{var t;return(0,r.jsxs)("option",{value:e.key,children:[e.label," — ",null!=(t=e.dir)?t:"(no path)"," ",e.exists?"✓":"(missing)"]},e.key)}),(0,r.jsx)("option",{value:"custom",children:"Custom directories"})]}),"custom"===f&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("label",{htmlFor:"skills-dirs",className:"block text-xs text-muted-foreground",children:"One absolute directory per line"}),(0,r.jsx)("textarea",{id:"skills-dirs",value:m,onChange:e=>{h(t=>({...t,dirs:e.target.value})),S("")},rows:3,className:"w-full rounded-md border border-input bg-background px-3 py-2 font-mono text-xs",placeholder:"/absolute/path/to/skills"})]}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void F(),disabled:g,children:"Save skills"}),N&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"skills-feedback",children:N})]})]})]}):null}},10080:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var r=s(54456),i=s(80247),a=s(13680),n=s(74591);let l=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:s="default",size:a="default",...o}=e;return(0,r.jsx)(i.$,{"data-slot":"button",className:(0,n.cn)(l({variant:s,size:a,className:t})),...o})}},13496:(e,t,s)=>{"use strict";s.d(t,{W:()=>d});var r=s(54456),i=s(60500),a=s(10080),n=s(95564),l=s(43468);let o=["telegram","discord"];function d(){let{client:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,l.Qj)(),s=null!=e?e:t,[d,c]=(0,i.useState)([]),[u,h]=(0,i.useState)({}),[p,f]=(0,i.useState)({}),[m,x]=(0,i.useState)({}),[b,g]=(0,i.useState)(null),[v,j]=(0,i.useState)({}),[y,k]=(0,i.useState)("");(0,i.useEffect)(()=>{if(!s)return;let e=!1;return s.getChannelBots().then(t=>{let{platforms:s}=t;e||(c(s),f(e=>{let t={...e};for(let e of s)Object.hasOwn(t,e.platform)||(t[e.platform]=e.allowedUsers.join(", "));return t}))}).catch(()=>{e||k("봇 상태를 불러오지 못했습니다.")}),()=>{e=!0}},[s]);let w=async e=>{var t;if(!s)return;g(e),k("");let r=null==(t=u[e])?void 0:t.trim(),i=Object.hasOwn(p,e)?p[e].split(",").map(e=>e.trim()).filter(Boolean):void 0;h(t=>({...t,[e]:""}));try{let t=await s.setChannelBot({platform:e,...r?{token:r}:{},...void 0!==i?{allowedUsers:i}:{}});t.botName&&x(s=>({...s,[e]:t.botName})),j(s=>({...s,[e]:t.restartNeeded}));try{let e=await s.getChannelBots();c(e.platforms)}catch(e){k("저장됐지만 봇 상태를 다시 불러오지 못했습니다.")}}catch(t){k("".concat(e," 저장에 실패했습니다. 토큰과 허용 사용자 ID를 확인하세요."))}finally{g(null)}};return s?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"channel-bot-setup-card",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"봇 연결"}),o.map(e=>{var t,s;let i=d.find(t=>t.platform===e);return(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("h3",{className:"text-sm font-medium capitalize",children:e}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:(null==i?void 0:i.configured)?"연결됨 (".concat(i.source,")"):"미연결"}),m[e]&&(0,r.jsxs)("p",{className:"text-xs",children:["봇 이름: ",m[e]]}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-bot-token"),className:"block text-xs",children:"봇 토큰"}),(0,r.jsx)(n.p,{id:"".concat(e,"-bot-token"),type:"password",autoComplete:"off",value:null!=(t=u[e])?t:"",onChange:t=>h(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-allowed-users"),className:"block text-xs",children:"허용 사용자 ID (쉼표로 구분)"}),(0,r.jsx)(n.p,{id:"".concat(e,"-allowed-users"),value:null!=(s=p[e])?s:"",onChange:t=>f(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)(a.$,{type:"button",size:"sm",disabled:null!==b,onClick:()=>void w(e),children:"확인하고 저장"}),v[e]&&(0,r.jsx)("p",{role:"status",className:"text-xs",children:"봇을 재시작해야 반영됩니다"})]},e)}),y&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:y})]}):null}},23224:(e,t,s)=>{Promise.resolve().then(s.bind(s,93412))},28042:(e,t,s)=>{"use strict";s.d(t,{Qb:()=>n,SI:()=>o,dJ:()=>l});let r="elanous:auth-required",i=null,a=!1;function n(e){null===i&&(i=e,window.dispatchEvent(new CustomEvent(r,{detail:{path:e}})))}function l(e){let t=window,s=t=>e(t.detail);return t.addEventListener(r,s),null===i||a||e({path:i}),()=>t.removeEventListener(r,s)}function o(){a=!0}},43468:(e,t,s)=>{"use strict";s.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var r=s(54456),i=s(60500),a=s(40324),n=s(59405);let l=(0,i.createContext)(null);function o(e){let{client:t,queryClient:s,defaultStaleTimeMs:o,children:d}=e,c=(0,i.useMemo)(()=>null!=s?s:new a.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[s,o]);return(0,r.jsx)(l.Provider,{value:t,children:(0,r.jsx)(n.Ht,{client:c,children:d})})}function d(){let e=(0,i.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,i.useContext)(l)}},50733:(e,t,s)=>{"use strict";let r;s.d(t,{cY:()=>c,x8:()=>l});let i={debug:0,info:1,warn:2,error:3},a="/v1/debug-logs/batch",n=null;function l(e){n=e}class o{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(i[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<i[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,s=JSON.stringify({records:e});try{var r,i;t=await (r=this.fetchFn(s),i=this.postTimeoutMs,new Promise((e,t)=>{let s=setTimeout(()=>t(Error("debug-forward timeout after ".concat(i,"ms"))),i);r.then(t=>{clearTimeout(s),e(t)},e=>{clearTimeout(s),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&n)try{await n(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let a=this.lastOkAt;this.lastOkAt=Date.now();let l=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:l,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:a},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(a,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=d,t="debug",s=1e4,r=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=s,this.flushMs=r,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function d(e){return(await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function c(e,t){if("undefined"==typeof console)return;let s=new Date().toISOString();if(void 0!==t){let r="";try{let e=new WeakSet;r=JSON.stringify(t,(t,s)=>{if("bigint"==typeof s)return"".concat(s.toString(),"n");if("function"==typeof s)return"[fn ".concat(s.name||"anon","]");if(s&&"object"==typeof s){if(e.has(s))return"[circular]";e.add(s)}return s})}catch(e){r="[unserializable: ".concat(String(e),"]")}r&&r.length>800&&(r=r.slice(0,797)+"..."),console.debug("[".concat(s,"] ").concat(e," ").concat(r),t),u(s,e,r)}else console.debug("[".concat(s,"] ").concat(e)),u(s,e,void 0)}function u(e,t,s){let i,a=function(){if(void 0!==r)return r;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return r=null,null;let t=new o(d,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return r=t,t}();if(!a)return;let n=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==s&&""!==s)try{i=JSON.parse(s)}catch(e){i=s}a.push({ts:e,category:t,event:n,...void 0!==i?{data:i}:{},source:{platform:"pwa"}})}},74591:(e,t,s)=>{"use strict";s.d(t,{cn:()=>a});var r=s(49454),i=s(79946);function a(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,i.QP)((0,r.$)(t))}},93412:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var r=s(54456),i=s(86048),a=s.n(i),n=s(60500),l=s(10080),o=s(43468);let d=[{anchor:"channels",label:"Channels",description:"Telegram / Discord 봇 연결",primary:!0},{anchor:"voice",label:"Voice",description:"TTS \xb7 STT 모델 + voice 환경설정",primary:!0},{anchor:"ios",label:"iOS / mobile",description:"PWA install \xb7 iOS companion 페어링",primary:!0},{anchor:"personas",label:"Personas",description:"4 인격 (default \xb7 contrarian \xb7 pragmatist \xb7 sage) 편집",primary:!1},{anchor:"tools",label:"Tool surface",description:"chat 이 사용할 tool 셋 (readonly / chat / webterm / all)",primary:!1},{anchor:"advanced",label:"Advanced",description:"Model tier \xb7 budget guard \xb7 OCR \xb7 기타 카드 17 종",primary:!1}];var c=s(13496),u=s(4112);function h(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(null),[i,a]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{if(!e)return;let t=!0;return s(null),a(!1),e.getChatFastPath().then(e=>{let{enabled:r}=e;if("boolean"!=typeof r)throw Error("chat.fastPath is unavailable");t&&s(r)}).catch(()=>{t&&a(!0)}),()=>{t=!1}},[e]),(0,r.jsx)("section",{"aria-label":"셋업 추천","data-testid":"setup-recommendations",className:"flex flex-col gap-2 rounded border border-border bg-card p-3 text-sm",children:null===t?(0,r.jsx)("p",{role:"status",children:i?"chat.fastPath 값을 읽을 수 없습니다. 다시 접속해 확인하세요.":"추천 설정 확인 중…"}):["고칠 것 고치기 — 권한\xb7PATH\xb7서비스 파일\xb7파이썬 환경 등 고칠 수 있는 항목을 고칩니다(로그인\xb7서비스 재시작은 별도): `elanous doctor --fix --yes`",{fastPath:t}.fastPath?"짧은 물음은 빠르게 — 켜져 있음(chat.fastPath=true): 짧은 물음에 도구 없이 먼저 답합니다. 끄기: `elanous config set chat.fastPath false`":"짧은 물음은 빠르게 — 꺼져 있음(chat.fastPath=false): 켜면 짧은 물음에 도구 없이 먼저 답합니다. 켜기: `elanous config set chat.fastPath true`"].map(e=>(0,r.jsx)("p",{children:e},e))})}function p(){let[e,t]=(0,n.useState)(!1),[s,i]=(0,n.useState)(!1);return(0,r.jsxs)("section",{className:"flex flex-col gap-3","aria-labelledby":"setup-next-steps-title","data-testid":"setup-next-steps",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{id:"setup-next-steps-title",className:"text-sm font-semibold",children:"다음 셋업(선택)"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"필요한 것만 지금 연결하세요. 나중에 해도 됩니다."})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":e,"aria-controls":"setup-next-bots",onClick:()=>t(e=>!e),children:"텔레그램\xb7디스코드 봇 연결"}),e&&(0,r.jsxs)("div",{id:"setup-next-bots",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(c.W,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>t(!1),children:"나중에"})]})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":s,"aria-controls":"setup-next-vault",onClick:()=>i(e=>!e),children:"Obsidian 볼트\xb7스킬 폴더"}),s&&(0,r.jsxs)("div",{id:"setup-next-vault",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(u.Q,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>i(!1),children:"나중에"})]})]})]})}function f(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(!1),[i,d]=(0,n.useState)({status:"idle"});return((0,n.useEffect)(()=>{s(!0)},[]),(0,n.useEffect)(()=>{t&&e&&(d({status:"loading"}),e.getLlmProviders().then(e=>{d({status:"ok",active:{provider:e.activeProvider||"(unset)"}})}).catch(e=>{d({status:"error",message:e.message})}))},[t,e]),t&&e)?(0,r.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,r.jsx)(h,{}),(0,r.jsx)(m,{load:i}),(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"곧장 chat 으로"}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["LLM 만 셋업해도 chat 은 바로 사용 가능합니다. 나머지는 필요할 때",(0,r.jsx)("span",{className:"font-mono",children:" /settings"})," 에서 추가하세요."]}),(0,r.jsx)("div",{children:(0,r.jsx)(a(),{href:"/chat","data-testid":"setup-done-chat-link",children:(0,r.jsx)(l.$,{size:"lg",children:"Chat 시작 →"})})})]}),(0,r.jsx)(p,{}),(0,r.jsx)(x,{})]}):null}function m(e){let{load:t}=e;if("loading"===t.status||"idle"===t.status)return(0,r.jsx)("section",{className:"rounded border border-border bg-card p-4",children:(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"상태 확인 중…"})});if("error"===t.status)return(0,r.jsx)("section",{className:"rounded border border-destructive/40 bg-destructive/5 p-4",children:(0,r.jsxs)("p",{className:"text-sm text-destructive",children:["LLM 상태 로드 실패: ",t.message]})});let s=t.active.provider,i="(unset)"===s;return(0,r.jsx)("section",{className:"rounded border border-primary/40 bg-primary/5 p-4","data-testid":"setup-done-active-llm",children:(0,r.jsxs)("header",{className:"flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:"현재 LLM provider"}),(0,r.jsx)("p",{className:"mt-1 font-mono text-base font-semibold",children:s})]}),i?(0,r.jsx)(a(),{href:"/setup",children:(0,r.jsx)(l.$,{variant:"outline",size:"sm",children:"셋업"})}):(0,r.jsx)("span",{className:"rounded bg-primary/10 px-2 py-1 text-xs font-medium text-primary",children:"✓ 준비됨"})]})})}function x(){let e=d.filter(e=>e.primary),t=d.filter(e=>!e.primary);return(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"필요하면 더 셋업하기"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"모두 선택. 안 만져도 chat 은 잘 됩니다."})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-3",children:e.map(e=>(0,r.jsx)(b,{link:e},e.anchor))}),(0,r.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,r.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 (",t.length,")"]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-3",children:t.map(e=>(0,r.jsx)(b,{link:e},e.anchor))})]})]})}function b(e){let{link:t}=e,s="/settings#".concat(t.anchor);return(0,r.jsxs)(a(),{href:s,"data-testid":"setup-done-link-".concat(t.anchor),className:"flex flex-col gap-1 rounded border border-border bg-card p-3 transition-colors hover:border-primary/40",children:[(0,r.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:t.description})]})}},95564:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var r=s(54456);s(60500);var i=s(27551),a=s(74591);function n(e){let{className:t,type:s,...n}=e;return(0,r.jsx)(i.p,{type:s,"data-slot":"input",className:(0,a.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...n})}}},e=>{e.O(0,[7777,9538,3278,6048,7551,3869,6390,3170,7358],()=>e(e.s=23224)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(54456),a=r(80247),n=r(13680),i=r(74591);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},16375:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(54456),a=r(80581),n=r(60500),i=r(51581),l=r(77980),o=r(60314),d=r(10080),c=r(95564),u=r(74591);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(43468),g=r(39906),v=r(86704);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},33808:(e,t,r)=>{Promise.resolve().then(r.bind(r,16375))},43468:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(54456),a=r(60500),n=r(40324),i=r(59405);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(60500);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(49454),a=r(79946);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(54456),a=r(96053),n=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},80581:(e,t,r)=>{"use strict";var s=r(35793);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(60500);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,7551,9906,3869,7274,6390,3170,7358],()=>e(e.s=33808)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(54456),a=r(80247),n=r(13680),i=r(74591);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},16375:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(54456),a=r(80581),n=r(60500),i=r(51581),l=r(77980),o=r(60314),d=r(10080),c=r(95564),u=r(74591);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(43468),g=r(39906),v=r(86704);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},42083:(e,t,r)=>{Promise.resolve().then(r.bind(r,16375))},43468:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(54456),a=r(60500),n=r(40324),i=r(59405);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(60500);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(49454),a=r(79946);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(54456),a=r(96053),n=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},80581:(e,t,r)=>{"use strict";var s=r(35793);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(60500);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,7551,9906,3869,7274,6390,3170,7358],()=>e(e.s=42083)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9038],{1355:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>l,f6:()=>n,oD:()=>s});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 s(){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}},36581:(e,t,r)=>{"use strict";r.d(t,{C:()=>u,DaemonProvider:()=>c,Q:()=>d});var a=r(54456),n=r(60500),s=r(86704),l=r(1355),o=r(39906),i=r(50733);let u=(0,n.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,d]=(0,n.useState)(r),[h,m]=(0,n.useState)(""),[f]=(0,n.useState)(()=>new o.ki(r));(0,n.useEffect)(()=>{let e=(0,s.Fp)();d(e),f.updateConfig(e),m((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.updateConfig(t),d(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&m(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 p=e=>{d(t=>{let r={...t,...e};return(0,s.Qc)(e),f.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{m(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},w=(0,n.useMemo)(()=>({config:c,setConfig:p,client:f,sessionId:h,setSessionId:x}),[c,f,h]);return(0,a.jsx)(u.Provider,{value:w,children:t})}function d(){let e=(0,n.useContext)(u);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},45069:(e,t,r)=>{Promise.resolve().then(r.bind(r,79851))},55499:(e,t,r)=>{"use strict";r.d(t,{K:()=>s,v:()=>n});var a=r(50733);async function n(e){var t;let r=e.baseUrl.replace(/\/$/,"");if(!r)return{ok:!1,status:0,reason:"baseUrl not configured"};let n=null!=(t=e.filename)?t:e.file instanceof File?e.file.name:"upload.bin";(0,a.cY)("webterm.attach.upload.begin",{filename:n,size:e.file.size,type:e.file.type});let s=new FormData;s.append("file",e.file,n),s.append("filename",n);try{let t=await fetch("".concat(r,"/v1/attachments"),{method:"POST",body:s,...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok){let e=await t.text().catch(()=>"");return(0,a.cY)("webterm.attach.upload.error",{status:t.status,detail:e.slice(0,200)}),{ok:!1,status:t.status,reason:e||"HTTP ".concat(t.status)}}let n=await t.json();return(0,a.cY)("webterm.attach.upload.ok",{id:n.id,size:n.size}),{ok:!0,meta:n}}catch(t){let e=String(t instanceof Error?t.message:t);return(0,a.cY)("webterm.attach.upload.exception",{reason:e}),{ok:!1,status:0,reason:e}}}async function s(e,t){return Promise.all(e.map(e=>n({baseUrl:t.baseUrl,...void 0!==t.token?{token:t.token}:{},file:e.file,...void 0!==e.filename?{filename:e.filename}:{}})))}},79624:(e,t,r)=>{"use strict";r.d(t,{ht:()=>s,vn:()=>n});let a="elanous.pwa.sharePrefill";function n(e){try{window.sessionStorage.setItem(a,e)}catch(e){}}function s(){try{var e;let t=null!=(e=window.sessionStorage.getItem(a))?e:"";return window.sessionStorage.removeItem(a),t}catch(e){return""}}},79851:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>m});var a=r(54456),n=r(60500),s=r(80581),l=r(50733),o=r(36581);async function i(){if("undefined"==typeof caches)return null;let e=(await caches.keys()).filter(e=>e.startsWith("elanous-pwa-share-target-")).sort().reverse();return 0===e.length?null:caches.open(e[0])}async function u(e){if(!e)return null;let t=await i();if(!t)return(0,l.cY)("pwa.share.l2.cache-missing",{id:e}),null;let r="/__share/".concat(e,"/manifest.json"),a=await t.match(r);if(!a)return(0,l.cY)("pwa.share.l2.no-manifest",{id:e}),null;let n=await a.json(),s=[];for(let r of n.files){let a=await t.match(r.cacheUrl);if(!a){(0,l.cY)("pwa.share.l2.file-missing",{id:e,cacheUrl:r.cacheUrl});continue}let n=await a.blob();s.push(new File([n],r.filename,{type:r.type||n.type}))}for(let e of(await t.delete(r),n.files))await t.delete(e.cacheUrl);return(0,l.cY)("pwa.share.l2.delivered",{id:e,fileCount:s.length,titleLen:n.title.length,textLen:n.text.length}),{id:n.id,title:n.title,text:n.text,url:n.url,files:s,combinedText:function(e){let t=[];return e.title.trim()&&t.push(e.title.trim()),e.text.trim()&&t.push(e.text.trim()),e.url.trim()&&t.push(e.url.trim()),t.join("\n\n")}(n)}}var c=r(79624),d=r(55499);function h(){var e,t,r;let i=(0,s.useRouter)(),h=(0,s.useSearchParams)(),{config:m}=(0,o.Q)(),[f,p]=(0,n.useState)({phase:"idle"});return(0,n.useEffect)(()=>{var e,t,r;let a=null==h?void 0:h.get("shared");if(a){let e=!1;return(async()=>{p({phase:"level2-loading"});let t=await u(a);if(e)return;if(!t||0===t.files.length){t&&t.combinedText&&(0,c.vn)(t.combinedText),(0,l.cY)("pwa.share.l2.empty",{sharedId:a,hasPayload:!!t}),p({phase:"level2-empty"});let e=setTimeout(()=>i.replace("/chat"),600);return()=>clearTimeout(e)}if(!m.baseUrl)return p({phase:"level2-error",error:"daemon baseUrl not configured"});p({phase:"level2-uploading",total:t.files.length,done:0});let r=[];for(let a=0;a<t.files.length;a+=1){let n=t.files[a],s=await (0,d.v)({baseUrl:m.baseUrl,...m.token?{token:m.token}:{},file:n,filename:n.name});if(e)return;s.ok?r.push(s.meta):(0,l.cY)("pwa.share.l2.upload-failed",{i:a,reason:s.reason}),p(e=>({...e,done:a+1}))}if(0===r.length)return p({phase:"level2-error",error:"all uploads failed"});try{window.sessionStorage.setItem("elanous.pwa.shareAttachments",JSON.stringify(r))}catch(e){}t.combinedText&&(0,c.vn)(t.combinedText),p({phase:"level2-handing-off",total:t.files.length,done:t.files.length});let n=setTimeout(()=>i.replace("/chat?shared=1"),400);return()=>clearTimeout(n)})(),()=>{e=!0}}let n=null!=(e=null==h?void 0:h.get("title"))?e:null,s=null!=(t=null==h?void 0:h.get("text"))?t:null,o=null!=(r=null==h?void 0:h.get("url"))?r:null,f=function(e,t,r){let a=[];return e&&e.trim()&&a.push(e.trim()),t&&t.trim()&&a.push(t.trim()),r&&r.trim()&&a.push(r.trim()),a.join("\n\n")}(n,s,o);(0,l.cY)("pwa.share.l1.received",{hasTitle:!!n,hasText:!!s,hasUrl:!!o,len:f.length}),f.length>0&&(0,c.vn)(f),p({phase:"level1-handing-off",preview:f});let x=setTimeout(()=>i.replace("/chat"),400);return()=>clearTimeout(x)},[h,i,m.baseUrl,m.token]),(0,a.jsxs)("main",{className:"flex h-full flex-col items-center justify-center gap-3 px-6 py-10 text-center",children:[(0,a.jsx)("h1",{className:"text-base font-semibold",children:"\uD83D\uDCE5 공유 받음"}),"level1-handing-off"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"곧 /chat 으로 이동합니다…"}),f.preview&&(0,a.jsxs)("pre",{className:"max-h-[60vh] max-w-full overflow-auto rounded-md border border-border bg-card p-3 text-left text-[11px] whitespace-pre-wrap break-words",children:[f.preview.slice(0,800),f.preview.length>800?"…":""]})]}),"level2-loading"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일 읽는 중…"}),"level2-uploading"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:["업로드 중… ",null!=(e=f.done)?e:0," / ",null!=(t=f.total)?t:0]}),"level2-handing-off"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:[null!=(r=f.done)?r:0," 개 첨부 완료 \xb7 /chat 이동…"]}),"level2-empty"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일이 없어요. /chat 으로 이동합니다…"}),"level2-error"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{className:"text-xs text-rose-500",children:["업로드 실패: ",f.error]}),(0,a.jsx)("a",{href:"/app/chat",className:"text-xs text-primary underline",children:"/chat 으로 이동"})]})]})}function m(){return(0,a.jsx)(n.Suspense,{fallback:(0,a.jsx)("div",{className:"p-6 text-sm text-muted-foreground",children:"loading…"}),children:(0,a.jsx)(h,{})})}},80581:(e,t,r)=>{"use strict";var a=r(35793);r.o(a,"useParams")&&r.d(t,{useParams:function(){return a.useParams}}),r.o(a,"usePathname")&&r.d(t,{usePathname:function(){return a.usePathname}}),r.o(a,"useRouter")&&r.d(t,{useRouter:function(){return a.useRouter}}),r.o(a,"useSearchParams")&&r.d(t,{useSearchParams:function(){return a.useSearchParams}})}},e=>{e.O(0,[9906,6390,3170,7358],()=>e(e.s=45069)),_N_E=e.O()}]);
|