elanous 0.2.11 → 0.2.12

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 (246) 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/chunks/1147-466ec15afacc1a65.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/{1394-556de6d71bbdb0fb.js → 1394-ee3795b112907122.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/3869-3cd46526879f454c.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/7277-0b2fc7c16ba2d64b.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/7758-0b018a9e4fc56200.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/{8605-ea5bee9dfae512c7.js → 8605-0259994816604c49.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/9920-5cfdc5e8fd209825.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/app/approvals/page-cb169620945d1952.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-6a061bd97f0b9398.js → page-cefe8169e36cf62a.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/app/board/{page-cb95a7432c9ee744.js → page-d2e35228bc497119.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-b12b6d2f8d2d1aea.js → page-5c05b0da4bc1392c.js} +1 -1
  14. package/apps/pwa/out/_next/static/chunks/app/bots/{page-b9efe868bfd36255.js → page-e0ccdb576812b523.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/app/chat/{page-7c97dcdfe2e37a60.js → page-813c4a52c9d05ca8.js} +1 -1
  16. package/apps/pwa/out/_next/static/chunks/app/consult/page-4731f2c215358937.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/app/control/{page-5721537ca8a3598c.js → page-a022b257950f39e6.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/app/design-check/{page-b654240a572e4c48.js → page-a2ffc717e04b8b0a.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/app/editor/{page-b9750abc897508c3.js → page-b59ee4e70fc18fcf.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/app/exec/page-a67e11ba962337b5.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/app/field/page-c172dabd796eb7a3.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/app/inside/page-1efd0cb9e0ed9d13.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/app/intake/{page-c8b1ccda6ba7ae98.js → page-d5dc7ff69a37b4cf.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/app/layout-e71c84189e8c683e.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/app/live/{page-2a9932ddb62d76bd.js → page-1d6a533ce5a6efcb.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/app/market/{page-9688f5b4f1ff950f.js → page-dfca9b7d2de0b135.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-793fa536b3a6ef37.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/app/morning/{page-35414e0a007b4082.js → page-6dd3bfbbde2a5c2c.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/app/{not-found-e7a529e0507ac86c.js → not-found-490653e8d4cc8852.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/app/observatory/{page-e001823c35c9dd67.js → page-77447356baad75d2.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-29e961191f6057df.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-c822f55b884d9104.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fa4ccfc432424e52.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-3a24072b35470157.js → page-6d604227e1664b71.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/app/page-9c7e8f744a765daf.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/app/reflection/{page-0be8d4b2ced75ba0.js → page-4048543b4b7ad5e0.js} +1 -1
  37. package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-d37cb0d52f9b6bd5.js → page-4c3a3126abed551a.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/app/sessions/{page-686da0df9bf23e5c.js → page-64b0aecb1ca75e75.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4292d0149020e8a7.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/app/settings/{page-53f80edc6b8dc07c.js → page-db14d0be7f1c460c.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-e5d8072cd7cfef73.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/app/setup/{page-239c17b911b84e72.js → page-9547b5cec7cf76bf.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/app/share/page-e6dcb83265530636.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/app/showroom/page-45248f08d6aecae5.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/app/tasks/{page-1218753c82d585f6.js → page-2cddeb9e2aeedc55.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/app/term/{page-4b5935e67531efb5.js → page-e297866051595d81.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/app/today/{page-3285bc87caf1eaa5.js → page-baba2e047872fb0f.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/app/trace/{page-ad553b0e06505ecd.js → page-e895da4ec9cac345.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/app/vault/page-4344faf20216233b.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-698bb29f11864b89.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/workflows/page-bd6a6dc1ddc273f2.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2e9e2fb01c9da1c9.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d62ceb13411ebba4.js +1 -0
  54. package/apps/pwa/out/_next/static/css/128fb7fb670b2fbf.css +1 -0
  55. package/apps/pwa/out/approvals/index.html +1 -1
  56. package/apps/pwa/out/approvals/index.txt +14 -14
  57. package/apps/pwa/out/autopilot/index.html +1 -1
  58. package/apps/pwa/out/autopilot/index.txt +14 -14
  59. package/apps/pwa/out/board/index.html +1 -1
  60. package/apps/pwa/out/board/index.txt +14 -14
  61. package/apps/pwa/out/botlab/index.html +1 -1
  62. package/apps/pwa/out/botlab/index.txt +14 -14
  63. package/apps/pwa/out/bots/index.html +1 -1
  64. package/apps/pwa/out/bots/index.txt +14 -14
  65. package/apps/pwa/out/chat/index.html +1 -1
  66. package/apps/pwa/out/chat/index.txt +14 -14
  67. package/apps/pwa/out/consult/index.html +1 -1
  68. package/apps/pwa/out/consult/index.txt +14 -14
  69. package/apps/pwa/out/control/index.html +1 -1
  70. package/apps/pwa/out/control/index.txt +14 -14
  71. package/apps/pwa/out/design-check/index.html +1 -1
  72. package/apps/pwa/out/design-check/index.txt +14 -14
  73. package/apps/pwa/out/editor/index.html +1 -1
  74. package/apps/pwa/out/editor/index.txt +14 -14
  75. package/apps/pwa/out/exec/index.html +1 -1
  76. package/apps/pwa/out/exec/index.txt +14 -14
  77. package/apps/pwa/out/field/index.html +1 -1
  78. package/apps/pwa/out/field/index.txt +14 -14
  79. package/apps/pwa/out/healthz +1 -1
  80. package/apps/pwa/out/index.html +1 -1
  81. package/apps/pwa/out/index.txt +14 -14
  82. package/apps/pwa/out/inside/index.html +1 -1
  83. package/apps/pwa/out/inside/index.txt +14 -14
  84. package/apps/pwa/out/intake/index.html +1 -1
  85. package/apps/pwa/out/intake/index.txt +14 -14
  86. package/apps/pwa/out/live/index.html +1 -1
  87. package/apps/pwa/out/live/index.txt +14 -14
  88. package/apps/pwa/out/market/index.html +1 -1
  89. package/apps/pwa/out/market/index.txt +14 -14
  90. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  91. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  92. package/apps/pwa/out/morning/index.html +1 -1
  93. package/apps/pwa/out/morning/index.txt +14 -14
  94. package/apps/pwa/out/observatory/index.html +1 -1
  95. package/apps/pwa/out/observatory/index.txt +14 -14
  96. package/apps/pwa/out/ops/checklist/index.html +1 -1
  97. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  98. package/apps/pwa/out/ops/release/index.html +1 -1
  99. package/apps/pwa/out/ops/release/index.txt +14 -14
  100. package/apps/pwa/out/ops/seats/index.html +1 -1
  101. package/apps/pwa/out/ops/seats/index.txt +14 -14
  102. package/apps/pwa/out/outputs/index.html +1 -1
  103. package/apps/pwa/out/outputs/index.txt +14 -14
  104. package/apps/pwa/out/reflection/index.html +1 -1
  105. package/apps/pwa/out/reflection/index.txt +15 -15
  106. package/apps/pwa/out/scheduler/index.html +1 -1
  107. package/apps/pwa/out/scheduler/index.txt +14 -14
  108. package/apps/pwa/out/sessions/index.html +1 -1
  109. package/apps/pwa/out/sessions/index.txt +14 -14
  110. package/apps/pwa/out/settings/devices/index.html +1 -1
  111. package/apps/pwa/out/settings/devices/index.txt +14 -14
  112. package/apps/pwa/out/settings/index.html +1 -1
  113. package/apps/pwa/out/settings/index.txt +14 -14
  114. package/apps/pwa/out/setup/done/index.html +1 -1
  115. package/apps/pwa/out/setup/done/index.txt +14 -14
  116. package/apps/pwa/out/setup/index.html +1 -1
  117. package/apps/pwa/out/setup/index.txt +14 -14
  118. package/apps/pwa/out/share/index.html +1 -1
  119. package/apps/pwa/out/share/index.txt +14 -14
  120. package/apps/pwa/out/showroom/index.html +1 -1
  121. package/apps/pwa/out/showroom/index.txt +14 -14
  122. package/apps/pwa/out/tasks/index.html +1 -1
  123. package/apps/pwa/out/tasks/index.txt +14 -14
  124. package/apps/pwa/out/term/index.html +1 -1
  125. package/apps/pwa/out/term/index.txt +14 -14
  126. package/apps/pwa/out/today/index.html +1 -1
  127. package/apps/pwa/out/today/index.txt +14 -14
  128. package/apps/pwa/out/trace/index.html +1 -1
  129. package/apps/pwa/out/trace/index.txt +14 -14
  130. package/apps/pwa/out/vault/index.html +1 -1
  131. package/apps/pwa/out/vault/index.txt +14 -14
  132. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  133. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  134. package/apps/pwa/out/workflows/index.html +1 -1
  135. package/apps/pwa/out/workflows/index.txt +14 -14
  136. package/apps/pwa/out/workspace/index.html +1 -1
  137. package/apps/pwa/out/workspace/index.txt +14 -14
  138. package/apps/pwa/out/worktrees/index.html +1 -1
  139. package/apps/pwa/out/worktrees/index.txt +14 -14
  140. package/graphs/context/nightly-condense.yaml +21 -0
  141. package/graphs/context/recipes.yaml +12 -0
  142. package/graphs/demo/inside-seed.yaml +20 -0
  143. package/graphs/demo/recipes.yaml +12 -0
  144. package/package.json +1 -1
  145. package/plugins/card-followup/examples/sample-card.png +0 -0
  146. package/scripts/lib/telegram-inject-args.ts +31 -0
  147. package/scripts/measure-pod-memory-by-goal.ts +130 -0
  148. package/scripts/release-loop/auto-approve-node.ts +1 -1
  149. package/scripts/release-loop/checklist-gate-node.ts +2 -1
  150. package/scripts/release-loop/gate-node.ts +8 -2
  151. package/scripts/release-loop/ops-upgrade-node.ts +47 -6
  152. package/scripts/release-loop/publish-node.ts +4 -1
  153. package/scripts/release-loop/version-node.ts +13 -3
  154. package/scripts/telegram-inject.ts +14 -6
  155. package/scripts/test-diet/remeasure-list.ts +112 -0
  156. package/scripts/ux/demo-rehearsal.ts +17 -13
  157. package/scripts/ux/demo-seed.ts +108 -0
  158. package/scripts/ux/lib/rehearsal-verdict.ts +12 -5
  159. package/src/agent-mission/driver.ts +138 -16
  160. package/src/agent-mission/pty-decision.ts +1 -1
  161. package/src/autopilot/pty-control-loop.ts +4 -1
  162. package/src/chat/index.ts +1 -0
  163. package/src/cli/persona-cli.ts +17 -14
  164. package/src/cli/pod-cli.ts +17 -0
  165. package/src/cli/pod-memory-advice.ts +35 -0
  166. package/src/cli/release-cli.ts +46 -6
  167. package/src/context-bus/context-now-surfaces.ts +17 -0
  168. package/src/context-bus/context-now.ts +2 -2
  169. package/src/context-bus/coord-events.ts +2 -2
  170. package/src/context-bus/nightly-condense.ts +153 -0
  171. package/src/context-bus/session-events.ts +35 -0
  172. package/src/dashboard/dashboard-status-lines.ts +2 -0
  173. package/src/dashboard/index.ts +8 -0
  174. package/src/dashboard/slash-runtime/dashboard-handlers.ts +24 -0
  175. package/src/domains/outbound-alert.ts +99 -31
  176. package/src/domains/outbound-log-probe.ts +8 -0
  177. package/src/execution-loop/launch-gate.ts +17 -8
  178. package/src/field-note/telegram.ts +142 -0
  179. package/src/graph-runner/graph-grow-llm.ts +23 -13
  180. package/src/graph-runner/graph-grow.ts +5 -2
  181. package/src/graph-runner/runner.ts +12 -8
  182. package/src/harness/harness-cli-command.ts +138 -16
  183. package/src/hooks/consult-intake.ts +153 -0
  184. package/src/hooks/receiver.ts +78 -1
  185. package/src/index.ts +33 -9
  186. package/src/intake-plane/discord-seat-work.ts +28 -2
  187. package/src/intake-plane/wish-card.ts +33 -0
  188. package/src/llm/difficulty.ts +1 -1
  189. package/src/maturity/feature-maturity.ts +2 -1
  190. package/src/nexus/api/http-server.ts +31 -8
  191. package/src/nexus/api/outbound-report.ts +40 -7
  192. package/src/nexus/api/personas.ts +95 -53
  193. package/src/nexus/api/task-cards-api.ts +19 -0
  194. package/src/nexus/api/workflow-history.ts +88 -0
  195. package/src/nexus/api/workflows.ts +52 -0
  196. package/src/nexus/outbound/delivery-ledger.ts +17 -8
  197. package/src/nexus/outbound/router.ts +8 -3
  198. package/src/persona/presets.ts +8 -1
  199. package/src/plugins/maker/market-bundle.ts +2 -1
  200. package/src/release-loop/checklist.ts +15 -3
  201. package/src/release-loop/feature-store.ts +24 -10
  202. package/src/release-loop/landed-but-yellow.ts +48 -0
  203. package/src/seat-loop/seat-loop.ts +168 -7
  204. package/src/self-dev/draft-sweep.ts +44 -10
  205. package/src/self-dev/draft-triage-rules.ts +54 -2
  206. package/src/self-implement/budget-gate.ts +29 -12
  207. package/src/self-implement/gate-candidate-ranking.ts +60 -0
  208. package/src/self-implement/gate-scope.ts +9 -8
  209. package/src/self-implement/headless-elanous-driver.ts +7 -2
  210. package/src/self-implement/orchestrator.ts +15 -0
  211. package/src/self-implement/test-seams.ts +1 -0
  212. package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -10
  213. package/src/task-orchestrator/surfaces/self-implement-pod.ts +8 -0
  214. package/src/telegram-commands.ts +21 -0
  215. package/src/telegram-project-command.ts +78 -4
  216. package/src/telegram.ts +32 -5
  217. package/src/user-config.ts +8 -4
  218. package/src/version/packed-revision.json +1 -1
  219. package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +0 -1
  220. package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +0 -1
  221. package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +0 -1
  222. package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +0 -1
  223. package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +0 -1
  224. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +0 -1
  225. package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +0 -1
  226. package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +0 -1
  227. package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +0 -1
  228. package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +0 -1
  229. package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +0 -1
  230. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +0 -1
  231. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +0 -1
  232. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +0 -1
  233. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +0 -1
  234. package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +0 -1
  235. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +0 -1
  236. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +0 -1
  237. package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +0 -1
  238. package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +0 -1
  239. package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +0 -1
  240. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +0 -1
  241. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +0 -1
  242. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +0 -1
  243. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +0 -1
  244. package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +0 -1
  245. /package/apps/pwa/out/_next/static/{Y4zKzL62sakG5momz3SoQ → -6XrAoD3eU7NyMHAE4xPS}/_buildManifest.js +0 -0
  246. /package/apps/pwa/out/_next/static/{Y4zKzL62sakG5momz3SoQ → -6XrAoD3eU7NyMHAE4xPS}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{3389:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},13784:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},24197:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]])},26439:(e,t,r)=>{"use strict";r.d(t,{$L:()=>s,Kz:()=>l,Vm:()=>i,kv:()=>a});let n="elanous.pwa.chat.autoRouting",o="elanous-chat-routing-changed",a={autoRouting:!1};function i(){return{autoRouting:function(e,t){try{let r=window.localStorage.getItem(e);if("1"===r)return!0;if("0"===r)return!1;return t}catch(e){return t}}(n,a.autoRouting)}}function l(e){try{window.localStorage.setItem(n,e?"1":"0")}catch(e){}window.dispatchEvent(new CustomEvent(o))}function s(e){let t=()=>e(i()),r=t=>{t.key===n&&e(i())};return window.addEventListener(o,t),window.addEventListener("storage",r),()=>{window.removeEventListener(o,t),window.removeEventListener("storage",r)}}},28149:(e,t,r)=>{Promise.resolve().then(r.bind(r,43591))},39681:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},43591:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(54456),o=r(2310),a=r(77980);function i(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"mx-auto max-w-2xl px-6 pt-6",children:(0,n.jsx)(a.N,{})}),(0,n.jsx)(o.O,{})]})}},45086:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},50399:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},52561:(e,t,r)=>{"use strict";r.d(t,{hn:()=>a,qv:()=>i,sg:()=>l});let n="elanous.ocr.prefs",o={defaultUseLlmVision:!1,defaultPreferHandwriting:!1};function a(){if("undefined"==typeof localStorage)return{...o};try{let e=localStorage.getItem(n);if(!e)return{...o};let t=JSON.parse(e);return{defaultUseLlmVision:"boolean"==typeof t.defaultUseLlmVision?t.defaultUseLlmVision:o.defaultUseLlmVision,defaultPreferHandwriting:"boolean"==typeof t.defaultPreferHandwriting?t.defaultPreferHandwriting:o.defaultPreferHandwriting}}catch(e){return{...o}}}function i(e){if("undefined"==typeof localStorage)return{...o,...e};let t={...a(),...e};try{localStorage.setItem(n,JSON.stringify(t))}catch(e){}return t}function l(){if("undefined"==typeof localStorage)return{...o};try{localStorage.removeItem(n)}catch(e){}return{...o}}},56849:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("minus",[["path",{d:"M5 12h14",key:"1ays0h"}]])},67949:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var n=r(60500);let o="elanous.pwa.showBeta",a="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(o)}catch(e){return!1}}function l(){let[e,t]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===o||null===e.key)&&t(i())};return window.addEventListener(a,e),window.addEventListener("storage",r),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,n.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(o,"1"):window.localStorage.removeItem(o)}catch(e){}window.dispatchEvent(new CustomEvent(a,{detail:e}))},[])}}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var n=r(54456),o=r(96053),a=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,o.In)(),{showBeta:t,setShowBeta:r}=(0,a.hj)();return(0,n.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,n.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,n.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,n.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:a,description:i}=t;return(0,n.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,o.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,n.jsx)("span",{className:"block font-medium",children:a}),(0,n.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,n.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,n.jsx)("span",{children:"실험 기능 켜기"}),(0,n.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>o,In:()=>c,OG:()=>l});var n=r(60500);let o="elanous.pwa.role",a="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(o);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(o,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function s(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let t=t=>{(t.key===o||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",t)}}function c(){return(0,n.useSyncExternalStore)(s,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,1829,9656,7551,3454,9906,3869,4215,2176,7274,2310,6390,3170,7358],()=>e(e.s=28149)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{3389:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},4102:(e,t,r)=>{Promise.resolve().then(r.bind(r,43591))},13784:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},24197:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]])},26439:(e,t,r)=>{"use strict";r.d(t,{$L:()=>s,Kz:()=>l,Vm:()=>i,kv:()=>a});let n="elanous.pwa.chat.autoRouting",o="elanous-chat-routing-changed",a={autoRouting:!1};function i(){return{autoRouting:function(e,t){try{let r=window.localStorage.getItem(e);if("1"===r)return!0;if("0"===r)return!1;return t}catch(e){return t}}(n,a.autoRouting)}}function l(e){try{window.localStorage.setItem(n,e?"1":"0")}catch(e){}window.dispatchEvent(new CustomEvent(o))}function s(e){let t=()=>e(i()),r=t=>{t.key===n&&e(i())};return window.addEventListener(o,t),window.addEventListener("storage",r),()=>{window.removeEventListener(o,t),window.removeEventListener("storage",r)}}},39681:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},43591:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i});var n=r(54456),o=r(17758),a=r(77980);function i(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"mx-auto max-w-2xl px-6 pt-6",children:(0,n.jsx)(a.N,{})}),(0,n.jsx)(o.O,{})]})}},45086:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},50399:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},52561:(e,t,r)=>{"use strict";r.d(t,{hn:()=>a,qv:()=>i,sg:()=>l});let n="elanous.ocr.prefs",o={defaultUseLlmVision:!1,defaultPreferHandwriting:!1};function a(){if("undefined"==typeof localStorage)return{...o};try{let e=localStorage.getItem(n);if(!e)return{...o};let t=JSON.parse(e);return{defaultUseLlmVision:"boolean"==typeof t.defaultUseLlmVision?t.defaultUseLlmVision:o.defaultUseLlmVision,defaultPreferHandwriting:"boolean"==typeof t.defaultPreferHandwriting?t.defaultPreferHandwriting:o.defaultPreferHandwriting}}catch(e){return{...o}}}function i(e){if("undefined"==typeof localStorage)return{...o,...e};let t={...a(),...e};try{localStorage.setItem(n,JSON.stringify(t))}catch(e){}return t}function l(){if("undefined"==typeof localStorage)return{...o};try{localStorage.removeItem(n)}catch(e){}return{...o}}},56849:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("minus",[["path",{d:"M5 12h14",key:"1ays0h"}]])},67949:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(18494).A)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var n=r(60500);let o="elanous.pwa.showBeta",a="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(o)}catch(e){return!1}}function l(){let[e,t]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===o||null===e.key)&&t(i())};return window.addEventListener(a,e),window.addEventListener("storage",r),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,n.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(o,"1"):window.localStorage.removeItem(o)}catch(e){}window.dispatchEvent(new CustomEvent(a,{detail:e}))},[])}}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var n=r(54456),o=r(96053),a=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,o.In)(),{showBeta:t,setShowBeta:r}=(0,a.hj)();return(0,n.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,n.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,n.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,n.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:a,description:i}=t;return(0,n.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,o.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,n.jsx)("span",{className:"block font-medium",children:a}),(0,n.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,n.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,n.jsx)("span",{children:"실험 기능 켜기"}),(0,n.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>o,In:()=>c,OG:()=>l});var n=r(60500);let o="elanous.pwa.role",a="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(o);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(o,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function s(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let t=t=>{(t.key===o||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",t)}}function c(){return(0,n.useSyncExternalStore)(s,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,1829,9656,7551,3454,9906,3869,4215,2176,7274,7758,6390,3170,7358],()=>e(e.s=4102)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8517],{4112:(e,t,s)=>{"use strict";s.d(t,{Q:()=>c});var r=s(54456),i=s(60500),a=s(10080),n=s(95564),l=s(43468),o=s(23869);function d(e){if(e instanceof o.Iu&&e.body&&"object"==typeof e.body){var t;let s=e.body;return[null!=(t=s.reason)?t:s.error,s.path].filter(Boolean).join(": ")}return e instanceof Error?e.message:String(e)}function c(){let e=(0,l.Qj)(),[t,s]=(0,i.useState)(!1),[o,c]=(0,i.useState)(null),[u,h]=(0,i.useState)({vault:"",selection:"custom",dirs:""}),{vault:p,selection:f,dirs:m}=u,[x,b]=(0,i.useState)(!0),[g,v]=(0,i.useState)(!1),[j,y]=(0,i.useState)(""),[k,w]=(0,i.useState)(""),[N,S]=(0,i.useState)("");(0,i.useEffect)(()=>{s(!0)},[]);let C=(0,i.useCallback)(async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"all";if(e){b(!0);try{let s=await e.getObsidianSkills();c(s),h(e=>({vault:"skills"===t?e.vault:s.obsidian.vault,selection:"vault"===t?e.selection:s.skills.activeSet,dirs:"vault"===t?e.dirs:s.skills.dirs.join("\n")})),y("")}catch(e){y(d(e))}finally{b(!1)}}},[e]);(0,i.useEffect)(()=>{t&&e&&C()},[t,e,C]);let O=async()=>{if(e){v(!0),w("");try{var t;let s=await e.setObsidian({vault:p.trim()});await C("vault"),w(null!=(t=s.warning)?t:"Vault saved.")}catch(e){w(d(e))}finally{v(!1)}}},F=async()=>{if(e){v(!0),S("");try{await e.setSkills("custom"===f?{dirs:m.split("\n").map(e=>e.trim()).filter(Boolean)}:{activeSet:f}),await C("skills"),S("Skills saved.")}catch(e){S(d(e))}finally{v(!1)}}};return t&&e?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"obsidian-skills-card",children:[(0,r.jsxs)("header",{className:"flex items-center justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"Obsidian & Skills"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Choose directories on the machine running NEXUS."})]}),(0,r.jsx)(a.$,{size:"sm",variant:"outline",onClick:()=>void C("all"),disabled:x||g,children:"Refresh"})]}),x&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"Loading paths…"}),j&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:j}),o&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("label",{htmlFor:"obsidian-vault",className:"text-sm font-medium",children:"Obsidian vault path"}),(0,r.jsx)(n.p,{id:"obsidian-vault",value:p,onChange:e=>{h(t=>({...t,vault:e.target.value})),w("")},placeholder:"/absolute/path/to/vault"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"vault-validation",children:p===o.obsidian.vault?o.obsidian.looksLikeVault?"Vault found (.obsidian detected)":o.obsidian.exists?"Directory found; .obsidian not detected":"Directory not found":"Save to validate this path on the NEXUS host."}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void O(),disabled:g||!p.trim(),children:"Save vault"}),k&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"vault-feedback",children:k})]}),(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("label",{htmlFor:"skills-preset",className:"text-sm font-medium",children:"Skills source"}),(0,r.jsxs)("select",{id:"skills-preset",value:f,onChange:e=>{h(t=>({...t,selection:e.target.value})),S("")},className:"flex h-9 w-full rounded-md border border-input bg-background px-3 text-sm",children:[o.skills.presets.map(e=>{var t;return(0,r.jsxs)("option",{value:e.key,children:[e.label," — ",null!=(t=e.dir)?t:"(no path)"," ",e.exists?"✓":"(missing)"]},e.key)}),(0,r.jsx)("option",{value:"custom",children:"Custom directories"})]}),"custom"===f&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("label",{htmlFor:"skills-dirs",className:"block text-xs text-muted-foreground",children:"One absolute directory per line"}),(0,r.jsx)("textarea",{id:"skills-dirs",value:m,onChange:e=>{h(t=>({...t,dirs:e.target.value})),S("")},rows:3,className:"w-full rounded-md border border-input bg-background px-3 py-2 font-mono text-xs",placeholder:"/absolute/path/to/skills"})]}),(0,r.jsx)(a.$,{size:"sm",onClick:()=>void F(),disabled:g,children:"Save skills"}),N&&(0,r.jsx)("p",{role:"status",className:"text-xs","data-testid":"skills-feedback",children:N})]})]})]}):null}},10080:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var r=s(54456),i=s(80247),a=s(13680),n=s(74591);let l=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:s="default",size:a="default",...o}=e;return(0,r.jsx)(i.$,{"data-slot":"button",className:(0,n.cn)(l({variant:s,size:a,className:t})),...o})}},13496:(e,t,s)=>{"use strict";s.d(t,{W:()=>d});var r=s(54456),i=s(60500),a=s(10080),n=s(95564),l=s(43468);let o=["telegram","discord"];function d(){let{client:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,l.Qj)(),s=null!=e?e:t,[d,c]=(0,i.useState)([]),[u,h]=(0,i.useState)({}),[p,f]=(0,i.useState)({}),[m,x]=(0,i.useState)({}),[b,g]=(0,i.useState)(null),[v,j]=(0,i.useState)({}),[y,k]=(0,i.useState)("");(0,i.useEffect)(()=>{if(!s)return;let e=!1;return s.getChannelBots().then(t=>{let{platforms:s}=t;e||(c(s),f(e=>{let t={...e};for(let e of s)Object.hasOwn(t,e.platform)||(t[e.platform]=e.allowedUsers.join(", "));return t}))}).catch(()=>{e||k("봇 상태를 불러오지 못했습니다.")}),()=>{e=!0}},[s]);let w=async e=>{var t;if(!s)return;g(e),k("");let r=null==(t=u[e])?void 0:t.trim(),i=Object.hasOwn(p,e)?p[e].split(",").map(e=>e.trim()).filter(Boolean):void 0;h(t=>({...t,[e]:""}));try{let t=await s.setChannelBot({platform:e,...r?{token:r}:{},...void 0!==i?{allowedUsers:i}:{}});t.botName&&x(s=>({...s,[e]:t.botName})),j(s=>({...s,[e]:t.restartNeeded}));try{let e=await s.getChannelBots();c(e.platforms)}catch(e){k("저장됐지만 봇 상태를 다시 불러오지 못했습니다.")}}catch(t){k("".concat(e," 저장에 실패했습니다. 토큰과 허용 사용자 ID를 확인하세요."))}finally{g(null)}};return s?(0,r.jsxs)("section",{className:"space-y-4 rounded border border-border bg-card p-4","data-testid":"channel-bot-setup-card",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"봇 연결"}),o.map(e=>{var t,s;let i=d.find(t=>t.platform===e);return(0,r.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,r.jsx)("h3",{className:"text-sm font-medium capitalize",children:e}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:(null==i?void 0:i.configured)?"연결됨 (".concat(i.source,")"):"미연결"}),m[e]&&(0,r.jsxs)("p",{className:"text-xs",children:["봇 이름: ",m[e]]}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-bot-token"),className:"block text-xs",children:"봇 토큰"}),(0,r.jsx)(n.p,{id:"".concat(e,"-bot-token"),type:"password",autoComplete:"off",value:null!=(t=u[e])?t:"",onChange:t=>h(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)("label",{htmlFor:"".concat(e,"-allowed-users"),className:"block text-xs",children:"허용 사용자 ID (쉼표로 구분)"}),(0,r.jsx)(n.p,{id:"".concat(e,"-allowed-users"),value:null!=(s=p[e])?s:"",onChange:t=>f(s=>({...s,[e]:t.target.value}))}),(0,r.jsx)(a.$,{type:"button",size:"sm",disabled:null!==b,onClick:()=>void w(e),children:"확인하고 저장"}),v[e]&&(0,r.jsx)("p",{role:"status",className:"text-xs",children:"봇을 재시작해야 반영됩니다"})]},e)}),y&&(0,r.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:y})]}):null}},28042:(e,t,s)=>{"use strict";s.d(t,{Qb:()=>n,SI:()=>o,dJ:()=>l});let r="elanous:auth-required",i=null,a=!1;function n(e){null===i&&(i=e,window.dispatchEvent(new CustomEvent(r,{detail:{path:e}})))}function l(e){let t=window,s=t=>e(t.detail);return t.addEventListener(r,s),null===i||a||e({path:i}),()=>t.removeEventListener(r,s)}function o(){a=!0}},43468:(e,t,s)=>{"use strict";s.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var r=s(54456),i=s(60500),a=s(40324),n=s(59405);let l=(0,i.createContext)(null);function o(e){let{client:t,queryClient:s,defaultStaleTimeMs:o,children:d}=e,c=(0,i.useMemo)(()=>null!=s?s:new a.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[s,o]);return(0,r.jsx)(l.Provider,{value:t,children:(0,r.jsx)(n.Ht,{client:c,children:d})})}function d(){let e=(0,i.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,i.useContext)(l)}},50733:(e,t,s)=>{"use strict";let r;s.d(t,{cY:()=>c,x8:()=>l});let i={debug:0,info:1,warn:2,error:3},a="/v1/debug-logs/batch",n=null;function l(e){n=e}class o{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(i[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<i[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,s=JSON.stringify({records:e});try{var r,i;t=await (r=this.fetchFn(s),i=this.postTimeoutMs,new Promise((e,t)=>{let s=setTimeout(()=>t(Error("debug-forward timeout after ".concat(i,"ms"))),i);r.then(t=>{clearTimeout(s),e(t)},e=>{clearTimeout(s),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&n)try{await n(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let a=this.lastOkAt;this.lastOkAt=Date.now();let l=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:l,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:a},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(a,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=d,t="debug",s=1e4,r=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=s,this.flushMs=r,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function d(e){return(await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function c(e,t){if("undefined"==typeof console)return;let s=new Date().toISOString();if(void 0!==t){let r="";try{let e=new WeakSet;r=JSON.stringify(t,(t,s)=>{if("bigint"==typeof s)return"".concat(s.toString(),"n");if("function"==typeof s)return"[fn ".concat(s.name||"anon","]");if(s&&"object"==typeof s){if(e.has(s))return"[circular]";e.add(s)}return s})}catch(e){r="[unserializable: ".concat(String(e),"]")}r&&r.length>800&&(r=r.slice(0,797)+"..."),console.debug("[".concat(s,"] ").concat(e," ").concat(r),t),u(s,e,r)}else console.debug("[".concat(s,"] ").concat(e)),u(s,e,void 0)}function u(e,t,s){let i,a=function(){if(void 0!==r)return r;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return r=null,null;let t=new o(d,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return r=t,t}();if(!a)return;let n=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==s&&""!==s)try{i=JSON.parse(s)}catch(e){i=s}a.push({ts:e,category:t,event:n,...void 0!==i?{data:i}:{},source:{platform:"pwa"}})}},74591:(e,t,s)=>{"use strict";s.d(t,{cn:()=>a});var r=s(49454),i=s(79946);function a(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,i.QP)((0,r.$)(t))}},93412:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var r=s(54456),i=s(86048),a=s.n(i),n=s(60500),l=s(10080),o=s(43468);let d=[{anchor:"channels",label:"Channels",description:"Telegram / Discord 봇 연결",primary:!0},{anchor:"voice",label:"Voice",description:"TTS \xb7 STT 모델 + voice 환경설정",primary:!0},{anchor:"ios",label:"iOS / mobile",description:"PWA install \xb7 iOS companion 페어링",primary:!0},{anchor:"personas",label:"Personas",description:"4 인격 (default \xb7 contrarian \xb7 pragmatist \xb7 sage) 편집",primary:!1},{anchor:"tools",label:"Tool surface",description:"chat 이 사용할 tool 셋 (readonly / chat / webterm / all)",primary:!1},{anchor:"advanced",label:"Advanced",description:"Model tier \xb7 budget guard \xb7 OCR \xb7 기타 카드 17 종",primary:!1}];var c=s(13496),u=s(4112);function h(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(null),[i,a]=(0,n.useState)(!1);return(0,n.useEffect)(()=>{if(!e)return;let t=!0;return s(null),a(!1),e.getChatFastPath().then(e=>{let{enabled:r}=e;if("boolean"!=typeof r)throw Error("chat.fastPath is unavailable");t&&s(r)}).catch(()=>{t&&a(!0)}),()=>{t=!1}},[e]),(0,r.jsx)("section",{"aria-label":"셋업 추천","data-testid":"setup-recommendations",className:"flex flex-col gap-2 rounded border border-border bg-card p-3 text-sm",children:null===t?(0,r.jsx)("p",{role:"status",children:i?"chat.fastPath 값을 읽을 수 없습니다. 다시 접속해 확인하세요.":"추천 설정 확인 중…"}):["고칠 것 고치기 — 권한\xb7PATH\xb7서비스 파일\xb7파이썬 환경 등 고칠 수 있는 항목을 고칩니다(로그인\xb7서비스 재시작은 별도): `elanous doctor --fix --yes`",{fastPath:t}.fastPath?"짧은 물음은 빠르게 — 켜져 있음(chat.fastPath=true): 짧은 물음에 도구 없이 먼저 답합니다. 끄기: `elanous config set chat.fastPath false`":"짧은 물음은 빠르게 — 꺼져 있음(chat.fastPath=false): 켜면 짧은 물음에 도구 없이 먼저 답합니다. 켜기: `elanous config set chat.fastPath true`"].map(e=>(0,r.jsx)("p",{children:e},e))})}function p(){let[e,t]=(0,n.useState)(!1),[s,i]=(0,n.useState)(!1);return(0,r.jsxs)("section",{className:"flex flex-col gap-3","aria-labelledby":"setup-next-steps-title","data-testid":"setup-next-steps",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{id:"setup-next-steps-title",className:"text-sm font-semibold",children:"다음 셋업(선택)"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"필요한 것만 지금 연결하세요. 나중에 해도 됩니다."})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":e,"aria-controls":"setup-next-bots",onClick:()=>t(e=>!e),children:"텔레그램\xb7디스코드 봇 연결"}),e&&(0,r.jsxs)("div",{id:"setup-next-bots",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(c.W,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>t(!1),children:"나중에"})]})]}),(0,r.jsxs)("div",{className:"rounded border border-border bg-card p-3",children:[(0,r.jsx)(l.$,{type:"button",variant:"outline","aria-expanded":s,"aria-controls":"setup-next-vault",onClick:()=>i(e=>!e),children:"Obsidian 볼트\xb7스킬 폴더"}),s&&(0,r.jsxs)("div",{id:"setup-next-vault",className:"mt-3 flex flex-col gap-3",children:[(0,r.jsx)(u.Q,{}),(0,r.jsx)(l.$,{type:"button",variant:"ghost",className:"self-start",onClick:()=>i(!1),children:"나중에"})]})]})]})}function f(){let e=(0,o.Qj)(),[t,s]=(0,n.useState)(!1),[i,d]=(0,n.useState)({status:"idle"});return((0,n.useEffect)(()=>{s(!0)},[]),(0,n.useEffect)(()=>{t&&e&&(d({status:"loading"}),e.getLlmProviders().then(e=>{d({status:"ok",active:{provider:e.activeProvider||"(unset)"}})}).catch(e=>{d({status:"error",message:e.message})}))},[t,e]),t&&e)?(0,r.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,r.jsx)(h,{}),(0,r.jsx)(m,{load:i}),(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"곧장 chat 으로"}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["LLM 만 셋업해도 chat 은 바로 사용 가능합니다. 나머지는 필요할 때",(0,r.jsx)("span",{className:"font-mono",children:" /settings"})," 에서 추가하세요."]}),(0,r.jsx)("div",{children:(0,r.jsx)(a(),{href:"/chat","data-testid":"setup-done-chat-link",children:(0,r.jsx)(l.$,{size:"lg",children:"Chat 시작 →"})})})]}),(0,r.jsx)(p,{}),(0,r.jsx)(x,{})]}):null}function m(e){let{load:t}=e;if("loading"===t.status||"idle"===t.status)return(0,r.jsx)("section",{className:"rounded border border-border bg-card p-4",children:(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"상태 확인 중…"})});if("error"===t.status)return(0,r.jsx)("section",{className:"rounded border border-destructive/40 bg-destructive/5 p-4",children:(0,r.jsxs)("p",{className:"text-sm text-destructive",children:["LLM 상태 로드 실패: ",t.message]})});let s=t.active.provider,i="(unset)"===s;return(0,r.jsx)("section",{className:"rounded border border-primary/40 bg-primary/5 p-4","data-testid":"setup-done-active-llm",children:(0,r.jsxs)("header",{className:"flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:"현재 LLM provider"}),(0,r.jsx)("p",{className:"mt-1 font-mono text-base font-semibold",children:s})]}),i?(0,r.jsx)(a(),{href:"/setup",children:(0,r.jsx)(l.$,{variant:"outline",size:"sm",children:"셋업"})}):(0,r.jsx)("span",{className:"rounded bg-primary/10 px-2 py-1 text-xs font-medium text-primary",children:"✓ 준비됨"})]})})}function x(){let e=d.filter(e=>e.primary),t=d.filter(e=>!e.primary);return(0,r.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-sm font-semibold",children:"필요하면 더 셋업하기"}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"모두 선택. 안 만져도 chat 은 잘 됩니다."})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-3",children:e.map(e=>(0,r.jsx)(b,{link:e},e.anchor))}),(0,r.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,r.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 (",t.length,")"]}),(0,r.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-3",children:t.map(e=>(0,r.jsx)(b,{link:e},e.anchor))})]})]})}function b(e){let{link:t}=e,s="/settings#".concat(t.anchor);return(0,r.jsxs)(a(),{href:s,"data-testid":"setup-done-link-".concat(t.anchor),className:"flex flex-col gap-1 rounded border border-border bg-card p-3 transition-colors hover:border-primary/40",children:[(0,r.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:t.description})]})}},95321:(e,t,s)=>{Promise.resolve().then(s.bind(s,93412))},95564:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var r=s(54456);s(60500);var i=s(27551),a=s(74591);function n(e){let{className:t,type:s,...n}=e;return(0,r.jsx)(i.p,{type:s,"data-slot":"input",className:(0,a.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...n})}}},e=>{e.O(0,[7777,9538,3278,6048,7551,3869,6390,3170,7358],()=>e(e.s=95321)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(54456),a=r(80247),n=r(13680),i=r(74591);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},16375:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(54456),a=r(80581),n=r(60500),i=r(51581),l=r(77980),o=r(60314),d=r(10080),c=r(95564),u=r(74591);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(43468),g=r(39906),v=r(86704);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},43468:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(54456),a=r(60500),n=r(40324),i=r(59405);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},56205:(e,t,r)=>{Promise.resolve().then(r.bind(r,16375))},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(60500);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(49454),a=r(79946);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(54456),a=r(96053),n=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},80581:(e,t,r)=>{"use strict";var s=r(35793);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(60500);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,7551,9906,3869,7274,6390,3170,7358],()=>e(e.s=56205)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{10080:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(54456),a=r(80247),n=r(13680),i=r(74591);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},16375:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(54456),a=r(80581),n=r(60500),i=r(51581),l=r(77980),o=r(60314),d=r(10080),c=r(95564),u=r(74591);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(43468),g=r(39906),v=r(86704);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},33808:(e,t,r)=>{Promise.resolve().then(r.bind(r,16375))},43468:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(54456),a=r(60500),n=r(40324),i=r(59405);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},69060:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(60500);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},74591:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(49454),a=r(79946);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},77980:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(54456),a=r(96053),n=r(69060);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},80581:(e,t,r)=>{"use strict";var s=r(35793);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},96053:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(60500);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[7777,9538,3278,7551,9906,3869,7274,6390,3170,7358],()=>e(e.s=33808)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9038],{1355:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>l,f6:()=>n,oD:()=>s});let a="elanous.daemon.sessionId";function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(a,e),e):localStorage.getItem(a)}();if(e)return e;let t=n();return localStorage.setItem(a,t),t}function l(){let e=n();return localStorage.setItem(a,e),e}},9258:(e,t,r)=>{Promise.resolve().then(r.bind(r,79851))},36581:(e,t,r)=>{"use strict";r.d(t,{C:()=>u,DaemonProvider:()=>c,Q:()=>d});var a=r(54456),n=r(60500),s=r(86704),l=r(1355),o=r(39906),i=r(50733);let u=(0,n.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,d]=(0,n.useState)(r),[h,m]=(0,n.useState)(""),[f]=(0,n.useState)(()=>new o.ki(r));(0,n.useEffect)(()=>{let e=(0,s.Fp)();d(e),f.updateConfig(e),m((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.updateConfig(t),d(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&m(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let p=e=>{d(t=>{let r={...t,...e};return(0,s.Qc)(e),f.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{m(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},w=(0,n.useMemo)(()=>({config:c,setConfig:p,client:f,sessionId:h,setSessionId:x}),[c,f,h]);return(0,a.jsx)(u.Provider,{value:w,children:t})}function d(){let e=(0,n.useContext)(u);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},55499:(e,t,r)=>{"use strict";r.d(t,{K:()=>s,v:()=>n});var a=r(50733);async function n(e){var t;let r=e.baseUrl.replace(/\/$/,"");if(!r)return{ok:!1,status:0,reason:"baseUrl not configured"};let n=null!=(t=e.filename)?t:e.file instanceof File?e.file.name:"upload.bin";(0,a.cY)("webterm.attach.upload.begin",{filename:n,size:e.file.size,type:e.file.type});let s=new FormData;s.append("file",e.file,n),s.append("filename",n);try{let t=await fetch("".concat(r,"/v1/attachments"),{method:"POST",body:s,...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok){let e=await t.text().catch(()=>"");return(0,a.cY)("webterm.attach.upload.error",{status:t.status,detail:e.slice(0,200)}),{ok:!1,status:t.status,reason:e||"HTTP ".concat(t.status)}}let n=await t.json();return(0,a.cY)("webterm.attach.upload.ok",{id:n.id,size:n.size}),{ok:!0,meta:n}}catch(t){let e=String(t instanceof Error?t.message:t);return(0,a.cY)("webterm.attach.upload.exception",{reason:e}),{ok:!1,status:0,reason:e}}}async function s(e,t){return Promise.all(e.map(e=>n({baseUrl:t.baseUrl,...void 0!==t.token?{token:t.token}:{},file:e.file,...void 0!==e.filename?{filename:e.filename}:{}})))}},79624:(e,t,r)=>{"use strict";r.d(t,{ht:()=>s,vn:()=>n});let a="elanous.pwa.sharePrefill";function n(e){try{window.sessionStorage.setItem(a,e)}catch(e){}}function s(){try{var e;let t=null!=(e=window.sessionStorage.getItem(a))?e:"";return window.sessionStorage.removeItem(a),t}catch(e){return""}}},79851:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>m});var a=r(54456),n=r(60500),s=r(80581),l=r(50733),o=r(36581);async function i(){if("undefined"==typeof caches)return null;let e=(await caches.keys()).filter(e=>e.startsWith("elanous-pwa-share-target-")).sort().reverse();return 0===e.length?null:caches.open(e[0])}async function u(e){if(!e)return null;let t=await i();if(!t)return(0,l.cY)("pwa.share.l2.cache-missing",{id:e}),null;let r="/__share/".concat(e,"/manifest.json"),a=await t.match(r);if(!a)return(0,l.cY)("pwa.share.l2.no-manifest",{id:e}),null;let n=await a.json(),s=[];for(let r of n.files){let a=await t.match(r.cacheUrl);if(!a){(0,l.cY)("pwa.share.l2.file-missing",{id:e,cacheUrl:r.cacheUrl});continue}let n=await a.blob();s.push(new File([n],r.filename,{type:r.type||n.type}))}for(let e of(await t.delete(r),n.files))await t.delete(e.cacheUrl);return(0,l.cY)("pwa.share.l2.delivered",{id:e,fileCount:s.length,titleLen:n.title.length,textLen:n.text.length}),{id:n.id,title:n.title,text:n.text,url:n.url,files:s,combinedText:function(e){let t=[];return e.title.trim()&&t.push(e.title.trim()),e.text.trim()&&t.push(e.text.trim()),e.url.trim()&&t.push(e.url.trim()),t.join("\n\n")}(n)}}var c=r(79624),d=r(55499);function h(){var e,t,r;let i=(0,s.useRouter)(),h=(0,s.useSearchParams)(),{config:m}=(0,o.Q)(),[f,p]=(0,n.useState)({phase:"idle"});return(0,n.useEffect)(()=>{var e,t,r;let a=null==h?void 0:h.get("shared");if(a){let e=!1;return(async()=>{p({phase:"level2-loading"});let t=await u(a);if(e)return;if(!t||0===t.files.length){t&&t.combinedText&&(0,c.vn)(t.combinedText),(0,l.cY)("pwa.share.l2.empty",{sharedId:a,hasPayload:!!t}),p({phase:"level2-empty"});let e=setTimeout(()=>i.replace("/chat"),600);return()=>clearTimeout(e)}if(!m.baseUrl)return p({phase:"level2-error",error:"daemon baseUrl not configured"});p({phase:"level2-uploading",total:t.files.length,done:0});let r=[];for(let a=0;a<t.files.length;a+=1){let n=t.files[a],s=await (0,d.v)({baseUrl:m.baseUrl,...m.token?{token:m.token}:{},file:n,filename:n.name});if(e)return;s.ok?r.push(s.meta):(0,l.cY)("pwa.share.l2.upload-failed",{i:a,reason:s.reason}),p(e=>({...e,done:a+1}))}if(0===r.length)return p({phase:"level2-error",error:"all uploads failed"});try{window.sessionStorage.setItem("elanous.pwa.shareAttachments",JSON.stringify(r))}catch(e){}t.combinedText&&(0,c.vn)(t.combinedText),p({phase:"level2-handing-off",total:t.files.length,done:t.files.length});let n=setTimeout(()=>i.replace("/chat?shared=1"),400);return()=>clearTimeout(n)})(),()=>{e=!0}}let n=null!=(e=null==h?void 0:h.get("title"))?e:null,s=null!=(t=null==h?void 0:h.get("text"))?t:null,o=null!=(r=null==h?void 0:h.get("url"))?r:null,f=function(e,t,r){let a=[];return e&&e.trim()&&a.push(e.trim()),t&&t.trim()&&a.push(t.trim()),r&&r.trim()&&a.push(r.trim()),a.join("\n\n")}(n,s,o);(0,l.cY)("pwa.share.l1.received",{hasTitle:!!n,hasText:!!s,hasUrl:!!o,len:f.length}),f.length>0&&(0,c.vn)(f),p({phase:"level1-handing-off",preview:f});let x=setTimeout(()=>i.replace("/chat"),400);return()=>clearTimeout(x)},[h,i,m.baseUrl,m.token]),(0,a.jsxs)("main",{className:"flex h-full flex-col items-center justify-center gap-3 px-6 py-10 text-center",children:[(0,a.jsx)("h1",{className:"text-base font-semibold",children:"\uD83D\uDCE5 공유 받음"}),"level1-handing-off"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"곧 /chat 으로 이동합니다…"}),f.preview&&(0,a.jsxs)("pre",{className:"max-h-[60vh] max-w-full overflow-auto rounded-md border border-border bg-card p-3 text-left text-[11px] whitespace-pre-wrap break-words",children:[f.preview.slice(0,800),f.preview.length>800?"…":""]})]}),"level2-loading"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일 읽는 중…"}),"level2-uploading"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:["업로드 중… ",null!=(e=f.done)?e:0," / ",null!=(t=f.total)?t:0]}),"level2-handing-off"===f.phase&&(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:[null!=(r=f.done)?r:0," 개 첨부 완료 \xb7 /chat 이동…"]}),"level2-empty"===f.phase&&(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"파일이 없어요. /chat 으로 이동합니다…"}),"level2-error"===f.phase&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{className:"text-xs text-rose-500",children:["업로드 실패: ",f.error]}),(0,a.jsx)("a",{href:"/app/chat",className:"text-xs text-primary underline",children:"/chat 으로 이동"})]})]})}function m(){return(0,a.jsx)(n.Suspense,{fallback:(0,a.jsx)("div",{className:"p-6 text-sm text-muted-foreground",children:"loading…"}),children:(0,a.jsx)(h,{})})}},80581:(e,t,r)=>{"use strict";var a=r(35793);r.o(a,"useParams")&&r.d(t,{useParams:function(){return a.useParams}}),r.o(a,"usePathname")&&r.d(t,{usePathname:function(){return a.usePathname}}),r.o(a,"useRouter")&&r.d(t,{useRouter:function(){return a.useRouter}}),r.o(a,"useSearchParams")&&r.d(t,{useSearchParams:function(){return a.useSearchParams}})}},e=>{e.O(0,[9906,6390,3170,7358],()=>e(e.s=9258)),_N_E=e.O()}]);