elanous 0.2.9 → 0.2.10

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.
Files changed (361) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/2DsiDfDCks44g1cPUMhiW/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/24-e6d28380efab7faf.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/3615-740dd270764ffa24.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/3734-1015fe991eb9b7e7.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/5012-a7fe6f3c8b6fe45a.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/5783-ef40ebfc91d55230.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/62-ff227c3edb8b248b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/7633-1b3709b0854c9412.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/7951-8b03dbb10b24cd06.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/8067-87ce253ec2f23697.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{5080-1613752891fcadb4.js → 8195-6fde3d7a39859206.js} +5 -5
  14. package/apps/pwa/out/_next/static/chunks/8894-b5fb36bab837cd29.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/9454-84d0d5d77446bd92.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/988-5f92e7ab7ccea3dd.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/9989-5582582f06429840.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d2253d7e58ef1890.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5441d4a9ab35e518.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/app/board/page-d9b12d680922d980.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-54b32bd27726588d.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/app/bots/page-e268d6d145827a22.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/app/chat/page-f8116559c7424da7.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/app/consult/page-1085399fd0f32112.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/app/control/page-1df686a14f65895a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/app/design-check/page-54e1f966ab60a4dc.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/app/editor/{page-973996d584f008c1.js → page-7ed95f296f5ee8e9.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/app/exec/page-11edac668d77e5c3.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/app/field/page-59e2b9a22cd5a6d5.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/app/intake/page-2976df21ad74ab48.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/app/layout-34d211a67f16d510.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/app/live/page-8ff652d5d950639b.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/app/market/{page-8b0402a46a749a3d.js → page-b31610deda76337b.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-037f83e2a1edc8e2.js → page-6cb0e1bbefe5fb3d.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/app/morning/page-a286a152cf584576.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/app/not-found-d9237581e7003bcb.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/app/observatory/page-83274e761643fdd2.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ceee6cfb1d4e6d68.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-9c9f8bb3e4a64091.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-c17217603ea3426a.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/app/page-efb6177cbf1e8a51.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/app/reflection/page-d307523703bc4df3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-462f4e4bab45ce7d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/app/sessions/page-8990e96f33af3837.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0df30e0c7e50148a.js → page-e168fa1030af0548.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/app/settings/page-1233e05a4068bc9c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-13a1840b1fac337a.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/app/setup/page-64a29fc80b11ab55.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/share/page-68e787339a16b3dc.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4fddc90b23feb215.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/tasks/page-886ba8260dc79c79.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/term/page-0f26507a1722e40b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/today/page-109d4ccd42259c9d.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/trace/page-f5c2a4e510726774.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/vault/page-b2e0039416f42522.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-90670589b87abea8.js → page-26102fd7350f171e.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/app/workflows/page-708948bc8a802794.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/workspace/page-5e5611620f78fb0b.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-35bedde6d885f08f.js → page-139ba5c367bbf60a.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/main-app-202b4e81f33895ea.js +1 -0
  61. package/apps/pwa/out/_next/static/css/43feca5fd387dcbd.css +1 -0
  62. package/apps/pwa/out/approvals/index.html +1 -1
  63. package/apps/pwa/out/approvals/index.txt +14 -14
  64. package/apps/pwa/out/autopilot/index.html +1 -1
  65. package/apps/pwa/out/autopilot/index.txt +14 -14
  66. package/apps/pwa/out/board/index.html +1 -1
  67. package/apps/pwa/out/board/index.txt +14 -14
  68. package/apps/pwa/out/botlab/index.html +1 -1
  69. package/apps/pwa/out/botlab/index.txt +14 -14
  70. package/apps/pwa/out/bots/index.html +1 -1
  71. package/apps/pwa/out/bots/index.txt +14 -14
  72. package/apps/pwa/out/chat/index.html +1 -1
  73. package/apps/pwa/out/chat/index.txt +14 -14
  74. package/apps/pwa/out/consult/index.html +1 -1
  75. package/apps/pwa/out/consult/index.txt +14 -14
  76. package/apps/pwa/out/control/index.html +1 -1
  77. package/apps/pwa/out/control/index.txt +14 -14
  78. package/apps/pwa/out/design-check/index.html +1 -1
  79. package/apps/pwa/out/design-check/index.txt +14 -14
  80. package/apps/pwa/out/editor/index.html +1 -1
  81. package/apps/pwa/out/editor/index.txt +14 -14
  82. package/apps/pwa/out/exec/index.html +1 -1
  83. package/apps/pwa/out/exec/index.txt +14 -14
  84. package/apps/pwa/out/field/index.html +1 -1
  85. package/apps/pwa/out/field/index.txt +14 -14
  86. package/apps/pwa/out/healthz +1 -1
  87. package/apps/pwa/out/index.html +1 -1
  88. package/apps/pwa/out/index.txt +14 -14
  89. package/apps/pwa/out/intake/index.html +1 -1
  90. package/apps/pwa/out/intake/index.txt +14 -14
  91. package/apps/pwa/out/live/index.html +1 -1
  92. package/apps/pwa/out/live/index.txt +14 -14
  93. package/apps/pwa/out/market/index.html +1 -1
  94. package/apps/pwa/out/market/index.txt +14 -14
  95. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  96. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  97. package/apps/pwa/out/morning/index.html +1 -1
  98. package/apps/pwa/out/morning/index.txt +14 -14
  99. package/apps/pwa/out/observatory/index.html +1 -1
  100. package/apps/pwa/out/observatory/index.txt +14 -14
  101. package/apps/pwa/out/ops/checklist/index.html +1 -1
  102. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  103. package/apps/pwa/out/ops/release/index.html +1 -1
  104. package/apps/pwa/out/ops/release/index.txt +14 -14
  105. package/apps/pwa/out/ops/seats/index.html +1 -0
  106. package/apps/pwa/out/ops/seats/index.txt +30 -0
  107. package/apps/pwa/out/reflection/index.html +1 -1
  108. package/apps/pwa/out/reflection/index.txt +15 -15
  109. package/apps/pwa/out/scheduler/index.html +1 -1
  110. package/apps/pwa/out/scheduler/index.txt +14 -14
  111. package/apps/pwa/out/sessions/index.html +1 -1
  112. package/apps/pwa/out/sessions/index.txt +14 -14
  113. package/apps/pwa/out/settings/devices/index.html +1 -1
  114. package/apps/pwa/out/settings/devices/index.txt +14 -14
  115. package/apps/pwa/out/settings/index.html +1 -1
  116. package/apps/pwa/out/settings/index.txt +14 -14
  117. package/apps/pwa/out/setup/done/index.html +1 -1
  118. package/apps/pwa/out/setup/done/index.txt +14 -14
  119. package/apps/pwa/out/setup/index.html +1 -1
  120. package/apps/pwa/out/setup/index.txt +14 -14
  121. package/apps/pwa/out/share/index.html +1 -1
  122. package/apps/pwa/out/share/index.txt +14 -14
  123. package/apps/pwa/out/showroom/index.html +1 -1
  124. package/apps/pwa/out/showroom/index.txt +14 -14
  125. package/apps/pwa/out/tasks/index.html +1 -1
  126. package/apps/pwa/out/tasks/index.txt +14 -14
  127. package/apps/pwa/out/term/index.html +1 -1
  128. package/apps/pwa/out/term/index.txt +14 -14
  129. package/apps/pwa/out/today/index.html +1 -0
  130. package/apps/pwa/out/today/index.txt +33 -0
  131. package/apps/pwa/out/trace/index.html +1 -1
  132. package/apps/pwa/out/trace/index.txt +14 -14
  133. package/apps/pwa/out/vault/index.html +1 -1
  134. package/apps/pwa/out/vault/index.txt +14 -14
  135. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  136. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  137. package/apps/pwa/out/workflows/index.html +1 -1
  138. package/apps/pwa/out/workflows/index.txt +14 -14
  139. package/apps/pwa/out/workspace/index.html +1 -1
  140. package/apps/pwa/out/workspace/index.txt +14 -14
  141. package/apps/pwa/out/worktrees/index.html +1 -1
  142. package/apps/pwa/out/worktrees/index.txt +14 -14
  143. package/graphs/field/field-feed.yaml +2 -0
  144. package/graphs/implement-loop.yaml +1 -1
  145. package/package.json +1 -1
  146. package/plugins/card-followup/graphs/run-step.ts +48 -13
  147. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  148. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  149. package/scripts/ci-pwa-build-gate.ts +160 -0
  150. package/scripts/coord-channel-watch.sh +42 -8
  151. package/scripts/coord-digest.ts +199 -0
  152. package/scripts/coord-post.sh +60 -3
  153. package/scripts/install.ps1 +68 -9
  154. package/scripts/install.sh +39 -12
  155. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  156. package/scripts/lib/tui-regress-checks.ts +146 -0
  157. package/scripts/memory-lifecycle-cycle.ts +2 -2
  158. package/scripts/ops-now-probe.ts +327 -0
  159. package/scripts/publish-internal-dist.ts +11 -1
  160. package/scripts/release-loop/cutoff.ts +19 -8
  161. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  162. package/scripts/release-loop/release-readiness.ts +9 -0
  163. package/scripts/release-loop/version-node.ts +58 -10
  164. package/scripts/repo-watch-cycle.ts +1 -1
  165. package/scripts/retro-cycle.ts +2 -2
  166. package/scripts/schedule-health-report.ts +1 -1
  167. package/scripts/storyboard/storyboard.ts +5 -161
  168. package/scripts/test-diet/lib.ts +30 -1
  169. package/scripts/test-diet/node.ts +82 -7
  170. package/scripts/test-timeout-audit.ts +114 -0
  171. package/scripts/tree-sync-alert.ts +1 -1
  172. package/scripts/tui-regress.ts +71 -0
  173. package/scripts/waitlist-daily-digest.ts +1 -1
  174. package/skills/explainer-video/SKILL.md +4 -0
  175. package/skills/explainer-video/engine/reel.mjs +18 -13
  176. package/skills/explainer-video/engine/reel.sh +24 -5
  177. package/skills/explainer-video/engine/stitch.mjs +145 -0
  178. package/skills/pitch-deck/SKILL.md +36 -0
  179. package/skills/pitch-deck/template.html +80 -0
  180. package/src/acp/codex-approval-adapter.ts +9 -3
  181. package/src/acp/core-turn-bridge.ts +117 -18
  182. package/src/acp/fact-question.ts +11 -0
  183. package/src/acp/server.ts +48 -7
  184. package/src/acp/tool-approval.ts +126 -0
  185. package/src/acp/turn-runner.ts +36 -0
  186. package/src/agent/monad-agent-turn.ts +8 -0
  187. package/src/ask-user-question/pending-questions.ts +25 -10
  188. package/src/ask-user-question/types.ts +9 -0
  189. package/src/auth/setup-link-tokens.ts +16 -5
  190. package/src/autopilot/build/integrity-gate.ts +12 -0
  191. package/src/boot/daemon-prompt-turn.ts +3 -0
  192. package/src/boot/daemon-tools/index.ts +8 -0
  193. package/src/boot/daemon-tools/types.ts +2 -0
  194. package/src/boot/daemon-tools/web-search.ts +1 -0
  195. package/src/chat/ctrl-c-in-input.ts +14 -0
  196. package/src/chat/index.ts +52 -0
  197. package/src/chat/pickers/state.ts +6 -2
  198. package/src/cli/agent-cli.ts +7 -0
  199. package/src/cli/decisions-cli.ts +25 -3
  200. package/src/cli/doctor-bundle-upload.ts +68 -0
  201. package/src/cli/doctor-cli.ts +38 -4
  202. package/src/cli/ops-cli.ts +20 -0
  203. package/src/cli/pod-cli.ts +49 -0
  204. package/src/cli/pr-cli.ts +31 -2
  205. package/src/cli/pwa-stop.ts +163 -13
  206. package/src/cli/pwa-test.ts +3 -0
  207. package/src/cli/release-cli.ts +63 -20
  208. package/src/cli/self-update.ts +14 -0
  209. package/src/cli/storyboard-cli.ts +37 -0
  210. package/src/cli/test-state-dir-flag.ts +11 -4
  211. package/src/connectors/linear.ts +146 -0
  212. package/src/context-bus/coord-events.ts +115 -0
  213. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  214. package/src/dashboard/index.ts +58 -21
  215. package/src/dashboard/slash-runtime/dashboard-handlers.ts +7 -0
  216. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  217. package/src/decisions/decision-cards.ts +49 -1
  218. package/src/decisions/decision-ledger.ts +75 -4
  219. package/src/decisions/decision-linear-projection.ts +157 -0
  220. package/src/decisions/web-push-decision-cards.ts +50 -0
  221. package/src/directive/interpretation-card.ts +36 -0
  222. package/src/discord.ts +2 -1
  223. package/src/domains/coo-admin-tool.ts +62 -0
  224. package/src/domains/core-tools.ts +11 -3
  225. package/src/domains/elanous-card.ts +29 -0
  226. package/src/domains/ops-facts-tool.ts +76 -0
  227. package/src/domains/outbound-alert.ts +41 -13
  228. package/src/domains/release-tool.ts +168 -0
  229. package/src/domains/telegram-kind-route.ts +19 -1
  230. package/src/exec-requests/planner.ts +98 -28
  231. package/src/exec-requests/runner.ts +107 -10
  232. package/src/exec-requests/store.ts +8 -2
  233. package/src/field/field-media.ts +10 -7
  234. package/src/field/field-reel.ts +14 -4
  235. package/src/git-fs/worktree.ts +45 -6
  236. package/src/graph-runner/graph-approval-card.ts +113 -0
  237. package/src/graph-runner/graph-cli.ts +129 -4
  238. package/src/graph-runner/graph-notify.ts +25 -3
  239. package/src/graph-runner/runner.ts +142 -16
  240. package/src/harness/browser-verify.ts +25 -2
  241. package/src/harness/harness-cli-command.ts +231 -35
  242. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  243. package/src/harness/harness-incidents.ts +129 -0
  244. package/src/harness/harness-stop.ts +53 -3
  245. package/src/hitl/clarification-policy.ts +3 -1
  246. package/src/index.ts +156 -37
  247. package/src/intake-plane/author-goals.ts +37 -4
  248. package/src/intake-plane/check.ts +3 -0
  249. package/src/intake-plane/discord-seat-work.ts +47 -2
  250. package/src/intake-plane/seat-doc-route.ts +170 -6
  251. package/src/intake-plane/telegram-seat-work.ts +44 -2
  252. package/src/intake-plane/telegram-work.ts +1 -0
  253. package/src/maturity/cli-maturity.ts +34 -0
  254. package/src/maturity/feature-maturity.ts +98 -1
  255. package/src/maturity/tui-slash-maturity.ts +31 -0
  256. package/src/memory.ts +32 -4
  257. package/src/nexus/api/exec-requests.ts +33 -3
  258. package/src/nexus/api/http-server.ts +53 -1
  259. package/src/nexus/api/meta-api.ts +11 -0
  260. package/src/nexus/api/ops-api.ts +10 -1
  261. package/src/nexus/api/ops-seats-sources.ts +37 -7
  262. package/src/nexus/api/ops-seats.ts +16 -6
  263. package/src/nexus/api/seat-requests.ts +88 -8
  264. package/src/nexus/api/sessions-store.ts +63 -0
  265. package/src/nexus/api/setup-codex-login.ts +160 -0
  266. package/src/nexus/api/usage-api.ts +102 -0
  267. package/src/nexus/index.ts +45 -4
  268. package/src/onboarding/first-run.ts +89 -0
  269. package/src/onboarding/lan-address.ts +45 -0
  270. package/src/onboarding/web-first.ts +119 -24
  271. package/src/onboarding.ts +4 -0
  272. package/src/ops-now/ops-now-refresh.ts +100 -0
  273. package/src/project/project-store.ts +115 -0
  274. package/src/release-loop/checklist.ts +78 -4
  275. package/src/release-loop/feature-store.ts +154 -21
  276. package/src/release-loop/release-schedule.ts +53 -0
  277. package/src/repl/index.ts +7 -0
  278. package/src/seat-dispatch/ceo-commands.ts +41 -8
  279. package/src/seat-dispatch/ceo-intent.ts +38 -0
  280. package/src/seat-loop/seat-loop.ts +231 -0
  281. package/src/seat-loop/seat-report.ts +64 -0
  282. package/src/self-dev/decompose.ts +66 -11
  283. package/src/self-dev/run-store.ts +10 -1
  284. package/src/self-implement/execution-clarification.ts +115 -0
  285. package/src/self-implement/gate-cli.ts +6 -3
  286. package/src/self-implement/orchestrator.ts +37 -3
  287. package/src/self-implement/pipeline-shape.ts +1 -1
  288. package/src/self-implement/run-status-mapping.ts +5 -3
  289. package/src/session/chat.ts +2 -0
  290. package/src/session/index.ts +9 -0
  291. package/src/shell-env-bootstrap.ts +17 -0
  292. package/src/steward/directive.ts +51 -2
  293. package/src/steward/launch.ts +250 -0
  294. package/src/steward/outcome-notify.ts +115 -0
  295. package/src/steward/steward-cards.ts +8 -2
  296. package/src/steward/triage-plan.ts +32 -4
  297. package/src/steward/triage.ts +93 -9
  298. package/src/steward/working-backwards.ts +64 -0
  299. package/src/storyboard/storyboard.ts +141 -0
  300. package/src/task-cards/card-store.ts +2 -2
  301. package/src/task-orchestrator/surfaces/pod-lease.ts +260 -0
  302. package/src/telegram-card-followup.ts +233 -0
  303. package/src/telegram-report.ts +15 -9
  304. package/src/telegram-run.ts +7 -0
  305. package/src/telegram.ts +29 -8
  306. package/src/tool-runtime/types.ts +4 -0
  307. package/src/tui-client/dashboard-session.ts +2 -0
  308. package/src/user-config.ts +118 -11
  309. package/src/version/packed-revision.json +1 -1
  310. package/src/web-push/notify-exec-request.ts +32 -0
  311. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  312. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  313. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  314. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  315. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  316. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  317. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  318. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  319. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  320. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  321. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  322. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  323. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  324. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  325. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  326. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  327. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  328. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  329. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  330. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  331. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  332. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  333. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  334. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  335. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  336. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  337. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  338. package/apps/pwa/out/_next/static/chunks/app/morning/page-adfbd2ba9598e59a.js +0 -1
  339. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  340. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  341. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  342. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  343. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  344. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  345. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  346. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  347. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  348. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  349. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  350. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  351. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  352. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  353. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  354. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  355. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  356. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  357. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  358. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  359. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  360. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  361. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → 2DsiDfDCks44g1cPUMhiW}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{5344:(e,t,r)=>{"use strict";r.d(t,{r:()=>i});var n=r(41121),a=r(45609),s=r.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 i(e){let{active:t}=e;return(0,n.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,n.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,r)=>(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.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,n.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,n.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),r<l.length-1&&(0,n.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},56557:(e,t,r)=>{Promise.resolve().then(r.bind(r,63082))},63082:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>h});var n=r(41121),a=r(91269),s=r(38519),l=r(72030),i=r(66062),d=r(5344);function o(e){var t,r,n,a,s,l,i,d,o,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!=(i=e.domain)?i:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(d=e.runVia)?d:e.source,lastRun:null!=(o=null==(t=e.lastRun)?void 0:t.at)?o:null,lastStatus:null!=(u=null==(r=e.lastRun)?void 0:r.status)?u:null,lastExit:null!=(m=null!=(c=null==(n=e.lastRun)?void 0:n.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 r of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let n=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(),r=e.map(o),n={},a={},s={};for(let e of r){var l,i,d;n[e.category]=(null!=(l=n[e.category])?l:0)+1,a[e.source]=(null!=(i=a[e.source])?i:0)+1,e.state&&(s[e.state]=(null!=(d=s[e.state])?d:0)+1)}return{total:r.length,adopted:r.filter(e=>"elanous"===e.runVia).length,byCategory:n,bySource:a,byState:s,jobs:r,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(r));if(n)return{kind:"ready",data:n};t="unexpected response from ".concat(r)}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:r,disabled:a,danger:s}=e;return(0,n.jsx)("button",{type:"button",onClick:r,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,r,a,s,l,i,d;let{job:o,onAction:u,acting:x}=e,p="daemon"===o.runVia||o.id.includes(":"),f=o.state?c[o.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let r=Math.round((t-Date.now())/6e4);if(r<1)return"next <1m";if(r<60)return"next ".concat(r,"m");let n=Math.floor(r/60);return n<24?"next ".concat(n,"h"):"next ".concat(Math.floor(n/24),"d")}(null==(t=o.next)?void 0:t[0]),h=o.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),r=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(r){let e=r[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let n=e.lastIndexOf("/");return n>=0?e.slice(n+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(o.command),v=o.note?"".concat(o.note,"\n\n").concat(o.command):o.command;return(0,n.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",o.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"truncate text-sm font-medium",children:o.name}),f?(0,n.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":o.state,children:f.label}):!o.enabled&&(0,n.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(r=o.flags)?void 0:r.includes("duplicate"))&&(0,n.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,n.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(o.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,n.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:o.cron?o.cron:o.intervalMs?"every ".concat(Math.round(o.intervalMs/1e3),"s"):"—"}),b&&o.enabled&&(0,n.jsx)("span",{className:"text-muted-foreground",title:null==(a=o.next)?void 0:a.join("\n"),children:b}),(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:o.category}),(0,n.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=m[o.runVia])?s:m.crontab),children:o.runVia}),o.lastStatus&&(0,n.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===o.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!=(i=o.lastError)?i:"ok"===o.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=o.lastExit)?l:"?"),children:["ok"===o.lastStatus?"✓":"✗",null!=o.lastDurationMs?" ".concat(Math.round(o.lastDurationMs),"ms"):"",o.lastVia&&"crontab"!==o.lastVia?" ".concat(o.lastVia):""]}),o.stale&&!f&&(0,n.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,n.jsx)("span",{className:"text-muted-foreground",title:null!=(d=o.lastRun)?d:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return"".concat(r,"s ago");let n=Math.floor(r/60);if(n<60)return"".concat(n,"m ago");let a=Math.floor(n/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(o.lastRun)}),!p&&(0,n.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===o.runVia&&(0,n.jsx)(g,{label:"adopt",onClick:()=>u("adopt",o),disabled:x}),"elanous"===o.runVia&&(0,n.jsx)(g,{label:"release",onClick:()=>u("release",o),disabled:x}),(0,n.jsx)(g,{label:o.enabled?"disable":"enable",onClick:()=>u(o.enabled?"disable":"enable",o),disabled:x}),(0,n.jsx)(g,{label:"✕",onClick:()=>u("delete",o),disabled:x,danger:!0})]})]})]})}function f(e){let{load:t,groups:r,onRefresh:a,onAction:s,busy:i,acting:d}=e;return"loading"===t.kind?(0,n.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,n.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,n.jsx)("p",{children:"Failed to load schedules"}),(0,n.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,n.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:i,children:"Retry"})]}):0===t.data.jobs.length?(0,n.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,n.jsx)("div",{className:"space-y-6",children:r.map(e=>{var t;return(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=x[e.domain])?t:e.domain}),(0,n.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,n.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,n.jsx)(p,{job:e,onAction:s,acting:d},e.id))})]},e.domain)})})}function b(){let{client:e}=(0,s.Q)(),[t,r]=(0,a.useState)({kind:"loading"}),[o,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 r=t.split(",").map(e=>e.trim()).filter(Boolean);return r.length?r:null}(window.location.search))},[]);let j=(0,a.useCallback)(async()=>{var t,n,a,s,l;if(b.current===e)return;b.current=e;let d=++p.current;m(!0),r({kind:"loading"});try{let s=await u(t=>e.fetchJson(t));t=p.current,n=b.current,d===t&&n===e&&(r(s),"error"===s.kind&&(a=s.reason,(0,i.oR.error)("scheduler load failed: ".concat(a))))}finally{s=p.current,l=b.current,d===s&&l===e&&(b.current=null,m(!1))}},[e]),N=(0,a.useCallback)(async(t,r,n)=>{if("delete"!==t||window.confirm("삭제: ".concat(r.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:r.id,...void 0!==n?{note:n}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?i.oR.error("".concat(t," 실패: ").concat(a.error)):(i.oR.success("note"===t?"설명 저장: ".concat(r.name):"".concat(t,": ").concat(r.name)),await j())}catch(e){i.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 k=(0,a.useMemo)(()=>{if(!h)return[];let e=new Map;for(let n of h.jobs){var t,r;if(v&&!v.includes(n.id))continue;let a=(r=n.domain)&&r.trim()?r:"general",s=null!=(t=e.get(a))?t:[];s.push(n),e.set(a,s)}let n=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let r=n.indexOf(e[0]),a=n.indexOf(t[0]);return(r<0?99:r)-(a<0?99:a)}).map(e=>{let[t,r]=e;return{domain:t,jobs:r.sort((e,t)=>{var r,n;return(Date.parse(null!=(r=t.lastRun)?r:"0")||0)-(Date.parse(null!=(n=e.lastRun)?n:"0")||0)})}})},[h,v]);return(0,n.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,n.jsx)(d.r,{active:"scheduler"}),(0,n.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[h&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:h.total})]}),h.byState?["live","firing","stale","off"].map(e=>{var t,r,a;return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:c[e].label}),(0,n.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==(r=h.byState)?void 0:r[e])?a:0})]},e)}):(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:h.adopted})]})]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void j(),disabled:o,children:"Refresh"})]})]}),v&&(0,n.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,n.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",v.length]}),h&&k.reduce((e,t)=>e+t.jobs.length,0)<v.length&&(0,n.jsxs)("span",{className:"text-amber-300",children:["— ",v.length-k.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,n.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{y(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,n.jsx)(f,{load:t,groups:k,onRefresh:()=>void j(),onAction:N,busy:o,acting:x})]})}function h(){return(0,n.jsx)(b,{})}},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>d});var n=r(41121),a=r(72524),s=r(49155),l=r(82157);let i=(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 d(e){let{className:t,variant:r="default",size:s="default",...d}=e;return(0,n.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(i({variant:r,size:s,className:t})),...d})}},82157:(e,t,r)=>{"use strict";r.d(t,{cn:()=>s});var n=r(3511),a=r(97043);function s(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,n.$)(t))}}},e=>{e.O(0,[2977,216,6062,7990,8519,2367,6725,7358],()=>e(e.s=56557)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{9050:(e,t,r)=>{"use strict";var n=r(65390);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}})},12536:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>x});var n=r(41121),s=r(91269),a=r(9050),i=r(66062),o=r(38519),l=r(72030),d=r(47940);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 i=0,o=a.map(e=>({m:e,userIndex:"user"===e.role?++i: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:o.map((e,t)=>{let{m:a,userIndex:i}=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(i),title:"이 발화 직전으로 갈라치기 — u".concat(i," 부터는 미포함 (원본 불변)"),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,x=(0,a.useRouter)(),{setSessionId:p}=(0,o.Q)(),[h,f]=(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 i.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),N=(0,s.useCallback)(async()=>{let e=!h;f(e),e&&!v&&await j()},[h,v,j]),w=(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),i.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){i.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{p(e),i.oR.success(t),x.push("/chat")},[p,x]),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),"…)"))):i.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){i.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),z=(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),"…)"))):i.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){i.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(()=>C(r.id,"이 세션으로 이어갑니다"),[C,r.id]),R=(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?(i.oR.success("세션 삭제됨"),g()):i.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){i.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 N(),className:"mt-0.5 text-muted-foreground",children:h?"▾":"▸"}),(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 N(),children:h?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>E(),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 R(),className:"text-rose-400 hover:text-rose-300",title:"세션 삭제(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),h&&(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 z(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function x(){var e;let{client:t}=(0,o.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,i]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[x,p]=(0,s.useState)(""),[h,f]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,N]=(0,s.useState)(""),w=(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 o=await r.list(u),l="".concat(o.total,":").concat(null!=(s=null==(t=o.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=o.sessions[0])?void 0:n.updatedAt)?a:"");l===w.current&&e||(w.current=l,i(o.sessions)),N(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=x.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===h||c(t)===h)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,x,h]),z=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,E=(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(z):"".concat(a.length,"개 \xb7 대화중 ").concat(z):"불러오는 중…",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:x,onChange:e=>p(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:()=>f(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",h===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||E[e.key]>0?" ".concat(E[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:x||"all"!==h?"검색\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))})]})}},32805:(e,t,r)=>{Promise.resolve().then(r.bind(r,12536))},47940:(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),"일 전")}},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(41121),s=r(72524),a=r(49155),i=r(82157);let o=(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,i.cn)(o({variant:r,size:a,className:t})),...l})}},82157:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(3511),s=r(97043);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))}}},e=>{e.O(0,[2977,216,6062,8519,2367,6725,7358],()=>e(e.s=32805)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{9754:(e,t,r)=>{"use strict";r.d(t,{N:()=>a});var n=r(41121),o=r(71807);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function a(){let e=(0,o.In)();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:i,description:a}=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:i}),(0,n.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:a})]},r)})})]})}},14421:(e,t,r)=>{Promise.resolve().then(r.bind(r,76913))},34182:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(89117).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},67770:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(89117).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},71807:(e,t,r)=>{"use strict";r.d(t,{GC:()=>o,In:()=>d,OG:()=>l});var n=r(91269);let o="elanous.pwa.role",i="elanous:pwa-role";function a(){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(i))}function s(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(i,e);let t=t=>{(t.key===o||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(i,e),window.removeEventListener("storage",t)}}function d(){return(0,n.useSyncExternalStore)(s,a,()=>"general")}},76913:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=r(41121),o=r(38894),i=r(9754);function a(){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)(i.N,{})}),(0,n.jsx)(o.O,{})]})}},80777:(e,t,r)=>{"use strict";r.d(t,{$L:()=>s,Kz:()=>l,Vm:()=>a,kv:()=>i});let n="elanous.pwa.chat.autoRouting",o="elanous-chat-routing-changed",i={autoRouting:!1};function a(){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,i.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(a()),r=t=>{t.key===n&&e(a())};return window.addEventListener(o,t),window.addEventListener("storage",r),()=>{window.removeEventListener(o,t),window.removeEventListener("storage",r)}}},95939:(e,t,r)=>{"use strict";r.d(t,{hn:()=>i,qv:()=>a,sg:()=>l});let n="elanous.ocr.prefs",o={defaultUseLlmVision:!1,defaultPreferHandwriting:!1};function i(){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 a(e){if("undefined"==typeof localStorage)return{...o,...e};let t={...i(),...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}}}},e=>{e.O(0,[2977,216,920,6062,6998,4114,1201,8519,2375,3441,9454,8142,8894,2367,6725,7358],()=>e(e.s=14421)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8517],{19286:(e,t,s)=>{"use strict";s.d(t,{Q:()=>c});var r=s(41121),i=s(91269),a=s(72030),n=s(59062),l=s(91514),o=s(42375);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}},26190:(e,t,s)=>{Promise.resolve().then(s.bind(s,39268))},39268:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var r=s(41121),i=s(45609),a=s.n(i),n=s(91269),l=s(72030),o=s(91514);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(76582),u=s(19286);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})]})}},51215:(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"}})}},59062:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var r=s(41121);s(91269);var i=s(94114),a=s(82157);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})}},72030:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var r=s(41121),i=s(72524),a=s(49155),n=s(82157);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})}},76582:(e,t,s)=>{"use strict";s.d(t,{W:()=>d});var r=s(41121),i=s(91269),a=s(72030),n=s(59062),l=s(91514);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}},82157:(e,t,s)=>{"use strict";s.d(t,{cn:()=>a});var r=s(3511),i=s(97043);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))}},91514:(e,t,s)=>{"use strict";s.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var r=s(41121),i=s(91269),a=s(19855),n=s(24818);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)}},91644:(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}}},e=>{e.O(0,[2977,216,920,7990,4114,2375,2367,6725,7358],()=>e(e.s=26190)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{9050:(e,t,r)=>{"use strict";var s=r(65390);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}})},9754:(e,t,r)=>{"use strict";r.d(t,{N:()=>a});var s=r(41121),i=r(71807);let n=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function a(){let e=(0,i.In)();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:n.map(t=>{let{role:r,label:n,description:a}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,i.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:a})]},r)})})]})}},45741:(e,t,r)=>{Promise.resolve().then(r.bind(r,48197))},48197:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>v});var s=r(41121),i=r(9050),n=r(91269),a=r(83023),o=r(9754),l=r(7632),d=r(72030),u=r(59062),c=r(82157);function h(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 i=null!=(t=r.minLength)?t:8;return s.length<i?{ok:!1,message:"at least ".concat(i," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function p(e){let{label:t,value:r,onChange:i,validation:a,disabled:o,placeholder:l,id:p}=e,[m,f]=(0,n.useState)(!1),g=null!=p?p:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),v=(0,n.useMemo)(()=>h(r,a),[r,a]),x=r.length>0&&!v.ok,b=(0,n.useCallback)(e=>{i(e.target.value.replace(/^\s+|\s+$/g,""))},[i]),y=(0,n.useCallback)(()=>f(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:g,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(u.p,{id:g,type:m?"text":"password",value:r,onChange:b,disabled:o,placeholder:null!=l?l:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":x,"aria-describedby":x?"".concat(g,"-error"):void 0,className:(0,c.cn)("font-mono text-xs",x&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:y,disabled:o,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),x&&v.message?(0,s.jsx)("p",{id:"".concat(g,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:v.message}):null]})}var m=r(91514);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function g(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}function v(){let e=(0,i.useRouter)(),t=(0,m.Qj)(),[r,u]=(0,n.useState)(!1),[c,p]=(0,n.useState)({status:"idle"}),[f,v]=(0,n.useState)(()=>Date.now()),[b,w]=(0,n.useState)(0),[j,k]=(0,n.useState)(null),[N,S]=(0,n.useState)(""),[C,F]=(0,n.useState)({status:"idle"});(0,n.useEffect)(()=>{u(!0)},[]);let O=(0,n.useCallback)(async()=>{if(t){w(0),v(Date.now()),p({status:"loading"});try{let e=await t.getLlmProviders();p({status:"ok",snapshot:e})}catch(e){p({status:"error",message:e.message})}}},[t]);(0,n.useEffect)(()=>{r&&t&&O()},[r,t,O]),(0,n.useEffect)(()=>{if("loading"!==c.status)return;let e=window.setInterval(()=>w(Math.floor((Date.now()-f)/1e3)),1e3);return()=>window.clearInterval(e)},[c.status,f]);let E="ok"===c.status?c.snapshot.providers:[],P=E.find(e=>"codex"===e.flow),q=(0,n.useMemo)(()=>{var e;return null!=(e=E.find(e=>e.provider===j))?e:null},[E,j]),L=(0,n.useMemo)(()=>!!q&&"mutating"!==C.status&&("auto"===q.flow||"apiKey"===q.flow&&h(N,g(q.provider)).ok),[q,N,C.status]),A=(0,n.useCallback)(async()=>{if(!t||!q)return;let r={provider:q.provider};"apiKey"===q.flow&&(r.apiKey=N),F({status:"mutating"});try{await t.setLlmProvider(r),e.push("/setup/done")}catch(e){F({status:"error",message:e instanceof Error?e.message:String(e)})}},[t,q,N,e]);return r&&t?"loading"===c.status||"idle"===c.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(o.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 ",b,"초"]}),(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"===c.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(o.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 카탈로그 로드 실패: ",c.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:O,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(o.N,{}),P?(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:()=>{k(P.provider),S(""),F({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[P.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(x,{providers:E,selected:j,onSelect:e=>{k(e),S(""),F({status:"idle"})},activeProvider:c.snapshot.activeProvider}),q?(0,s.jsx)(y,{provider:q,apiKey:N,onApiKeyChange:S,submitState:C,canSubmit:L,onSubmit:A}):(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)(a.lN,{})})]}),(0,s.jsx)(l.Q,{})]}):(0,s.jsx)(o.N,{})}function x(e){let{providers:t,selected:r,onSelect:i,activeProvider:n}=e,a=t.filter(e=>e.recommended),o=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:a.map(e=>(0,s.jsx)(b,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:i},e.provider))})]}),o.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 (",o.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:o.map(e=>(0,s.jsx)(b,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:i},e.provider))})]}):null]})}function b(e){let{provider:t,selected:r,active:i,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,c.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:[i?(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 y(e){let{provider:t,apiKey:r,onApiKeyChange:i,submitState:n,canSubmit:a,onSubmit:o}=e,l="apiKey"===t.flow,u="auto"===t.flow,c="codex"===t.flow||"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})]}),l?(0,s.jsx)(p,{label:t.apiKeyLabel,value:r,onChange:i,validation:g(t.provider),disabled:"mutating"===n.status}):null,u?(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,c?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["codex"===t.flow?"OAuth":"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:o,disabled:!a,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},51215:(e,t,r)=>{"use strict";let s;r.d(t,{cY:()=>u,x8:()=>o});let i={debug:0,info:1,warn:2,error:3},n="/v1/debug-logs/batch",a=null;function o(e){a=e}class l{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,r=JSON.stringify({records:e});try{var s,i;t=await (s=this.fetchFn(r),i=this.postTimeoutMs,new Promise((e,t)=>{let r=setTimeout(()=>t(Error("debug-forward timeout after ".concat(i,"ms"))),i);s.then(t=>{clearTimeout(r),e(t)},e=>{clearTimeout(r),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&a)try{await a(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let n=this.lastOkAt;this.lastOkAt=Date.now();let o=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:o,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:n},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(n,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=d,t="debug",r=1e4,s=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=r,this.flushMs=s,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function d(e){return(await fetch(n,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function u(e,t){if("undefined"==typeof console)return;let r=new Date().toISOString();if(void 0!==t){let s="";try{let e=new WeakSet;s=JSON.stringify(t,(t,r)=>{if("bigint"==typeof r)return"".concat(r.toString(),"n");if("function"==typeof r)return"[fn ".concat(r.name||"anon","]");if(r&&"object"==typeof r){if(e.has(r))return"[circular]";e.add(r)}return r})}catch(e){s="[unserializable: ".concat(String(e),"]")}s&&s.length>800&&(s=s.slice(0,797)+"..."),console.debug("[".concat(r,"] ").concat(e," ").concat(s),t),c(r,e,s)}else console.debug("[".concat(r,"] ").concat(e)),c(r,e,void 0)}function c(e,t,r){let i,n=function(){if(void 0!==s)return s;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return s=null,null;let t=new l(d,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return s=t,t}();if(!n)return;let a=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==r&&""!==r)try{i=JSON.parse(r)}catch(e){i=r}n.push({ts:e,category:t,event:a,...void 0!==i?{data:i}:{},source:{platform:"pwa"}})}},71807:(e,t,r)=>{"use strict";r.d(t,{GC:()=>i,In:()=>d,OG:()=>o});var s=r(91269);let i="elanous.pwa.role",n="elanous:pwa-role";function a(){try{let e=window.localStorage.getItem(i);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function o(e){try{window.localStorage.setItem(i,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function l(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===i||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(l,a,()=>"general")}},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var s=r(41121),i=r(72524),n=r(49155),a=r(82157);let o=(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 l(e){let{className:t,variant:r="default",size:n="default",...l}=e;return(0,s.jsx)(i.$,{"data-slot":"button",className:(0,a.cn)(o({variant:r,size:n,className:t})),...l})}},82157:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(3511),i=r(97043);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,i.QP)((0,s.$)(t))}},91514:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>u,tI:()=>l});var s=r(41121),i=r(91269),n=r(19855),a=r(24818);let o=(0,i.createContext)(null);function l(e){let{client:t,queryClient:r,defaultStaleTimeMs:l,children:d}=e,u=(0,i.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=l?l:2e3,refetchOnWindowFocus:!1}}}),[r,l]);return(0,s.jsx)(o.Provider,{value:t,children:(0,s.jsx)(a.Ht,{client:u,children:d})})}function d(){let e=(0,i.useContext)(o);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function u(){return(0,i.useContext)(o)}},91644:(e,t,r)=>{"use strict";r.d(t,{Qb:()=>a,SI:()=>l,dJ:()=>o});let s="elanous:auth-required",i=null,n=!1;function a(e){null===i&&(i=e,window.dispatchEvent(new CustomEvent(s,{detail:{path:e}})))}function o(e){let t=window,r=t=>e(t.detail);return t.addEventListener(s,r),null===i||n||e({path:i}),()=>t.removeEventListener(s,r)}function l(){n=!0}}},e=>{e.O(0,[2977,216,920,4114,2375,8142,2367,6725,7358],()=>e(e.s=45741)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9038],{9050:(e,t,a)=>{"use strict";var l=a(65390);a.o(l,"useParams")&&a.d(t,{useParams:function(){return l.useParams}}),a.o(l,"usePathname")&&a.d(t,{usePathname:function(){return l.usePathname}}),a.o(l,"useRouter")&&a.d(t,{useRouter:function(){return l.useRouter}}),a.o(l,"useSearchParams")&&a.d(t,{useSearchParams:function(){return l.useSearchParams}})},33236:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>f});var l=a(41121),r=a(91269),n=a(9050),s=a(51215),i=a(38519);async function o(){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 o();if(!t)return(0,s.cY)("pwa.share.l2.cache-missing",{id:e}),null;let a="/__share/".concat(e,"/manifest.json"),l=await t.match(a);if(!l)return(0,s.cY)("pwa.share.l2.no-manifest",{id:e}),null;let r=await l.json(),n=[];for(let a of r.files){let l=await t.match(a.cacheUrl);if(!l){(0,s.cY)("pwa.share.l2.file-missing",{id:e,cacheUrl:a.cacheUrl});continue}let r=await l.blob();n.push(new File([r],a.filename,{type:a.type||r.type}))}for(let e of(await t.delete(a),r.files))await t.delete(e.cacheUrl);return(0,s.cY)("pwa.share.l2.delivered",{id:e,fileCount:n.length,titleLen:r.title.length,textLen:r.text.length}),{id:r.id,title:r.title,text:r.text,url:r.url,files:n,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")}(r)}}var c=a(56178),h=a(73313);function d(){var e,t,a;let o=(0,n.useRouter)(),d=(0,n.useSearchParams)(),{config:f}=(0,i.Q)(),[m,p]=(0,r.useState)({phase:"idle"});return(0,r.useEffect)(()=>{var e,t,a;let l=null==d?void 0:d.get("shared");if(l){let e=!1;return(async()=>{p({phase:"level2-loading"});let t=await u(l);if(e)return;if(!t||0===t.files.length){t&&t.combinedText&&(0,c.vn)(t.combinedText),(0,s.cY)("pwa.share.l2.empty",{sharedId:l,hasPayload:!!t}),p({phase:"level2-empty"});let e=setTimeout(()=>o.replace("/chat"),600);return()=>clearTimeout(e)}if(!f.baseUrl)return p({phase:"level2-error",error:"daemon baseUrl not configured"});p({phase:"level2-uploading",total:t.files.length,done:0});let a=[];for(let l=0;l<t.files.length;l+=1){let r=t.files[l],n=await (0,h.v)({baseUrl:f.baseUrl,...f.token?{token:f.token}:{},file:r,filename:r.name});if(e)return;n.ok?a.push(n.meta):(0,s.cY)("pwa.share.l2.upload-failed",{i:l,reason:n.reason}),p(e=>({...e,done:l+1}))}if(0===a.length)return p({phase:"level2-error",error:"all uploads failed"});try{window.sessionStorage.setItem("elanous.pwa.shareAttachments",JSON.stringify(a))}catch(e){}t.combinedText&&(0,c.vn)(t.combinedText),p({phase:"level2-handing-off",total:t.files.length,done:t.files.length});let r=setTimeout(()=>o.replace("/chat?shared=1"),400);return()=>clearTimeout(r)})(),()=>{e=!0}}let r=null!=(e=null==d?void 0:d.get("title"))?e:null,n=null!=(t=null==d?void 0:d.get("text"))?t:null,i=null!=(a=null==d?void 0:d.get("url"))?a:null,m=function(e,t,a){let l=[];return e&&e.trim()&&l.push(e.trim()),t&&t.trim()&&l.push(t.trim()),a&&a.trim()&&l.push(a.trim()),l.join("\n\n")}(r,n,i);(0,s.cY)("pwa.share.l1.received",{hasTitle:!!r,hasText:!!n,hasUrl:!!i,len:m.length}),m.length>0&&(0,c.vn)(m),p({phase:"level1-handing-off",preview:m});let x=setTimeout(()=>o.replace("/chat"),400);return()=>clearTimeout(x)},[d,o,f.baseUrl,f.token]),(0,l.jsxs)("main",{className:"flex h-full flex-col items-center justify-center gap-3 px-6 py-10 text-center",children:[(0,l.jsx)("h1",{className:"text-base font-semibold",children:"\uD83D\uDCE5 공유 받음"}),"level1-handing-off"===m.phase&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"곧 /chat 으로 이동합니다…"}),m.preview&&(0,l.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:[m.preview.slice(0,800),m.preview.length>800?"…":""]})]}),"level2-loading"===m.phase&&(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일 읽는 중…"}),"level2-uploading"===m.phase&&(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["업로드 중… ",null!=(e=m.done)?e:0," / ",null!=(t=m.total)?t:0]}),"level2-handing-off"===m.phase&&(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:[null!=(a=m.done)?a:0," 개 첨부 완료 \xb7 /chat 이동…"]}),"level2-empty"===m.phase&&(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일이 없어요. /chat 으로 이동합니다…"}),"level2-error"===m.phase&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("p",{className:"text-xs text-rose-500",children:["업로드 실패: ",m.error]}),(0,l.jsx)("a",{href:"/app/chat",className:"text-xs text-primary underline",children:"/chat 으로 이동"})]})]})}function f(){return(0,l.jsx)(r.Suspense,{fallback:(0,l.jsx)("div",{className:"p-6 text-sm text-muted-foreground",children:"loading…"}),children:(0,l.jsx)(d,{})})}},56178:(e,t,a)=>{"use strict";a.d(t,{ht:()=>n,vn:()=>r});let l="elanous.pwa.sharePrefill";function r(e){try{window.sessionStorage.setItem(l,e)}catch(e){}}function n(){try{var e;let t=null!=(e=window.sessionStorage.getItem(l))?e:"";return window.sessionStorage.removeItem(l),t}catch(e){return""}}},71035:(e,t,a)=>{Promise.resolve().then(a.bind(a,33236))},73313:(e,t,a)=>{"use strict";a.d(t,{K:()=>n,v:()=>r});var l=a(51215);async function r(e){var t;let a=e.baseUrl.replace(/\/$/,"");if(!a)return{ok:!1,status:0,reason:"baseUrl not configured"};let r=null!=(t=e.filename)?t:e.file instanceof File?e.file.name:"upload.bin";(0,l.cY)("webterm.attach.upload.begin",{filename:r,size:e.file.size,type:e.file.type});let n=new FormData;n.append("file",e.file,r),n.append("filename",r);try{let t=await fetch("".concat(a,"/v1/attachments"),{method:"POST",body:n,...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok){let e=await t.text().catch(()=>"");return(0,l.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 r=await t.json();return(0,l.cY)("webterm.attach.upload.ok",{id:r.id,size:r.size}),{ok:!0,meta:r}}catch(t){let e=String(t instanceof Error?t.message:t);return(0,l.cY)("webterm.attach.upload.exception",{reason:e}),{ok:!1,status:0,reason:e}}}async function n(e,t){return Promise.all(e.map(e=>r({baseUrl:t.baseUrl,...void 0!==t.token?{token:t.token}:{},file:e.file,...void 0!==e.filename?{filename:e.filename}:{}})))}}},e=>{e.O(0,[8519,2367,6725,7358],()=>e(e.s=71035)),_N_E=e.O()}]);