elanous 0.2.8 → 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 (385) 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-d4b6df905f185055.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-186fc6952f027acc.js → page-f8116559c7424da7.js} +1 -1
  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-cbbe03c0da7b081a.js → page-54e1f966ab60a4dc.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/app/editor/page-7ed95f296f5ee8e9.js +1 -0
  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-c0c0d19d51342d3e.js → page-b31610deda76337b.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2e002ad8faa43291.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-7464c1987dd76e6d.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-d8ab4d1489223459.js → page-4fddc90b23feb215.js} +1 -1
  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-26102fd7350f171e.js +1 -0
  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-139ba5c367bbf60a.js +1 -0
  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 +30 -29
  64. package/apps/pwa/out/autopilot/index.html +1 -1
  65. package/apps/pwa/out/autopilot/index.txt +30 -29
  66. package/apps/pwa/out/board/index.html +1 -1
  67. package/apps/pwa/out/board/index.txt +30 -29
  68. package/apps/pwa/out/botlab/index.html +1 -1
  69. package/apps/pwa/out/botlab/index.txt +27 -26
  70. package/apps/pwa/out/bots/index.html +1 -1
  71. package/apps/pwa/out/bots/index.txt +27 -26
  72. package/apps/pwa/out/chat/index.html +1 -1
  73. package/apps/pwa/out/chat/index.txt +27 -26
  74. package/apps/pwa/out/consult/index.html +1 -1
  75. package/apps/pwa/out/consult/index.txt +30 -29
  76. package/apps/pwa/out/control/index.html +1 -1
  77. package/apps/pwa/out/control/index.txt +30 -29
  78. package/apps/pwa/out/design-check/index.html +1 -1
  79. package/apps/pwa/out/design-check/index.txt +30 -29
  80. package/apps/pwa/out/editor/index.html +1 -1
  81. package/apps/pwa/out/editor/index.txt +30 -29
  82. package/apps/pwa/out/exec/index.html +1 -1
  83. package/apps/pwa/out/exec/index.txt +30 -29
  84. package/apps/pwa/out/field/index.html +1 -1
  85. package/apps/pwa/out/field/index.txt +30 -29
  86. package/apps/pwa/out/healthz +1 -1
  87. package/apps/pwa/out/index.html +1 -1
  88. package/apps/pwa/out/index.txt +27 -26
  89. package/apps/pwa/out/intake/index.html +1 -1
  90. package/apps/pwa/out/intake/index.txt +30 -29
  91. package/apps/pwa/out/live/index.html +1 -1
  92. package/apps/pwa/out/live/index.txt +30 -29
  93. package/apps/pwa/out/market/index.html +1 -1
  94. package/apps/pwa/out/market/index.txt +27 -26
  95. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  96. package/apps/pwa/out/missions/placeholder/index.txt +27 -26
  97. package/apps/pwa/out/morning/index.html +1 -1
  98. package/apps/pwa/out/morning/index.txt +30 -29
  99. package/apps/pwa/out/observatory/index.html +1 -1
  100. package/apps/pwa/out/observatory/index.txt +30 -29
  101. package/apps/pwa/out/ops/checklist/index.html +1 -0
  102. package/apps/pwa/out/ops/checklist/index.txt +30 -0
  103. package/apps/pwa/out/ops/release/index.html +1 -0
  104. package/apps/pwa/out/ops/release/index.txt +30 -0
  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 +28 -27
  109. package/apps/pwa/out/scheduler/index.html +1 -1
  110. package/apps/pwa/out/scheduler/index.txt +30 -29
  111. package/apps/pwa/out/sessions/index.html +1 -1
  112. package/apps/pwa/out/sessions/index.txt +27 -26
  113. package/apps/pwa/out/settings/devices/index.html +1 -1
  114. package/apps/pwa/out/settings/devices/index.txt +30 -29
  115. package/apps/pwa/out/settings/index.html +1 -1
  116. package/apps/pwa/out/settings/index.txt +30 -29
  117. package/apps/pwa/out/setup/done/index.html +1 -1
  118. package/apps/pwa/out/setup/done/index.txt +30 -29
  119. package/apps/pwa/out/setup/index.html +1 -1
  120. package/apps/pwa/out/setup/index.txt +30 -29
  121. package/apps/pwa/out/share/index.html +1 -1
  122. package/apps/pwa/out/share/index.txt +30 -29
  123. package/apps/pwa/out/showroom/index.html +1 -1
  124. package/apps/pwa/out/showroom/index.txt +27 -26
  125. package/apps/pwa/out/tasks/index.html +1 -1
  126. package/apps/pwa/out/tasks/index.txt +30 -29
  127. package/apps/pwa/out/term/index.html +1 -1
  128. package/apps/pwa/out/term/index.txt +30 -29
  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 +30 -29
  133. package/apps/pwa/out/vault/index.html +1 -1
  134. package/apps/pwa/out/vault/index.txt +30 -29
  135. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  136. package/apps/pwa/out/workflows/chat-ui/index.txt +30 -29
  137. package/apps/pwa/out/workflows/index.html +1 -1
  138. package/apps/pwa/out/workflows/index.txt +30 -29
  139. package/apps/pwa/out/workspace/index.html +1 -1
  140. package/apps/pwa/out/workspace/index.txt +30 -29
  141. package/apps/pwa/out/worktrees/index.html +1 -1
  142. package/apps/pwa/out/worktrees/index.txt +30 -29
  143. package/graphs/field/field-feed.yaml +2 -0
  144. package/graphs/implement-loop.yaml +1 -1
  145. package/graphs/release/recipes.yaml +3 -0
  146. package/graphs/release/release-loop.yaml +3 -1
  147. package/graphs/test-diet/nightly-audit.yaml +18 -0
  148. package/graphs/test-diet/recipes.yaml +3 -0
  149. package/package.json +1 -1
  150. package/plugins/card-followup/graphs/run-step.ts +48 -13
  151. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  152. package/plugins/doc-draft/graphs/run-step.ts +14 -7
  153. package/scripts/ci-pwa-build-gate.ts +160 -0
  154. package/scripts/coord-channel-watch.sh +42 -8
  155. package/scripts/coord-digest.ts +199 -0
  156. package/scripts/coord-post.sh +60 -3
  157. package/scripts/install.ps1 +68 -9
  158. package/scripts/install.sh +39 -12
  159. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  160. package/scripts/lib/tui-regress-checks.ts +146 -0
  161. package/scripts/memory-lifecycle-cycle.ts +2 -2
  162. package/scripts/ops-now-probe.ts +327 -0
  163. package/scripts/publish-internal-dist.ts +11 -1
  164. package/scripts/release-loop/cutoff.ts +31 -2
  165. package/scripts/release-loop/export-check-node.ts +85 -0
  166. package/scripts/release-loop/gate-node.ts +18 -4
  167. package/scripts/release-loop/node-verdict.ts +8 -1
  168. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  169. package/scripts/release-loop/release-readiness.ts +9 -0
  170. package/scripts/release-loop/version-node.ts +58 -10
  171. package/scripts/repo-watch-cycle.ts +1 -1
  172. package/scripts/retro-cycle.ts +2 -2
  173. package/scripts/schedule-health-report.ts +1 -1
  174. package/scripts/storyboard/storyboard.ts +5 -161
  175. package/scripts/test-diet/lib.ts +31 -1
  176. package/scripts/test-diet/node.ts +134 -17
  177. package/scripts/test-timeout-audit.ts +114 -0
  178. package/scripts/tree-sync-alert.ts +1 -1
  179. package/scripts/tui-regress.ts +71 -0
  180. package/scripts/waitlist-daily-digest.ts +1 -1
  181. package/skills/explainer-video/SKILL.md +4 -0
  182. package/skills/explainer-video/engine/reel.mjs +18 -13
  183. package/skills/explainer-video/engine/reel.sh +24 -5
  184. package/skills/explainer-video/engine/stitch.mjs +145 -0
  185. package/skills/pitch-deck/SKILL.md +36 -0
  186. package/skills/pitch-deck/template.html +80 -0
  187. package/src/acp/codex-approval-adapter.ts +9 -3
  188. package/src/acp/core-turn-bridge.ts +117 -18
  189. package/src/acp/fact-question.ts +11 -0
  190. package/src/acp/server.ts +48 -7
  191. package/src/acp/tool-approval.ts +126 -0
  192. package/src/acp/turn-runner.ts +36 -0
  193. package/src/agent/monad-agent-turn.ts +8 -0
  194. package/src/ask-user-question/pending-questions.ts +25 -10
  195. package/src/ask-user-question/types.ts +9 -0
  196. package/src/auth/setup-link-tokens.fixture.ts +19 -0
  197. package/src/auth/setup-link-tokens.ts +164 -0
  198. package/src/autopilot/build/integrity-gate.ts +12 -0
  199. package/src/boot/daemon-prompt-turn.ts +3 -0
  200. package/src/boot/daemon-tools/index.ts +8 -0
  201. package/src/boot/daemon-tools/types.ts +2 -0
  202. package/src/boot/daemon-tools/web-search.ts +1 -0
  203. package/src/budget/unified-usage.ts +75 -0
  204. package/src/channel-bot-token.ts +37 -10
  205. package/src/chat/ctrl-c-in-input.ts +14 -0
  206. package/src/chat/index.ts +61 -9
  207. package/src/chat/pickers/state.ts +6 -2
  208. package/src/cli/agent-cli.ts +7 -0
  209. package/src/cli/decisions-cli.ts +25 -3
  210. package/src/cli/doctor-bundle-upload.ts +68 -0
  211. package/src/cli/doctor-cli.ts +38 -4
  212. package/src/cli/op-proxy-sync.ts +83 -0
  213. package/src/cli/ops-cli.ts +20 -0
  214. package/src/cli/pod-cli.ts +49 -0
  215. package/src/cli/pr-cli.ts +37 -4
  216. package/src/cli/pwa-stop.ts +163 -13
  217. package/src/cli/pwa-test.ts +3 -0
  218. package/src/cli/release-cli.ts +98 -15
  219. package/src/cli/self-update.ts +14 -0
  220. package/src/cli/storyboard-cli.ts +37 -0
  221. package/src/cli/test-state-dir-flag.ts +11 -4
  222. package/src/connectors/linear.ts +146 -0
  223. package/src/context-bus/coord-events.ts +115 -0
  224. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  225. package/src/dashboard/dashboard-status-lines.ts +45 -0
  226. package/src/dashboard/first-screen-band.ts +35 -0
  227. package/src/dashboard/index.ts +128 -34
  228. package/src/dashboard/provider-slash-runtime.ts +28 -11
  229. package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -0
  230. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  231. package/src/dashboard/turn-stream-formatter.ts +1 -1
  232. package/src/decisions/decision-cards.ts +50 -2
  233. package/src/decisions/decision-ledger.ts +75 -4
  234. package/src/decisions/decision-linear-projection.ts +157 -0
  235. package/src/decisions/web-push-decision-cards.ts +50 -0
  236. package/src/directive/interpretation-card.ts +36 -0
  237. package/src/discord.ts +2 -1
  238. package/src/domains/coo-admin-tool.ts +62 -0
  239. package/src/domains/core-tools.ts +11 -3
  240. package/src/domains/elanous-card.ts +29 -0
  241. package/src/domains/ops-facts-tool.ts +76 -0
  242. package/src/domains/outbound-alert.ts +41 -13
  243. package/src/domains/release-tool.ts +168 -0
  244. package/src/domains/telegram-kind-route.ts +19 -1
  245. package/src/exec-requests/planner.ts +98 -28
  246. package/src/exec-requests/runner.ts +107 -10
  247. package/src/exec-requests/store.ts +8 -2
  248. package/src/field/field-media.ts +10 -7
  249. package/src/field/field-reel.ts +14 -4
  250. package/src/git-fs/worktree.ts +45 -6
  251. package/src/graph-runner/graph-approval-card.ts +113 -0
  252. package/src/graph-runner/graph-cli.ts +129 -4
  253. package/src/graph-runner/graph-notify.ts +25 -3
  254. package/src/graph-runner/runner.ts +142 -16
  255. package/src/harness/browser-verify.ts +25 -2
  256. package/src/harness/harness-cli-command.ts +231 -35
  257. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  258. package/src/harness/harness-incidents.ts +129 -0
  259. package/src/harness/harness-stop.ts +53 -3
  260. package/src/hitl/clarification-policy.ts +3 -1
  261. package/src/index.ts +172 -41
  262. package/src/intake-plane/author-goals.ts +37 -4
  263. package/src/intake-plane/check.ts +3 -0
  264. package/src/intake-plane/discord-seat-work.ts +47 -2
  265. package/src/intake-plane/seat-doc-route.ts +170 -6
  266. package/src/intake-plane/telegram-seat-work.ts +44 -2
  267. package/src/intake-plane/telegram-work.ts +1 -0
  268. package/src/maturity/cli-maturity.ts +34 -0
  269. package/src/maturity/feature-maturity.ts +100 -1
  270. package/src/maturity/tui-slash-maturity.ts +31 -0
  271. package/src/memory.ts +32 -4
  272. package/src/nexus/api/exec-requests.ts +33 -3
  273. package/src/nexus/api/http-server.ts +73 -1
  274. package/src/nexus/api/meta-api.ts +38 -0
  275. package/src/nexus/api/operator.ts +61 -0
  276. package/src/nexus/api/ops-api.ts +148 -0
  277. package/src/nexus/api/ops-seats-sources.ts +95 -0
  278. package/src/nexus/api/ops-seats.ts +124 -0
  279. package/src/nexus/api/public-routes.ts +14 -1
  280. package/src/nexus/api/seat-requests.ts +88 -8
  281. package/src/nexus/api/sessions-store.ts +63 -0
  282. package/src/nexus/api/setup-claim.ts +21 -0
  283. package/src/nexus/api/setup-codex-login.ts +160 -0
  284. package/src/nexus/api/usage-api.ts +102 -0
  285. package/src/nexus/config/secrets/file-backend.ts +56 -18
  286. package/src/nexus/index.ts +45 -4
  287. package/src/onboarding/first-run-doctor.ts +54 -0
  288. package/src/onboarding/first-run.ts +89 -0
  289. package/src/onboarding/lan-address.ts +45 -0
  290. package/src/onboarding/web-first.ts +119 -24
  291. package/src/onboarding.ts +4 -0
  292. package/src/ops-now/ops-now-refresh.ts +100 -0
  293. package/src/project/project-store.ts +115 -0
  294. package/src/release-loop/checklist.ts +76 -61
  295. package/src/release-loop/feature-store.ts +460 -0
  296. package/src/release-loop/manifest.ts +59 -5
  297. package/src/release-loop/release-schedule.ts +53 -0
  298. package/src/repl/index.ts +7 -0
  299. package/src/seat-dispatch/ceo-commands.ts +98 -0
  300. package/src/seat-dispatch/ceo-intent.ts +38 -0
  301. package/src/seat-loop/seat-loop.ts +231 -0
  302. package/src/seat-loop/seat-report.ts +64 -0
  303. package/src/self-dev/decompose.ts +66 -11
  304. package/src/self-dev/run-store.ts +10 -1
  305. package/src/self-implement/execution-clarification.ts +115 -0
  306. package/src/self-implement/gate-cli.ts +6 -3
  307. package/src/self-implement/orchestrator.ts +37 -3
  308. package/src/self-implement/pipeline-shape.ts +1 -1
  309. package/src/self-implement/run-status-mapping.ts +5 -3
  310. package/src/session/chat.ts +2 -0
  311. package/src/session/index.ts +9 -0
  312. package/src/shell-env-bootstrap.ts +17 -0
  313. package/src/skills/tools/usage-slash.ts +8 -7
  314. package/src/steward/directive.ts +51 -2
  315. package/src/steward/launch.ts +250 -0
  316. package/src/steward/outcome-notify.ts +115 -0
  317. package/src/steward/steward-cards.ts +8 -2
  318. package/src/steward/triage-plan.ts +32 -4
  319. package/src/steward/triage.ts +93 -9
  320. package/src/steward/working-backwards.ts +64 -0
  321. package/src/storyboard/storyboard.ts +141 -0
  322. package/src/task-cards/card-store.ts +2 -2
  323. package/src/task-orchestrator/surfaces/pod-lease.ts +260 -0
  324. package/src/telegram-card-followup.ts +233 -0
  325. package/src/telegram-commands.ts +16 -0
  326. package/src/telegram-report.ts +15 -9
  327. package/src/telegram-run.ts +90 -13
  328. package/src/telegram.ts +29 -8
  329. package/src/thinking-line.ts +28 -20
  330. package/src/tool-runtime/types.ts +4 -0
  331. package/src/tui/chat/execution-badge.ts +1 -1
  332. package/src/tui-client/dashboard-session.ts +2 -0
  333. package/src/user-config.ts +118 -11
  334. package/src/ux-sim/turn-states.ts +1 -1
  335. package/src/version/packed-revision.json +1 -1
  336. package/src/web-push/notify-exec-request.ts +32 -0
  337. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  338. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  339. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  340. package/apps/pwa/out/_next/static/chunks/4836-3084c58c1725a40b.js +0 -1
  341. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  342. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  343. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  344. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  345. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  346. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  347. package/apps/pwa/out/_next/static/chunks/8894-7317998f6cb97d8c.js +0 -1
  348. package/apps/pwa/out/_next/static/chunks/9454-a3e0953307216c58.js +0 -1
  349. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  350. package/apps/pwa/out/_next/static/chunks/app/approvals/page-9aa47b0bc6d570ff.js +0 -1
  351. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f4d2ecbbae6088d6.js +0 -1
  352. package/apps/pwa/out/_next/static/chunks/app/board/page-2053e49930c82748.js +0 -1
  353. package/apps/pwa/out/_next/static/chunks/app/bots/page-a70ba27c33003dd0.js +0 -1
  354. package/apps/pwa/out/_next/static/chunks/app/consult/page-18166f885d831d3e.js +0 -1
  355. package/apps/pwa/out/_next/static/chunks/app/control/page-1c9d6cfe68b121c2.js +0 -1
  356. package/apps/pwa/out/_next/static/chunks/app/editor/page-c108ff1fdb665c97.js +0 -1
  357. package/apps/pwa/out/_next/static/chunks/app/exec/page-147a328753d983e2.js +0 -1
  358. package/apps/pwa/out/_next/static/chunks/app/field/page-799395a9df7d95aa.js +0 -1
  359. package/apps/pwa/out/_next/static/chunks/app/intake/page-6a8158b71d1fe9d7.js +0 -1
  360. package/apps/pwa/out/_next/static/chunks/app/layout-9567560270857531.js +0 -1
  361. package/apps/pwa/out/_next/static/chunks/app/live/page-e7ed3d010153d818.js +0 -1
  362. package/apps/pwa/out/_next/static/chunks/app/morning/page-b672e02e4bec8deb.js +0 -1
  363. package/apps/pwa/out/_next/static/chunks/app/not-found-1ba4a5d857276334.js +0 -1
  364. package/apps/pwa/out/_next/static/chunks/app/observatory/page-9db2226f38c542fb.js +0 -1
  365. package/apps/pwa/out/_next/static/chunks/app/page-70ee65f5f7a151dc.js +0 -1
  366. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0bb8e43203efb23b.js +0 -1
  367. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-092e1bcf27d751cc.js +0 -1
  368. package/apps/pwa/out/_next/static/chunks/app/sessions/page-eb52580c4b75b905.js +0 -1
  369. package/apps/pwa/out/_next/static/chunks/app/settings/page-e573437b0a1c728f.js +0 -1
  370. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-294300625e49e4d3.js +0 -1
  371. package/apps/pwa/out/_next/static/chunks/app/setup/page-085847b088675978.js +0 -1
  372. package/apps/pwa/out/_next/static/chunks/app/share/page-9fe9d38c36999eb4.js +0 -1
  373. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6141f67f531d8b6a.js +0 -1
  374. package/apps/pwa/out/_next/static/chunks/app/term/page-295a02b1026b8255.js +0 -1
  375. package/apps/pwa/out/_next/static/chunks/app/trace/page-1eb9a0e1e054209d.js +0 -1
  376. package/apps/pwa/out/_next/static/chunks/app/vault/page-82efa177a30f3741.js +0 -1
  377. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d0be51cec4f62606.js +0 -1
  378. package/apps/pwa/out/_next/static/chunks/app/workflows/page-2e367075ffdbc062.js +0 -1
  379. package/apps/pwa/out/_next/static/chunks/app/workspace/page-647ed2b66c1d49f1.js +0 -1
  380. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ba058c56e38f2792.js +0 -1
  381. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  382. package/apps/pwa/out/_next/static/css/5ef72a618a8994f3.css +0 -1
  383. package/apps/pwa/out/_next/static/lywc8m_HDzH9MKSDQhyEj/_buildManifest.js +0 -1
  384. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  385. /package/apps/pwa/out/_next/static/{lywc8m_HDzH9MKSDQhyEj → 2DsiDfDCks44g1cPUMhiW}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{5584:(e,n,t)=>{"use strict";t.d(n,{SeatBoardView:()=>p});var r=t(41121),l=t(91269),s=t(38519),o=t(25241),a=t(34613);let i=[{seat:"OP",role:"COO"},{seat:"MK",role:"CMO"},{seat:"TC",role:"CTO"},{seat:"UX",role:"CXO"}];function d(e){return null===e?"못 읽음":String(e)}function c(e,n,t){let r=e.split(/\r?\n/);return n?r.filter(e=>(0,a.Wf)(e)&&!t.some(n=>e.includes(n))).map(a.Es):r}function u(e){var n,t,l,s,o,i;let{seat:u,role:m,publicCapture:p,identifiers:f}=e,h=null!=(n=null==u?void 0:u.landed)?n:null,x=null!=(t=null==u?void 0:u.blocked)?t:null,b=null!=(l=null==u?void 0:u.checklist)?l:null;return(0,r.jsxs)("article",{className:"min-w-0 space-y-5 rounded-2xl border bg-card p-5 shadow-sm","aria-label":"".concat(m," 자리"),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-3xl font-bold tracking-tight",children:m}),(0,r.jsx)("div",{className:"mt-3 min-h-12 break-words text-muted-foreground","aria-label":"지금 하는 일",children:(null==u?void 0:u.now)?c((0,a.q9)(u.now.text),p,f).map((e,n)=>(0,r.jsx)("p",{children:e},n)):"못 읽음"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 착지",children:[(0,r.jsxs)("h3",{className:"font-semibold",children:["오늘 착지 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===h?"text-muted-foreground":""),children:d(null!=(s=null==h?void 0:h.length)?s:null)})]}),h&&(0,r.jsx)("ul",{className:"mt-2 space-y-1",children:h.slice(-5).reverse().flatMap(e=>c(e.title,p,f).map((n,t)=>(0,r.jsx)("li",{className:"break-words",children:p?n:"#".concat(e.pr," \xb7 ").concat(n)},"".concat(e.pr,"-").concat(t))))})]}),(0,r.jsxs)("section",{"aria-label":"막힘",children:[(0,r.jsxs)("h3",{className:"font-semibold text-red-600 dark:text-red-400",children:["막힘 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===x?"text-muted-foreground":""),children:d(null!=(o=null==x?void 0:x.length)?o:null)})]}),x&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:x.flatMap(e=>c(e.title,p,f).map((n,t)=>(0,r.jsx)("li",{className:"break-words",children:p?n:"".concat(e.id," \xb7 ").concat(n)},"".concat(e.id,"-").concat(t))))})]}),(0,r.jsxs)("p",{children:["대표 결정 대기 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat((null==u?void 0:u.pendingDecisions)==null?"text-muted-foreground":""),children:d(null!=(i=null==u?void 0:u.pendingDecisions)?i:null)})]}),(0,r.jsx)("section",{"aria-label":"칸 상태",className:"flex flex-wrap gap-2 border-t pt-3",children:b?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,n)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(b[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][n]," ",b[e]]},e))}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"못 읽음"})})]})}function m(e){let{result:n,refreshedAt:t,publicCapture:l=!1}=e;if((null==n?void 0:n.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let s=(null==n?void 0:n.kind)==="ready"?n.data.seats:[],o=s.flatMap(e=>{var n,t;return[...(null!=(n=e.landed)?n:[]).flatMap(e=>[String(e.pr),...e.checklistId?[e.checklistId]:[]]),...(null!=(t=e.blocked)?t:[]).map(e=>e.id)]});return(0,r.jsxs)("main",{className:"mx-auto w-full max-w-[1920px] space-y-6 p-4 text-foreground md:p-8 ".concat(l?"flex min-h-screen flex-col text-base":""),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-muted-foreground",children:"운영 / 자리 현황"}),(0,r.jsx)("h1",{className:"text-3xl font-bold",children:"자리 현황"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 합계",className:"flex flex-wrap items-center gap-x-8 gap-y-3 rounded-2xl border bg-card p-5",children:[["landed","blocked","pendingDecisions"].map(e=>{let t=(null==n?void 0:n.kind)!=="ready"||i.some(n=>{var t;let{seat:r}=n;return!s.find(e=>e.seat===r)||(null==(t=s.find(e=>e.seat===r))?void 0:t[e])===null})?"못 읽음":String(s.reduce((n,t)=>n+("pendingDecisions"===e?t.pendingDecisions:t[e].length),0));return(0,r.jsxs)("p",{children:["landed"===e?"오늘 착지":"blocked"===e?"막힘":"결정 대기"," ",(0,r.jsx)("strong",{className:"".concat(l?"text-5xl":"text-3xl").concat("못 읽음"===t?" text-muted-foreground":""),children:t})]},e)}),(0,r.jsxs)("p",{children:["마지막 갱신 ",(0,r.jsx)("time",{dateTime:null!=t?t:void 0,children:t?new Date(t).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"}):"못 읽음"})]})]}),null===n&&(0,r.jsx)("p",{role:"status",children:"자리 현황을 불러오는 중…"}),(null==n?void 0:n.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["자리 현황을 불러오지 못했습니다 (",n.status,")"]}),(null==n?void 0:n.kind)==="ready"&&(0,r.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 min-[1440px]:grid-cols-4",children:i.map(e=>{let{seat:n,role:t}=e;return(0,r.jsx)(u,{seat:s.find(e=>e.seat===n),role:t,publicCapture:l,identifiers:o},n)})}),l&&(0,r.jsx)("footer",{className:"mt-auto border-t pt-4 text-center font-semibold tracking-wide",children:"PUBLIC CAPTURE \xb7 가린 화면"})]})}function p(){let{client:e}=(0,s.Q)(),[n,t]=(0,l.useState)(null),[a,i]=(0,l.useState)(null),[d,c]=(0,l.useState)(null);return((0,l.useEffect)(()=>{c("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,l.useEffect)(()=>{let n=!0,r=!1,l=!1,s=async()=>{if(!n||r||l||document.hidden)return;r=!0;let s=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),a=await (0,o.Nn)(e,s);r=!1,n&&(t(a),"forbidden"===a.kind&&(l=!0),"ready"===a.kind&&i(new Date().toISOString()))};t(null),i(null),s();let a=window.setInterval(()=>{s()},3e4),d=()=>{document.hidden||s()};return document.addEventListener("visibilitychange",d),()=>{n=!1,window.clearInterval(a),document.removeEventListener("visibilitychange",d)}},[e]),null===d)?null:(0,r.jsx)(m,{result:n,refreshedAt:a,publicCapture:d})}},25241:(e,n,t)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e}function s(e){return l(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function o(e){return r(e)&&l(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&l(e.summary)}function a(e){return r(e)&&l(e.runId)&&l(e.status)&&l(e.startedAt)&&(null===e.version||l(e.version))&&Array.isArray(e.path)&&e.path.every(l)&&Array.isArray(e.nodes)&&e.nodes.every(o)}function i(e){return r(e)&&l(e.id)&&l(e.title)&&l(e.status)&&(void 0===e.owner||l(e.owner))&&l(e.updatedAt)&&(void 0===e.evidence||l(e.evidence))}t.d(n,{HG:()=>h,Kh:()=>f,Nn:()=>m,oc:()=>p});let d=e=>Number.isInteger(e)&&e>=0;function c(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||l(e.role))&&(null===e.now||r(e.now)&&l(e.now.text)&&l(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&d(e.pr)&&l(e.title)&&l(e.at)&&(null===e.checklistId||l(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||d(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(n=>d(e.checklist[n])))}async function u(e,n,t){try{let r=await e.fetchResponse(n,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let l=t(await r.json());return null===l?{kind:"error",status:r.status}:{kind:"ready",data:l}}catch(e){return{kind:"error",status:0}}}function m(e,n){return u(e,"/v1/ops/seats".concat(n?"?date=".concat(encodeURIComponent(n)):""),e=>r(e)&&l(e.date)&&Array.isArray(e.seats)&&e.seats.every(c)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function p(e,n){return u(e,"/v1/ops/release/runs".concat(n?"?version=".concat(encodeURIComponent(n)):""),e=>Array.isArray(e)&&e.every(a)?e:null)}function f(e,n,t){return u(e,"/v1/ops/release/runs/".concat(encodeURIComponent(n),"/nodes/").concat(encodeURIComponent(t),"/log"),e=>r(e)&&l(e.log)?{log:e.log}:null)}function h(e,n){return u(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(n)),e=>{var n,t,o,a;if(!(r(e)&&l(e.version)&&(void 0===e.codename||l(e.codename))&&Array.isArray(e.items)&&e.items.every(i)&&["green","yellow","red","done"].every(n=>void 0===e[n]||Number.isInteger(e[n])&&e[n]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(l))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let d={green:0,yellow:0,red:0,done:0};for(let n of e.items)n.status in d&&d[n.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&s(e.schedule.cutAt)&&(null===e.schedule.landBy||s(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(n=e.green)?n:d.green,yellow:null!=(t=e.yellow)?t:d.yellow,red:null!=(o=e.red)?o:d.red,done:null!=(a=e.done)?a:d.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},27813:(e,n,t)=>{"use strict";t.d(n,{Zr:()=>o,f6:()=>l,oD:()=>s});let r="elanous.daemon.sessionId";function l(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let n=l();return localStorage.setItem(r,n),n}function o(){let e=l();return localStorage.setItem(r,e),e}},34613:(e,n,t)=>{"use strict";t.d(n,{Es:()=>o,Wf:()=>l,q9:()=>s});let r=/\u{1F451}|`[^`]+`|\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{7,40}\b|\/Users\/|\/(?:home|root)\/|\/\.ssh\/|~\/\.elanous|elt_|\$\s*[-+]?\d[\d,.]*|run-[0-9a-f]{8}\b|\b(?:test|mirror):|\b(?:account|remote)-\d+\b|\bmsb\d+\b|\.ts\.net\b|\bgcpvm\b|user|[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/iu;function l(e){return!r.test(e)}function s(e){return(e.replace(/^\s*\*\*\[[A-Za-z]{1,4}\]\*\*\s*/,"").replace(/^(?:\{\{TS\}\}|\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}(?::\d{2})?\s*(?:KST)?)\s*/,"").replace(/^→\s*(?:(?:[A-Z]{2,4}|전원|전체)(?=[\s·,(]|$)[\s·,]*)+/u,"").trim()||e.trim()).replace(/\*\*/g,"")}function o(e){return e.replace(/#\d{4,6}\b/g,"PR")}},38519:(e,n,t)=>{"use strict";t.d(n,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var r=t(41121),l=t(91269),s=t(49536),o=t(27813),a=t(45012),i=t(51215);let d=(0,l.createContext)(null);function c(e){let{children:n}=e,t={baseUrl:"",token:"",provider:""},[c,u]=(0,l.useState)(t),[m,p]=(0,l.useState)(""),[f]=(0,l.useState)(()=>new a.ki(t));(0,l.useEffect)(()=>{let e=(0,s.Fp)();u(e),f.updateConfig(e),p((0,o.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let n=(0,s.Fp)();f.updateConfig(n),u(n),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!n.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(n=>n===e.newValue?n:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:n||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let h=e=>{u(n=>{let t={...n,...e};return(0,s.Qc)(e),f.updateConfig(t),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),t})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,l.useMemo)(()=>({config:c,setConfig:h,client:f,sessionId:m,setSessionId:x}),[c,f,m]);return(0,r.jsx)(d.Provider,{value:b,children:n})}function u(){let e=(0,l.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},73760:(e,n,t)=>{Promise.resolve().then(t.bind(t,5584))}},e=>{e.O(0,[5012,2367,6725,7358],()=>e(e.s=73760)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{29314:(e,s,_)=>{Promise.resolve().then(_.bind(_,14829))}},e=>{e.O(0,[2977,920,7990,988,9454,7633,2367,6725,7358],()=>e(e.s=29314)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4538],{12775:(e,t,r)=>{"use strict";r.d(t,{K:()=>n}),r(91269);let n={emit:async function(e){return{ok:!1,reason:"not-configured"}}}},27813:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>i,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function i(){let e=s();return localStorage.setItem(n,e),e}},38519:(e,t,r)=>{"use strict";r.d(t,{C:()=>l,DaemonProvider:()=>c,Q:()=>u});var n=r(41121),s=r(91269),a=r(49536),i=r(27813),o=r(45012),d=r(51215);let l=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,p]=(0,s.useState)(""),[g]=(0,s.useState)(()=>new o.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),g.updateConfig(e),p((0,i.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();g.updateConfig(t),u(t),(0,d.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,d.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let f=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),g.updateConfig(r),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:f,client:g,sessionId:m,setSessionId:x}),[c,g,m]);return(0,n.jsx)(l.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(l);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},58910:(e,t,r)=>{"use strict";r.d(t,{DailyReflectionPanel:()=>c});var n=r(41121),s=r(91269),a=r(99608),i=r(38519),o=r(72030);function d(e){let{snapshot:t}=e,r=0===t.notesSaved&&0===t.ocrRuns&&0===t.sessionsToday;return(0,n.jsxs)("article",{"data-testid":"daily-reflection","data-date":t.date,className:"flex flex-col gap-4 rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,n.jsx)("h2",{className:"font-heading text-base font-medium","data-testid":"reflection-date",children:t.date}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"reflection-generated-at",children:["생성 ",function(e){try{return new Date(e).toLocaleTimeString("ko-KR",{hour:"2-digit",minute:"2-digit"})}catch(t){return e}}(t.generatedAt)]})]}),r?(0,n.jsx)("p",{"data-testid":"reflection-empty",className:"rounded-md bg-muted/50 px-3 py-4 text-center text-sm text-muted-foreground",children:"오늘 기록된 활동이 없습니다."}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("dl",{className:"grid grid-cols-3 gap-3 text-sm",children:[(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"노트 저장"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-notes-saved",children:t.notesSaved})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"OCR 실행"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-ocr-runs",children:t.ocrRuns})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"세션"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-sessions-today",children:t.sessionsToday})]})]}),t.topSessions.length>0&&(0,n.jsxs)("section",{children:[(0,n.jsxs)("h3",{className:"mb-2 text-xs font-medium text-muted-foreground",children:["활성 세션 Top ",t.topSessions.length]}),(0,n.jsx)("ul",{"data-testid":"reflection-top-sessions",className:"flex flex-col gap-2 text-xs",children:t.topSessions.map(e=>(0,n.jsxs)("li",{"data-testid":"reflection-session-row","data-session-id":e.id,className:"rounded-md border border-border px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsx)("code",{className:"truncate font-mono text-[11px]",children:e.id}),(0,n.jsxs)("span",{className:"shrink-0 text-muted-foreground",children:["msgs ",e.msgCount]})]}),e.lastMsgPreview&&(0,n.jsx)("p",{className:"mt-1 line-clamp-2 text-muted-foreground",children:e.lastMsgPreview})]},e.id))})]})]})]})}let l={date:"",notesSaved:0,ocrRuns:0,sessionsToday:0,topSessions:[],generatedAt:""};function c(){let{config:e}=(0,i.Q)(),[t,r]=(0,s.useState)(l),[c,u]=(0,s.useState)(!1),[m,p]=(0,s.useState)(null),g=(0,s.useCallback)(async()=>{if(e.baseUrl){u(!0);try{let t=await fetch("".concat(e.baseUrl,"/v1/reflection/today"),{...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok)return void p("HTTP ".concat(t.status));let n=await t.json();r(n.snapshot),p(null)}catch(e){p(String(e instanceof Error?e.message:e))}finally{u(!1)}}},[e.baseUrl,e.token]);return(0,s.useEffect)(()=>{g();let e=setInterval(()=>{g()},3e5);return()=>clearInterval(e)},[g]),(0,n.jsxs)("section",{"data-testid":"daily-reflection-panel",className:"mx-auto flex max-w-md flex-col gap-3 p-4",children:[(0,n.jsxs)("header",{className:"flex items-start justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"font-heading text-lg font-medium",children:"오늘의 회고"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"오늘 elanous 활동 요약 \xb7 5분마다 자동 갱신"})]}),(0,n.jsx)(o.$,{type:"button",variant:"ghost",size:"sm","aria-label":"refresh reflection",onClick:()=>void g(),disabled:c,children:(0,n.jsx)(a.A,{className:c?"h-3.5 w-3.5 animate-spin":"h-3.5 w-3.5"})})]}),m&&(0,n.jsxs)("p",{"data-testid":"reflection-panel-error",className:"rounded bg-destructive/10 px-2 py-1 text-xs text-destructive",children:["fetch 실패: ",m]}),(0,n.jsx)(d,{snapshot:t})]})}},59591:(e,t,r)=>{"use strict";r.d(t,{ReflectionRouteIntentBeacon:()=>a});var n=r(91269),s=r(12775);function a(){return(0,n.useEffect)(()=>{let e=function(){try{let e=new URLSearchParams(window.location.search);if("push"===e.get("from"))return"push";let t=document.referrer||"";if(t&&t.startsWith(window.location.origin))return"manual";return"unknown"}catch(e){return"unknown"}}();s.K.emit({surface:"pwa",intent:{layer:"navigation",kind:"pwa.navigation.reflection_opened",target:{kind:"route",id:"/reflection",label:"Reflection"},value:{source:e}},surface_state:{route:"/reflection"}})},[]),null}},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>d});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 d(e){let{className:t,variant:r="default",size:a="default",...d}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(o({variant:r,size:a,className:t})),...d})}},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))}},89117:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var n=r(91269);let s=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var i={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,n.createContext)({}),d=(0,n.forwardRef)((e,t)=>{var r,a,d;let{color:l,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:g,iconNode:f,...x}=e,{size:h=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,color:w="currentColor",className:y=""}=null!=(r=(0,n.useContext)(o))?r:{},k=(null!=m?m:b)?24*Number(null!=u?u:v)/Number(null!=c?c:h):null!=u?u:v;return(0,n.createElement)("svg",{ref:t,...i,width:null!=(a=null!=c?c:h)?a:i.width,height:null!=(d=null!=c?c:h)?d:i.height,stroke:null!=l?l:w,strokeWidth:k,className:s("lucide",y,p),...!g&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(x)&&{"aria-hidden":"true"},...x},[...f.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(g)?g:[g]])}),l=(e,t)=>{let r=(0,n.forwardRef)((r,i)=>{let{className:o,...l}=r;return(0,n.createElement)(d,{ref:i,iconNode:t,className:s("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...l})});return r.displayName=a(e),r}},98579:(e,t,r)=>{Promise.resolve().then(r.bind(r,58910)),Promise.resolve().then(r.bind(r,59591))},99608:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(89117).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])}},e=>{e.O(0,[2977,216,5012,2367,6725,7358],()=>e(e.s=98579)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{5344:(e,t,n)=>{"use strict";n.d(t,{r:()=>o});var r=n(41121),a=n(45609),s=n.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,r.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,r.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,n)=>(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsxs)(s(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,r.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,r.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),n<l.length-1&&(0,r.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},27813:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>a,oD:()=>s});let r="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=a();return localStorage.setItem(r,t),t}function l(){let e=a();return localStorage.setItem(r,e),e}},38519:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(41121),a=n(91269),s=n(49536),l=n(27813),o=n(45012),i=n(51215);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(n),[m,x]=(0,a.useState)(""),[g]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),g.updateConfig(e),x((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&x(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let p=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),g.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},f=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,a.useMemo)(()=>({config:u,setConfig:p,client:g,sessionId:m,setSessionId:f}),[u,g,m]);return(0,r.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},41111:(e,t,n)=>{Promise.resolve().then(n.bind(n,63082))},63082:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>h});var r=n(41121),a=n(91269),s=n(38519),l=n(72030),o=n(66062),i=n(5344);function d(e){var t,n,r,a,s,l,o,i,d,u,c,m,x,g,p,f;return{id:e.id,name:e.name,cron:e.cron,intervalMs:e.intervalMs,category:null!=(l=e.category)?l:e.source,domain:null!=(o=e.domain)?o:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(i=e.runVia)?i:e.source,lastRun:null!=(d=null==(t=e.lastRun)?void 0:t.at)?d:null,lastStatus:null!=(u=null==(n=e.lastRun)?void 0:n.status)?u:null,lastExit:null!=(m=null!=(c=null==(r=e.lastRun)?void 0:r.exit)?c:e.lastExit)?m:null,lastDurationMs:null!=(x=null==(a=e.lastRun)?void 0:a.durationMs)?x:null,lastVia:null!=(g=null==(s=e.lastRun)?void 0:s.via)?g:null,stale:"stale"===e.state,command:null!=(p=e.command)?p:"",note:null!=(f=e.note)?f:null,state:e.state,next:e.next,flags:e.flags}}async function u(e){let t="Unknown error";for(let n of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let r=function(e){if(!e||"object"!=typeof e)return null;if(Array.isArray(e.schedules))return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString(),n=e.map(d),r={},a={},s={};for(let e of n){var l,o,i;r[e.category]=(null!=(l=r[e.category])?l:0)+1,a[e.source]=(null!=(o=a[e.source])?o:0)+1,e.state&&(s[e.state]=(null!=(i=s[e.state])?i:0)+1)}return{total:n.length,adopted:n.filter(e=>"elanous"===e.runVia).length,byCategory:r,bySource:a,byState:s,jobs:n,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(n));if(r)return{kind:"ready",data:r};t="unexpected response from ".concat(n)}catch(e){t=e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}return{kind:"error",reason:t}}let c={live:{label:"켜짐",tone:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",tip:"실제 발화 경로(crontab\xb7launchd\xb7trigger)에 올라 있다"},firing:{label:"발화 중",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30",tip:"발화 경로에 올라 있고 최근 실행 기록이 있다"},stale:{label:"유실 의심",tone:"bg-amber-500/15 text-amber-300 ring-amber-500/30",tip:"예정 시각이 지났는데 실행 기록이 없다"},off:{label:"꺼짐",tone:"bg-muted text-muted-foreground ring-border",tip:"어느 발화 경로에도 없다(레지스트리에만 있다)"}},m={elanous:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",daemon:"bg-sky-500/15 text-sky-200 ring-sky-500/30",crontab:"bg-muted text-muted-foreground ring-border"},x={finance:"Finance",elanous:"elanous (core)",general:"General"};function g(e){let{label:t,onClick:n,disabled:a,danger:s}=e;return(0,r.jsx)("button",{type:"button",onClick:n,disabled:a,className:["rounded-md px-1.5 py-0.5 text-[10px] ring-1 transition-colors disabled:opacity-40",s?"text-red-300 ring-red-500/30 hover:bg-red-500/15":"text-muted-foreground ring-border hover:bg-accent/40 hover:text-foreground"].join(" "),children:t})}function p(e){var t,n,a,s,l,o,i;let{job:d,onAction:u,acting:x}=e,p="daemon"===d.runVia||d.id.includes(":"),f=d.state?c[d.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let n=Math.round((t-Date.now())/6e4);if(n<1)return"next <1m";if(n<60)return"next ".concat(n,"m");let r=Math.floor(n/60);return r<24?"next ".concat(r,"h"):"next ".concat(Math.floor(r/24),"d")}(null==(t=d.next)?void 0:t[0]),h=d.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),n=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(n){let e=n[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let r=e.lastIndexOf("/");return r>=0?e.slice(r+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(d.command),v=d.note?"".concat(d.note,"\n\n").concat(d.command):d.command;return(0,r.jsxs)("div",{className:["flex flex-col gap-1 rounded-xl border border-border bg-card p-3 sm:flex-row sm:items-center sm:justify-between",d.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"truncate text-sm font-medium",children:d.name}),f?(0,r.jsx)("span",{className:"shrink-0 whitespace-nowrap rounded-full px-1.5 py-0.5 text-[10px] ring-1 ".concat(f.tone),title:f.tip,"data-schedule-state":d.state,children:f.label}):!d.enabled&&(0,r.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(n=d.flags)?void 0:n.includes("duplicate"))&&(0,r.jsx)("span",{className:"rounded-full bg-red-500/15 px-1.5 py-0.5 text-[10px] text-red-300 ring-1 ring-red-500/30",title:"같은 명령이 두 번 발화한다",children:"duplicate"})]}),(0,r.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(d.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,r.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:d.cron?d.cron:d.intervalMs?"every ".concat(Math.round(d.intervalMs/1e3),"s"):"—"}),b&&d.enabled&&(0,r.jsx)("span",{className:"text-muted-foreground",title:null==(a=d.next)?void 0:a.join("\n"),children:b}),(0,r.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:d.category}),(0,r.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=m[d.runVia])?s:m.crontab),children:d.runVia}),d.lastStatus&&(0,r.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===d.lastStatus?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-red-500/15 text-red-300 ring-red-500/30"),title:null!=(o=d.lastError)?o:"ok"===d.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=d.lastExit)?l:"?"),children:["ok"===d.lastStatus?"✓":"✗",null!=d.lastDurationMs?" ".concat(Math.round(d.lastDurationMs),"ms"):"",d.lastVia&&"crontab"!==d.lastVia?" ".concat(d.lastVia):""]}),d.stale&&!f&&(0,r.jsx)("span",{className:"rounded-full bg-amber-500/15 px-2 py-0.5 text-amber-300 ring-1 ring-amber-500/30",title:"예정 시각이 지났는데 미실행(유실 의심)",children:"stale"}),(0,r.jsx)("span",{className:"text-muted-foreground",title:null!=(i=d.lastRun)?i:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<60)return"".concat(n,"s ago");let r=Math.floor(n/60);if(r<60)return"".concat(r,"m ago");let a=Math.floor(r/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(d.lastRun)}),!p&&(0,r.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===d.runVia&&(0,r.jsx)(g,{label:"adopt",onClick:()=>u("adopt",d),disabled:x}),"elanous"===d.runVia&&(0,r.jsx)(g,{label:"release",onClick:()=>u("release",d),disabled:x}),(0,r.jsx)(g,{label:d.enabled?"disable":"enable",onClick:()=>u(d.enabled?"disable":"enable",d),disabled:x}),(0,r.jsx)(g,{label:"✕",onClick:()=>u("delete",d),disabled:x,danger:!0})]})]})]})}function f(e){let{load:t,groups:n,onRefresh:a,onAction:s,busy:o,acting:i}=e;return"loading"===t.kind?(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,r.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,r.jsx)("p",{children:"Failed to load schedules"}),(0,r.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,r.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:o,children:"Retry"})]}):0===t.data.jobs.length?(0,r.jsx)("div",{className:"rounded-xl border border-dashed border-border px-3 py-10 text-center text-sm text-muted-foreground",children:"no schedules"}):(0,r.jsx)("div",{className:"space-y-6",children:n.map(e=>{var t;return(0,r.jsxs)("section",{className:"space-y-2",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=x[e.domain])?t:e.domain}),(0,r.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,r.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,r.jsx)(p,{job:e,onAction:s,acting:i},e.id))})]},e.domain)})})}function b(){let{client:e}=(0,s.Q)(),[t,n]=(0,a.useState)({kind:"loading"}),[d,m]=(0,a.useState)(!1),[x,g]=(0,a.useState)(!1),p=(0,a.useRef)(0),b=(0,a.useRef)(null),h="ready"===t.kind?t.data:null,[v,y]=(0,a.useState)(null);(0,a.useEffect)(()=>{y(function(e){let t=new URLSearchParams(e).get("ids");if(!t)return null;let n=t.split(",").map(e=>e.trim()).filter(Boolean);return n.length?n:null}(window.location.search))},[]);let j=(0,a.useCallback)(async()=>{var t,r,a,s,l;if(b.current===e)return;b.current=e;let i=++p.current;m(!0),n({kind:"loading"});try{let s=await u(t=>e.fetchJson(t));t=p.current,r=b.current,i===t&&r===e&&(n(s),"error"===s.kind&&(a=s.reason,(0,o.oR.error)("scheduler load failed: ".concat(a))))}finally{s=p.current,l=b.current,i===s&&l===e&&(b.current=null,m(!1))}},[e]),k=(0,a.useCallback)(async(t,n,r)=>{if("delete"!==t||window.confirm("삭제: ".concat(n.name,"?\n(자동 백업되어 복구 가능)"))){g(!0);try{let a=await e.fetchJson("/v1/schedules/action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,id:n.id,...void 0!==r?{note:r}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?o.oR.error("".concat(t," 실패: ").concat(a.error)):(o.oR.success("note"===t?"설명 저장: ".concat(n.name):"".concat(t,": ").concat(n.name)),await j())}catch(e){o.oR.error("".concat(t," 실패: ").concat(e instanceof Error?e.message:e))}finally{g(!1)}}},[e,j]);(0,a.useEffect)(()=>{j();let e=window.setInterval(()=>void j(),3e4);return()=>window.clearInterval(e)},[j]);let N=(0,a.useMemo)(()=>{if(!h)return[];let e=new Map;for(let r of h.jobs){var t,n;if(v&&!v.includes(r.id))continue;let a=(n=r.domain)&&n.trim()?n:"general",s=null!=(t=e.get(a))?t:[];s.push(r),e.set(a,s)}let r=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let n=r.indexOf(e[0]),a=r.indexOf(t[0]);return(n<0?99:n)-(a<0?99:a)}).map(e=>{let[t,n]=e;return{domain:t,jobs:n.sort((e,t)=>{var n,r;return(Date.parse(null!=(n=t.lastRun)?n:"0")||0)-(Date.parse(null!=(r=e.lastRun)?r:"0")||0)})}})},[h,v]);return(0,r.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,r.jsx)(i.r,{active:"scheduler"}),(0,r.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[h&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.total})]}),h.byState?["live","firing","stale","off"].map(e=>{var t,n,a;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:c[e].label}),(0,r.jsx)("div",{className:"text-sm font-semibold ".concat("stale"===e&&(null==(t=h.byState)?void 0:t[e])?"text-amber-300":""),children:null!=(a=null==(n=h.byState)?void 0:n[e])?a:0})]},e)}):(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,r.jsx)("div",{className:"text-sm font-semibold",children:h.adopted})]})]}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void j(),disabled:d,children:"Refresh"})]})]}),v&&(0,r.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-primary/40 bg-primary/10 px-3 py-2 text-xs","data-schedule-ids-filter":!0,children:[(0,r.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",v.length]}),h&&N.reduce((e,t)=>e+t.jobs.length,0)<v.length&&(0,r.jsxs)("span",{className:"text-amber-300",children:["— ",v.length-N.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,r.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{y(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,r.jsx)(f,{load:t,groups:N,onRefresh:()=>void j(),onAction:k,busy:d,acting:x})]})}function h(){return(0,r.jsx)(b,{})}},72030:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(41121),a=n(72524),s=n(49155),l=n(82157);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function i(e){let{className:t,variant:n="default",size:s="default",...i}=e;return(0,r.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(o({variant:n,size:s,className:t})),...i})}},82157:(e,t,n)=>{"use strict";n.d(t,{cn:()=>s});var r=n(3511),a=n(97043);function s(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,a.QP)((0,r.$)(t))}}},e=>{e.O(0,[2977,216,6062,7990,5012,2367,6725,7358],()=>e(e.s=41111)),_N_E=e.O()}]);
@@ -0,0 +1 @@
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:()=>p});var n=r(41121),s=r(91269),a=r(9050),o=r(66062),i=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 o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}},27813:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function o(){let e=s();return localStorage.setItem(n,e),e}},38519:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(41121),s=r(91269),a=r(49536),o=r(27813),i=r(45012),l=r(51215);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},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),"일 전")}},50007:(e,t,r)=>{Promise.resolve().then(r.bind(r,12536))},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(41121),s=r(72524),a=r(49155),o=r(82157);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},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,5012,2367,6725,7358],()=>e(e.s=50007)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{9438:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(41121),i=s(91269),c=s(94387);class l extends Error{constructor(e,t,s){super("devices ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="DevicesApiError"}}function n(e){let{api:t}=e,[s,c]=(0,i.useState)(null),[n,r]=(0,i.useState)(null),[o,d]=(0,i.useState)(!0);return((0,i.useEffect)(()=>{let e=!1;return t.fleet().then(t=>{e||(c(t),d(!1))}).catch(t=>{e||(r(t instanceof l?"(".concat(t.status,") ").concat(t.path):String(t)),d(!1))}),()=>{e=!0}},[t]),o)?(0,a.jsx)("div",{className:"text-sm opacity-70",children:"Loading device fleet…"}):n?(0,a.jsx)("div",{role:"alert",className:"rounded bg-rose-50 px-3 py-2 text-sm text-rose-900",children:n}):s?0===s.totalDevices?(0,a.jsxs)("div",{className:"rounded border border-zinc-200 bg-zinc-50 p-4 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"No Apple devices detected yet."}),(0,a.jsxs)("p",{className:"mt-1 opacity-70",children:["The iOS Companion writes ",(0,a.jsx)("code",{children:"~/.elanous/devices.json"})," on iCloud sync. Install it on at least one Apple device to populate this list."]})]}):(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsxs)("caption",{className:"text-xs opacity-60 text-left mb-2",children:["snapshot @ ",new Date(s.snapshotAt).toLocaleString()," \xb7 ",s.totalDevices," devices"]}),(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-zinc-200 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("th",{className:"text-left py-1",children:"kind"}),(0,a.jsx)("th",{className:"text-right py-1",children:"count"}),(0,a.jsx)("th",{className:"text-left py-1 pl-3",children:"capabilities"})]})}),(0,a.jsx)("tbody",{children:s.kinds.map(e=>(0,a.jsxs)("tr",{className:"border-b border-zinc-100 align-top",children:[(0,a.jsx)("td",{className:"py-1 font-medium",children:e.kind}),(0,a.jsx)("td",{className:"py-1 text-right tabular-nums",children:e.count}),(0,a.jsx)("td",{className:"py-1 pl-3 text-xs",children:0===e.capabilities.length?(0,a.jsx)("span",{className:"opacity-50",children:"(none advertised)"}):e.capabilities.map(e=>(0,a.jsx)("span",{className:"mr-1 inline-block rounded bg-zinc-100 px-1.5 py-0.5",children:e},e))})]},e.kind))})]}):(0,a.jsx)("div",{className:"text-sm opacity-70",children:"No fleet data."})}function r(){let e=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch;async function i(t,i){let c={"content-type":"application/json"};e.authHeader&&(c.authorization=e.authHeader);let n=await a("".concat(s).concat(t),{...i,headers:c}),r=await n.json().catch(()=>null);if(!n.ok)throw new l(n.status,t,r);return r}return{fleet:async()=>await i(c.WF),preview:async e=>await i(c.bR,{method:"POST",body:JSON.stringify(e)})}})({baseUrl:window.location.origin}),[]);return(0,a.jsxs)("section",{className:"flex flex-col gap-4 p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-lg font-semibold",children:"Device fleet"}),(0,a.jsx)("p",{className:"text-xs opacity-70",children:"Detected Apple devices \xb7 OMF v1 templates use this to decide which capabilities to fire vs gracefully degrade. iPhone-only fleets still get full template value via the fallback chain."})]}),(0,a.jsx)(n,{api:e})]})}},71882:(e,t,s)=>{Promise.resolve().then(s.bind(s,9438))},94387:(e,t,s)=>{"use strict";s.d(t,{GM:()=>n,J3:()=>l,WF:()=>a,bR:()=>c,m:()=>r,r5:()=>i});let a="/v1/devices",i="/v1/approvals/merges",c="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",n="/v1/morning-digest/showroom",r="/v1/next-fluent/dispatch"}},e=>{e.O(0,[2367,6725,7358],()=>e(e.s=71882)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{9438:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(41121),i=s(91269),c=s(94387);class l extends Error{constructor(e,t,s){super("devices ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="DevicesApiError"}}function n(e){let{api:t}=e,[s,c]=(0,i.useState)(null),[n,r]=(0,i.useState)(null),[o,d]=(0,i.useState)(!0);return((0,i.useEffect)(()=>{let e=!1;return t.fleet().then(t=>{e||(c(t),d(!1))}).catch(t=>{e||(r(t instanceof l?"(".concat(t.status,") ").concat(t.path):String(t)),d(!1))}),()=>{e=!0}},[t]),o)?(0,a.jsx)("div",{className:"text-sm opacity-70",children:"Loading device fleet…"}):n?(0,a.jsx)("div",{role:"alert",className:"rounded bg-rose-50 px-3 py-2 text-sm text-rose-900",children:n}):s?0===s.totalDevices?(0,a.jsxs)("div",{className:"rounded border border-zinc-200 bg-zinc-50 p-4 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"No Apple devices detected yet."}),(0,a.jsxs)("p",{className:"mt-1 opacity-70",children:["The iOS Companion writes ",(0,a.jsx)("code",{children:"~/.elanous/devices.json"})," on iCloud sync. Install it on at least one Apple device to populate this list."]})]}):(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsxs)("caption",{className:"text-xs opacity-60 text-left mb-2",children:["snapshot @ ",new Date(s.snapshotAt).toLocaleString()," \xb7 ",s.totalDevices," devices"]}),(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-zinc-200 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("th",{className:"text-left py-1",children:"kind"}),(0,a.jsx)("th",{className:"text-right py-1",children:"count"}),(0,a.jsx)("th",{className:"text-left py-1 pl-3",children:"capabilities"})]})}),(0,a.jsx)("tbody",{children:s.kinds.map(e=>(0,a.jsxs)("tr",{className:"border-b border-zinc-100 align-top",children:[(0,a.jsx)("td",{className:"py-1 font-medium",children:e.kind}),(0,a.jsx)("td",{className:"py-1 text-right tabular-nums",children:e.count}),(0,a.jsx)("td",{className:"py-1 pl-3 text-xs",children:0===e.capabilities.length?(0,a.jsx)("span",{className:"opacity-50",children:"(none advertised)"}):e.capabilities.map(e=>(0,a.jsx)("span",{className:"mr-1 inline-block rounded bg-zinc-100 px-1.5 py-0.5",children:e},e))})]},e.kind))})]}):(0,a.jsx)("div",{className:"text-sm opacity-70",children:"No fleet data."})}function r(){let e=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch;async function i(t,i){let c={"content-type":"application/json"};e.authHeader&&(c.authorization=e.authHeader);let n=await a("".concat(s).concat(t),{...i,headers:c}),r=await n.json().catch(()=>null);if(!n.ok)throw new l(n.status,t,r);return r}return{fleet:async()=>await i(c.WF),preview:async e=>await i(c.bR,{method:"POST",body:JSON.stringify(e)})}})({baseUrl:window.location.origin}),[]);return(0,a.jsxs)("section",{className:"flex flex-col gap-4 p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-lg font-semibold",children:"Device fleet"}),(0,a.jsx)("p",{className:"text-xs opacity-70",children:"Detected Apple devices \xb7 OMF v1 templates use this to decide which capabilities to fire vs gracefully degrade. iPhone-only fleets still get full template value via the fallback chain."})]}),(0,a.jsx)(n,{api:e})]})}},40569:(e,t,s)=>{Promise.resolve().then(s.bind(s,9438))},94387:(e,t,s)=>{"use strict";s.d(t,{GM:()=>n,J3:()=>l,WF:()=>a,bR:()=>c,m:()=>r,r5:()=>i});let a="/v1/devices",i="/v1/approvals/merges",c="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",n="/v1/morning-digest/showroom",r="/v1/next-fluent/dispatch"}},e=>{e.O(0,[2367,6725,7358],()=>e(e.s=40569)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{839:(e,t,n)=>{Promise.resolve().then(n.bind(n,76913))},9754:(e,t,n)=>{"use strict";n.d(t,{N:()=>s});var r=n(41121),o=n(71807),a=n(75230);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function s(){let e=(0,o.In)(),{showBeta:t,setShowBeta:n}=(0,a.hj)();return(0,r.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,r.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,r.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:n,label:a,description:i}=t;return(0,r.jsxs)("button",{type:"button","aria-pressed":e===n,onClick:()=>(0,o.OG)(n),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===n?"border-primary bg-primary/10":"border-border"),children:[(0,r.jsx)("span",{className:"block font-medium",children:a}),(0,r.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},n)})}),"general"===e&&(0,r.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,r.jsx)("span",{children:"실험 기능 켜기"}),(0,r.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>n(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},34182:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});let r=(0,n(89117).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},67770:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});let r=(0,n(89117).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},71807:(e,t,n)=>{"use strict";n.d(t,{GC:()=>o,In:()=>c,OG:()=>s});var r=n(91269);let o="elanous.pwa.role",a="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(o);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function s(e){try{window.localStorage.setItem(o,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function l(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let t=t=>{(t.key===o||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",t)}}function c(){return(0,r.useSyncExternalStore)(l,i,()=>"general")}},75230:(e,t,n)=>{"use strict";n.d(t,{hj:()=>s});var r=n(91269);let o="elanous.pwa.showBeta",a="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(o)}catch(e){return!1}}function s(){let[e,t]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{t(i());let e=e=>{let n=e.detail;t("boolean"==typeof n?n:i())},n=e=>{(e.key===o||null===e.key)&&t(i())};return window.addEventListener(a,e),window.addEventListener("storage",n),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",n)}},[]),{showBeta:e,setShowBeta:(0,r.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(o,"1"):window.localStorage.removeItem(o)}catch(e){}window.dispatchEvent(new CustomEvent(a,{detail:e}))},[])}}},76913:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>i});var r=n(41121),o=n(38894),a=n(9754);function i(){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mx-auto max-w-2xl px-6 pt-6",children:(0,r.jsx)(a.N,{})}),(0,r.jsx)(o.O,{})]})}},80777:(e,t,n)=>{"use strict";n.d(t,{$L:()=>l,Kz:()=>s,Vm:()=>i,kv:()=>a});let r="elanous.pwa.chat.autoRouting",o="elanous-chat-routing-changed",a={autoRouting:!1};function i(){return{autoRouting:function(e,t){try{let n=window.localStorage.getItem(e);if("1"===n)return!0;if("0"===n)return!1;return t}catch(e){return t}}(r,a.autoRouting)}}function s(e){try{window.localStorage.setItem(r,e?"1":"0")}catch(e){}window.dispatchEvent(new CustomEvent(o))}function l(e){let t=()=>e(i()),n=t=>{t.key===r&&e(i())};return window.addEventListener(o,t),window.addEventListener("storage",n),()=>{window.removeEventListener(o,t),window.removeEventListener("storage",n)}}},95939:(e,t,n)=>{"use strict";n.d(t,{hn:()=>a,qv:()=>i,sg:()=>s});let r="elanous.ocr.prefs",o={defaultUseLlmVision:!1,defaultPreferHandwriting:!1};function a(){if("undefined"==typeof localStorage)return{...o};try{let e=localStorage.getItem(r);if(!e)return{...o};let t=JSON.parse(e);return{defaultUseLlmVision:"boolean"==typeof t.defaultUseLlmVision?t.defaultUseLlmVision:o.defaultUseLlmVision,defaultPreferHandwriting:"boolean"==typeof t.defaultPreferHandwriting?t.defaultPreferHandwriting:o.defaultPreferHandwriting}}catch(e){return{...o}}}function i(e){if("undefined"==typeof localStorage)return{...o,...e};let t={...a(),...e};try{localStorage.setItem(r,JSON.stringify(t))}catch(e){}return t}function s(){if("undefined"==typeof localStorage)return{...o};try{localStorage.removeItem(r)}catch(e){}return{...o}}}},e=>{e.O(0,[2977,216,920,6062,6998,4114,988,5012,2375,7951,9454,8142,8894,2367,6725,7358],()=>e(e.s=839)),_N_E=e.O()}]);
@@ -0,0 +1 @@
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}},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})}},61620:(e,t,s)=>{Promise.resolve().then(s.bind(s,39268))},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=61620)),_N_E=e.O()}]);
@@ -0,0 +1 @@
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:()=>l});var s=r(41121),a=r(71807),n=r(75230);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},48197:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(41121),a=r(9050),n=r(91269),i=r(83023),l=r(9754),o=r(7632),d=r(72030),c=r(59062),u=r(82157);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(91514),g=r(45012),v=r(49536);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},64199:(e,t,r)=>{Promise.resolve().then(r.bind(r,48197))},71807:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(91269);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}},72030:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(41121),a=r(72524),n=r(49155),i=r(82157);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},75230:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(91269);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},82157:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(3511),a=r(97043);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},91514:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(41121),a=r(91269),n=r(19855),i=r(24818);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}}},e=>{e.O(0,[2977,216,920,4114,5012,2375,8142,2367,6725,7358],()=>e(e.s=64199)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9038],{369:(e,t,r)=>{Promise.resolve().then(r.bind(r,33236))},9050:(e,t,r)=>{"use strict";var a=r(65390);r.o(a,"useParams")&&r.d(t,{useParams:function(){return a.useParams}}),r.o(a,"usePathname")&&r.d(t,{usePathname:function(){return a.usePathname}}),r.o(a,"useRouter")&&r.d(t,{useRouter:function(){return a.useRouter}}),r.o(a,"useSearchParams")&&r.d(t,{useSearchParams:function(){return a.useSearchParams}})},27813:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>l,f6:()=>n,oD:()=>s});let a="elanous.daemon.sessionId";function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(a,e),e):localStorage.getItem(a)}();if(e)return e;let t=n();return localStorage.setItem(a,t),t}function l(){let e=n();return localStorage.setItem(a,e),e}},33236:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>m});var a=r(41121),n=r(91269),s=r(9050),l=r(51215),o=r(38519);async function i(){if("undefined"==typeof caches)return null;let e=(await caches.keys()).filter(e=>e.startsWith("elanous-pwa-share-target-")).sort().reverse();return 0===e.length?null:caches.open(e[0])}async function u(e){if(!e)return null;let t=await i();if(!t)return(0,l.cY)("pwa.share.l2.cache-missing",{id:e}),null;let r="/__share/".concat(e,"/manifest.json"),a=await t.match(r);if(!a)return(0,l.cY)("pwa.share.l2.no-manifest",{id:e}),null;let n=await a.json(),s=[];for(let r of n.files){let a=await t.match(r.cacheUrl);if(!a){(0,l.cY)("pwa.share.l2.file-missing",{id:e,cacheUrl:r.cacheUrl});continue}let n=await a.blob();s.push(new File([n],r.filename,{type:r.type||n.type}))}for(let e of(await t.delete(r),n.files))await t.delete(e.cacheUrl);return(0,l.cY)("pwa.share.l2.delivered",{id:e,fileCount:s.length,titleLen:n.title.length,textLen:n.text.length}),{id:n.id,title:n.title,text:n.text,url:n.url,files:s,combinedText:function(e){let t=[];return e.title.trim()&&t.push(e.title.trim()),e.text.trim()&&t.push(e.text.trim()),e.url.trim()&&t.push(e.url.trim()),t.join("\n\n")}(n)}}var c=r(56178),d=r(73313);function h(){var e,t,r;let i=(0,s.useRouter)(),h=(0,s.useSearchParams)(),{config:m}=(0,o.Q)(),[f,p]=(0,n.useState)({phase:"idle"});return(0,n.useEffect)(()=>{var e,t,r;let a=null==h?void 0:h.get("shared");if(a){let e=!1;return(async()=>{p({phase:"level2-loading"});let t=await u(a);if(e)return;if(!t||0===t.files.length){t&&t.combinedText&&(0,c.vn)(t.combinedText),(0,l.cY)("pwa.share.l2.empty",{sharedId:a,hasPayload:!!t}),p({phase:"level2-empty"});let e=setTimeout(()=>i.replace("/chat"),600);return()=>clearTimeout(e)}if(!m.baseUrl)return p({phase:"level2-error",error:"daemon baseUrl not configured"});p({phase:"level2-uploading",total:t.files.length,done:0});let r=[];for(let a=0;a<t.files.length;a+=1){let n=t.files[a],s=await (0,d.v)({baseUrl:m.baseUrl,...m.token?{token:m.token}:{},file:n,filename:n.name});if(e)return;s.ok?r.push(s.meta):(0,l.cY)("pwa.share.l2.upload-failed",{i:a,reason:s.reason}),p(e=>({...e,done:a+1}))}if(0===r.length)return p({phase:"level2-error",error:"all uploads failed"});try{window.sessionStorage.setItem("elanous.pwa.shareAttachments",JSON.stringify(r))}catch(e){}t.combinedText&&(0,c.vn)(t.combinedText),p({phase:"level2-handing-off",total:t.files.length,done:t.files.length});let n=setTimeout(()=>i.replace("/chat?shared=1"),400);return()=>clearTimeout(n)})(),()=>{e=!0}}let n=null!=(e=null==h?void 0:h.get("title"))?e:null,s=null!=(t=null==h?void 0:h.get("text"))?t:null,o=null!=(r=null==h?void 0:h.get("url"))?r:null,f=function(e,t,r){let a=[];return e&&e.trim()&&a.push(e.trim()),t&&t.trim()&&a.push(t.trim()),r&&r.trim()&&a.push(r.trim()),a.join("\n\n")}(n,s,o);(0,l.cY)("pwa.share.l1.received",{hasTitle:!!n,hasText:!!s,hasUrl:!!o,len:f.length}),f.length>0&&(0,c.vn)(f),p({phase:"level1-handing-off",preview:f});let x=setTimeout(()=>i.replace("/chat"),400);return()=>clearTimeout(x)},[h,i,m.baseUrl,m.token]),(0,a.jsxs)("main",{className:"flex h-full flex-col items-center justify-center gap-3 px-6 py-10 text-center",children:[(0,a.jsx)("h1",{className:"text-base font-semibold",children:"\uD83D\uDCE5 공유 받음"}),"level1-handing-off"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"곧 /chat 으로 이동합니다…"}),f.preview&&(0,a.jsxs)("pre",{className:"max-h-[60vh] max-w-full overflow-auto rounded-md border border-border bg-card p-3 text-left text-[11px] whitespace-pre-wrap break-words",children:[f.preview.slice(0,800),f.preview.length>800?"…":""]})]}),"level2-loading"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일 읽는 중…"}),"level2-uploading"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:["업로드 중… ",null!=(e=f.done)?e:0," / ",null!=(t=f.total)?t:0]}),"level2-handing-off"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:[null!=(r=f.done)?r:0," 개 첨부 완료 \xb7 /chat 이동…"]}),"level2-empty"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일이 없어요. /chat 으로 이동합니다…"}),"level2-error"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{className:"text-xs text-rose-500",children:["업로드 실패: ",f.error]}),(0,a.jsx)("a",{href:"/app/chat",className:"text-xs text-primary underline",children:"/chat 으로 이동"})]})]})}function m(){return(0,a.jsx)(n.Suspense,{fallback:(0,a.jsx)("div",{className:"p-6 text-sm text-muted-foreground",children:"loading…"}),children:(0,a.jsx)(h,{})})}},38519:(e,t,r)=>{"use strict";r.d(t,{C:()=>u,DaemonProvider:()=>c,Q:()=>d});var a=r(41121),n=r(91269),s=r(49536),l=r(27813),o=r(45012),i=r(51215);let u=(0,n.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,d]=(0,n.useState)(r),[h,m]=(0,n.useState)(""),[f]=(0,n.useState)(()=>new o.ki(r));(0,n.useEffect)(()=>{let e=(0,s.Fp)();d(e),f.updateConfig(e),m((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.updateConfig(t),d(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&m(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let p=e=>{d(t=>{let r={...t,...e};return(0,s.Qc)(e),f.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{m(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},w=(0,n.useMemo)(()=>({config:c,setConfig:p,client:f,sessionId:h,setSessionId:x}),[c,f,h]);return(0,a.jsx)(u.Provider,{value:w,children:t})}function d(){let e=(0,n.useContext)(u);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},56178:(e,t,r)=>{"use strict";r.d(t,{ht:()=>s,vn:()=>n});let a="elanous.pwa.sharePrefill";function n(e){try{window.sessionStorage.setItem(a,e)}catch(e){}}function s(){try{var e;let t=null!=(e=window.sessionStorage.getItem(a))?e:"";return window.sessionStorage.removeItem(a),t}catch(e){return""}}},73313:(e,t,r)=>{"use strict";r.d(t,{K:()=>s,v:()=>n});var a=r(51215);async function n(e){var t;let r=e.baseUrl.replace(/\/$/,"");if(!r)return{ok:!1,status:0,reason:"baseUrl not configured"};let n=null!=(t=e.filename)?t:e.file instanceof File?e.file.name:"upload.bin";(0,a.cY)("webterm.attach.upload.begin",{filename:n,size:e.file.size,type:e.file.type});let s=new FormData;s.append("file",e.file,n),s.append("filename",n);try{let t=await fetch("".concat(r,"/v1/attachments"),{method:"POST",body:s,...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok){let e=await t.text().catch(()=>"");return(0,a.cY)("webterm.attach.upload.error",{status:t.status,detail:e.slice(0,200)}),{ok:!1,status:t.status,reason:e||"HTTP ".concat(t.status)}}let n=await t.json();return(0,a.cY)("webterm.attach.upload.ok",{id:n.id,size:n.size}),{ok:!0,meta:n}}catch(t){let e=String(t instanceof Error?t.message:t);return(0,a.cY)("webterm.attach.upload.exception",{reason:e}),{ok:!1,status:0,reason:e}}}async function s(e,t){return Promise.all(e.map(e=>n({baseUrl:t.baseUrl,...void 0!==t.token?{token:t.token}:{},file:e.file,...void 0!==e.filename?{filename:e.filename}:{}})))}}},e=>{e.O(0,[5012,2367,6725,7358],()=>e(e.s=369)),_N_E=e.O()}]);