elanous 0.2.31 → 0.2.32

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 (282) 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/{1834-50625904996a8fa8.js → 1834-98b64172bc1efe77.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-3535a4a69f1fafaa.js → page-a9717a67c2eecbaf.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/app/ceo/{page-5a503541353e60a8.js → page-c0f1ca371f710b06.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/app/chat/{page-6025101384e361a5.js → page-46430d45a9e04eac.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/app/control/{page-a645f00a06483e9a.js → page-a27b1e5a0d1b308f.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/app/design-check/{page-e9bab7413b028b28.js → page-8ea49a4c6dd2c6e7.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/app/exec/{page-e547e6ce55f1fb33.js → page-0e5a41fac1c75396.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/app/field/{page-d27e1b9850fd54bf.js → page-31aaf1ed37c6df9a.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/app/intake/{page-0fec29c7ba01894b.js → page-c69247e7134d329d.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/app/{layout-339a07410cd6f36b.js → layout-66dc5cd3a0999abe.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/app/loops/{page-2fd93ed8c9f16580.js → page-d256f5d5d9552823.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/app/market/{page-9b564dbff0fefc35.js → page-ce8f1907b8a6101c.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/app/morning/{page-814ba51385225776.js → page-32866485913d6a04.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/app/{not-found-397d479626e5a459.js → not-found-7607cca9b84950c6.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/app/observatory/{page-af1bba4e3251b728.js → page-eeab86176b03dc3b.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-3ad3be5e7d3fdce9.js → page-5b93dbae3432b996.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/app/ops/seats/{page-4da93ad35d4a8d28.js → page-f47e768b5b242b5a.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-3a658d5fa6d16a25.js → page-95306f892aa2d0ee.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/app/sessions/{page-0157de6e85f8bb6b.js → page-940fb6c217f6b470.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-8c66a3b24a745630.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/app/settings/{page-841d73d4ac44ed49.js → page-7b675dfd35c36fc9.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/app/setup/done/{page-6f43a3d1146e6377.js → page-8bd0d3cf7665bcfc.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/app/setup/{page-521ee23ac8c0abfa.js → page-c219f2ed171131be.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/app/share/{page-a9992ee285efaa83.js → page-40f8fa21bdae955b.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/app/showroom/{page-3d48e85fa89ec04f.js → page-468f8313e4f1fbd9.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/app/today/{page-233c71cd5f68f0d7.js → page-4214b855d9233ea8.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/app/trace/{page-70151d78de2f375e.js → page-936752c7aa58762e.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/app/vault/{page-dcac33a3e2cb72c0.js → page-ec052ad359df1797.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/workflows/{page-0448145ccd5c45c1.js → page-fad650e4793adb65.js} +1 -1
  52. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
  54. package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.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/ceo/index.html +1 -1
  66. package/apps/pwa/out/ceo/index.txt +14 -14
  67. package/apps/pwa/out/chat/index.html +1 -1
  68. package/apps/pwa/out/chat/index.txt +14 -14
  69. package/apps/pwa/out/consult/index.html +1 -1
  70. package/apps/pwa/out/consult/index.txt +14 -14
  71. package/apps/pwa/out/control/index.html +1 -1
  72. package/apps/pwa/out/control/index.txt +14 -14
  73. package/apps/pwa/out/decisions/index.html +1 -1
  74. package/apps/pwa/out/decisions/index.txt +14 -14
  75. package/apps/pwa/out/design-check/index.html +1 -1
  76. package/apps/pwa/out/design-check/index.txt +14 -14
  77. package/apps/pwa/out/editor/index.html +1 -1
  78. package/apps/pwa/out/editor/index.txt +14 -14
  79. package/apps/pwa/out/exec/index.html +1 -1
  80. package/apps/pwa/out/exec/index.txt +14 -14
  81. package/apps/pwa/out/field/index.html +1 -1
  82. package/apps/pwa/out/field/index.txt +14 -14
  83. package/apps/pwa/out/healthz +1 -1
  84. package/apps/pwa/out/index.html +1 -1
  85. package/apps/pwa/out/index.txt +14 -14
  86. package/apps/pwa/out/inside/index.html +1 -1
  87. package/apps/pwa/out/inside/index.txt +14 -14
  88. package/apps/pwa/out/intake/index.html +1 -1
  89. package/apps/pwa/out/intake/index.txt +14 -14
  90. package/apps/pwa/out/live/index.html +1 -1
  91. package/apps/pwa/out/live/index.txt +17 -14
  92. package/apps/pwa/out/live-run/index.html +1 -1
  93. package/apps/pwa/out/live-run/index.txt +14 -14
  94. package/apps/pwa/out/loops/index.html +1 -1
  95. package/apps/pwa/out/loops/index.txt +14 -14
  96. package/apps/pwa/out/market/index.html +1 -1
  97. package/apps/pwa/out/market/index.txt +14 -14
  98. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  99. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  100. package/apps/pwa/out/morning/index.html +1 -1
  101. package/apps/pwa/out/morning/index.txt +14 -14
  102. package/apps/pwa/out/observatory/index.html +1 -1
  103. package/apps/pwa/out/observatory/index.txt +14 -14
  104. package/apps/pwa/out/ops/checklist/index.html +1 -1
  105. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  106. package/apps/pwa/out/ops/release/index.html +1 -1
  107. package/apps/pwa/out/ops/release/index.txt +14 -14
  108. package/apps/pwa/out/ops/seats/index.html +1 -1
  109. package/apps/pwa/out/ops/seats/index.txt +14 -14
  110. package/apps/pwa/out/outputs/index.html +1 -1
  111. package/apps/pwa/out/outputs/index.txt +14 -14
  112. package/apps/pwa/out/reflection/index.html +1 -1
  113. package/apps/pwa/out/reflection/index.txt +15 -15
  114. package/apps/pwa/out/scheduler/index.html +1 -1
  115. package/apps/pwa/out/scheduler/index.txt +14 -14
  116. package/apps/pwa/out/sessions/index.html +1 -1
  117. package/apps/pwa/out/sessions/index.txt +14 -14
  118. package/apps/pwa/out/settings/devices/index.html +1 -1
  119. package/apps/pwa/out/settings/devices/index.txt +14 -14
  120. package/apps/pwa/out/settings/index.html +1 -1
  121. package/apps/pwa/out/settings/index.txt +14 -14
  122. package/apps/pwa/out/setup/done/index.html +1 -1
  123. package/apps/pwa/out/setup/done/index.txt +14 -14
  124. package/apps/pwa/out/setup/index.html +1 -1
  125. package/apps/pwa/out/setup/index.txt +14 -14
  126. package/apps/pwa/out/share/index.html +1 -1
  127. package/apps/pwa/out/share/index.txt +14 -14
  128. package/apps/pwa/out/showroom/index.html +1 -1
  129. package/apps/pwa/out/showroom/index.txt +14 -14
  130. package/apps/pwa/out/tasks/index.html +1 -1
  131. package/apps/pwa/out/tasks/index.txt +14 -14
  132. package/apps/pwa/out/term/index.html +1 -1
  133. package/apps/pwa/out/term/index.txt +14 -14
  134. package/apps/pwa/out/today/index.html +1 -1
  135. package/apps/pwa/out/today/index.txt +14 -14
  136. package/apps/pwa/out/trace/index.html +1 -1
  137. package/apps/pwa/out/trace/index.txt +14 -14
  138. package/apps/pwa/out/vault/index.html +1 -1
  139. package/apps/pwa/out/vault/index.txt +14 -14
  140. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  141. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  142. package/apps/pwa/out/workflows/index.html +1 -1
  143. package/apps/pwa/out/workflows/index.txt +14 -14
  144. package/apps/pwa/out/workspace/index.html +1 -1
  145. package/apps/pwa/out/workspace/index.txt +14 -14
  146. package/apps/pwa/out/worktrees/index.html +1 -1
  147. package/apps/pwa/out/worktrees/index.txt +14 -14
  148. package/graphs/implement-loop.yaml +5 -0
  149. package/package.json +1 -1
  150. package/scripts/ci-typecheck-changed.ts +26 -1
  151. package/scripts/measure-si-task-cpu.ts +143 -0
  152. package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
  153. package/scripts/release-loop/prepare-node.ts +102 -4
  154. package/src/acp/core-turn-bridge.ts +16 -4
  155. package/src/acp/elanous-extensions.ts +3 -0
  156. package/src/acp/server.ts +3 -0
  157. package/src/acp/tool-trace.ts +186 -11
  158. package/src/agent/self-ambient-cache.ts +156 -0
  159. package/src/agent/self-ambient.ts +8 -1
  160. package/src/agent/task-notification.ts +5 -0
  161. package/src/agent-substrate/pr-reviewer.ts +3 -1
  162. package/src/ask-user-question/tool.ts +22 -0
  163. package/src/autopilot/build/llm-conflict-merge.ts +56 -10
  164. package/src/autopilot/pr-manager.ts +23 -5
  165. package/src/capture/frame-state-detect.ts +39 -0
  166. package/src/capture/tui-self-report.ts +134 -6
  167. package/src/chat/index.ts +61 -15
  168. package/src/chat/pickers/modal-runtime.ts +6 -0
  169. package/src/chat/pickers/modals.ts +8 -2
  170. package/src/cli/ask-bare.ts +1 -0
  171. package/src/cli/import-cli.ts +12 -0
  172. package/src/cli/log-event-names.ts +10 -0
  173. package/src/cli/msg-cli.ts +1 -0
  174. package/src/cli/pod-cli.ts +14 -3
  175. package/src/cli/pr-cli.ts +67 -32
  176. package/src/cli/pr-land-base-read.ts +34 -0
  177. package/src/cli/pr-land-heavy-remote.ts +81 -25
  178. package/src/cli/pr-land-overlap-evidence.ts +46 -2
  179. package/src/cli/pr-land-pod-shadow-job.ts +26 -3
  180. package/src/cli/pr-land-refusal.ts +20 -5
  181. package/src/cli/pty-takeover-cli.ts +88 -14
  182. package/src/cli/sim-cli.ts +18 -0
  183. package/src/context-bus/ops-events.ts +6 -2
  184. package/src/core-turn/run-core-turn.ts +1 -0
  185. package/src/core-turn/run-goal-loop.ts +21 -0
  186. package/src/core-turn/types.ts +3 -0
  187. package/src/dashboard/acp-active-model.ts +42 -1
  188. package/src/dashboard/background-jobs-status.ts +66 -0
  189. package/src/dashboard/index.ts +117 -44
  190. package/src/dashboard/input/agent-wake.ts +242 -0
  191. package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
  192. package/src/dashboard/input/external-input-host.ts +23 -9
  193. package/src/dashboard/input/mouse-wiring.ts +108 -11
  194. package/src/dashboard/log-click-runtime.ts +118 -2
  195. package/src/dashboard/turn-preamble.ts +116 -40
  196. package/src/dashboard/turn-session-layers.ts +4 -2
  197. package/src/dashboard/turn-start-segments.ts +222 -0
  198. package/src/display/prompt-row-owner.ts +146 -0
  199. package/src/display/resize-listener.ts +33 -2
  200. package/src/fold-stack.ts +4 -2
  201. package/src/git-fs/index.ts +263 -36
  202. package/src/harness/gate-reserve.ts +87 -0
  203. package/src/harness/harness-incidents.ts +13 -0
  204. package/src/harness/harness-queue.ts +15 -0
  205. package/src/index.ts +8 -6
  206. package/src/input/external-input-queue.ts +34 -9
  207. package/src/llm/route-decision.ts +36 -0
  208. package/src/llm/tool-loop-steered-rejection.ts +8 -0
  209. package/src/llm-request-shape.ts +209 -0
  210. package/src/llm.ts +166 -267
  211. package/src/loops/orchestrator/tick.ts +24 -2
  212. package/src/maturity/feature-maturity.ts +1 -1
  213. package/src/mss/logging/render-categories.ts +5 -0
  214. package/src/ops/overview.ts +59 -2
  215. package/src/pr-tool/census.ts +19 -4
  216. package/src/pr-tool/inflight-registry.ts +143 -0
  217. package/src/pty-shell/pty-manifest.ts +12 -3
  218. package/src/pty-shell/tui-run-state.ts +34 -3
  219. package/src/seat-loop/traffic-signal.ts +2 -1
  220. package/src/self-dev/ask-launch-flow.ts +13 -0
  221. package/src/self-dev/draft-residue.ts +243 -24
  222. package/src/self-dev/shard-plan.ts +11 -3
  223. package/src/self-dev/shard-run.ts +103 -10
  224. package/src/self-implement/elanous-tui-spawn.ts +14 -0
  225. package/src/self-implement/follow-up-placement.ts +79 -0
  226. package/src/self-implement/gate-artifacts.ts +15 -4
  227. package/src/self-implement/gate-baseline.ts +96 -5
  228. package/src/self-implement/gate-cli.ts +7 -2
  229. package/src/self-implement/gate-remote.ts +26 -1
  230. package/src/self-implement/host-regate.ts +36 -4
  231. package/src/self-implement/orchestrator.ts +101 -11
  232. package/src/self-implement/run-ledger.ts +16 -14
  233. package/src/session-runtime/index.ts +22 -267
  234. package/src/shell-runner/background-surface.ts +15 -5
  235. package/src/skills/tools/agent.ts +39 -6
  236. package/src/skills/tools/list-dir.ts +11 -0
  237. package/src/skills/tools/schedule-wakeup.ts +408 -0
  238. package/src/skills/tools/shell.ts +245 -3
  239. package/src/status/bar.ts +26 -0
  240. package/src/steward/digest-delivery.ts +118 -0
  241. package/src/steward/hold-hygiene.ts +120 -0
  242. package/src/steward/triage.ts +10 -0
  243. package/src/surface/shell-runner-boot.ts +5 -2
  244. package/src/task-agent/task-hand.ts +24 -0
  245. package/src/task-orchestrator/surfaces/pod-command-job.ts +65 -11
  246. package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
  247. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
  248. package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
  249. package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
  250. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +525 -0
  251. package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
  252. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +156 -2
  253. package/src/task-orchestrator/surfaces/self-implement-pod.ts +7 -5
  254. package/src/tui/chat/execution-badge.ts +5 -1
  255. package/src/tui/input-lag-probe.ts +230 -0
  256. package/src/tui.ts +4 -0
  257. package/src/ux-sim/scenario.ts +255 -0
  258. package/src/version/packed-revision.json +1 -1
  259. package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +0 -1
  260. package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +0 -1
  261. package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
  262. package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
  263. package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
  264. package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
  265. package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
  266. package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
  267. package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +0 -1
  268. package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
  269. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
  270. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
  271. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
  272. package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
  273. package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
  274. package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
  275. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
  276. package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
  277. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
  278. package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
  279. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +0 -1
  280. package/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
  281. /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +0 -0
  282. /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2967],{27346:(e,t,n)=>{"use strict";n.d(t,{M1:()=>c,Qj:()=>d,tI:()=>o});var r=n(65863),s=n(24815),l=n(77945),a=n(37388);let i=(0,s.createContext)(null);function o(e){let{client:t,queryClient:n,defaultStaleTimeMs:o,children:c}=e,d=(0,s.useMemo)(()=>null!=n?n:new l.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[n,o]);return(0,r.jsx)(i.Provider,{value:t,children:(0,r.jsx)(a.Ht,{client:d,children:c})})}function c(){let e=(0,s.useContext)(i);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function d(){return(0,s.useContext)(i)}},35931:(e,t,n)=>{Promise.resolve().then(n.bind(n,93147))},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var r=n(65863),s=n(24815),l=n(70086),a=n(89469),i=n(31324),o=n(16263);let c=(0,s.createContext)(null);function d(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[d,u]=(0,s.useState)(n),[m,p]=(0,s.useState)(""),[h]=(0,s.useState)(()=>new i.ki(n));(0,s.useEffect)(()=>{let e=(0,l.Fp)();u(e),h.updateConfig(e),p((0,a.oD)()),(0,o.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,l.Fp)();h.updateConfig(t),u(t),(0,o.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,o.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let x=e=>{u(t=>{let n={...t,...e};return(0,l.Qc)(e),h.updateConfig(n),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,s.useMemo)(()=>({config:d,setConfig:x,client:h,sessionId:m,setSessionId:b}),[d,h,m]);return(0,r.jsx)(c.Provider,{value:f,children:t})}function u(){let e=(0,s.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>s,oD:()=>l});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function l(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function a(){let e=s();return localStorage.setItem(r,e),e}},93147:(e,t,n)=>{"use strict";n.d(t,{MarketPanel:()=>h});var r=n(65863),s=n(24815),l=n(45695),a=n(27346);let i={resolve:"받는 중",verify:"서명 확인",consent:"권한 동의",credentials:"자격 필요",registered:"등록",done:"완료",failed:"실패"},o={signature:"서명을 확인하지 못했습니다.",scan:"플러그인 파일을 확인하지 못했습니다.","consent-denied":"필요한 권한에 동의하지 않았습니다.",credentials:"연결 정보가 필요합니다.",conflict:"이미 설치된 플러그인입니다.",io:"설치 중 오류가 발생했습니다."};var c=n(89279);function d(e){return e.fields.map(e=>{let{name:t,env:n,set:r}=e;return{name:t,env:n,set:r}})}function u(e){if(e instanceof c.Iu){if(404===e.status)return"설치된 플러그인을 찾을 수 없습니다.";if(401===e.status)return"연결 정보를 관리할 권한이 없습니다.";if(400===e.status)return"선언되지 않은 연결 정보 항목입니다."}return"연결 정보를 불러오거나 저장하지 못했습니다."}function m(e){let{client:t,name:n}=e,[l,a]=(0,s.useState)(null),[i,o]=(0,s.useState)({}),[c,m]=(0,s.useState)([]),[p,h]=(0,s.useState)(null),[x,b]=(0,s.useState)(!1);async function f(e){if(e.preventDefault(),x||!l)return;let{fields:r}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n={};for(let[t,r]of Object.entries(e))r.trim()&&(n[t]=r);for(let e of t)n[e]=null;return{fields:n}}(i,c);if(0!==Object.keys(r).length){b(!0),h(null);try{await t.putPluginCredentials(n,r),o({}),m([]),a(null),a(await t.getPluginCredentials(n))}catch(e){h(u(e))}finally{b(!1)}}}return(0,s.useEffect)(()=>{let e=!0;return a(null),o({}),m([]),h(null),t.getPluginCredentials(n).then(t=>{e&&a(t)}).catch(t=>{e&&h(u(t))}),()=>{e=!1}},[t,n]),(0,r.jsxs)("form",{className:"space-y-3 rounded-lg border border-border p-4",onSubmit:e=>void f(e),children:[(0,r.jsx)("h3",{className:"font-medium",children:"연결 정보"}),p&&(0,r.jsx)("p",{role:"alert",className:"text-sm",children:p}),!l&&!p&&(0,r.jsx)("p",{role:"status",children:"연결 정보를 불러오는 중…"}),l&&0===d(l).length&&(0,r.jsx)("p",{className:"text-sm",children:"입력할 연결 정보가 없습니다."}),l&&d(l).map(e=>{var t;return(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsx)("label",{className:"block text-sm font-medium",htmlFor:"credential-".concat(n,"-").concat(e.name),children:e.name}),(0,r.jsxs)("small",{className:"block text-muted-foreground",children:["환경 변수: ",(0,r.jsx)("code",{children:e.env})]}),(0,r.jsx)("p",{className:"text-sm",role:"status",children:e.set?"✓ 저장됨":"비어 있음"}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsx)("input",{id:"credential-".concat(n,"-").concat(e.name),type:"password",autoComplete:"new-password",className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1",value:null!=(t=i[e.name])?t:"",disabled:x,onChange:t=>{o(n=>({...n,[e.name]:t.target.value})),m(t=>t.filter(t=>t!==e.name))}}),e.set&&(0,r.jsx)("button",{type:"button",className:"rounded border px-2 py-1 text-sm",disabled:x,onClick:()=>{o(t=>({...t,[e.name]:""})),m(t=>t.includes(e.name)?t:[...t,e.name])},children:c.includes(e.name)?"삭제 예정":"지우기"})]})]},e.name)}),l&&l.fields.length>0&&(0,r.jsx)("button",{type:"submit",disabled:x||0===c.length&&!Object.values(i).some(e=>e.trim()),className:"rounded border px-3 py-1 text-sm",children:x?"저장 중…":"저장"})]})}let p={name:"",description:"",instructions:"",connectorId:"",credentialNames:""};function h(){var e;let t=(0,a.Qj)(),n=(0,s.useContext)(l.C),[c,d]=(0,s.useState)("browse"),[u,h]=(0,s.useState)(null),[x,b]=(0,s.useState)([]),[f,g]=(0,s.useState)(null),[j,y]=(0,s.useState)(!1),[w,N]=(0,s.useState)(!1),[v,k]=(0,s.useState)(!1),[C,S]=(0,s.useState)(!1),[E,I]=(0,s.useState)(null),[P,z]=(0,s.useState)(!1),[O,D]=(0,s.useState)([]),[q,U]=(0,s.useState)(null),[M,A]=(0,s.useState)(p),[W,_]=(0,s.useState)(""),[L,R]=(0,s.useState)([]),[T,F]=(0,s.useState)([]),[Y,J]=(0,s.useState)(null),[Q,V]=(0,s.useState)(!1),[$,Z]=(0,s.useState)(null);async function B(){if(!Q){V(!0),J(null);try{let e=W.trim(),t=function(e,t){let n=e.trim();if(!n)throw Error("플러그인 설명을 입력하세요.");return t.description?{...t,instructions:"".concat(t.instructions||t.description,"\n").concat(n)}:{...t,description:n,instructions:t.instructions||n}}(e,M),r=[...L,{role:"user",text:e}];if(null==n?void 0:n.config.baseUrl){let e=r.map(e=>"".concat("user"===e.role?"사용자":"마법사",": ").concat(e.text)).join("\n"),t=await fetch("".concat(n.config.baseUrl.replace(/\/$/,""),"/v1/prompt"),{method:"POST",headers:{"content-type":"application/json",...n.config.token?{authorization:"Bearer ".concat(n.config.token)}:{}},body:JSON.stringify({tools:"none",userText:["플러그인 연구 초안 폼 편집 도우미입니다. 도구 실행\xb7설치\xb7저장은 하지 마세요.","대화와 현재 폼을 바탕으로 description\xb7instructions\xb7reply 문자열이 있는 JSON 객체만 반환하세요. reply는 사용자에게 다음에 무엇을 다듬을지 묻거나 폼 변경 내용을 설명하는 자연스러운 답변입니다.","현재 설명: ".concat(M.description,"\n현재 지시문: ").concat(M.instructions),e].join("\n\n")})});if(!t.ok)throw Error("마법사 대화를 처리하지 못했습니다 (".concat(t.status,"). 다시 요청하세요."));let s=await t.json();if("string"!=typeof s.text)throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");let l=function(e,t){let n,r=e.trim(),s=r.startsWith("```json")&&r.endsWith("```")?r.slice(7,-3).trim():r;if(!s.startsWith("{")||!s.endsWith("}"))throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");try{n=JSON.parse(s)}catch(e){throw Error("마법사 응답을 읽지 못했습니다. 다시 요청하세요.")}if(!n||"object"!=typeof n||Array.isArray(n))throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");let l=n;if("string"!=typeof l.description||!l.description.trim()||"string"!=typeof l.instructions||!l.instructions.trim()||"string"!=typeof l.reply||!l.reply.trim())throw Error("마법사 응답에 설명과 지시문과 답변이 필요합니다. 다시 요청하세요.");return{form:{...t,description:l.description.trim(),instructions:l.instructions.trim()},reply:l.reply.trim()}}(s.text,M);A(e=>({...e,description:l.form.description,instructions:l.form.instructions})),R([...r,{role:"assistant",text:l.reply}])}else A(t),R([...r,{role:"assistant",text:"초안을 폼에 옮겼습니다. LLM 대화는 데몬 연결 후 사용할 수 있습니다. 내용을 검토하고 저장하세요."}]);_(""),J(null)}catch(e){J(e instanceof Error?e.message:"초안을 만들지 못했습니다.")}finally{V(!1)}}}async function K(){if(t&&!Q){V(!0),J(null);try{let e=function(e){var t,n;let r=e.name.trim();if(!/^[a-z0-9][a-z0-9-]{1,31}$/.test(r))throw Error("플러그인 이름은 영문 소문자\xb7숫자\xb7하이픈 2~32자로 입력하세요.");if(!e.description.trim())throw Error("플러그인 설명을 입력하세요.");let s=e.connectorId.trim(),l=e.credentialNames.split(",").map(e=>e.trim()).filter(Boolean);if(s&&!/^[a-z0-9][a-z0-9-]{1,31}$/.test(s))throw Error("연결 이름이 올바르지 않습니다.");if(!s&&l.length)throw Error("연결 이름을 먼저 입력하세요.");if(l.some(e=>!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(e))||new Set(l).size!==l.length)throw Error("자격 정보에는 중복 없는 항목 이름만 입력하세요.");let a=null!=(t=e.otherConnectors)?t:[];if(s&&a.some(e=>e.id===s))throw Error("연결 이름이 중복됩니다.");return{name:r,draft:{description:e.description.trim(),...s||a.length?{connectors:[...s?[{id:s,credentials:l.map(e=>({name:e}))}]:[],...a]}:{},skill:{description:null!=(n=e.skillDescription)?n:e.description.trim(),instructions:e.instructions.trim()||e.description.trim(),...e.requires?{requires:e.requires}:{}}}}}(M);if($&&$!==e.name)throw Error("다시 만들 때는 기존 플러그인 이름을 유지하세요. 새 이름으로 만들려면 새 초안을 선택하세요.");await t.saveWizardPlugin({...e,...$===e.name?{regenerate:!0}:{}}),Z(e.name),R(t=>[...t,{role:"assistant",text:"".concat(e.name," 연구 초안을 저장했습니다. 실행\xb7설치 전 그래프 단계를 구현하고 검증해야 합니다.")}]);try{F((await t.getWizardPlugins()).plugins)}catch(e){J("초안은 저장했지만 만든 플러그인 목록을 불러오지 못했습니다. 탭을 다시 열어 목록을 새로고침하세요.")}}catch(e){J(e instanceof Error?e.message:"플러그인을 저장하지 못했습니다.")}finally{V(!1)}}}async function H(){if(d("wizard"),t)try{F((await t.getWizardPlugins()).plugins),J(null)}catch(e){J("만든 플러그인 목록을 불러오지 못했습니다.")}}async function G(){if(t){S(!0),I(null);try{if(!(await t.refreshPluginMarket("elanous")).ok)throw Error("공식 마켓을 받지 못했습니다.");h(await t.getPluginsIndex()),y(!1)}catch(e){I("공식 마켓을 받지 못했습니다.")}finally{S(!1)}}}async function X(){if(!t||!f)return;S(!0),D([]),I(null);let e=null;try{await t.installMarketPlugin("".concat(f.plugin.name,"@").concat(f.market.name),f.plugin.capabilities,t=>{let n=function(e){let t;try{t=JSON.parse(e)}catch(e){return null}if(!t||"object"!=typeof t)return null;let n=t.event;if("string"!=typeof n||!Object.hasOwn(i,n))return null;if("failed"===n){var r;let e=t.reason,n=t.detail,s="string"==typeof e&&null!=(r=o[e])?r:o.io;return{step:"실패",reason:"string"==typeof n&&n.trim()?"".concat(s," — ").concat(n.trim()):s}}return"credentials"===n?!0===t.required?{step:"자격 필요",credentialsRequired:!0}:null:{step:i[n]}}(t);n&&(("완료"===n.step||"실패"===n.step)&&(e=n.step),D(e=>[...e,n]))}),e||D(e=>[...e,{step:"실패",reason:"설치가 끝나지 않았습니다."}])}catch(t){e||D(e=>[...e,{step:"실패",reason:"설치 중 오류가 발생했습니다."}])}if("완료"===e)try{b(await t.getInstalledPlugins()),k(!0),N(!1)}catch(e){N(!0),I("설치는 완료됐지만 설치 목록을 불러오지 못했습니다.")}S(!1)}async function ee(e){if(t){S(!0),I(null);try{await t.removeMarketPlugin(e)}catch(e){I("플러그인을 제거하지 못했습니다."),S(!1);return}U(null),b(t=>t.filter(t=>t.name!==e));try{b(await t.getInstalledPlugins()),k(!0),N(!1)}catch(e){N(!0),I("플러그인은 제거됐지만 설치 목록을 불러오지 못했습니다.")}finally{S(!1)}}}(0,s.useEffect)(()=>{if(!t)return;let e=!0;return h(null),b([]),g(null),y(!1),N(!1),k(!1),D([]),z(!1),U(null),I(null),F([]),A(p),R([]),Z(null),J(null),t.getPluginsIndex().then(t=>{e&&h(t)}).catch(()=>{e&&y(!0)}),t.getInstalledPlugins().then(t=>{e&&(b(t),k(!0))}).catch(()=>{e&&(N(!0),k(!0))}),()=>{e=!1}},[t]);let et=u?u.markets.flatMap(e=>e.plugins.map(t=>({market:e,plugin:t,price:function(e){var t;if("free"===e.model)return"무료";let n=void 0===e.amount?"가격 미정":"".concat(e.amount.toLocaleString("ko-KR")," ").concat(null!=(t=e.currency)?t:"").trim();return"subscription"===e.model&&e.period?"".concat(n," / ").concat(e.period):n}(t.pricing),badge:function(e){switch(e){case"ok":return"✅ 서명 확인";case"missing":return"⚠️ 서명 없음";case"unknown-key":return"⚠️ 알 수 없는 서명 키";case"malformed":return"⚠️ 잘못된 서명";case"stale":return"⚠️ 유효하지 않은 서명"}}(e.signature)}))).sort((e,t)=>("ok"!==e.market.signature)-("ok"!==t.market.signature)||e.plugin.name.localeCompare(t.plugin.name)||e.market.name.localeCompare(t.market.name)):[];return(0,r.jsxs)("main",{className:"mx-auto max-w-5xl space-y-6 p-5 text-foreground","aria-label":"마켓",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"마켓"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"확인된 플러그인을 살펴보고 설치할 수 있습니다."})]}),(0,r.jsx)("nav",{"aria-label":"마켓 탭",className:"flex flex-wrap gap-2",children:[["browse","찾아보기"],["detail","상세"],["installed","설치됨"],["wizard","플러그인 만들기"]].map(e=>{let[t,n]=e;return(0,r.jsx)("button",{type:"button","aria-current":c===t?"page":void 0,className:"rounded-lg border px-4 py-2 text-sm ".concat(c===t?"border-blue-500 font-semibold":"border-border"),onClick:()=>{"wizard"===t?H():d(t)},children:n},t)})}),!t&&(0,r.jsx)("p",{role:"status",children:"서버 연결이 설정되지 않았습니다. 설정에서 서버 주소를 입력하세요."}),E&&(0,r.jsx)("p",{role:"alert",children:E}),"installed"!==c&&"wizard"!==c&&j&&(0,r.jsx)("p",{role:"alert",children:"마켓을 불러오지 못했습니다."}),"installed"!==c&&"wizard"!==c&&t&&!j&&!u&&(0,r.jsx)("p",{role:"status",children:"마켓을 불러오는 중…"}),"installed"===c&&w&&(0,r.jsx)("p",{role:"alert",children:"설치 목록을 불러오지 못했습니다."}),"installed"===c&&t&&!v&&(0,r.jsx)("p",{role:"status",children:"설치 목록을 불러오는 중…"}),"browse"===c&&u&&(0===u.markets.length?(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsx)("p",{children:"아직 받아 둔 마켓이 없습니다."}),(0,r.jsx)("button",{type:"button",disabled:C||!t,className:"rounded border px-3 py-2",onClick:()=>void G(),children:"공식 마켓 받기"})]}):0===et.length?(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsx)("p",{children:"등록된 플러그인이 없습니다."}),(0,r.jsx)("button",{type:"button",disabled:C||!t,className:"rounded border px-3 py-2",onClick:()=>void G(),children:"공식 마켓 받기"})]}):(0,r.jsx)("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:et.map(e=>{var t;return(0,r.jsxs)("article",{className:"rounded-xl border border-border p-4 space-y-2",children:[(0,r.jsxs)("h2",{className:"font-semibold",children:[e.plugin.name," ",(0,r.jsxs)("span",{className:"text-xs font-normal",children:["v",e.plugin.version]})]}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:null!=(t=e.plugin.description)?t:"설명이 없습니다."}),(0,r.jsxs)("p",{className:"text-sm",children:[e.price," \xb7 ",(0,r.jsx)("span",{title:e.market.detail,children:e.badge})]}),(0,r.jsx)("button",{type:"button",className:"rounded border px-3 py-1 text-sm",onClick:()=>{g(e),z(!1),D([]),d("detail")},children:"상세 보기"})]},"".concat(e.market.name,"/").concat(e.plugin.name,"/").concat(e.plugin.version))})})),"detail"===c&&!j&&(f?(0,r.jsxs)("section",{className:"space-y-4 rounded-xl border border-border p-5","aria-label":"플러그인 상세",children:[(0,r.jsxs)("h2",{className:"text-xl font-semibold",children:[f.plugin.name," ",(0,r.jsxs)("small",{children:["v",f.plugin.version]})]}),(0,r.jsx)("p",{children:f.plugin.description}),(0,r.jsxs)("p",{children:[f.price," \xb7 ",f.badge]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"권한"}),(0,r.jsx)("ul",{children:f.plugin.capabilities.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"연결 정보 항목"}),f.plugin.connectors.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"연결 정보"}),(0,r.jsx)("ul",{children:e.userConfig.map(e=>(0,r.jsxs)("li",{children:[e.label,e.secret?" \xb7 비공개 정보":""]},e.key))})]},e.id))]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"포함된 기능"}),(0,r.jsx)("ul",{children:null==(e=f.plugin.graphs)?void 0:e.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("p",{children:["파일 확인값: ",(0,r.jsx)("code",{children:f.plugin.sha256.slice(0,12)})]}),P?(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("p",{children:"이 플러그인이 요청하는 권한을 확인하세요."}),(0,r.jsx)("ul",{children:f.plugin.capabilities.map(e=>(0,r.jsx)("li",{children:e},e))}),(0,r.jsx)("button",{type:"button",disabled:C,className:"rounded border px-3 py-1",onClick:()=>void X(),children:"동의하고 설치"}),(0,r.jsx)("button",{type:"button",disabled:C,className:"rounded border px-3 py-1",onClick:()=>z(!1),children:"취소"})]}):(0,r.jsx)("button",{type:"button",disabled:C||"ok"!==f.market.signature,className:"rounded border px-3 py-1",onClick:()=>z(!0),children:"설치"}),O.length>0&&(0,r.jsx)("ol",{"aria-label":"설치 진행",className:"space-y-1",children:O.map((e,t)=>(0,r.jsxs)("li",{role:"실패"===e.step?"alert":void 0,children:[e.step,e.reason?": ".concat(e.reason):"",e.credentialsRequired?" — 이 플러그인은 연결 정보가 필요합니다.":""]},t))}),t&&O.some(e=>e.credentialsRequired)&&(0,r.jsx)(m,{client:t,name:f.plugin.name},"".concat(f.plugin.name,"-").concat(O.some(e=>"완료"===e.step||"등록"===e.step)))]}):(0,r.jsx)("p",{children:"찾아보기에서 플러그인을 선택하세요."})),"wizard"===c&&(0,r.jsxs)("section",{"aria-label":"플러그인 마법사",className:"min-w-0 space-y-5",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"플러그인 마법사"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"대화로 요청을 정리하고 폼을 다듬어 연구 초안을 만듭니다. 생성된 그래프는 아직 실행\xb7설치할 수 없습니다."}),(0,r.jsxs)("div",{className:"grid min-w-0 gap-5 md:grid-cols-2",children:[(0,r.jsxs)("section",{"aria-label":"마법사 대화 입력",className:"min-w-0 space-y-3",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"대화로 요청하기"}),(0,r.jsx)("ol",{"aria-label":"마법사 대화",className:"max-h-64 space-y-2 overflow-y-auto break-words","aria-live":"polite",children:L.map((e,t)=>(0,r.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[(0,r.jsxs)("strong",{children:["user"===e.role?"나":"마법사",": "]}),e.text]},t))}),(0,r.jsxs)("label",{className:"block",children:["만들고 싶은 플러그인",(0,r.jsx)("textarea",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:W,disabled:Q,onChange:e=>{Q||_(e.target.value)}})]}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"w-full rounded border px-3 py-2 sm:w-auto",onClick:()=>void B(),children:Q?"대화 중…":"대화에 추가"})]}),(0,r.jsxs)("section",{"aria-label":"마법사 초안 편집",className:"min-w-0 space-y-3",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"폼으로 다듬기"}),(0,r.jsxs)("div",{className:"grid min-w-0 gap-3",children:[(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["이름 (영문 소문자\xb7숫자\xb7하이픈)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.name,disabled:Q,onChange:e=>{Q||A(t=>({...t,name:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["설명",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.description,disabled:Q,onChange:e=>{Q||A(t=>({...t,description:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["스킬 지시문",(0,r.jsx)("textarea",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.instructions,disabled:Q,onChange:e=>{Q||A(t=>({...t,instructions:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["연결 이름 (선택)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.connectorId,disabled:Q,onChange:e=>{Q||A(t=>({...t,connectorId:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["자격 정보 항목 이름 (쉼표 구분, 값은 입력하지 마세요)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.credentialNames,disabled:Q,onChange:e=>{Q||A(t=>({...t,credentialNames:e.target.value}))}})]})]}),Y&&(0,r.jsx)("p",{role:"alert",children:Y}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:!t||Q,className:"rounded border px-3 py-2",onClick:()=>void K(),children:Q?"저장 중…":$===M.name?"다시 만들기":"초안 만들기"}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"rounded border px-3 py-2",onClick:()=>{A(p),R([]),_(""),Z(null),J(null)},children:"새 초안"})]})]})]}),(0,r.jsxs)("section",{"aria-label":"만든 플러그인",className:"min-w-0 space-y-2",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"만든 플러그인"}),0===T.length?(0,r.jsx)("p",{children:"만든 초안이 없습니다."}):(0,r.jsx)("ul",{className:"grid gap-2 lg:grid-cols-2",children:T.map(e=>(0,r.jsxs)("li",{className:"flex min-w-0 flex-col items-start gap-2 rounded border border-border p-3",children:[(0,r.jsxs)("span",{className:"max-w-full break-words",children:[e.name," \xb7 ",e.description]}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"rounded border px-3 py-2",onClick:()=>{if(!Q){var t,n,r,s,l,a,i,o,c,d,u,m;A({name:e.name,description:e.draft.description,instructions:null!=(d=null==(t=e.draft.skill)?void 0:t.instructions)?d:"",connectorId:null!=(u=null==(r=e.draft.connectors)||null==(n=r[0])?void 0:n.id)?u:"",credentialNames:null!=(m=null==(a=e.draft.connectors)||null==(l=a[0])||null==(s=l.credentials)?void 0:s.map(e=>e.name).join(", "))?m:"",...(null==(o=e.draft.skill)||null==(i=o.requires)?void 0:i.length)?{requires:e.draft.skill.requires}:{},...(null==(c=e.draft.skill)?void 0:c.description)&&e.draft.skill.description!==e.draft.description?{skillDescription:e.draft.skill.description}:{},...e.draft.connectors&&e.draft.connectors.length>1?{otherConnectors:e.draft.connectors.slice(1)}:{}}),Z(e.name),R([]),J(null)}},children:"다듬고 다시 만들기"})]},e.name))})]})]}),"installed"===c&&v&&!w&&(0===x.length?(0,r.jsx)("p",{children:"설치된 플러그인이 없습니다."}):(0,r.jsx)("ul",{className:"space-y-2",children:x.map(e=>(0,r.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[e.name," \xb7 v",e.version," \xb7 설치 시각: ",e.installedAt&&Number.isFinite(Date.parse(e.installedAt))?(0,r.jsx)("time",{dateTime:e.installedAt,children:new Date(e.installedAt).toLocaleString("ko-KR")}):"알 수 없음",q===e.name?(0,r.jsxs)("span",{className:"ml-3",children:["제거할까요? ",(0,r.jsx)("button",{type:"button",disabled:C,onClick:()=>void ee(e.name),children:"제거 확인"})," ",(0,r.jsx)("button",{type:"button",onClick:()=>U(null),children:"취소"})]}):(0,r.jsx)("button",{type:"button",disabled:C,className:"ml-3 rounded border px-3 py-1",onClick:()=>U(e.name),children:"제거"}),t&&(0,r.jsxs)("details",{className:"mt-3",children:[(0,r.jsx)("summary",{className:"cursor-pointer",children:"연결 정보"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(m,{client:t,name:e.name})})]})]},"".concat(e.market,"/").concat(e.name,"/").concat(e.version)))}))]})}}},e=>{e.O(0,[8260,1324,9279,5290,607,7358],()=>e(e.s=35931)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2967],{27346:(e,t,n)=>{"use strict";n.d(t,{M1:()=>c,Qj:()=>d,tI:()=>o});var r=n(65863),s=n(24815),l=n(77945),a=n(37388);let i=(0,s.createContext)(null);function o(e){let{client:t,queryClient:n,defaultStaleTimeMs:o,children:c}=e,d=(0,s.useMemo)(()=>null!=n?n:new l.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[n,o]);return(0,r.jsx)(i.Provider,{value:t,children:(0,r.jsx)(a.Ht,{client:d,children:c})})}function c(){let e=(0,s.useContext)(i);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function d(){return(0,s.useContext)(i)}},29550:(e,t,n)=>{Promise.resolve().then(n.bind(n,93147))},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var r=n(65863),s=n(24815),l=n(70086),a=n(89469),i=n(31324),o=n(16263);let c=(0,s.createContext)(null);function d(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[d,u]=(0,s.useState)(n),[m,p]=(0,s.useState)(""),[h]=(0,s.useState)(()=>new i.ki(n));(0,s.useEffect)(()=>{let e=(0,l.Fp)();u(e),h.updateConfig(e),p((0,a.oD)()),(0,o.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,l.Fp)();h.updateConfig(t),u(t),(0,o.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,o.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let x=e=>{u(t=>{let n={...t,...e};return(0,l.Qc)(e),h.updateConfig(n),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,s.useMemo)(()=>({config:d,setConfig:x,client:h,sessionId:m,setSessionId:b}),[d,h,m]);return(0,r.jsx)(c.Provider,{value:f,children:t})}function u(){let e=(0,s.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>s,oD:()=>l});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function l(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function a(){let e=s();return localStorage.setItem(r,e),e}},93147:(e,t,n)=>{"use strict";n.d(t,{MarketPanel:()=>h});var r=n(65863),s=n(24815),l=n(45695),a=n(27346);let i={resolve:"받는 중",verify:"서명 확인",consent:"권한 동의",credentials:"자격 필요",registered:"등록",done:"완료",failed:"실패"},o={signature:"서명을 확인하지 못했습니다.",scan:"플러그인 파일을 확인하지 못했습니다.","consent-denied":"필요한 권한에 동의하지 않았습니다.",credentials:"연결 정보가 필요합니다.",conflict:"이미 설치된 플러그인입니다.",io:"설치 중 오류가 발생했습니다."};var c=n(89279);function d(e){return e.fields.map(e=>{let{name:t,env:n,set:r}=e;return{name:t,env:n,set:r}})}function u(e){if(e instanceof c.Iu){if(404===e.status)return"설치된 플러그인을 찾을 수 없습니다.";if(401===e.status)return"연결 정보를 관리할 권한이 없습니다.";if(400===e.status)return"선언되지 않은 연결 정보 항목입니다."}return"연결 정보를 불러오거나 저장하지 못했습니다."}function m(e){let{client:t,name:n}=e,[l,a]=(0,s.useState)(null),[i,o]=(0,s.useState)({}),[c,m]=(0,s.useState)([]),[p,h]=(0,s.useState)(null),[x,b]=(0,s.useState)(!1);async function f(e){if(e.preventDefault(),x||!l)return;let{fields:r}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n={};for(let[t,r]of Object.entries(e))r.trim()&&(n[t]=r);for(let e of t)n[e]=null;return{fields:n}}(i,c);if(0!==Object.keys(r).length){b(!0),h(null);try{await t.putPluginCredentials(n,r),o({}),m([]),a(null),a(await t.getPluginCredentials(n))}catch(e){h(u(e))}finally{b(!1)}}}return(0,s.useEffect)(()=>{let e=!0;return a(null),o({}),m([]),h(null),t.getPluginCredentials(n).then(t=>{e&&a(t)}).catch(t=>{e&&h(u(t))}),()=>{e=!1}},[t,n]),(0,r.jsxs)("form",{className:"space-y-3 rounded-lg border border-border p-4",onSubmit:e=>void f(e),children:[(0,r.jsx)("h3",{className:"font-medium",children:"연결 정보"}),p&&(0,r.jsx)("p",{role:"alert",className:"text-sm",children:p}),!l&&!p&&(0,r.jsx)("p",{role:"status",children:"연결 정보를 불러오는 중…"}),l&&0===d(l).length&&(0,r.jsx)("p",{className:"text-sm",children:"입력할 연결 정보가 없습니다."}),l&&d(l).map(e=>{var t;return(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsx)("label",{className:"block text-sm font-medium",htmlFor:"credential-".concat(n,"-").concat(e.name),children:e.name}),(0,r.jsxs)("small",{className:"block text-muted-foreground",children:["환경 변수: ",(0,r.jsx)("code",{children:e.env})]}),(0,r.jsx)("p",{className:"text-sm",role:"status",children:e.set?"✓ 저장됨":"비어 있음"}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsx)("input",{id:"credential-".concat(n,"-").concat(e.name),type:"password",autoComplete:"new-password",className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1",value:null!=(t=i[e.name])?t:"",disabled:x,onChange:t=>{o(n=>({...n,[e.name]:t.target.value})),m(t=>t.filter(t=>t!==e.name))}}),e.set&&(0,r.jsx)("button",{type:"button",className:"rounded border px-2 py-1 text-sm",disabled:x,onClick:()=>{o(t=>({...t,[e.name]:""})),m(t=>t.includes(e.name)?t:[...t,e.name])},children:c.includes(e.name)?"삭제 예정":"지우기"})]})]},e.name)}),l&&l.fields.length>0&&(0,r.jsx)("button",{type:"submit",disabled:x||0===c.length&&!Object.values(i).some(e=>e.trim()),className:"rounded border px-3 py-1 text-sm",children:x?"저장 중…":"저장"})]})}let p={name:"",description:"",instructions:"",connectorId:"",credentialNames:""};function h(){var e;let t=(0,a.Qj)(),n=(0,s.useContext)(l.C),[c,d]=(0,s.useState)("browse"),[u,h]=(0,s.useState)(null),[x,b]=(0,s.useState)([]),[f,g]=(0,s.useState)(null),[j,y]=(0,s.useState)(!1),[w,N]=(0,s.useState)(!1),[v,k]=(0,s.useState)(!1),[C,S]=(0,s.useState)(!1),[E,I]=(0,s.useState)(null),[P,z]=(0,s.useState)(!1),[O,D]=(0,s.useState)([]),[q,U]=(0,s.useState)(null),[M,A]=(0,s.useState)(p),[W,_]=(0,s.useState)(""),[L,R]=(0,s.useState)([]),[T,F]=(0,s.useState)([]),[Y,J]=(0,s.useState)(null),[Q,V]=(0,s.useState)(!1),[$,Z]=(0,s.useState)(null);async function B(){if(!Q){V(!0),J(null);try{let e=W.trim(),t=function(e,t){let n=e.trim();if(!n)throw Error("플러그인 설명을 입력하세요.");return t.description?{...t,instructions:"".concat(t.instructions||t.description,"\n").concat(n)}:{...t,description:n,instructions:t.instructions||n}}(e,M),r=[...L,{role:"user",text:e}];if(null==n?void 0:n.config.baseUrl){let e=r.map(e=>"".concat("user"===e.role?"사용자":"마법사",": ").concat(e.text)).join("\n"),t=await fetch("".concat(n.config.baseUrl.replace(/\/$/,""),"/v1/prompt"),{method:"POST",headers:{"content-type":"application/json",...n.config.token?{authorization:"Bearer ".concat(n.config.token)}:{}},body:JSON.stringify({tools:"none",userText:["플러그인 연구 초안 폼 편집 도우미입니다. 도구 실행\xb7설치\xb7저장은 하지 마세요.","대화와 현재 폼을 바탕으로 description\xb7instructions\xb7reply 문자열이 있는 JSON 객체만 반환하세요. reply는 사용자에게 다음에 무엇을 다듬을지 묻거나 폼 변경 내용을 설명하는 자연스러운 답변입니다.","현재 설명: ".concat(M.description,"\n현재 지시문: ").concat(M.instructions),e].join("\n\n")})});if(!t.ok)throw Error("마법사 대화를 처리하지 못했습니다 (".concat(t.status,"). 다시 요청하세요."));let s=await t.json();if("string"!=typeof s.text)throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");let l=function(e,t){let n,r=e.trim(),s=r.startsWith("```json")&&r.endsWith("```")?r.slice(7,-3).trim():r;if(!s.startsWith("{")||!s.endsWith("}"))throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");try{n=JSON.parse(s)}catch(e){throw Error("마법사 응답을 읽지 못했습니다. 다시 요청하세요.")}if(!n||"object"!=typeof n||Array.isArray(n))throw Error("마법사 응답에 폼이 없습니다. 다시 요청하세요.");let l=n;if("string"!=typeof l.description||!l.description.trim()||"string"!=typeof l.instructions||!l.instructions.trim()||"string"!=typeof l.reply||!l.reply.trim())throw Error("마법사 응답에 설명과 지시문과 답변이 필요합니다. 다시 요청하세요.");return{form:{...t,description:l.description.trim(),instructions:l.instructions.trim()},reply:l.reply.trim()}}(s.text,M);A(e=>({...e,description:l.form.description,instructions:l.form.instructions})),R([...r,{role:"assistant",text:l.reply}])}else A(t),R([...r,{role:"assistant",text:"초안을 폼에 옮겼습니다. LLM 대화는 데몬 연결 후 사용할 수 있습니다. 내용을 검토하고 저장하세요."}]);_(""),J(null)}catch(e){J(e instanceof Error?e.message:"초안을 만들지 못했습니다.")}finally{V(!1)}}}async function K(){if(t&&!Q){V(!0),J(null);try{let e=function(e){var t,n;let r=e.name.trim();if(!/^[a-z0-9][a-z0-9-]{1,31}$/.test(r))throw Error("플러그인 이름은 영문 소문자\xb7숫자\xb7하이픈 2~32자로 입력하세요.");if(!e.description.trim())throw Error("플러그인 설명을 입력하세요.");let s=e.connectorId.trim(),l=e.credentialNames.split(",").map(e=>e.trim()).filter(Boolean);if(s&&!/^[a-z0-9][a-z0-9-]{1,31}$/.test(s))throw Error("연결 이름이 올바르지 않습니다.");if(!s&&l.length)throw Error("연결 이름을 먼저 입력하세요.");if(l.some(e=>!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(e))||new Set(l).size!==l.length)throw Error("자격 정보에는 중복 없는 항목 이름만 입력하세요.");let a=null!=(t=e.otherConnectors)?t:[];if(s&&a.some(e=>e.id===s))throw Error("연결 이름이 중복됩니다.");return{name:r,draft:{description:e.description.trim(),...s||a.length?{connectors:[...s?[{id:s,credentials:l.map(e=>({name:e}))}]:[],...a]}:{},skill:{description:null!=(n=e.skillDescription)?n:e.description.trim(),instructions:e.instructions.trim()||e.description.trim(),...e.requires?{requires:e.requires}:{}}}}}(M);if($&&$!==e.name)throw Error("다시 만들 때는 기존 플러그인 이름을 유지하세요. 새 이름으로 만들려면 새 초안을 선택하세요.");await t.saveWizardPlugin({...e,...$===e.name?{regenerate:!0}:{}}),Z(e.name),R(t=>[...t,{role:"assistant",text:"".concat(e.name," 연구 초안을 저장했습니다. 실행\xb7설치 전 그래프 단계를 구현하고 검증해야 합니다.")}]);try{F((await t.getWizardPlugins()).plugins)}catch(e){J("초안은 저장했지만 만든 플러그인 목록을 불러오지 못했습니다. 탭을 다시 열어 목록을 새로고침하세요.")}}catch(e){J(e instanceof Error?e.message:"플러그인을 저장하지 못했습니다.")}finally{V(!1)}}}async function H(){if(d("wizard"),t)try{F((await t.getWizardPlugins()).plugins),J(null)}catch(e){J("만든 플러그인 목록을 불러오지 못했습니다.")}}async function G(){if(t){S(!0),I(null);try{if(!(await t.refreshPluginMarket("elanous")).ok)throw Error("공식 마켓을 받지 못했습니다.");h(await t.getPluginsIndex()),y(!1)}catch(e){I("공식 마켓을 받지 못했습니다.")}finally{S(!1)}}}async function X(){if(!t||!f)return;S(!0),D([]),I(null);let e=null;try{await t.installMarketPlugin("".concat(f.plugin.name,"@").concat(f.market.name),f.plugin.capabilities,t=>{let n=function(e){let t;try{t=JSON.parse(e)}catch(e){return null}if(!t||"object"!=typeof t)return null;let n=t.event;if("string"!=typeof n||!Object.hasOwn(i,n))return null;if("failed"===n){var r;let e=t.reason,n=t.detail,s="string"==typeof e&&null!=(r=o[e])?r:o.io;return{step:"실패",reason:"string"==typeof n&&n.trim()?"".concat(s," — ").concat(n.trim()):s}}return"credentials"===n?!0===t.required?{step:"자격 필요",credentialsRequired:!0}:null:{step:i[n]}}(t);n&&(("완료"===n.step||"실패"===n.step)&&(e=n.step),D(e=>[...e,n]))}),e||D(e=>[...e,{step:"실패",reason:"설치가 끝나지 않았습니다."}])}catch(t){e||D(e=>[...e,{step:"실패",reason:"설치 중 오류가 발생했습니다."}])}if("완료"===e)try{b(await t.getInstalledPlugins()),k(!0),N(!1)}catch(e){N(!0),I("설치는 완료됐지만 설치 목록을 불러오지 못했습니다.")}S(!1)}async function ee(e){if(t){S(!0),I(null);try{await t.removeMarketPlugin(e)}catch(e){I("플러그인을 제거하지 못했습니다."),S(!1);return}U(null),b(t=>t.filter(t=>t.name!==e));try{b(await t.getInstalledPlugins()),k(!0),N(!1)}catch(e){N(!0),I("플러그인은 제거됐지만 설치 목록을 불러오지 못했습니다.")}finally{S(!1)}}}(0,s.useEffect)(()=>{if(!t)return;let e=!0;return h(null),b([]),g(null),y(!1),N(!1),k(!1),D([]),z(!1),U(null),I(null),F([]),A(p),R([]),Z(null),J(null),t.getPluginsIndex().then(t=>{e&&h(t)}).catch(()=>{e&&y(!0)}),t.getInstalledPlugins().then(t=>{e&&(b(t),k(!0))}).catch(()=>{e&&(N(!0),k(!0))}),()=>{e=!1}},[t]);let et=u?u.markets.flatMap(e=>e.plugins.map(t=>({market:e,plugin:t,price:function(e){var t;if("free"===e.model)return"무료";let n=void 0===e.amount?"가격 미정":"".concat(e.amount.toLocaleString("ko-KR")," ").concat(null!=(t=e.currency)?t:"").trim();return"subscription"===e.model&&e.period?"".concat(n," / ").concat(e.period):n}(t.pricing),badge:function(e){switch(e){case"ok":return"✅ 서명 확인";case"missing":return"⚠️ 서명 없음";case"unknown-key":return"⚠️ 알 수 없는 서명 키";case"malformed":return"⚠️ 잘못된 서명";case"stale":return"⚠️ 유효하지 않은 서명"}}(e.signature)}))).sort((e,t)=>("ok"!==e.market.signature)-("ok"!==t.market.signature)||e.plugin.name.localeCompare(t.plugin.name)||e.market.name.localeCompare(t.market.name)):[];return(0,r.jsxs)("main",{className:"mx-auto max-w-5xl space-y-6 p-5 text-foreground","aria-label":"마켓",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"마켓"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"확인된 플러그인을 살펴보고 설치할 수 있습니다."})]}),(0,r.jsx)("nav",{"aria-label":"마켓 탭",className:"flex flex-wrap gap-2",children:[["browse","찾아보기"],["detail","상세"],["installed","설치됨"],["wizard","플러그인 만들기"]].map(e=>{let[t,n]=e;return(0,r.jsx)("button",{type:"button","aria-current":c===t?"page":void 0,className:"rounded-lg border px-4 py-2 text-sm ".concat(c===t?"border-blue-500 font-semibold":"border-border"),onClick:()=>{"wizard"===t?H():d(t)},children:n},t)})}),!t&&(0,r.jsx)("p",{role:"status",children:"서버 연결이 설정되지 않았습니다. 설정에서 서버 주소를 입력하세요."}),E&&(0,r.jsx)("p",{role:"alert",children:E}),"installed"!==c&&"wizard"!==c&&j&&(0,r.jsx)("p",{role:"alert",children:"마켓을 불러오지 못했습니다."}),"installed"!==c&&"wizard"!==c&&t&&!j&&!u&&(0,r.jsx)("p",{role:"status",children:"마켓을 불러오는 중…"}),"installed"===c&&w&&(0,r.jsx)("p",{role:"alert",children:"설치 목록을 불러오지 못했습니다."}),"installed"===c&&t&&!v&&(0,r.jsx)("p",{role:"status",children:"설치 목록을 불러오는 중…"}),"browse"===c&&u&&(0===u.markets.length?(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsx)("p",{children:"아직 받아 둔 마켓이 없습니다."}),(0,r.jsx)("button",{type:"button",disabled:C||!t,className:"rounded border px-3 py-2",onClick:()=>void G(),children:"공식 마켓 받기"})]}):0===et.length?(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsx)("p",{children:"등록된 플러그인이 없습니다."}),(0,r.jsx)("button",{type:"button",disabled:C||!t,className:"rounded border px-3 py-2",onClick:()=>void G(),children:"공식 마켓 받기"})]}):(0,r.jsx)("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:et.map(e=>{var t;return(0,r.jsxs)("article",{className:"rounded-xl border border-border p-4 space-y-2",children:[(0,r.jsxs)("h2",{className:"font-semibold",children:[e.plugin.name," ",(0,r.jsxs)("span",{className:"text-xs font-normal",children:["v",e.plugin.version]})]}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:null!=(t=e.plugin.description)?t:"설명이 없습니다."}),(0,r.jsxs)("p",{className:"text-sm",children:[e.price," \xb7 ",(0,r.jsx)("span",{title:e.market.detail,children:e.badge})]}),(0,r.jsx)("button",{type:"button",className:"rounded border px-3 py-1 text-sm",onClick:()=>{g(e),z(!1),D([]),d("detail")},children:"상세 보기"})]},"".concat(e.market.name,"/").concat(e.plugin.name,"/").concat(e.plugin.version))})})),"detail"===c&&!j&&(f?(0,r.jsxs)("section",{className:"space-y-4 rounded-xl border border-border p-5","aria-label":"플러그인 상세",children:[(0,r.jsxs)("h2",{className:"text-xl font-semibold",children:[f.plugin.name," ",(0,r.jsxs)("small",{children:["v",f.plugin.version]})]}),(0,r.jsx)("p",{children:f.plugin.description}),(0,r.jsxs)("p",{children:[f.price," \xb7 ",f.badge]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"권한"}),(0,r.jsx)("ul",{children:f.plugin.capabilities.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"연결 정보 항목"}),f.plugin.connectors.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{children:"연결 정보"}),(0,r.jsx)("ul",{children:e.userConfig.map(e=>(0,r.jsxs)("li",{children:[e.label,e.secret?" \xb7 비공개 정보":""]},e.key))})]},e.id))]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"font-medium",children:"포함된 기능"}),(0,r.jsx)("ul",{children:null==(e=f.plugin.graphs)?void 0:e.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("p",{children:["파일 확인값: ",(0,r.jsx)("code",{children:f.plugin.sha256.slice(0,12)})]}),P?(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("p",{children:"이 플러그인이 요청하는 권한을 확인하세요."}),(0,r.jsx)("ul",{children:f.plugin.capabilities.map(e=>(0,r.jsx)("li",{children:e},e))}),(0,r.jsx)("button",{type:"button",disabled:C,className:"rounded border px-3 py-1",onClick:()=>void X(),children:"동의하고 설치"}),(0,r.jsx)("button",{type:"button",disabled:C,className:"rounded border px-3 py-1",onClick:()=>z(!1),children:"취소"})]}):(0,r.jsx)("button",{type:"button",disabled:C||"ok"!==f.market.signature,className:"rounded border px-3 py-1",onClick:()=>z(!0),children:"설치"}),O.length>0&&(0,r.jsx)("ol",{"aria-label":"설치 진행",className:"space-y-1",children:O.map((e,t)=>(0,r.jsxs)("li",{role:"실패"===e.step?"alert":void 0,children:[e.step,e.reason?": ".concat(e.reason):"",e.credentialsRequired?" — 이 플러그인은 연결 정보가 필요합니다.":""]},t))}),t&&O.some(e=>e.credentialsRequired)&&(0,r.jsx)(m,{client:t,name:f.plugin.name},"".concat(f.plugin.name,"-").concat(O.some(e=>"완료"===e.step||"등록"===e.step)))]}):(0,r.jsx)("p",{children:"찾아보기에서 플러그인을 선택하세요."})),"wizard"===c&&(0,r.jsxs)("section",{"aria-label":"플러그인 마법사",className:"min-w-0 space-y-5",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"플러그인 마법사"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"대화로 요청을 정리하고 폼을 다듬어 연구 초안을 만듭니다. 생성된 그래프는 아직 실행\xb7설치할 수 없습니다."}),(0,r.jsxs)("div",{className:"grid min-w-0 gap-5 md:grid-cols-2",children:[(0,r.jsxs)("section",{"aria-label":"마법사 대화 입력",className:"min-w-0 space-y-3",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"대화로 요청하기"}),(0,r.jsx)("ol",{"aria-label":"마법사 대화",className:"max-h-64 space-y-2 overflow-y-auto break-words","aria-live":"polite",children:L.map((e,t)=>(0,r.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[(0,r.jsxs)("strong",{children:["user"===e.role?"나":"마법사",": "]}),e.text]},t))}),(0,r.jsxs)("label",{className:"block",children:["만들고 싶은 플러그인",(0,r.jsx)("textarea",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:W,disabled:Q,onChange:e=>{Q||_(e.target.value)}})]}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"w-full rounded border px-3 py-2 sm:w-auto",onClick:()=>void B(),children:Q?"대화 중…":"대화에 추가"})]}),(0,r.jsxs)("section",{"aria-label":"마법사 초안 편집",className:"min-w-0 space-y-3",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"폼으로 다듬기"}),(0,r.jsxs)("div",{className:"grid min-w-0 gap-3",children:[(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["이름 (영문 소문자\xb7숫자\xb7하이픈)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.name,disabled:Q,onChange:e=>{Q||A(t=>({...t,name:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["설명",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.description,disabled:Q,onChange:e=>{Q||A(t=>({...t,description:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["스킬 지시문",(0,r.jsx)("textarea",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.instructions,disabled:Q,onChange:e=>{Q||A(t=>({...t,instructions:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["연결 이름 (선택)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.connectorId,disabled:Q,onChange:e=>{Q||A(t=>({...t,connectorId:e.target.value}))}})]}),(0,r.jsxs)("label",{className:"min-w-0 break-words",children:["자격 정보 항목 이름 (쉼표 구분, 값은 입력하지 마세요)",(0,r.jsx)("input",{className:"mt-1 w-full min-w-0 rounded border border-border bg-background p-2",value:M.credentialNames,disabled:Q,onChange:e=>{Q||A(t=>({...t,credentialNames:e.target.value}))}})]})]}),Y&&(0,r.jsx)("p",{role:"alert",children:Y}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:!t||Q,className:"rounded border px-3 py-2",onClick:()=>void K(),children:Q?"저장 중…":$===M.name?"다시 만들기":"초안 만들기"}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"rounded border px-3 py-2",onClick:()=>{A(p),R([]),_(""),Z(null),J(null)},children:"새 초안"})]})]})]}),(0,r.jsxs)("section",{"aria-label":"만든 플러그인",className:"min-w-0 space-y-2",children:[(0,r.jsx)("h3",{className:"font-semibold",children:"만든 플러그인"}),0===T.length?(0,r.jsx)("p",{children:"만든 초안이 없습니다."}):(0,r.jsx)("ul",{className:"grid gap-2 lg:grid-cols-2",children:T.map(e=>(0,r.jsxs)("li",{className:"flex min-w-0 flex-col items-start gap-2 rounded border border-border p-3",children:[(0,r.jsxs)("span",{className:"max-w-full break-words",children:[e.name," \xb7 ",e.description]}),(0,r.jsx)("button",{type:"button",disabled:Q,className:"rounded border px-3 py-2",onClick:()=>{if(!Q){var t,n,r,s,l,a,i,o,c,d,u,m;A({name:e.name,description:e.draft.description,instructions:null!=(d=null==(t=e.draft.skill)?void 0:t.instructions)?d:"",connectorId:null!=(u=null==(r=e.draft.connectors)||null==(n=r[0])?void 0:n.id)?u:"",credentialNames:null!=(m=null==(a=e.draft.connectors)||null==(l=a[0])||null==(s=l.credentials)?void 0:s.map(e=>e.name).join(", "))?m:"",...(null==(o=e.draft.skill)||null==(i=o.requires)?void 0:i.length)?{requires:e.draft.skill.requires}:{},...(null==(c=e.draft.skill)?void 0:c.description)&&e.draft.skill.description!==e.draft.description?{skillDescription:e.draft.skill.description}:{},...e.draft.connectors&&e.draft.connectors.length>1?{otherConnectors:e.draft.connectors.slice(1)}:{}}),Z(e.name),R([]),J(null)}},children:"다듬고 다시 만들기"})]},e.name))})]})]}),"installed"===c&&v&&!w&&(0===x.length?(0,r.jsx)("p",{children:"설치된 플러그인이 없습니다."}):(0,r.jsx)("ul",{className:"space-y-2",children:x.map(e=>(0,r.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[e.name," \xb7 v",e.version," \xb7 설치 시각: ",e.installedAt&&Number.isFinite(Date.parse(e.installedAt))?(0,r.jsx)("time",{dateTime:e.installedAt,children:new Date(e.installedAt).toLocaleString("ko-KR")}):"알 수 없음",q===e.name?(0,r.jsxs)("span",{className:"ml-3",children:["제거할까요? ",(0,r.jsx)("button",{type:"button",disabled:C,onClick:()=>void ee(e.name),children:"제거 확인"})," ",(0,r.jsx)("button",{type:"button",onClick:()=>U(null),children:"취소"})]}):(0,r.jsx)("button",{type:"button",disabled:C,className:"ml-3 rounded border px-3 py-1",onClick:()=>U(e.name),children:"제거"}),t&&(0,r.jsxs)("details",{className:"mt-3",children:[(0,r.jsx)("summary",{className:"cursor-pointer",children:"연결 정보"}),(0,r.jsx)("div",{className:"mt-2",children:(0,r.jsx)(m,{client:t,name:e.name})})]})]},"".concat(e.market,"/").concat(e.name,"/").concat(e.version)))}))]})}}},e=>{e.O(0,[8260,1324,9279,5290,607,7358],()=>e(e.s=29550)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7398],{323:(e,t,s)=>{"use strict";s.d(t,{l:()=>r});var a=s(65863),i=s(24815);function r(e){let[t,s]=(0,i.useState)("");if("onChoose"in e){let{decision:t,onChoose:s,busy:i}=e;return(0,a.jsxs)("article",{className:"rounded border border-border bg-card p-3","data-decision-card":t.id,children:[(0,a.jsx)("h3",{className:"text-sm font-semibold",children:t.title}),(0,a.jsx)("p",{className:"mt-1 whitespace-pre-wrap text-sm text-muted-foreground",children:t.situation}),(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:t.options.map(e=>(0,a.jsxs)("button",{type:"button",disabled:i,onClick:()=>s(e),className:"rounded-md border border-border px-2 py-1 text-sm hover:bg-muted disabled:opacity-50",children:[e.label,"option"in t.recommendation&&t.recommendation.option===e.id&&(0,a.jsx)("span",{className:"ml-1 text-primary",children:"추천"})]},e.id))})]})}let{decision:r,onDecide:n,decidingChoice:o}=e,l=r.resolution.status,c="decided"===r.resolution.status?r.resolution.chosen:null;return(0,a.jsxs)("article",{className:"rounded border border-zinc-200 bg-white p-3",children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:r.question}),(0,a.jsx)("time",{className:"shrink-0 text-xs opacity-60",dateTime:new Date(r.ts).toISOString(),children:new Date(r.ts).toLocaleString()})]}),(0,a.jsx)("ul",{className:"mt-2 flex flex-col gap-2",children:r.opinions.map((e,t)=>(0,a.jsxs)("li",{className:"rounded bg-zinc-50 p-2 text-xs",children:[(0,a.jsxs)("div",{className:"font-medium",children:[e.role,e.modelId?(0,a.jsxs)("span",{className:"opacity-60",children:[" \xb7 ",e.modelId]}):null]}),(0,a.jsx)("pre",{className:"mt-1 whitespace-pre-wrap text-xs leading-snug",children:e.text})]},"".concat(e.role,"-").concat(t)))}),(0,a.jsxs)("footer",{className:"mt-3 flex items-center justify-between gap-2",children:[(0,a.jsxs)("span",{className:"text-xs opacity-70",children:["resolution:"," ","decided"===l?(0,a.jsxs)("span",{className:"font-medium text-emerald-700",children:["decided → ",c]}):(0,a.jsx)("span",{className:"text-amber-700",children:"open"})]}),n&&"open"===l&&(0,a.jsxs)("form",{className:"flex items-center gap-1",onSubmit:e=>{e.preventDefault(),t.trim()&&n(t.trim())},children:[(0,a.jsx)("input",{className:"w-32 rounded border border-zinc-300 px-2 py-0.5 text-xs",placeholder:"chosen…",value:t,onChange:e=>s(e.target.value),disabled:null!==o}),(0,a.jsx)("button",{type:"submit",className:"rounded bg-emerald-700 px-2 py-0.5 text-xs text-white disabled:opacity-50",disabled:!t.trim()||null!==o,children:o===t?"…":"apply"})]})]})]})}},8726:(e,t,s)=>{"use strict";s.d(t,{default:()=>d});var a=s(65863),i=s(24815),r=s(76072);class n extends Error{constructor(e,t,s){super("mission-room ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="MissionRoomApiError"}}var o=s(323);function l(e){var t;let[s,r]=(0,i.useState)({loading:!0,error:null,state:null}),[n,l]=(0,i.useState)(""),[d,u]=(0,i.useState)(""),[m,p]=(0,i.useState)(!1),[x,h]=(0,i.useState)(null),[b,f]=(0,i.useState)(!1),y=(0,i.useRef)(!0);(0,i.useEffect)(()=>()=>{y.current=!1},[]);let g=(0,i.useCallback)(async()=>{r(e=>({...e,loading:!0,error:null}));try{let{state:t}=await e.api.spawn(e.missionId);if(!y.current)return;r({loading:!1,error:null,state:t})}catch(e){if(!y.current)return;r({loading:!1,error:c(e),state:null})}},[e.api,e.missionId]);(0,i.useEffect)(()=>{g()},[g]);let j=(0,i.useCallback)(async()=>{if(n.trim()&&!m){p(!0);try{let t=await e.api.deliberate(e.missionId,n.trim(),d.trim()||void 0);if(!y.current)return;r(e=>e.state?{...e,state:{...e.state,decisions:[...e.state.decisions,t]}}:e),l("")}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&p(!1)}}},[e.api,e.missionId,n,d,m]),N=(0,i.useCallback)(async t=>{if(t.trim()&&!x){h(t);try{let s=await e.api.decide(e.missionId,t);if(!y.current)return;r(e=>{if(!e.state)return e;let t=e.state.decisions.slice(),a=t.findIndex(e=>e.ts===s.ts);return a>=0&&(t[a]=s),{...e,state:{...e.state,decisions:t}}})}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&h(null)}}},[e.api,e.missionId,x]),v=(0,i.useCallback)(async()=>{if(!b){f(!0);try{var t;let s=await e.api.archive(e.missionId);if(!y.current)return;r(e=>({...e,state:s})),null==(t=e.onArchived)||t.call(e)}catch(e){if(!y.current)return;r(t=>({...t,error:c(e)}))}finally{y.current&&f(!1)}}},[e.api,e.missionId,b,e.onArchived]),w=(null==(t=s.state)?void 0:t.status)==="archived",S=(0,i.useMemo)(()=>s.state?[...s.state.decisions].sort((e,t)=>t.ts-e.ts):[],[s.state]);return s.loading&&!s.state?(0,a.jsx)("div",{className:"p-4 text-sm opacity-70",children:"Loading mission room…"}):(0,a.jsxs)("section",{className:"mission-room-panel flex flex-col gap-4 p-4","data-mission-id":e.missionId,children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:e.missionTitle?"".concat(e.missionTitle," \xb7 deliberation"):"Mission Deliberation Room"}),s.state&&(0,a.jsxs)("p",{className:"text-xs opacity-70",children:["tag: ",(0,a.jsx)("code",{children:s.state.missionTag})," \xb7 status:"," ",(0,a.jsx)("span",{className:w?"text-amber-600":"text-emerald-600",children:s.state.status})," \xb7 ","decisions: ",s.state.decisions.length]})]}),!w&&s.state&&(0,a.jsx)("button",{type:"button",className:"text-xs underline opacity-70 hover:opacity-100",disabled:b,onClick:()=>void v(),children:b?"archiving…":"archive room"})]}),s.error&&(0,a.jsx)("div",{role:"alert",className:"rounded border border-rose-400/50 bg-rose-50 px-3 py-2 text-sm text-rose-900",children:s.error}),!w&&(0,a.jsxs)("form",{className:"flex flex-col gap-2 rounded border border-zinc-200 p-3",onSubmit:e=>{e.preventDefault(),j()},children:[(0,a.jsx)("label",{className:"text-xs uppercase tracking-wide opacity-70",children:"New deliberation"}),(0,a.jsx)("textarea",{className:"min-h-[80px] w-full rounded border border-zinc-300 bg-white p-2 text-sm",placeholder:"Describe the branch you're stuck on…",value:n,onChange:e=>l(e.target.value),disabled:m}),(0,a.jsx)("textarea",{className:"min-h-[40px] w-full rounded border border-zinc-200 bg-zinc-50 p-2 text-xs",placeholder:"Optional mission context (task list digest, etc.)",value:d,onChange:e=>u(e.target.value),disabled:m}),(0,a.jsx)("div",{className:"flex justify-end",children:(0,a.jsx)("button",{type:"submit",className:"rounded bg-zinc-900 px-3 py-1 text-sm text-white disabled:opacity-50",disabled:!n.trim()||m,children:m?"asking lanes…":"ask the lanes"})})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[0===S.length&&(0,a.jsx)("p",{className:"text-sm opacity-70",children:"No deliberations yet."}),S.map(e=>(0,a.jsx)(o.l,{decision:e,onDecide:w?void 0:N,decidingChoice:x},e.ts))]})]})}function c(e){if(e instanceof n){let t="object"==typeof e.body&&e.body&&"detail"in e.body?e.body.detail:null;return 404===e.status?"Mission room not found.":409===e.status?t?"Conflict: ".concat(t):"Conflict — room may be archived or no open decision.":401===e.status?"Authentication required.":"Mission room error (".concat(e.status,").")}return e instanceof Error?e.message:String(e)}function d(){var e;let t=(0,r.useParams)(),s=decodeURIComponent(null!=(e=null==t?void 0:t.id)?e:""),o=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch,i=e.authHeader;async function r(e,t){let r={"content-type":"application/json"};i&&(r.authorization=i),(null==t?void 0:t.headers)&&Object.assign(r,t.headers);let o=await a("".concat(s).concat(e),{...t,headers:r}),l=await o.json().catch(()=>null);if(!o.ok)throw new n(o.status,e,l);return l}function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"/v1/missions/".concat(encodeURIComponent(e),"/showroom").concat(t)}return{spawn:async e=>await r(o(e)),deliberate:async(e,t,s)=>(await r(o(e,"/deliberate"),{method:"POST",body:JSON.stringify({question:t,...void 0!==s?{missionContext:s}:{}})})).decision,decide:async(e,t)=>(await r(o(e,"/decision"),{method:"POST",body:JSON.stringify({chosen:t})})).decision,archive:async e=>(await r(o(e,"/archive"),{method:"POST"})).state}})({baseUrl:window.location.origin}),[]);return s?(0,a.jsx)(l,{missionId:s,api:o}):(0,a.jsx)("div",{className:"p-4 text-sm",children:"Mission id missing in URL."})}},76072:(e,t,s)=>{"use strict";var a=s(33912);s.o(a,"useParams")&&s.d(t,{useParams:function(){return a.useParams}}),s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},82251:(e,t,s)=>{Promise.resolve().then(s.bind(s,8726))}},e=>{e.O(0,[5290,607,7358],()=>e(e.s=82251)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9773],{39168:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>h});var n=a(65863),s=a(24815),r=a(91611);class o extends Error{constructor(e,t,a){super("morning-showroom ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=a,this.name="MorningShowroomApiError"}}let i={yesterday:"Yesterday",today:"Today",blockers:"Blockers",opportunities:"Opportunities"},d={yesterday:"◐",today:"▶",blockers:"⛔",opportunities:"✦"};function c(e){let[t,a]=(0,s.useState)({kind:"loading"}),[i,d]=(0,s.useState)(0);return(0,s.useEffect)(()=>{var t;let n=!1,s=null!=(t=e.api)?t:function(e){var t;let a=e.baseUrl.replace(/\/+$/,""),n=null!=(t=e.fetchImpl)?t:fetch,s=r.GM;return{async compose(t){let r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader);let i=await n("".concat(a).concat(s),{method:"POST",headers:r,body:JSON.stringify(t)}),d=await i.json().catch(()=>null);if(!i.ok||!(null==d?void 0:d.card))throw new o(i.status,s,d);return d.card}}}({baseUrl:window.location.origin});return a({kind:"loading"}),s.compose(e.request).then(e=>{n||a(0===e.lanes.length?{kind:"empty"}:{kind:"card",card:e})}).catch(()=>{n||a({kind:"unavailable"})}),()=>{n=!0}},[e.api,e.request.date,e.request.windowStart,e.request.windowEnd,i]),(0,n.jsx)(l,{state:t,onRetry:()=>d(e=>e+1)})}function l(e){let{state:t,onRetry:a}=e;return"loading"===t.kind?(0,n.jsx)("div",{className:"p-4 text-sm opacity-70",children:"Morning showroom을 준비하고 있습니다…"}):"unavailable"===t.kind?(0,n.jsxs)("section",{className:"p-4 text-sm","data-testid":"morning-showroom-unavailable",children:[(0,n.jsx)("h2",{className:"font-semibold",children:"Morning showroom이 아직 연결되지 않았습니다."}),(0,n.jsx)("p",{className:"mt-1 opacity-70",children:"다이제스트를 만들 수 있는 곳이 준비되면 이 화면에 표시됩니다."}),(0,n.jsx)("button",{type:"button",className:"mt-3 underline",onClick:a,children:"다시 시도"})]}):"empty"===t.kind?(0,n.jsxs)("section",{className:"p-4 text-sm","data-testid":"morning-showroom-empty",children:[(0,n.jsx)("h2",{className:"font-semibold",children:"아직 보여 줄 Morning showroom 항목이 없습니다."}),(0,n.jsx)("p",{className:"mt-1 opacity-70",children:"오늘의 실행 기록이 쌓이면 이곳에서 아침 다이제스트를 확인할 수 있습니다."}),(0,n.jsx)("button",{type:"button",className:"mt-3 underline","data-testid":"morning-showroom-empty-retry",onClick:a,children:"새로 고침"})]}):(0,n.jsxs)("section",{className:"morning-showroom p-4","data-date":t.card.date,children:[(0,n.jsxs)("header",{className:"mb-3 flex items-baseline justify-between",children:[(0,n.jsxs)("h2",{className:"text-lg font-semibold",children:["Morning showroom \xb7 ",t.card.date]}),(0,n.jsx)("time",{className:"text-xs opacity-60",dateTime:new Date(t.card.createdAt).toISOString(),children:new Date(t.card.createdAt).toLocaleTimeString()})]}),(0,n.jsx)("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2",children:t.card.lanes.map(e=>(0,n.jsx)(m,{lane:e},e.lane))})]})}function m(e){let{lane:t}=e;return(0,n.jsxs)("article",{className:"rounded border border-zinc-200 bg-white p-3","data-lane":t.lane,children:[(0,n.jsxs)("header",{className:"mb-2 flex items-center gap-2 text-xs uppercase tracking-wide opacity-70",children:[(0,n.jsx)("span",{"aria-hidden":!0,children:d[t.lane]}),(0,n.jsx)("span",{children:i[t.lane]}),t.modelId&&(0,n.jsxs)("span",{className:"ml-auto opacity-60",children:["\xb7 ",t.modelId]})]}),(0,n.jsx)("pre",{className:"whitespace-pre-wrap text-sm leading-snug",children:t.text})]})}function h(){let e=(0,s.useMemo)(()=>{let e=function(){let e=new Date,t=e.getUTCFullYear(),a=String(e.getUTCMonth()+1).padStart(2,"0"),n=String(e.getUTCDate()).padStart(2,"0"),s="".concat(t,"-").concat(a,"-").concat(n),r=new Date(Date.UTC(t,e.getUTCMonth(),e.getUTCDate()-1,22)),o=new Date(Date.UTC(t,e.getUTCMonth(),e.getUTCDate(),8));return{date:s,windowStart:r.toISOString(),windowEnd:o.toISOString()}}();return{date:e.date,windowStart:e.windowStart,windowEnd:e.windowEnd,runs:[],upcoming:[],backlogRecommendations:[]}},[]);return(0,n.jsx)(c,{request:e})}},40261:(e,t,a)=>{Promise.resolve().then(a.bind(a,39168))},91611:(e,t,a)=>{"use strict";a.d(t,{GM:()=>i,J3:()=>o,WF:()=>n,bR:()=>r,m:()=>d,r5:()=>s});let n="/v1/devices",s="/v1/approvals/merges",r="/v1/templates/capability-preview",o="/v1/idle-nudge/preview",i="/v1/morning-digest/showroom",d="/v1/next-fluent/dispatch"}},e=>{e.O(0,[5290,607,7358],()=>e(e.s=40261)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9773],{39168:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>h});var n=a(65863),s=a(24815),r=a(91611);class o extends Error{constructor(e,t,a){super("morning-showroom ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=a,this.name="MorningShowroomApiError"}}let i={yesterday:"Yesterday",today:"Today",blockers:"Blockers",opportunities:"Opportunities"},d={yesterday:"◐",today:"▶",blockers:"⛔",opportunities:"✦"};function c(e){let[t,a]=(0,s.useState)({kind:"loading"}),[i,d]=(0,s.useState)(0);return(0,s.useEffect)(()=>{var t;let n=!1,s=null!=(t=e.api)?t:function(e){var t;let a=e.baseUrl.replace(/\/+$/,""),n=null!=(t=e.fetchImpl)?t:fetch,s=r.GM;return{async compose(t){let r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader);let i=await n("".concat(a).concat(s),{method:"POST",headers:r,body:JSON.stringify(t)}),d=await i.json().catch(()=>null);if(!i.ok||!(null==d?void 0:d.card))throw new o(i.status,s,d);return d.card}}}({baseUrl:window.location.origin});return a({kind:"loading"}),s.compose(e.request).then(e=>{n||a(0===e.lanes.length?{kind:"empty"}:{kind:"card",card:e})}).catch(()=>{n||a({kind:"unavailable"})}),()=>{n=!0}},[e.api,e.request.date,e.request.windowStart,e.request.windowEnd,i]),(0,n.jsx)(l,{state:t,onRetry:()=>d(e=>e+1)})}function l(e){let{state:t,onRetry:a}=e;return"loading"===t.kind?(0,n.jsx)("div",{className:"p-4 text-sm opacity-70",children:"Morning showroom을 준비하고 있습니다…"}):"unavailable"===t.kind?(0,n.jsxs)("section",{className:"p-4 text-sm","data-testid":"morning-showroom-unavailable",children:[(0,n.jsx)("h2",{className:"font-semibold",children:"Morning showroom이 아직 연결되지 않았습니다."}),(0,n.jsx)("p",{className:"mt-1 opacity-70",children:"다이제스트를 만들 수 있는 곳이 준비되면 이 화면에 표시됩니다."}),(0,n.jsx)("button",{type:"button",className:"mt-3 underline",onClick:a,children:"다시 시도"})]}):"empty"===t.kind?(0,n.jsxs)("section",{className:"p-4 text-sm","data-testid":"morning-showroom-empty",children:[(0,n.jsx)("h2",{className:"font-semibold",children:"아직 보여 줄 Morning showroom 항목이 없습니다."}),(0,n.jsx)("p",{className:"mt-1 opacity-70",children:"오늘의 실행 기록이 쌓이면 이곳에서 아침 다이제스트를 확인할 수 있습니다."}),(0,n.jsx)("button",{type:"button",className:"mt-3 underline","data-testid":"morning-showroom-empty-retry",onClick:a,children:"새로 고침"})]}):(0,n.jsxs)("section",{className:"morning-showroom p-4","data-date":t.card.date,children:[(0,n.jsxs)("header",{className:"mb-3 flex items-baseline justify-between",children:[(0,n.jsxs)("h2",{className:"text-lg font-semibold",children:["Morning showroom \xb7 ",t.card.date]}),(0,n.jsx)("time",{className:"text-xs opacity-60",dateTime:new Date(t.card.createdAt).toISOString(),children:new Date(t.card.createdAt).toLocaleTimeString()})]}),(0,n.jsx)("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2",children:t.card.lanes.map(e=>(0,n.jsx)(m,{lane:e},e.lane))})]})}function m(e){let{lane:t}=e;return(0,n.jsxs)("article",{className:"rounded border border-zinc-200 bg-white p-3","data-lane":t.lane,children:[(0,n.jsxs)("header",{className:"mb-2 flex items-center gap-2 text-xs uppercase tracking-wide opacity-70",children:[(0,n.jsx)("span",{"aria-hidden":!0,children:d[t.lane]}),(0,n.jsx)("span",{children:i[t.lane]}),t.modelId&&(0,n.jsxs)("span",{className:"ml-auto opacity-60",children:["\xb7 ",t.modelId]})]}),(0,n.jsx)("pre",{className:"whitespace-pre-wrap text-sm leading-snug",children:t.text})]})}function h(){let e=(0,s.useMemo)(()=>{let e=function(){let e=new Date,t=e.getUTCFullYear(),a=String(e.getUTCMonth()+1).padStart(2,"0"),n=String(e.getUTCDate()).padStart(2,"0"),s="".concat(t,"-").concat(a,"-").concat(n),r=new Date(Date.UTC(t,e.getUTCMonth(),e.getUTCDate()-1,22)),o=new Date(Date.UTC(t,e.getUTCMonth(),e.getUTCDate(),8));return{date:s,windowStart:r.toISOString(),windowEnd:o.toISOString()}}();return{date:e.date,windowStart:e.windowStart,windowEnd:e.windowEnd,runs:[],upcoming:[],backlogRecommendations:[]}},[]);return(0,n.jsx)(c,{request:e})}},66012:(e,t,a)=>{Promise.resolve().then(a.bind(a,39168))},91611:(e,t,a)=>{"use strict";a.d(t,{GM:()=>i,J3:()=>o,WF:()=>n,bR:()=>r,m:()=>d,r5:()=>s});let n="/v1/devices",s="/v1/approvals/merges",r="/v1/templates/capability-preview",o="/v1/idle-nudge/preview",i="/v1/morning-digest/showroom",d="/v1/next-fluent/dispatch"}},e=>{e.O(0,[5290,607,7358],()=>e(e.s=66012)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4345],{15387:(e,r,t)=>{Promise.resolve().then(t.bind(t,62582))},15991:(e,r,t)=>{"use strict";t.d(r,{GC:()=>s,In:()=>d,OG:()=>i});var n=t(24815);let s="elanous.pwa.role",a="elanous:pwa-role";function l(){try{let e=window.localStorage.getItem(s);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function i(e){try{window.localStorage.setItem(s,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let r=r=>{(r.key===s||null===r.key)&&e()};return window.addEventListener("storage",r),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",r)}}function d(){return(0,n.useSyncExternalStore)(o,l,()=>"general")}},37771:(e,r,t)=>{"use strict";t.d(r,{C:()=>a,P:()=>s});let n="셋업 모드 — 먼저 LLM 을 정하세요";function s(e,r){return(null==e?void 0:e.setupMode)!==!0||"/"!==r?null:"/setup"}function a(e,r){if((null==e?void 0:e.setupMode)!==!0||"/setup"===r||r.startsWith("/setup/"))return null;let t=e.setupMissing;return t&&t.length>0?"".concat(n," (").concat(t.join(", "),")"):n}},41893:(e,r,t)=>{"use strict";t.d(r,{cn:()=>a});var n=t(23169),s=t(49637);function a(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];return(0,s.QP)((0,n.$)(r))}},57795:(e,r,t)=>{"use strict";t.d(r,{QL:()=>p,WelcomeHome:()=>j});var n=t(65863),s=t(24815),a=t(38519),l=t.n(a),i=t(76072),o=t(83420),d=t(41893),u=t(15991),c=t(43008);let f=["/term","/chat","/intake","/live","/editor","/market","/setup"];var m=t(78082),x=t(37771),h=t(84538);let g=[...h.Ue.filter(e=>!(0,h.wu)(e.href)).map(e=>({href:function(e){if(!(h.Ue.some(r=>r.href===e)||h.OE.some(r=>r.href===e)))throw Error("Unknown sidebar route: ".concat(e));return e}(e.href),label:e.label,navigable:!0})),...h.OE.map(e=>({href:e.href,label:e.href,navigable:!1,reason:e.reason}))],b=[...g.filter(e=>e.navigable),{href:"/setup",label:"Setup",navigable:!0}],v=[{href:"/morning",label:"아침 브리핑",navigable:!0},{href:"/settings/devices",label:"기기 목록",navigable:!0},{href:"/workflows/chat-ui",label:"워크플로 채팅",navigable:!0}];function p(e){let{ariaLabel:r,items:t=g}=e;return(0,n.jsx)("section",{"aria-label":r,className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",children:t.map(e=>{var r;return(0,n.jsx)("article",{"data-testid":(r=e.href,"route-guidance-".concat("/"===r?"root":r.slice(1).replaceAll("/","-"))),"data-route-kind":e.navigable?"destination":"reference",className:(0,d.cn)("rounded-2xl border border-border/60 bg-card/60 p-5 shadow-sm",!e.navigable&&"bg-muted/40"),children:e.navigable?(0,n.jsxs)(l(),{href:e.href,className:"font-semibold underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[e.label," ",(0,n.jsx)("code",{className:"text-xs text-muted-foreground",children:e.href})]}):(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("span",{className:"font-semibold",children:["참고 주소 ",(0,n.jsx)("code",{className:"text-xs text-muted-foreground",children:e.href})]}),(0,n.jsx)("p",{className:"text-sm leading-relaxed text-muted-foreground",children:e.reason})]})},e.href)})})}function j(){let{role:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return null==(0,s.useContext)(o.AppRouterContext)?(0,n.jsx)(N,{role:e}):(0,n.jsx)(w,{role:e})}function w(e){let{role:r}=e,t=(0,i.useRouter)(),a=(0,i.usePathname)(),l=(0,m._r)(),o=null==a||l.isError||l.isPending||l.isLoading?null:(0,x.P)(l.data,a);return(0,s.useEffect)(()=>{"/setup"===o&&t.replace("/setup")},[o,t]),(0,n.jsx)(N,{role:r})}function N(e){var r;let{role:t}=e,s=(0,u.In)(),a=null!=t?t:s,{core:l,more:i}=(r=b.filter(e=>(0,c.EX)(a,e.href)),{core:f.flatMap(e=>r.filter(r=>r.href===e)),more:r.filter(e=>!f.some(r=>r===e.href))});return(0,n.jsx)("main",{"data-testid":"welcome-home",className:"min-h-screen bg-gradient-to-b from-background via-background to-muted/40 px-6 py-12 sm:px-10",children:(0,n.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-10",children:[(0,n.jsxs)("header",{className:"flex flex-col gap-3",children:[(0,n.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"elanous PWA"}),(0,n.jsx)("h1",{className:"text-3xl font-bold leading-tight sm:text-4xl",children:"웰컴 — 어디부터 시작할까요?"}),(0,n.jsx)("p",{className:"max-w-2xl text-sm text-muted-foreground sm:text-base",children:"처음이라면 아래 핵심 화면에서 시작하세요. 다른 화면은 필요할 때 펼쳐 볼 수 있습니다."})]}),(0,n.jsx)(p,{ariaLabel:"핵심 화면",items:l}),i.length>0&&(0,n.jsxs)("details",{className:"rounded-2xl border border-border/60 bg-card/60 p-5",children:[(0,n.jsxs)("summary",{className:"cursor-pointer font-semibold focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:["모든 화면 (",i.length,")"]}),(0,n.jsx)("div",{className:"mt-4",children:(0,n.jsx)(p,{ariaLabel:"나머지 화면",items:i})})]}),v.some(e=>(0,c.EX)(a,e.href))&&(0,n.jsxs)("details",{className:"rounded-2xl border border-border/60 bg-card/60 p-5",children:[(0,n.jsx)("summary",{className:"cursor-pointer font-semibold focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고치는 중인 화면"}),(0,n.jsx)("div",{className:"mt-4",children:(0,n.jsx)(p,{ariaLabel:"고치는 중인 화면",items:v.filter(e=>(0,c.EX)(a,e.href))})})]})]})})}},62582:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>l});var n=t(65863),s=t(76072),a=t(57795);function l(){let e=(0,s.usePathname)();return(0,n.jsx)("main",{"data-testid":"not-found",className:"min-h-screen bg-gradient-to-b from-background via-background to-muted/40 px-6 py-12 sm:px-10",children:(0,n.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-10",children:[(0,n.jsxs)("header",{className:"flex flex-col gap-3",children:[(0,n.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"elanous PWA"}),(0,n.jsx)("h1",{className:"text-3xl font-bold leading-tight sm:text-4xl",children:"여기엔 없습니다"}),(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:[(0,n.jsx)("code",{children:e||"알 수 없는 주소"})," 주소는 이 앱에 없습니다. 아래에서 지금 갈 수 있는 곳을 선택하거나 참고 주소의 사유를 확인하세요."]})]}),(0,n.jsx)(a.QL,{ariaLabel:"이동 가능한 주소와 참고 주소"})]})})}},76072:(e,r,t)=>{"use strict";var n=t(33912);t.o(n,"useParams")&&t.d(r,{useParams:function(){return n.useParams}}),t.o(n,"usePathname")&&t.d(r,{usePathname:function(){return n.usePathname}}),t.o(n,"useRouter")&&t.d(r,{useRouter:function(){return n.useRouter}}),t.o(n,"useSearchParams")&&t.d(r,{useSearchParams:function(){return n.useSearchParams}})},78082:(e,r,t)=>{"use strict";t.d(r,{_r:()=>a});var n=t(24815),s=t(27346);function a(){let e=(0,s.Qj)(),[r,t]=(0,n.useState)({data:void 0,isError:!1,isPending:!0});return(0,n.useEffect)(()=>{if(!e)return void t({data:void 0,isError:!1,isPending:!0});let r=!0,n=()=>{e.getHealth().then(e=>{r&&t({data:e,isError:!1,isPending:!1})}).catch(()=>{r&&t(e=>({...e,isError:!0,isPending:!1}))})};n();let s=setInterval(n,6e4);return()=>{r=!1,clearInterval(s)}},[e]),{...r,isLoading:r.isPending&&null!==e}}t(31130)}},e=>{e.O(0,[3541,8260,8519,2099,6684,5290,607,7358],()=>e(e.s=15387)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4345],{15991:(e,r,t)=>{"use strict";t.d(r,{GC:()=>s,In:()=>d,OG:()=>i});var n=t(24815);let s="elanous.pwa.role",a="elanous:pwa-role";function l(){try{let e=window.localStorage.getItem(s);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function i(e){try{window.localStorage.setItem(s,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(a))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(a,e);let r=r=>{(r.key===s||null===r.key)&&e()};return window.addEventListener("storage",r),()=>{window.removeEventListener(a,e),window.removeEventListener("storage",r)}}function d(){return(0,n.useSyncExternalStore)(o,l,()=>"general")}},24532:(e,r,t)=>{Promise.resolve().then(t.bind(t,62582))},37771:(e,r,t)=>{"use strict";t.d(r,{C:()=>a,P:()=>s});let n="셋업 모드 — 먼저 LLM 을 정하세요";function s(e,r){return(null==e?void 0:e.setupMode)!==!0||"/"!==r?null:"/setup"}function a(e,r){if((null==e?void 0:e.setupMode)!==!0||"/setup"===r||r.startsWith("/setup/"))return null;let t=e.setupMissing;return t&&t.length>0?"".concat(n," (").concat(t.join(", "),")"):n}},41893:(e,r,t)=>{"use strict";t.d(r,{cn:()=>a});var n=t(23169),s=t(49637);function a(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];return(0,s.QP)((0,n.$)(r))}},57795:(e,r,t)=>{"use strict";t.d(r,{QL:()=>p,WelcomeHome:()=>j});var n=t(65863),s=t(24815),a=t(38519),l=t.n(a),i=t(76072),o=t(83420),d=t(41893),u=t(15991),c=t(43008);let f=["/term","/chat","/intake","/live","/editor","/market","/setup"];var m=t(78082),x=t(37771),h=t(84538);let g=[...h.Ue.filter(e=>!(0,h.wu)(e.href)).map(e=>({href:function(e){if(!(h.Ue.some(r=>r.href===e)||h.OE.some(r=>r.href===e)))throw Error("Unknown sidebar route: ".concat(e));return e}(e.href),label:e.label,navigable:!0})),...h.OE.map(e=>({href:e.href,label:e.href,navigable:!1,reason:e.reason}))],b=[...g.filter(e=>e.navigable),{href:"/setup",label:"Setup",navigable:!0}],v=[{href:"/morning",label:"아침 브리핑",navigable:!0},{href:"/settings/devices",label:"기기 목록",navigable:!0},{href:"/workflows/chat-ui",label:"워크플로 채팅",navigable:!0}];function p(e){let{ariaLabel:r,items:t=g}=e;return(0,n.jsx)("section",{"aria-label":r,className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",children:t.map(e=>{var r;return(0,n.jsx)("article",{"data-testid":(r=e.href,"route-guidance-".concat("/"===r?"root":r.slice(1).replaceAll("/","-"))),"data-route-kind":e.navigable?"destination":"reference",className:(0,d.cn)("rounded-2xl border border-border/60 bg-card/60 p-5 shadow-sm",!e.navigable&&"bg-muted/40"),children:e.navigable?(0,n.jsxs)(l(),{href:e.href,className:"font-semibold underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[e.label," ",(0,n.jsx)("code",{className:"text-xs text-muted-foreground",children:e.href})]}):(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("span",{className:"font-semibold",children:["참고 주소 ",(0,n.jsx)("code",{className:"text-xs text-muted-foreground",children:e.href})]}),(0,n.jsx)("p",{className:"text-sm leading-relaxed text-muted-foreground",children:e.reason})]})},e.href)})})}function j(){let{role:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return null==(0,s.useContext)(o.AppRouterContext)?(0,n.jsx)(N,{role:e}):(0,n.jsx)(w,{role:e})}function w(e){let{role:r}=e,t=(0,i.useRouter)(),a=(0,i.usePathname)(),l=(0,m._r)(),o=null==a||l.isError||l.isPending||l.isLoading?null:(0,x.P)(l.data,a);return(0,s.useEffect)(()=>{"/setup"===o&&t.replace("/setup")},[o,t]),(0,n.jsx)(N,{role:r})}function N(e){var r;let{role:t}=e,s=(0,u.In)(),a=null!=t?t:s,{core:l,more:i}=(r=b.filter(e=>(0,c.EX)(a,e.href)),{core:f.flatMap(e=>r.filter(r=>r.href===e)),more:r.filter(e=>!f.some(r=>r===e.href))});return(0,n.jsx)("main",{"data-testid":"welcome-home",className:"min-h-screen bg-gradient-to-b from-background via-background to-muted/40 px-6 py-12 sm:px-10",children:(0,n.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-10",children:[(0,n.jsxs)("header",{className:"flex flex-col gap-3",children:[(0,n.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"elanous PWA"}),(0,n.jsx)("h1",{className:"text-3xl font-bold leading-tight sm:text-4xl",children:"웰컴 — 어디부터 시작할까요?"}),(0,n.jsx)("p",{className:"max-w-2xl text-sm text-muted-foreground sm:text-base",children:"처음이라면 아래 핵심 화면에서 시작하세요. 다른 화면은 필요할 때 펼쳐 볼 수 있습니다."})]}),(0,n.jsx)(p,{ariaLabel:"핵심 화면",items:l}),i.length>0&&(0,n.jsxs)("details",{className:"rounded-2xl border border-border/60 bg-card/60 p-5",children:[(0,n.jsxs)("summary",{className:"cursor-pointer font-semibold focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:["모든 화면 (",i.length,")"]}),(0,n.jsx)("div",{className:"mt-4",children:(0,n.jsx)(p,{ariaLabel:"나머지 화면",items:i})})]}),v.some(e=>(0,c.EX)(a,e.href))&&(0,n.jsxs)("details",{className:"rounded-2xl border border-border/60 bg-card/60 p-5",children:[(0,n.jsx)("summary",{className:"cursor-pointer font-semibold focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고치는 중인 화면"}),(0,n.jsx)("div",{className:"mt-4",children:(0,n.jsx)(p,{ariaLabel:"고치는 중인 화면",items:v.filter(e=>(0,c.EX)(a,e.href))})})]})]})})}},62582:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>l});var n=t(65863),s=t(76072),a=t(57795);function l(){let e=(0,s.usePathname)();return(0,n.jsx)("main",{"data-testid":"not-found",className:"min-h-screen bg-gradient-to-b from-background via-background to-muted/40 px-6 py-12 sm:px-10",children:(0,n.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-10",children:[(0,n.jsxs)("header",{className:"flex flex-col gap-3",children:[(0,n.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"elanous PWA"}),(0,n.jsx)("h1",{className:"text-3xl font-bold leading-tight sm:text-4xl",children:"여기엔 없습니다"}),(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:[(0,n.jsx)("code",{children:e||"알 수 없는 주소"})," 주소는 이 앱에 없습니다. 아래에서 지금 갈 수 있는 곳을 선택하거나 참고 주소의 사유를 확인하세요."]})]}),(0,n.jsx)(a.QL,{ariaLabel:"이동 가능한 주소와 참고 주소"})]})})}},76072:(e,r,t)=>{"use strict";var n=t(33912);t.o(n,"useParams")&&t.d(r,{useParams:function(){return n.useParams}}),t.o(n,"usePathname")&&t.d(r,{usePathname:function(){return n.usePathname}}),t.o(n,"useRouter")&&t.d(r,{useRouter:function(){return n.useRouter}}),t.o(n,"useSearchParams")&&t.d(r,{useSearchParams:function(){return n.useSearchParams}})},78082:(e,r,t)=>{"use strict";t.d(r,{_r:()=>a});var n=t(24815),s=t(27346);function a(){let e=(0,s.Qj)(),[r,t]=(0,n.useState)({data:void 0,isError:!1,isPending:!0});return(0,n.useEffect)(()=>{if(!e)return void t({data:void 0,isError:!1,isPending:!0});let r=!0,n=()=>{e.getHealth().then(e=>{r&&t({data:e,isError:!1,isPending:!1})}).catch(()=>{r&&t(e=>({...e,isError:!0,isPending:!1}))})};n();let s=setInterval(n,6e4);return()=>{r=!1,clearInterval(s)}},[e]),{...r,isLoading:r.isPending&&null!==e}}t(31130)}},e=>{e.O(0,[3541,8260,8519,2099,6684,5290,607,7358],()=>e(e.s=24532)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6997],{42933:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("maximize-2",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]])},45576:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]])},71747:(e,t,s)=>{"use strict";s.d(t,{A:()=>o});var r=s(24815);let n=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,r.createContext)({}),d=(0,r.forwardRef)((e,t)=>{var s,a,d;let{color:o,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:x,iconNode:h,...g}=e,{size:f=24,strokeWidth:b=2,absoluteStrokeWidth:k=!1,color:j="currentColor",className:v=""}=null!=(s=(0,r.useContext)(i))?s:{},y=(null!=m?m:k)?24*Number(null!=u?u:b)/Number(null!=c?c:f):null!=u?u:b;return(0,r.createElement)("svg",{ref:t,...l,width:null!=(a=null!=c?c:f)?a:l.width,height:null!=(d=null!=c?c:f)?d:l.height,stroke:null!=o?o:j,strokeWidth:y,className:n("lucide",v,p),...!x&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...h.map(e=>{let[t,s]=e;return(0,r.createElement)(t,s)}),...Array.isArray(x)?x:[x]])}),o=(e,t)=>{let s=(0,r.forwardRef)((s,l)=>{let{className:i,...o}=s;return(0,r.createElement)(d,{ref:l,iconNode:t,className:n("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...o})});return s.displayName=a(e),s}},73443:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("minimize-2",[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]])},73904:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("messages-square",[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]])},85356:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>x});var r=s(65863),n=s(24815),a=s(21435);let l={live:"live",unknown:"unknown",inactive:"inactive"},i={running:"running","probable-running":"probably running","ended-unclosed":"ended, not closed",unknown:"run state unknown"};function d(e){let{label:t,present:s}=e;return(0,r.jsxs)("span",{className:"rounded-full px-2 py-0.5 text-[10px] ".concat(s?"bg-primary/10 text-primary":"bg-muted text-muted-foreground"),children:[t,": ",s?"present":"absent"]})}function o(e){var t,s,l;let{ptyIds:i,onRefresh:d}=e,[o,c]=(0,n.useState)(null!=(t=i[0])?t:""),[u,m]=(0,n.useState)({kind:"loading",ptyId:null!=(s=i[0])?s:""}),[p,x]=(0,n.useState)(0),[h,g]=(0,n.useState)({kind:"idle"}),f=(0,n.useRef)(null),b=i.includes(o)?o:null!=(l=i[0])?l:"",k=u.ptyId===b?u:{kind:"loading",ptyId:b},j="pending"===h.kind,v="idle"===h.kind||h.ptyId===b?h:{kind:"idle"},y="pending"===v.kind;return(0,n.useEffect)(()=>{c(e=>{var t;return i.includes(e)?e:null!=(t=i[0])?t:""})},[i]),(0,n.useEffect)(()=>{if(!b)return;let e=new AbortController;return m({kind:"loading",ptyId:b}),fetch((0,a.xV)(b),{signal:e.signal}).then(async t=>{if(!t.ok)throw Error("GET ".concat((0,a.xV)(b)," failed (").concat(t.status,")"));let s=await t.json();if("string"!=typeof s.frame)throw Error("Terminal frame response did not contain text.");e.signal.aborted||m({kind:"success",ptyId:b,frame:s.frame})}).catch(t=>{e.signal.aborted||m({kind:"error",ptyId:b,message:t instanceof Error?t.message:"Terminal frame request failed."})}),()=>e.abort()},[b,p]),(0,n.useEffect)(()=>(g(e=>"pending"===e.kind&&e.ptyId!==b?{kind:"idle"}:e),()=>{var e;null==(e=f.current)||e.abort(),f.current=null}),[b]),(0,r.jsxs)("div",{className:"space-y-2 rounded-md bg-surface-elevated p-3","data-testid":"terminal-frame-panel",children:[i.length>1&&(0,r.jsxs)("label",{className:"flex w-fit items-center gap-2 text-xs",children:["PTY",(0,r.jsx)("select",{value:b,onChange:e=>c(e.target.value),"aria-label":"Select terminal PTY",disabled:j,children:i.map(e=>(0,r.jsx)("option",{value:e,children:e},e))})]}),b&&(0,r.jsxs)("div",{className:"space-y-1","data-testid":"terminal-takeover",children:[(0,r.jsx)("button",{type:"button",className:"text-xs underline","aria-label":"Take over PTY ownership","data-testid":"terminal-takeover-button",disabled:y,onClick:()=>{var e;if(!b||j)return;null==(e=f.current)||e.abort();let t=new AbortController;f.current=t,g({kind:"pending",ptyId:b}),(0,a.HS)(b,globalThis.fetch,{signal:t.signal}).then(e=>{if(!t.signal.aborted){if(e.ok){g({kind:"success",ptyId:e.ptyId}),x(e=>e+1),null==d||d();return}g({kind:"error",ptyId:e.ptyId,failureKind:e.kind,message:e.message})}})},children:y?"Taking over ownership…":"Take over ownership"}),"pending"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-pending",children:"Taking over ownership…"}),"success"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-success",children:"Ownership transferred. Observation refreshed."}),"error"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-destructive",role:"alert","data-testid":"terminal-takeover-error","data-takeover-kind":v.failureKind,children:v.message})]}),"loading"===k.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status",children:"Loading terminal frame…"}),"error"===k.kind&&(0,r.jsxs)("p",{className:"text-xs text-destructive",role:"alert",children:["Unable to load terminal frame: ",k.message]}),"success"===k.kind&&(0,r.jsx)("pre",{className:"max-h-80 overflow-auto whitespace-pre-wrap break-words rounded bg-background p-3 font-mono text-xs","data-testid":"terminal-frame",children:k.frame||"(Terminal frame is empty.)"})]})}function c(e){let{subject:t,onRefresh:s}=e,[l,i]=(0,n.useState)(!1),d="terminal-frame-".concat(encodeURIComponent(t.id)),c=t.screen.ptyIds;return(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["screen: ",c.length," PTY \xb7 ",t.screen.liveCount," live"]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("button",{type:"button",className:"text-xs underline","aria-expanded":l,"aria-controls":d,onClick:()=>i(e=>!e),children:l?"Hide terminal frame":"Show terminal frame"}),(0,r.jsx)("a",{className:"text-xs underline",href:(0,a.GG)(),children:"Open terminal inspector"})]}),l&&(0,r.jsx)("div",{id:d,children:(0,r.jsx)(o,{ptyIds:c,onRefresh:s})})]})}function u(e){let{subjects:t,runningRuns:s,scope:o,includeIsolatedInstances:u=!1,onIncludeIsolatedInstancesChange:m,progressBySubject:p=new Map,onRefresh:x}=e,[h,g]=(0,n.useState)(!1),f=(0,a.U$)(t,h);return(0,r.jsxs)("section",{className:"space-y-3","aria-label":"Observatory subjects",children:[s&&(0,r.jsxs)("p",{className:"text-sm text-muted-foreground","data-testid":"running-runs-summary",children:["Server run count: ",s.running," running, ",s["probable-running"]," probable-running"," ","(counted statuses: ",s.countedStatuses.join(", "),")"]}),(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:u,onChange:e=>null==m?void 0:m(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",u?"included":"local only"]}),o&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"observatory-scope",children:["Observation scope: ",o.domain,"; ",o.roots," root",1===o.roots?"":"s","; ",o.federated?"federated":"local only","; ",o.hiddenDead," dead hidden",void 0===o.hiddenSubAgentRuns?"":"; ".concat(o.hiddenSubAgentRuns," sub-agent runs hidden")]})]}),(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:h,onChange:e=>g(e.target.checked)}),"Show all subjects"]}),0===f.length?(0,r.jsx)("p",{className:"rounded-md border border-border p-4 text-sm text-muted-foreground","data-testid":"subject-list-empty",children:0===t.length?"No observation subjects reported.":"No live or unknown subjects. Turn on Show all subjects to include inactive subjects."}):(0,r.jsx)("ul",{className:"space-y-2","data-testid":"subject-list",children:f.map(e=>{let t=(0,a.XG)(e),s=(0,a.t_)(e),n=p.get(e.id);return(0,r.jsxs)("li",{className:"space-y-2 rounded-md border border-border p-3","data-status":s,children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"font-mono text-sm",children:e.runId||e.id}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["origin: ",e.origin]})]}),(0,r.jsx)("span",{className:"rounded-full bg-surface-elevated px-2 py-0.5 text-[10px] font-medium uppercase",children:l[s]})]}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-1","aria-label":"Subject surfaces",children:[(0,r.jsx)(d,{label:"\uD83D\uDDE3️ talk",present:t.talk}),(0,r.jsx)(d,{label:"\uD83D\uDDA5️ screen",present:t.screen}),(0,r.jsx)(d,{label:"\uD83E\uDD16 agent",present:t.agent})]}),e.run&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"subject-run-assessment","data-run-status":e.run.status,children:["run: ",i[e.run.status]," — reason: ",e.run.reason," (presence: ",e.run.presence,")"]}),(null==n?void 0:n.kind)==="no-screen"&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no screen"}),(null==n?void 0:n.kind)==="no-progress"&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no progress reported"}),(null==n?void 0:n.kind)==="progress"&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["progress (",n.ptyId,"): ",n.status," — ",n.line,n.hasMissingFrames?" (missing frames)":""]}),t.screen&&(0,r.jsx)(c,{subject:e,onRefresh:x})]},e.id)})})]})}var m=s(37947);let p=new(s(31324)).ki({baseUrl:"",token:"",provider:""});function x(){let[e,t]=(0,n.useState)(null),[s,l]=(0,n.useState)(),[i,d]=(0,n.useState)(),[o,c]=(0,n.useState)(!1),[x,h]=(0,n.useState)(new Map),[g,f]=(0,n.useState)(null),[b,k]=(0,n.useState)(0);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{var s,r;let[n,i]=await Promise.all([fetch((0,a.h7)(o)).then(async e=>{if(!e.ok)throw Error("GET ".concat((0,a.h7)(o)," failed (").concat(e.status,")"));return e.json()}),p.listProgressFrames().catch(()=>null)]);if(e)return;let c=null!=(s=n.subjects)?s:[];f(null),t(c),l(n.runningRuns),d(n.scope),h((0,a.vq)(c,i?(0,m.gA)(null!=(r=i.logs)?r:[]):new Map))}catch(t){e||f(t instanceof Error?t.message:"Failed to load observation subjects")}})(),()=>{e=!0}},[o,b]),(0,r.jsxs)("main",{className:"mx-auto max-w-4xl space-y-4 p-6",children:[(0,r.jsxs)("header",{className:"space-y-1",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Observatory"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Subject-level view of talk, screen, and agent observation surfaces."}),(0,r.jsx)("button",{type:"button",className:"text-sm underline",onClick:()=>{(0,a.L4)()},children:"Open new terminal"})]}),g?(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsx)("p",{role:"alert",className:"rounded-md border border-error/40 bg-error/5 p-3 text-sm text-error",children:g}),(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:o,onChange:e=>c(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",o?"included":"local only"]})]}):null===e?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading observation subjects…"}):(0,r.jsx)(u,{subjects:e,runningRuns:s,scope:i,includeIsolatedInstances:o,onIncludeIsolatedInstancesChange:c,progressBySubject:x,onRefresh:()=>k(e=>e+1)})]})}},98141:(e,t,s)=>{Promise.resolve().then(s.bind(s,85356))}},e=>{e.O(0,[1324,7947,5290,607,7358],()=>e(e.s=98141)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6997],{42933:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("maximize-2",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]])},45576:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]])},71747:(e,t,s)=>{"use strict";s.d(t,{A:()=>o});var r=s(24815);let n=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,r.createContext)({}),d=(0,r.forwardRef)((e,t)=>{var s,a,d;let{color:o,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:x,iconNode:h,...g}=e,{size:f=24,strokeWidth:b=2,absoluteStrokeWidth:k=!1,color:j="currentColor",className:v=""}=null!=(s=(0,r.useContext)(i))?s:{},y=(null!=m?m:k)?24*Number(null!=u?u:b)/Number(null!=c?c:f):null!=u?u:b;return(0,r.createElement)("svg",{ref:t,...l,width:null!=(a=null!=c?c:f)?a:l.width,height:null!=(d=null!=c?c:f)?d:l.height,stroke:null!=o?o:j,strokeWidth:y,className:n("lucide",v,p),...!x&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...h.map(e=>{let[t,s]=e;return(0,r.createElement)(t,s)}),...Array.isArray(x)?x:[x]])}),o=(e,t)=>{let s=(0,r.forwardRef)((s,l)=>{let{className:i,...o}=s;return(0,r.createElement)(d,{ref:l,iconNode:t,className:n("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...o})});return s.displayName=a(e),s}},73443:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("minimize-2",[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]])},73904:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(71747).A)("messages-square",[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]])},85356:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>x});var r=s(65863),n=s(24815),a=s(21435);let l={live:"live",unknown:"unknown",inactive:"inactive"},i={running:"running","probable-running":"probably running","ended-unclosed":"ended, not closed",unknown:"run state unknown"};function d(e){let{label:t,present:s}=e;return(0,r.jsxs)("span",{className:"rounded-full px-2 py-0.5 text-[10px] ".concat(s?"bg-primary/10 text-primary":"bg-muted text-muted-foreground"),children:[t,": ",s?"present":"absent"]})}function o(e){var t,s,l;let{ptyIds:i,onRefresh:d}=e,[o,c]=(0,n.useState)(null!=(t=i[0])?t:""),[u,m]=(0,n.useState)({kind:"loading",ptyId:null!=(s=i[0])?s:""}),[p,x]=(0,n.useState)(0),[h,g]=(0,n.useState)({kind:"idle"}),f=(0,n.useRef)(null),b=i.includes(o)?o:null!=(l=i[0])?l:"",k=u.ptyId===b?u:{kind:"loading",ptyId:b},j="pending"===h.kind,v="idle"===h.kind||h.ptyId===b?h:{kind:"idle"},y="pending"===v.kind;return(0,n.useEffect)(()=>{c(e=>{var t;return i.includes(e)?e:null!=(t=i[0])?t:""})},[i]),(0,n.useEffect)(()=>{if(!b)return;let e=new AbortController;return m({kind:"loading",ptyId:b}),fetch((0,a.xV)(b),{signal:e.signal}).then(async t=>{if(!t.ok)throw Error("GET ".concat((0,a.xV)(b)," failed (").concat(t.status,")"));let s=await t.json();if("string"!=typeof s.frame)throw Error("Terminal frame response did not contain text.");e.signal.aborted||m({kind:"success",ptyId:b,frame:s.frame})}).catch(t=>{e.signal.aborted||m({kind:"error",ptyId:b,message:t instanceof Error?t.message:"Terminal frame request failed."})}),()=>e.abort()},[b,p]),(0,n.useEffect)(()=>(g(e=>"pending"===e.kind&&e.ptyId!==b?{kind:"idle"}:e),()=>{var e;null==(e=f.current)||e.abort(),f.current=null}),[b]),(0,r.jsxs)("div",{className:"space-y-2 rounded-md bg-surface-elevated p-3","data-testid":"terminal-frame-panel",children:[i.length>1&&(0,r.jsxs)("label",{className:"flex w-fit items-center gap-2 text-xs",children:["PTY",(0,r.jsx)("select",{value:b,onChange:e=>c(e.target.value),"aria-label":"Select terminal PTY",disabled:j,children:i.map(e=>(0,r.jsx)("option",{value:e,children:e},e))})]}),b&&(0,r.jsxs)("div",{className:"space-y-1","data-testid":"terminal-takeover",children:[(0,r.jsx)("button",{type:"button",className:"text-xs underline","aria-label":"Take over PTY ownership","data-testid":"terminal-takeover-button",disabled:y,onClick:()=>{var e;if(!b||j)return;null==(e=f.current)||e.abort();let t=new AbortController;f.current=t,g({kind:"pending",ptyId:b}),(0,a.HS)(b,globalThis.fetch,{signal:t.signal}).then(e=>{if(!t.signal.aborted){if(e.ok){g({kind:"success",ptyId:e.ptyId}),x(e=>e+1),null==d||d();return}g({kind:"error",ptyId:e.ptyId,failureKind:e.kind,message:e.message})}})},children:y?"Taking over ownership…":"Take over ownership"}),"pending"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-pending",children:"Taking over ownership…"}),"success"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-success",children:"Ownership transferred. Observation refreshed."}),"error"===v.kind&&(0,r.jsx)("p",{className:"text-xs text-destructive",role:"alert","data-testid":"terminal-takeover-error","data-takeover-kind":v.failureKind,children:v.message})]}),"loading"===k.kind&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",role:"status",children:"Loading terminal frame…"}),"error"===k.kind&&(0,r.jsxs)("p",{className:"text-xs text-destructive",role:"alert",children:["Unable to load terminal frame: ",k.message]}),"success"===k.kind&&(0,r.jsx)("pre",{className:"max-h-80 overflow-auto whitespace-pre-wrap break-words rounded bg-background p-3 font-mono text-xs","data-testid":"terminal-frame",children:k.frame||"(Terminal frame is empty.)"})]})}function c(e){let{subject:t,onRefresh:s}=e,[l,i]=(0,n.useState)(!1),d="terminal-frame-".concat(encodeURIComponent(t.id)),c=t.screen.ptyIds;return(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["screen: ",c.length," PTY \xb7 ",t.screen.liveCount," live"]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("button",{type:"button",className:"text-xs underline","aria-expanded":l,"aria-controls":d,onClick:()=>i(e=>!e),children:l?"Hide terminal frame":"Show terminal frame"}),(0,r.jsx)("a",{className:"text-xs underline",href:(0,a.GG)(),children:"Open terminal inspector"})]}),l&&(0,r.jsx)("div",{id:d,children:(0,r.jsx)(o,{ptyIds:c,onRefresh:s})})]})}function u(e){let{subjects:t,runningRuns:s,scope:o,includeIsolatedInstances:u=!1,onIncludeIsolatedInstancesChange:m,progressBySubject:p=new Map,onRefresh:x}=e,[h,g]=(0,n.useState)(!1),f=(0,a.U$)(t,h);return(0,r.jsxs)("section",{className:"space-y-3","aria-label":"Observatory subjects",children:[s&&(0,r.jsxs)("p",{className:"text-sm text-muted-foreground","data-testid":"running-runs-summary",children:["Server run count: ",s.running," running, ",s["probable-running"]," probable-running"," ","(counted statuses: ",s.countedStatuses.join(", "),")"]}),(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:u,onChange:e=>null==m?void 0:m(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",u?"included":"local only"]}),o&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"observatory-scope",children:["Observation scope: ",o.domain,"; ",o.roots," root",1===o.roots?"":"s","; ",o.federated?"federated":"local only","; ",o.hiddenDead," dead hidden",void 0===o.hiddenSubAgentRuns?"":"; ".concat(o.hiddenSubAgentRuns," sub-agent runs hidden")]})]}),(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:h,onChange:e=>g(e.target.checked)}),"Show all subjects"]}),0===f.length?(0,r.jsx)("p",{className:"rounded-md border border-border p-4 text-sm text-muted-foreground","data-testid":"subject-list-empty",children:0===t.length?"No observation subjects reported.":"No live or unknown subjects. Turn on Show all subjects to include inactive subjects."}):(0,r.jsx)("ul",{className:"space-y-2","data-testid":"subject-list",children:f.map(e=>{let t=(0,a.XG)(e),s=(0,a.t_)(e),n=p.get(e.id);return(0,r.jsxs)("li",{className:"space-y-2 rounded-md border border-border p-3","data-status":s,children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"font-mono text-sm",children:e.runId||e.id}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["origin: ",e.origin]})]}),(0,r.jsx)("span",{className:"rounded-full bg-surface-elevated px-2 py-0.5 text-[10px] font-medium uppercase",children:l[s]})]}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-1","aria-label":"Subject surfaces",children:[(0,r.jsx)(d,{label:"\uD83D\uDDE3️ talk",present:t.talk}),(0,r.jsx)(d,{label:"\uD83D\uDDA5️ screen",present:t.screen}),(0,r.jsx)(d,{label:"\uD83E\uDD16 agent",present:t.agent})]}),e.run&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"subject-run-assessment","data-run-status":e.run.status,children:["run: ",i[e.run.status]," — reason: ",e.run.reason," (presence: ",e.run.presence,")"]}),(null==n?void 0:n.kind)==="no-screen"&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no screen"}),(null==n?void 0:n.kind)==="no-progress"&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no progress reported"}),(null==n?void 0:n.kind)==="progress"&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["progress (",n.ptyId,"): ",n.status," — ",n.line,n.hasMissingFrames?" (missing frames)":""]}),t.screen&&(0,r.jsx)(c,{subject:e,onRefresh:x})]},e.id)})})]})}var m=s(37947);let p=new(s(31324)).ki({baseUrl:"",token:"",provider:""});function x(){let[e,t]=(0,n.useState)(null),[s,l]=(0,n.useState)(),[i,d]=(0,n.useState)(),[o,c]=(0,n.useState)(!1),[x,h]=(0,n.useState)(new Map),[g,f]=(0,n.useState)(null),[b,k]=(0,n.useState)(0);return(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{var s,r;let[n,i]=await Promise.all([fetch((0,a.h7)(o)).then(async e=>{if(!e.ok)throw Error("GET ".concat((0,a.h7)(o)," failed (").concat(e.status,")"));return e.json()}),p.listProgressFrames().catch(()=>null)]);if(e)return;let c=null!=(s=n.subjects)?s:[];f(null),t(c),l(n.runningRuns),d(n.scope),h((0,a.vq)(c,i?(0,m.gA)(null!=(r=i.logs)?r:[]):new Map))}catch(t){e||f(t instanceof Error?t.message:"Failed to load observation subjects")}})(),()=>{e=!0}},[o,b]),(0,r.jsxs)("main",{className:"mx-auto max-w-4xl space-y-4 p-6",children:[(0,r.jsxs)("header",{className:"space-y-1",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Observatory"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Subject-level view of talk, screen, and agent observation surfaces."}),(0,r.jsx)("button",{type:"button",className:"text-sm underline",onClick:()=>{(0,a.L4)()},children:"Open new terminal"})]}),g?(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsx)("p",{role:"alert",className:"rounded-md border border-error/40 bg-error/5 p-3 text-sm text-error",children:g}),(0,r.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:o,onChange:e=>c(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",o?"included":"local only"]})]}):null===e?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading observation subjects…"}):(0,r.jsx)(u,{subjects:e,runningRuns:s,scope:i,includeIsolatedInstances:o,onIncludeIsolatedInstancesChange:c,progressBySubject:x,onRefresh:()=>k(e=>e+1)})]})}},87004:(e,t,s)=>{Promise.resolve().then(s.bind(s,85356))}},e=>{e.O(0,[1324,7947,5290,607,7358],()=>e(e.s=87004)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5354],{33461:(e,t,n)=>{Promise.resolve().then(n.bind(n,39265))},39265:(e,t,n)=>{"use strict";n.d(t,{ChecklistView:()=>c});var r=n(65863),s=n(24815),a=n(45695),l=n(63169);function o(e){return"".concat(String(e.getHours()).padStart(2,"0"),":").concat(String(e.getMinutes()).padStart(2,"0"))}function i(e,t){let n=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),r=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()+1).getTime(),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=s===n?"오늘":s===r?"내일":"".concat(String(e.getMonth()+1).padStart(2,"0"),"/").concat(String(e.getDate()).padStart(2,"0")," (").concat(["일","월","화","수","목","금","토"][e.getDay()],")");return"".concat(a," ").concat(o(e))}function d(e){let{schedule:t,now:n}=e;if(!t)return(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"판 일정 없음"});let s=new Date(t.cutAt),a=null===t.landBy?null:new Date(t.landBy),l=a&&null!==n?a.getTime()-n:null,d=null!==l&&l>0?Math.ceil(l/6e4):0,u="".concat(Math.floor(d/60)?"".concat(Math.floor(d/60),"시간"):"").concat(d%60?"".concat(Math.floor(d/60)?" ":"").concat(d%60,"분"):d<60?"0분":"");return(0,r.jsxs)("p",{"aria-label":"판 일정",className:"text-sm ".concat(null!==l&&l<=0?"text-red-600":null!==l&&l<=108e5?"text-orange-600":"text-muted-foreground"),children:["컷 ",i(s,null===n?null:new Date(n)),a&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 착지 마감 ",a.toDateString()===s.toDateString()?o(a):i(a,null===n?null:new Date(n)),null!==l&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 ",l<=0?"착지 마감 지남":"마감까지 ".concat(u)]})]})]})}function u(e){var t;let{result:n,version:s,owner:a,status:l,pendingOnly:o,expandedId:i,onVersion:u,onOwner:c,onStatus:m,onPending:p,onExpand:h,now:y=null}=e;if((null==n?void 0:n.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let v=(null==n?void 0:n.kind)==="ready"?n.data:null,g=null!=(t=null==v?void 0:v.items.filter(e=>(!a||e.owner===a)&&(!l||e.status===l)&&(!o||"yellow"===e.status)))?t:[];return(0,r.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-4xl space-y-6 overflow-x-hidden px-4 py-6 text-foreground",children:[(0,r.jsxs)("header",{className:"space-y-1",children:[(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"운영 / 판별 피처"}),(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"판별 피처"})]}),(0,r.jsxs)("label",{className:"block space-y-2 text-sm font-medium",children:["판",(0,r.jsx)("input",{"aria-label":"판",list:"ops-checklist-versions",value:s,onChange:e=>u(e.target.value),className:"block w-full max-w-xs rounded-md border bg-background p-2"}),(0,r.jsxs)("datalist",{id:"ops-checklist-versions",children:[(0,r.jsx)("option",{value:"0.2.8"}),(0,r.jsx)("option",{value:"0.2.9"}),(0,r.jsx)("option",{value:"0.2.10"})]})]}),null===n&&(0,r.jsx)("p",{role:"status",children:"칸을 불러오는 중…"}),(null==n?void 0:n.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["칸을 불러오지 못했습니다 (",n.status,")"]}),v&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d,{schedule:v.schedule,now:y}),(0,r.jsx)("section",{"aria-label":"상태별 수",className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[["\uD83D\uDFE2","green"],["\uD83D\uDFE1","yellow"],["\uD83D\uDD34","red"],["✅","done"]].map(e=>{let[t,n]=e;return(0,r.jsxs)("div",{className:"rounded-md border p-3 text-sm",children:[t," ",v[n]]},n)})}),(0,r.jsxs)("section",{className:"flex min-w-0 flex-wrap items-end gap-3","aria-label":"거르기",children:[(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["자리",(0,r.jsxs)("select",{"aria-label":"자리",className:"block rounded-md border bg-background p-2",value:a,onChange:e=>c(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["OP","MK","TC","UX"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["상태",(0,r.jsxs)("select",{"aria-label":"상태",className:"block rounded-md border bg-background p-2",value:l,onChange:e=>m(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["green","yellow","red","done"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"flex items-center gap-2 p-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:o,onChange:e=>p(e.target.checked)}),"판정 대기만"]})]}),(0,r.jsxs)("section",{className:"min-w-0 space-y-2","aria-label":"칸 목록",children:[(0,r.jsx)("h2",{className:"font-semibold",children:"칸 목록"}),0===g.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"해당하는 칸이 없습니다."}),g.map(e=>{var t,n;return(0,r.jsxs)("div",{className:"min-w-0 rounded-md border",children:[(0,r.jsxs)("button",{type:"button",className:"flex w-full min-w-0 items-center gap-2 overflow-hidden p-3 text-left hover:bg-muted","aria-expanded":i===e.id,onClick:()=>h(i===e.id?null:e.id),children:[(0,r.jsx)("span",{className:"max-w-[35%] shrink-0 truncate text-sm font-medium",children:e.id}),(0,r.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.title}),(0,r.jsxs)("span",{className:"shrink-0 text-xs",children:[null!=(t=e.owner)?t:"—"," \xb7 ",e.status]})]}),i===e.id&&(0,r.jsxs)("div",{className:"min-w-0 space-y-2 border-t p-3 text-sm",children:[(0,r.jsx)("p",{className:"break-all font-medium",children:e.title}),(0,r.jsx)("p",{className:"whitespace-pre-wrap break-all",children:null!=(n=e.evidence)?n:"근거 없음"})]})]},e.id)})]})]})]})}function c(){let{client:e}=(0,a.Q)(),[t,n]=(0,s.useState)("0.2.9"),[o,i]=(0,s.useState)(null),[d,c]=(0,s.useState)(""),[m,p]=(0,s.useState)(""),[h,y]=(0,s.useState)(!1),[v,g]=(0,s.useState)(null),[f,b]=(0,s.useState)(null);(0,s.useEffect)(()=>{let e;if("undefined"==typeof document)return;let t=()=>{void 0!==e&&(window.clearInterval(e),e=void 0),document.hidden||(b(Date.now()),e=window.setInterval(()=>b(Date.now()),6e4))};return t(),document.addEventListener("visibilitychange",t),()=>{void 0!==e&&window.clearInterval(e),document.removeEventListener("visibilitychange",t)}},[]);let[w,x]=(0,s.useState)(!1),k=(0,s.useRef)(!1),j=(0,s.useRef)(e);return((0,s.useEffect)(()=>{let n=!0;return(j.current!==e&&(j.current=e,k.current=!1,x(!1)),k.current)?()=>{n=!1}:/^\d+\.\d+\.\d+(?:-(?:rc|alpha|beta)\.\d+)?$/.test(t)?(i(null),(0,l.HG)(e,t).then(e=>{n&&!k.current&&("forbidden"===e.kind&&(k.current=!0,x(!0)),i(e))}),()=>{n=!1}):(i(null),()=>{n=!1})},[e,t]),w)?(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"}):(0,r.jsx)(u,{result:o,version:t,owner:d,status:m,pendingOnly:h,now:f,expandedId:v,onVersion:e=>{n(e),g(null)},onOwner:c,onStatus:p,onPending:y,onExpand:g})}},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(65863),s=n(24815),a=n(70086),l=n(89469),o=n(31324),i=n(16263);let d=(0,s.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,s.useState)(n),[m,p]=(0,s.useState)(""),[h]=(0,s.useState)(()=>new o.ki(n));(0,s.useEffect)(()=>{let e=(0,a.Fp)();c(e),h.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();h.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let y=e=>{c(t=>{let n={...t,...e};return(0,a.Qc)(e),h.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,s.useMemo)(()=>({config:u,setConfig:y,client:h,sessionId:m,setSessionId:v}),[u,h,m]);return(0,r.jsx)(d.Provider,{value:g,children:t})}function c(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},63169:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function s(e){return"string"==typeof e}function a(e){return s(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function l(e){return r(e)&&s(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&s(e.summary)&&(void 0===e.startedAt||null===e.startedAt||s(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||s(e.endedAt))}n.d(t,{HG:()=>f,Kh:()=>g,Nn:()=>y,oc:()=>v});let o=new Set(["pending","running","done","retry","timeout","failed"]),i=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function d(e){return!!(r(e)&&s(e.runId)&&s(e.status)&&s(e.startedAt)&&(null===e.version||s(e.version))&&Array.isArray(e.path)&&e.path.every(s)&&Array.isArray(e.nodes)&&e.nodes.every(l))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!s(e.version)||!s(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&s(e.id)&&o.has(e.state)&&i(e.plannedMin)&&i(e.installSec)&&i(e.rc)&&(void 0===e.waitReason||s(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&s(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function u(e){return r(e)&&s(e.id)&&s(e.title)&&s(e.status)&&(void 0===e.owner||s(e.owner))&&s(e.updatedAt)&&(void 0===e.evidence||s(e.evidence))}let c=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&s(e.id)&&s(e.title)&&(null===e.open||c(e.open))&&(null===e.landed||c(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||s(e.role))&&(null===e.now||r(e.now)&&s(e.now.text)&&s(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&c(e.pr)&&s(e.title)&&s(e.at)&&(null===e.checklistId||s(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||c(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>c(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let s=n(await r.json());return null===s?{kind:"error",status:r.status}:{kind:"ready",data:s}}catch(e){return{kind:"error",status:0}}}function y(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&s(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function v(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(d)?e:null)}function g(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&s(e.log)?{log:e.log}:null)}function f(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,l,o;if(!(r(e)&&s(e.version)&&(void 0===e.codename||s(e.codename))&&Array.isArray(e.items)&&e.items.every(u)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(s))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let i={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in i&&i[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&a(e.schedule.cutAt)&&(null===e.schedule.landBy||a(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:i.green,yellow:null!=(n=e.yellow)?n:i.yellow,red:null!=(l=e.red)?l:i.red,done:null!=(o=e.done)?o:i.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>s,oD:()=>a});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function l(){let e=s();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=33461)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5354],{19762:(e,t,n)=>{Promise.resolve().then(n.bind(n,39265))},39265:(e,t,n)=>{"use strict";n.d(t,{ChecklistView:()=>c});var r=n(65863),s=n(24815),a=n(45695),l=n(63169);function o(e){return"".concat(String(e.getHours()).padStart(2,"0"),":").concat(String(e.getMinutes()).padStart(2,"0"))}function i(e,t){let n=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),r=t&&new Date(t.getFullYear(),t.getMonth(),t.getDate()+1).getTime(),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=s===n?"오늘":s===r?"내일":"".concat(String(e.getMonth()+1).padStart(2,"0"),"/").concat(String(e.getDate()).padStart(2,"0")," (").concat(["일","월","화","수","목","금","토"][e.getDay()],")");return"".concat(a," ").concat(o(e))}function d(e){let{schedule:t,now:n}=e;if(!t)return(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"판 일정 없음"});let s=new Date(t.cutAt),a=null===t.landBy?null:new Date(t.landBy),l=a&&null!==n?a.getTime()-n:null,d=null!==l&&l>0?Math.ceil(l/6e4):0,u="".concat(Math.floor(d/60)?"".concat(Math.floor(d/60),"시간"):"").concat(d%60?"".concat(Math.floor(d/60)?" ":"").concat(d%60,"분"):d<60?"0분":"");return(0,r.jsxs)("p",{"aria-label":"판 일정",className:"text-sm ".concat(null!==l&&l<=0?"text-red-600":null!==l&&l<=108e5?"text-orange-600":"text-muted-foreground"),children:["컷 ",i(s,null===n?null:new Date(n)),a&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 착지 마감 ",a.toDateString()===s.toDateString()?o(a):i(a,null===n?null:new Date(n)),null!==l&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 ",l<=0?"착지 마감 지남":"마감까지 ".concat(u)]})]})]})}function u(e){var t;let{result:n,version:s,owner:a,status:l,pendingOnly:o,expandedId:i,onVersion:u,onOwner:c,onStatus:m,onPending:p,onExpand:h,now:y=null}=e;if((null==n?void 0:n.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let v=(null==n?void 0:n.kind)==="ready"?n.data:null,g=null!=(t=null==v?void 0:v.items.filter(e=>(!a||e.owner===a)&&(!l||e.status===l)&&(!o||"yellow"===e.status)))?t:[];return(0,r.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-4xl space-y-6 overflow-x-hidden px-4 py-6 text-foreground",children:[(0,r.jsxs)("header",{className:"space-y-1",children:[(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"운영 / 판별 피처"}),(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"판별 피처"})]}),(0,r.jsxs)("label",{className:"block space-y-2 text-sm font-medium",children:["판",(0,r.jsx)("input",{"aria-label":"판",list:"ops-checklist-versions",value:s,onChange:e=>u(e.target.value),className:"block w-full max-w-xs rounded-md border bg-background p-2"}),(0,r.jsxs)("datalist",{id:"ops-checklist-versions",children:[(0,r.jsx)("option",{value:"0.2.8"}),(0,r.jsx)("option",{value:"0.2.9"}),(0,r.jsx)("option",{value:"0.2.10"})]})]}),null===n&&(0,r.jsx)("p",{role:"status",children:"칸을 불러오는 중…"}),(null==n?void 0:n.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["칸을 불러오지 못했습니다 (",n.status,")"]}),v&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d,{schedule:v.schedule,now:y}),(0,r.jsx)("section",{"aria-label":"상태별 수",className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[["\uD83D\uDFE2","green"],["\uD83D\uDFE1","yellow"],["\uD83D\uDD34","red"],["✅","done"]].map(e=>{let[t,n]=e;return(0,r.jsxs)("div",{className:"rounded-md border p-3 text-sm",children:[t," ",v[n]]},n)})}),(0,r.jsxs)("section",{className:"flex min-w-0 flex-wrap items-end gap-3","aria-label":"거르기",children:[(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["자리",(0,r.jsxs)("select",{"aria-label":"자리",className:"block rounded-md border bg-background p-2",value:a,onChange:e=>c(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["OP","MK","TC","UX"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"space-y-1 text-sm",children:["상태",(0,r.jsxs)("select",{"aria-label":"상태",className:"block rounded-md border bg-background p-2",value:l,onChange:e=>m(e.target.value),children:[(0,r.jsx)("option",{value:"",children:"전체"}),["green","yellow","red","done"].map(e=>(0,r.jsx)("option",{value:e,children:e},e))]})]}),(0,r.jsxs)("label",{className:"flex items-center gap-2 p-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:o,onChange:e=>p(e.target.checked)}),"판정 대기만"]})]}),(0,r.jsxs)("section",{className:"min-w-0 space-y-2","aria-label":"칸 목록",children:[(0,r.jsx)("h2",{className:"font-semibold",children:"칸 목록"}),0===g.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"해당하는 칸이 없습니다."}),g.map(e=>{var t,n;return(0,r.jsxs)("div",{className:"min-w-0 rounded-md border",children:[(0,r.jsxs)("button",{type:"button",className:"flex w-full min-w-0 items-center gap-2 overflow-hidden p-3 text-left hover:bg-muted","aria-expanded":i===e.id,onClick:()=>h(i===e.id?null:e.id),children:[(0,r.jsx)("span",{className:"max-w-[35%] shrink-0 truncate text-sm font-medium",children:e.id}),(0,r.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.title}),(0,r.jsxs)("span",{className:"shrink-0 text-xs",children:[null!=(t=e.owner)?t:"—"," \xb7 ",e.status]})]}),i===e.id&&(0,r.jsxs)("div",{className:"min-w-0 space-y-2 border-t p-3 text-sm",children:[(0,r.jsx)("p",{className:"break-all font-medium",children:e.title}),(0,r.jsx)("p",{className:"whitespace-pre-wrap break-all",children:null!=(n=e.evidence)?n:"근거 없음"})]})]},e.id)})]})]})]})}function c(){let{client:e}=(0,a.Q)(),[t,n]=(0,s.useState)("0.2.9"),[o,i]=(0,s.useState)(null),[d,c]=(0,s.useState)(""),[m,p]=(0,s.useState)(""),[h,y]=(0,s.useState)(!1),[v,g]=(0,s.useState)(null),[f,b]=(0,s.useState)(null);(0,s.useEffect)(()=>{let e;if("undefined"==typeof document)return;let t=()=>{void 0!==e&&(window.clearInterval(e),e=void 0),document.hidden||(b(Date.now()),e=window.setInterval(()=>b(Date.now()),6e4))};return t(),document.addEventListener("visibilitychange",t),()=>{void 0!==e&&window.clearInterval(e),document.removeEventListener("visibilitychange",t)}},[]);let[w,x]=(0,s.useState)(!1),k=(0,s.useRef)(!1),j=(0,s.useRef)(e);return((0,s.useEffect)(()=>{let n=!0;return(j.current!==e&&(j.current=e,k.current=!1,x(!1)),k.current)?()=>{n=!1}:/^\d+\.\d+\.\d+(?:-(?:rc|alpha|beta)\.\d+)?$/.test(t)?(i(null),(0,l.HG)(e,t).then(e=>{n&&!k.current&&("forbidden"===e.kind&&(k.current=!0,x(!0)),i(e))}),()=>{n=!1}):(i(null),()=>{n=!1})},[e,t]),w)?(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"}):(0,r.jsx)(u,{result:o,version:t,owner:d,status:m,pendingOnly:h,now:f,expandedId:v,onVersion:e=>{n(e),g(null)},onOwner:c,onStatus:p,onPending:y,onExpand:g})}},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(65863),s=n(24815),a=n(70086),l=n(89469),o=n(31324),i=n(16263);let d=(0,s.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,s.useState)(n),[m,p]=(0,s.useState)(""),[h]=(0,s.useState)(()=>new o.ki(n));(0,s.useEffect)(()=>{let e=(0,a.Fp)();c(e),h.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();h.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let y=e=>{c(t=>{let n={...t,...e};return(0,a.Qc)(e),h.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,s.useMemo)(()=>({config:u,setConfig:y,client:h,sessionId:m,setSessionId:v}),[u,h,m]);return(0,r.jsx)(d.Provider,{value:g,children:t})}function c(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},63169:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function s(e){return"string"==typeof e}function a(e){return s(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function l(e){return r(e)&&s(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&s(e.summary)&&(void 0===e.startedAt||null===e.startedAt||s(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||s(e.endedAt))}n.d(t,{HG:()=>f,Kh:()=>g,Nn:()=>y,oc:()=>v});let o=new Set(["pending","running","done","retry","timeout","failed"]),i=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function d(e){return!!(r(e)&&s(e.runId)&&s(e.status)&&s(e.startedAt)&&(null===e.version||s(e.version))&&Array.isArray(e.path)&&e.path.every(s)&&Array.isArray(e.nodes)&&e.nodes.every(l))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!s(e.version)||!s(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&s(e.id)&&o.has(e.state)&&i(e.plannedMin)&&i(e.installSec)&&i(e.rc)&&(void 0===e.waitReason||s(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&s(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function u(e){return r(e)&&s(e.id)&&s(e.title)&&s(e.status)&&(void 0===e.owner||s(e.owner))&&s(e.updatedAt)&&(void 0===e.evidence||s(e.evidence))}let c=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&s(e.id)&&s(e.title)&&(null===e.open||c(e.open))&&(null===e.landed||c(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||s(e.role))&&(null===e.now||r(e.now)&&s(e.now.text)&&s(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&c(e.pr)&&s(e.title)&&s(e.at)&&(null===e.checklistId||s(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&s(e.id)&&s(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||c(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>c(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let s=n(await r.json());return null===s?{kind:"error",status:r.status}:{kind:"ready",data:s}}catch(e){return{kind:"error",status:0}}}function y(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&s(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function v(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(d)?e:null)}function g(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&s(e.log)?{log:e.log}:null)}function f(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,l,o;if(!(r(e)&&s(e.version)&&(void 0===e.codename||s(e.codename))&&Array.isArray(e.items)&&e.items.every(u)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(s))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let i={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in i&&i[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&a(e.schedule.cutAt)&&(null===e.schedule.landBy||a(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:i.green,yellow:null!=(n=e.yellow)?n:i.yellow,red:null!=(l=e.red)?l:i.red,done:null!=(o=e.done)?o:i.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>s,oD:()=>a});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function l(){let e=s();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=19762)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6231],{5532:(e,n,l)=>{"use strict";l.d(n,{ReleaseRunsView:()=>m});var t=l(65863),r=l(24815),a=l(45695),s=l(63169),d=l(55049),u=l(82734);let i=["done","completed","failed","cancelled","aborted","success","succeeded","error"],o=new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",year:"numeric",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function c(e){var n;let{result:l,version:r,versions:a=[],selectedRun:s,unmatchedRunId:i,openedNodeId:c,log:m,onVersion:h,onRun:p,onNode:x,onStripRun:f}=e;if((null==l?void 0:l.kind)==="forbidden"||(null==m?void 0:m.kind)==="forbidden")return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let v=(null==l?void 0:l.kind)==="ready"?l.data:[],b=r?v.filter(e=>e.version===r):v,w=s?b.filter(e=>e.runId===s.runId):[],k=1===w.length?w[0]:null,j=(null==l?void 0:l.kind)==="ready"&&(null!==s&&!k||!!i),N=[...new Set([...a,...v.map(e=>e.version).filter(e=>!!e)])];return r&&!N.includes(r)&&N.push(r),(0,t.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-4xl space-y-6 overflow-x-hidden px-4 py-6 text-foreground",children:[j?(0,t.jsx)("p",{role:"status",children:"발행 진행 \xb7 노드 흐름: 런이 달라 못 잼"}):f&&(0,t.jsx)(d.EF,{result:l,selectedRun:k,expectedRunId:null==k?void 0:k.runId,onSelect:f}),(0,t.jsxs)("header",{className:"space-y-1",children:[(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"운영 / 릴리스"}),(0,t.jsx)("h1",{className:"text-2xl font-semibold",children:"릴리스"})]}),(0,t.jsxs)("label",{className:"block space-y-2 text-sm font-medium",children:["판",(0,t.jsx)("input",{"aria-label":"판",list:"ops-release-versions",className:"block w-full max-w-xs rounded-md border bg-background p-2",value:r,onChange:e=>h(e.target.value),placeholder:"전체 판"}),(0,t.jsx)("datalist",{id:"ops-release-versions",children:N.map(e=>(0,t.jsx)("option",{value:e},e))})]}),null===l?(0,t.jsx)("p",{role:"status",children:"런을 불러오는 중…"}):"error"===l.kind?(0,t.jsxs)("p",{role:"alert",children:["런을 불러오지 못했습니다 (",l.status,")"]}):null,(null==l?void 0:l.kind)==="ready"&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("section",{className:"min-w-0 space-y-2","aria-label":"런 목록",children:[(0,t.jsx)("h2",{className:"font-semibold",children:"런 목록"}),0===b.length&&(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 판의 런이 없습니다."}),b.map(e=>{var n;return(0,t.jsxs)("button",{type:"button","aria-pressed":(null==k?void 0:k.runId)===e.runId,onClick:()=>p(e.runId),className:"block w-full min-w-0 rounded-md border p-3 text-left hover:bg-muted aria-pressed:border-primary",children:[(0,t.jsxs)("span",{className:"block truncate font-medium",children:[null!=(n=e.version)?n:"판 미상"," \xb7 ",e.status]}),(0,t.jsx)("time",{"aria-label":"시작 시각 (KST)",className:"block break-all text-sm text-muted-foreground",dateTime:e.startedAt,children:Number.isFinite(Date.parse(e.startedAt))?"".concat(o.format(new Date(e.startedAt))," KST"):"시각 미기록"})]},e.runId)})]}),k&&!j&&(0,t.jsxs)("section",{className:"min-w-0 space-y-3","aria-label":"노드 진행","data-run-id":k.runId,children:[(0,t.jsxs)("h2",{className:"font-semibold",children:["노드 흐름 ",(0,t.jsxs)("span",{className:"text-sm font-normal text-muted-foreground",children:["\xb7 ",null!=(n=k.version)?n:"판 미상"," \xb7 ",k.status]})]}),(0,t.jsx)(u.af,{run:k,openedNodeId:c,onNode:x}),c&&k.path.includes(c)?(0,t.jsx)(u.Jv,{run:k,nodeId:c,log:m}):(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"노드를 누르면 요약 전문과 로그 꼬리가 열립니다."})]})]})]})}function m(){var e,n;let{client:l}=(0,a.Q)(),[u,o]=(0,r.useState)(null),[m,h]=(0,r.useState)([]),[p,x]=(0,r.useState)(null),[f,v]=(0,r.useState)(null),[b,w]=(0,r.useState)(null),[k,j]=(0,r.useState)(null),[N,I]=(0,r.useState)(null),[g,y]=(0,r.useState)(!1),S=(0,r.useRef)(0),R=(0,r.useRef)(!1),C=(0,r.useRef)(null),D=(0,r.useRef)([]),E=(0,r.useRef)(l);(0,r.useEffect)(()=>{var e,n;let l=new URLSearchParams(null!=(n=null==(e=window.location)?void 0:e.search)?n:"").get("run");l&&w(l)},[]),(0,r.useEffect)(()=>{let e=!0;return(E.current!==l&&(E.current=l,R.current=!1,y(!1),h([]),C.current=null,x(null)),R.current)?()=>{e=!1}:(S.current++,j(null),I(null),v(null),D.current=[],null===u&&(C.current=null,x(null)),(0,s.oc)(l,u||void 0).then(n=>{if(e&&!R.current&&(v(n),"forbidden"===n.kind&&(R.current=!0,y(!0)),"ready"===n.kind)&&(D.current=n.data,h(e=>[...new Set([...e,...n.data.map(e=>e.version).filter(e=>!!e)])]),null===u&&null===C.current)){var l,t,r,a,s,i,o,c;let e=new URLSearchParams(null!=(s=null==(l=window.location)?void 0:l.search)?s:"").get("run");C.current=null!=(c=null!=(o=null!=(i=null==(t=n.data.find(n=>n.runId===e))?void 0:t.version)?i:null==(r=(0,d.m6)(n,Date.now()))?void 0:r.version)?o:null==(a=n.data[0])?void 0:a.version)?c:null,x(C.current)}}),()=>{e=!1})},[l,u]);let A=!g&&((null==f?void 0:f.kind)==="ready"||(null==f?void 0:f.kind)==="error")&&D.current.some(e=>!i.includes(e.status.toLowerCase()));(0,r.useEffect)(()=>{if(!A)return;let e=!0,n=!1,t=async()=>{if(n||document.hidden||!e||R.current||!D.current.some(e=>!i.includes(e.status.toLowerCase())))return;n=!0;let t=await (0,s.oc)(l,u||void 0);n=!1,e&&!R.current&&(v(t),"ready"===t.kind&&(D.current=t.data),"forbidden"===t.kind&&(R.current=!0,y(!0)))},r=window.setInterval(()=>{t()},1e4),a=()=>{document.hidden||t()};return document.addEventListener("visibilitychange",a),()=>{e=!1,window.clearInterval(r),document.removeEventListener("visibilitychange",a)}},[l,u,A]);let F=null===u?p:u,L=(null==f?void 0:f.kind)==="ready"?f.data.filter(e=>!F||e.version===F):[],M=b?L.find(e=>e.runId===b):null!=(e=(0,d.m6)({kind:"ready",data:L},Date.now()))?e:L[0],_=null!=(n=null!=F?F:null==M?void 0:M.version)?n:"",K=null==M?void 0:M.runId;(0,r.useEffect)(()=>{S.current++,j(null),I(null)},[K]);let T=(0,r.useCallback)(e=>{(e!==p||null!==u)&&(S.current++,x(null),o(e),w(null),j(null),I(null))},[u,p]),P=e=>{S.current++,w(e),j(null),I(null)};if(g)return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let O=k&&k.runId===K?k.nodeId:null,U=N&&N.runId===K&&N.nodeId===O?N.result:null;return(0,t.jsx)(c,{result:f,version:_,versions:m,selectedRun:null!=M?M:null,unmatchedRunId:b&&!M?b:null,openedNodeId:O,log:U,onVersion:T,onRun:P,onNode:e=>{if(!M||(null==f?void 0:f.kind)!=="ready")return;let n=++S.current,t=M.runId;if((null==k?void 0:k.runId)===t&&k.nodeId===e){j(null),I(null);return}j({runId:t,nodeId:e}),I(null),(0,s.Kh)(l,t,e).then(l=>{n!==S.current||R.current||("forbidden"===l.kind&&(R.current=!0,y(!0)),I({runId:t,nodeId:e,result:l}))})},onStripRun:e=>{if(e.version!==F){var n;o(null!=(n=e.version)?n:""),x(null)}P(e.runId)}})}},32312:(e,n,l)=>{Promise.resolve().then(l.bind(l,5532))},55049:(e,n,l)=>{"use strict";l.d(n,{EF:()=>d,m6:()=>s});var t=l(65863);let r=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),a=/fail|error|block|stall|cancel|abort/i;function s(e,n){if((null==e?void 0:e.kind)!=="ready")return null;let l=e.data.reduce((e,n)=>!e||Date.parse(n.startedAt)>Date.parse(e.startedAt)?n:e,null);return!l||r.has(l.status.toLowerCase())&&n-Date.parse(l.startedAt)>864e5?null:l}function d(e){var n,l;let{result:d,onSelect:u,selectedRun:i,expectedRunId:o,now:c=Date.now()}=e,m=void 0===i?s(d,c):i;if(o&&(null==m?void 0:m.runId)!==o)return(0,t.jsx)("p",{role:"status",children:"발행 진행 \xb7 노드 흐름: 런이 달라 못 잼"});if(!m)return null;let h=Math.max(0,m.path.findIndex(e=>{var n;return(null==(n=m.nodes.find(n=>n.nodeId===e))?void 0:n.ok)!==!0})),p=m.path.length>0&&m.path.every(e=>{var n;return(null==(n=m.nodes.find(n=>n.nodeId===e))?void 0:n.ok)===!0})?m.path.length-1:h,x=m.path[p],f=m.nodes.find(e=>e.nodeId===x),v="done"===m.status.toLowerCase()&&(null==f?void 0:f.ok)===!1,b=!v&&((null==f?void 0:f.ok)===!1||a.test(m.status))?null==f||null==(n=f.summary.split(/\r?\n/,1)[0])?void 0:n.trim():null,w=r.has(m.status.toLowerCase()),k=w?function(e){let n=Date.parse(e.startedAt),l=e.path.map(n=>{var l;let t=null==(l=e.nodes.find(e=>e.nodeId===n))?void 0:l.endedAt;return t?Date.parse(t):NaN}).filter(Number.isFinite);return Number.isFinite(n)&&0!==l.length?Math.max(0,Math.floor((Math.max(...l)-n)/6e4)):null}(m):null,j=w?null:Math.max(0,Math.floor((c-Date.parse(m.startedAt))/6e4));return(0,t.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":m.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>u(m),className:"flex w-full min-w-0 items-center gap-2 text-left text-sm hover:text-primary",children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap font-semibold",children:["발행 ",null!=(l=m.version)?l:"판 미상"]}),w?(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==k?" \xb7 걸린 시간 ".concat(k,"분"):""]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=x?x:"노드 미상"," (",m.path.length?p+1:0,"/",m.path.length,")"]}),(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(j)?j:0,"분"]})]}),(0,t.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:m.path.map((e,n)=>{let l=m.nodes.find(n=>n.nodeId===e),r=!w&&n===p,a=w||n<p;return(0,t.jsxs)("span",{"aria-current":r?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(r?"border-primary bg-primary/10 font-semibold":!w&&n>p?"opacity-50":""),children:[a?(null==l?void 0:l.ok)===!0?"✓ ":(null==l?void 0:l.ok)===!1?"✗ ":"":"",e]},"".concat(e,"-").concat(n))})})]}),(0,t.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["상태: ",m.status]}),v&&(0,t.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),b&&(0,t.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",b]})]})}}},e=>{e.O(0,[1324,7886,5290,607,7358],()=>e(e.s=32312)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{22717:(e,t,n)=>{"use strict";n.d(t,{Es:()=>s,Wf:()=>l,q9:()=>a});let r=/\u{1F451}|`[^`]+`|\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{7,40}\b|\/Users\/|\/(?:home|root)\/|\/\.ssh\/|~\/\.elanous|elt_|\$\s*[-+]?\d[\d,.]*|run-[0-9a-f]{8}\b|\b(?:test|mirror):|\b(?:account|remote)-\d+\b|\bmsb\d+\b|\.ts\.net\b|\bgcpvm\b|user|[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/iu;function l(e){return!r.test(e)}function a(e){return(e.replace(/^\s*\*\*\[[A-Za-z]{1,4}\]\*\*\s*/,"").replace(/^(?:\{\{TS\}\}|\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}(?::\d{2})?\s*(?:KST)?)\s*/,"").replace(/^→\s*(?:(?:[A-Z]{2,4}|전원|전체)(?=[\s·,(]|$)[\s·,]*)+/u,"").replace(/^—\s*/,"").replace(/^(?:보고|요청|정정|결정|사고|안내)\s*·\s*/,"").trim()||e.trim()).replace(/\*\*/g,"")}function s(e){return e.replace(/#\d{4,6}\b/g,"PR")}},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,DaemonProvider:()=>c,Q:()=>u});var r=n(65863),l=n(24815),a=n(70086),s=n(89469),o=n(31324),d=n(16263);let i=(0,l.createContext)(null);function c(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[c,u]=(0,l.useState)(n),[m,p]=(0,l.useState)(""),[h]=(0,l.useState)(()=>new o.ki(n));(0,l.useEffect)(()=>{let e=(0,a.Fp)();u(e),h.updateConfig(e),p((0,s.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();h.updateConfig(t),u(t),(0,d.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,d.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let f=e=>{u(t=>{let n={...t,...e};return(0,a.Qc)(e),h.updateConfig(n),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,l.useMemo)(()=>({config:c,setConfig:f,client:h,sessionId:m,setSessionId:v}),[c,h,m]);return(0,r.jsx)(i.Provider,{value:b,children:t})}function u(){let e=(0,l.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},55049:(e,t,n)=>{"use strict";n.d(t,{EF:()=>o,m6:()=>s});var r=n(65863);let l=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),a=/fail|error|block|stall|cancel|abort/i;function s(e,t){if((null==e?void 0:e.kind)!=="ready")return null;let n=e.data.reduce((e,t)=>!e||Date.parse(t.startedAt)>Date.parse(e.startedAt)?t:e,null);return!n||l.has(n.status.toLowerCase())&&t-Date.parse(n.startedAt)>864e5?null:n}function o(e){var t,n;let{result:o,onSelect:d,selectedRun:i,expectedRunId:c,now:u=Date.now()}=e,m=void 0===i?s(o,u):i;if(c&&(null==m?void 0:m.runId)!==c)return(0,r.jsx)("p",{role:"status",children:"발행 진행 \xb7 노드 흐름: 런이 달라 못 잼"});if(!m)return null;let p=Math.max(0,m.path.findIndex(e=>{var t;return(null==(t=m.nodes.find(t=>t.nodeId===e))?void 0:t.ok)!==!0})),h=m.path.length>0&&m.path.every(e=>{var t;return(null==(t=m.nodes.find(t=>t.nodeId===e))?void 0:t.ok)===!0})?m.path.length-1:p,f=m.path[h],v=m.nodes.find(e=>e.nodeId===f),b="done"===m.status.toLowerCase()&&(null==v?void 0:v.ok)===!1,x=!b&&((null==v?void 0:v.ok)===!1||a.test(m.status))?null==v||null==(t=v.summary.split(/\r?\n/,1)[0])?void 0:t.trim():null,y=l.has(m.status.toLowerCase()),g=y?function(e){let t=Date.parse(e.startedAt),n=e.path.map(t=>{var n;let r=null==(n=e.nodes.find(e=>e.nodeId===t))?void 0:n.endedAt;return r?Date.parse(r):NaN}).filter(Number.isFinite);return Number.isFinite(t)&&0!==n.length?Math.max(0,Math.floor((Math.max(...n)-t)/6e4)):null}(m):null,w=y?null:Math.max(0,Math.floor((u-Date.parse(m.startedAt))/6e4));return(0,r.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":m.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>d(m),className:"flex w-full min-w-0 items-center gap-2 text-left text-sm hover:text-primary",children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap font-semibold",children:["발행 ",null!=(n=m.version)?n:"판 미상"]}),y?(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==g?" \xb7 걸린 시간 ".concat(g,"분"):""]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=f?f:"노드 미상"," (",m.path.length?h+1:0,"/",m.path.length,")"]}),(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(w)?w:0,"분"]})]}),(0,r.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:m.path.map((e,t)=>{let n=m.nodes.find(t=>t.nodeId===e),l=!y&&t===h,a=y||t<h;return(0,r.jsxs)("span",{"aria-current":l?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(l?"border-primary bg-primary/10 font-semibold":!y&&t>h?"opacity-50":""),children:[a?(null==n?void 0:n.ok)===!0?"✓ ":(null==n?void 0:n.ok)===!1?"✗ ":"":"",e]},"".concat(e,"-").concat(t))})})]}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["상태: ",m.status]}),b&&(0,r.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),x&&(0,r.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",x]})]})}},63169:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e}function a(e){return l(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function s(e){return r(e)&&l(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&l(e.summary)&&(void 0===e.startedAt||null===e.startedAt||l(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||l(e.endedAt))}n.d(t,{HG:()=>x,Kh:()=>b,Nn:()=>f,oc:()=>v});let o=new Set(["pending","running","done","retry","timeout","failed"]),d=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function i(e){return!!(r(e)&&l(e.runId)&&l(e.status)&&l(e.startedAt)&&(null===e.version||l(e.version))&&Array.isArray(e.path)&&e.path.every(l)&&Array.isArray(e.nodes)&&e.nodes.every(s))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!l(e.version)||!l(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&l(e.id)&&o.has(e.state)&&d(e.plannedMin)&&d(e.installSec)&&d(e.rc)&&(void 0===e.waitReason||l(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&l(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function c(e){return r(e)&&l(e.id)&&l(e.title)&&l(e.status)&&(void 0===e.owner||l(e.owner))&&l(e.updatedAt)&&(void 0===e.evidence||l(e.evidence))}let u=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&l(e.id)&&l(e.title)&&(null===e.open||u(e.open))&&(null===e.landed||u(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||l(e.role))&&(null===e.now||r(e.now)&&l(e.now.text)&&l(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&l(e.title)&&l(e.at)&&(null===e.checklistId||l(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||u(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>u(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let l=n(await r.json());return null===l?{kind:"error",status:r.status}:{kind:"ready",data:l}}catch(e){return{kind:"error",status:0}}}function f(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&l(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function v(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(i)?e:null)}function b(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&l(e.log)?{log:e.log}:null)}function x(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,s,o;if(!(r(e)&&l(e.version)&&(void 0===e.codename||l(e.codename))&&Array.isArray(e.items)&&e.items.every(c)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(l))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let d={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in d&&d[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&a(e.schedule.cutAt)&&(null===e.schedule.landBy||a(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:d.green,yellow:null!=(n=e.yellow)?n:d.yellow,red:null!=(s=e.red)?s:d.red,done:null!=(o=e.done)?o:d.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},67095:(e,t,n)=>{Promise.resolve().then(n.bind(n,77800))},76072:(e,t,n)=>{"use strict";var r=n(33912);n.o(r,"useParams")&&n.d(t,{useParams:function(){return r.useParams}}),n.o(r,"usePathname")&&n.d(t,{usePathname:function(){return r.usePathname}}),n.o(r,"useRouter")&&n.d(t,{useRouter:function(){return r.useRouter}}),n.o(r,"useSearchParams")&&n.d(t,{useSearchParams:function(){return r.useSearchParams}})},77800:(e,t,n)=>{"use strict";n.d(t,{SeatBoardView:()=>f});var r=n(65863),l=n(24815),a=n(76072),s=n(45695),o=n(63169),d=n(55049),i=n(22717);let c=[{seat:"OP",role:"COO"},{seat:"MK",role:"CMO"},{seat:"TC",role:"CTO"},{seat:"UX",role:"CXO"}];function u(e){return null===e?"못 읽음":String(e)}function m(e,t,n){let r=e.split(/\r?\n/);return t?r.filter(e=>(0,i.Wf)(e)&&!n.some(t=>e.includes(t))).map(i.Es):r}function p(e){var t,n,l,a,s,o;let{seat:d,role:c,publicCapture:p,identifiers:h}=e,f=null!=(t=null==d?void 0:d.landed)?t:null,v=null!=(n=null==d?void 0:d.blocked)?n:null,b=null!=(l=null==d?void 0:d.checklist)?l:null;return(0,r.jsxs)("article",{className:"min-w-0 space-y-5 rounded-2xl border bg-card p-5 shadow-sm","aria-label":"".concat(c," 자리"),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-3xl font-bold tracking-tight",children:c}),(0,r.jsx)("div",{className:"mt-3 min-h-12 break-words text-muted-foreground","aria-label":"지금 하는 일",children:(null==d?void 0:d.now)?m((0,i.q9)(d.now.text),p,h).map((e,t)=>(0,r.jsx)("p",{children:e},t)):"못 읽음"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 착지",children:[(0,r.jsxs)("h3",{className:"font-semibold",children:["오늘 착지 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===f?"text-muted-foreground":""),children:u(null!=(a=null==f?void 0:f.length)?a:null)})]}),f&&(0,r.jsx)("ul",{className:"mt-2 space-y-1",children:f.slice(-5).reverse().flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"#".concat(e.pr," \xb7 ").concat(t)},"".concat(e.pr,"-").concat(n))))})]}),(0,r.jsxs)("section",{"aria-label":"막힘",children:[(0,r.jsxs)("h3",{className:"font-semibold text-red-600 dark:text-red-400",children:["막힘 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===v?"text-muted-foreground":""),children:u(null!=(s=null==v?void 0:v.length)?s:null)})]}),v&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:v.flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"".concat(e.id," \xb7 ").concat(t)},"".concat(e.id,"-").concat(n))))})]}),(0,r.jsxs)("p",{children:["대표 결정 대기 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat((null==d?void 0:d.pendingDecisions)==null?"text-muted-foreground":""),children:u(null!=(o=null==d?void 0:d.pendingDecisions)?o:null)})]}),(0,r.jsx)("section",{"aria-label":"칸 상태",className:"flex flex-wrap gap-2 border-t pt-3",children:b?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,t)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(b[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][t]," ",b[e]]},e))}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"못 읽음"})}),(null==d?void 0:d.subSeats)&&d.subSeats.length>0&&(0,r.jsx)("ul",{"aria-label":"하위 자리",className:"space-y-1 border-t pt-3",children:d.subSeats.map(e=>{var t,n,l;let a="└ ".concat(e.id," ").concat(e.title," \xb7 열린 칸 ").concat(u(e.open)," \xb7 오늘 착지 ").concat(u(e.landed)," \xb7 막힘 ").concat(u(null!=(l=null==(t=e.blocked)?void 0:t.length)?l:null)),s=(null==(n=e.blocked)?void 0:n.length)?" \xb7 ".concat(e.blocked.map(e=>e.id).join(", ")):"",o=p?m(a,!0,h):[a],d=p?m(s,!0,h):[s];return o.map((t,n)=>(0,r.jsxs)("li",{className:"break-words",children:[t,d.join("")]},"".concat(e.id,"-").concat(n)))})})]})}function h(e){let{result:t,refreshedAt:n,publicCapture:l=!1,releaseStrip:a}=e;if((null==t?void 0:t.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let s=(null==t?void 0:t.kind)==="ready"?t.data.seats:[],o=s.flatMap(e=>{var t,n,r;return[...(null!=(t=e.landed)?t:[]).flatMap(e=>[String(e.pr),...e.checklistId?[e.checklistId]:[]]),...(null!=(n=e.blocked)?n:[]).map(e=>e.id),...(null!=(r=e.subSeats)?r:[]).flatMap(e=>{var t;return(null!=(t=e.blocked)?t:[]).map(e=>e.id)})]});return(0,r.jsxs)("main",{className:"mx-auto w-full max-w-[1920px] space-y-6 p-4 text-foreground md:p-8 ".concat(l?"flex min-h-screen flex-col text-base":""),children:[!l&&a,(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-muted-foreground",children:"운영 / 자리 현황"}),(0,r.jsx)("h1",{className:"text-3xl font-bold",children:"자리 현황"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 합계",className:"flex flex-wrap items-center gap-x-8 gap-y-3 rounded-2xl border bg-card p-5",children:[["landed","blocked","pendingDecisions"].map(e=>{let n=(null==t?void 0:t.kind)!=="ready"||c.some(t=>{var n;let{seat:r}=t;return!s.find(e=>e.seat===r)||(null==(n=s.find(e=>e.seat===r))?void 0:n[e])===null})?"못 읽음":String(s.reduce((t,n)=>t+("pendingDecisions"===e?n.pendingDecisions:n[e].length),0));return(0,r.jsxs)("p",{children:["landed"===e?"오늘 착지":"blocked"===e?"막힘":"결정 대기"," ",(0,r.jsx)("strong",{className:"".concat(l?"text-5xl":"text-3xl").concat("못 읽음"===n?" text-muted-foreground":""),children:n})]},e)}),(0,r.jsxs)("p",{children:["마지막 갱신 ",(0,r.jsx)("time",{dateTime:null!=n?n:void 0,children:n?new Date(n).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"}):"못 읽음"})]})]}),null===t&&(0,r.jsx)("p",{role:"status",children:"자리 현황을 불러오는 중…"}),(null==t?void 0:t.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["자리 현황을 불러오지 못했습니다 (",t.status,")"]}),(null==t?void 0:t.kind)==="ready"&&(0,r.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 min-[1440px]:grid-cols-4",children:c.map(e=>{let{seat:t,role:n}=e;return(0,r.jsx)(p,{seat:s.find(e=>e.seat===t),role:n,publicCapture:l,identifiers:o},t)})}),l&&(0,r.jsx)("footer",{className:"mt-auto border-t pt-4 text-center font-semibold tracking-wide",children:"PUBLIC CAPTURE \xb7 가린 화면"})]})}function f(){let{client:e}=(0,s.Q)(),t=(0,a.useRouter)(),[n,i]=(0,l.useState)(null),[c,u]=(0,l.useState)(null),[m,p]=(0,l.useState)(null),[f,v]=(0,l.useState)(null);return((0,l.useEffect)(()=>{v("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,l.useEffect)(()=>{let t=!0,n=!1,r=!1,l=async()=>{if(!t||n||r||document.hidden)return;n=!0;let l=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),a=await (0,o.Nn)(e,l);n=!1,t&&(u(a),"forbidden"===a.kind&&(r=!0),"ready"===a.kind&&p(new Date().toISOString()))};u(null),p(null),l();let a=window.setInterval(()=>{l()},3e4),s=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(a),document.removeEventListener("visibilitychange",s)}},[e]),(0,l.useEffect)(()=>{if(!1!==f||(null==c?void 0:c.kind)==="forbidden")return;let t=!0,n=!1,r=!1,l=async()=>{if(!t||n||r||document.hidden)return;n=!0;let l=await (0,o.oc)(e);n=!1,t&&(i(l),"forbidden"===l.kind&&(r=!0))};i(null),l();let a=window.setInterval(()=>{l()},1e4),s=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(a),document.removeEventListener("visibilitychange",s)}},[e,f,(null==c?void 0:c.kind)==="forbidden"]),null===f)?null:(0,r.jsx)(h,{result:c,refreshedAt:m,publicCapture:f,releaseStrip:(0,r.jsx)(d.EF,{result:n,onSelect:e=>t.push("/ops/release?run=".concat(encodeURIComponent(e.runId)))})})}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>s,f6:()=>l,oD:()=>a});let r="elanous.daemon.sessionId";function l(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=l();return localStorage.setItem(r,t),t}function s(){let e=l();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=67095)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{22717:(e,t,n)=>{"use strict";n.d(t,{Es:()=>s,Wf:()=>l,q9:()=>a});let r=/\u{1F451}|`[^`]+`|\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{7,40}\b|\/Users\/|\/(?:home|root)\/|\/\.ssh\/|~\/\.elanous|elt_|\$\s*[-+]?\d[\d,.]*|run-[0-9a-f]{8}\b|\b(?:test|mirror):|\b(?:account|remote)-\d+\b|\bmsb\d+\b|\.ts\.net\b|\bgcpvm\b|user|[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/iu;function l(e){return!r.test(e)}function a(e){return(e.replace(/^\s*\*\*\[[A-Za-z]{1,4}\]\*\*\s*/,"").replace(/^(?:\{\{TS\}\}|\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}(?::\d{2})?\s*(?:KST)?)\s*/,"").replace(/^→\s*(?:(?:[A-Z]{2,4}|전원|전체)(?=[\s·,(]|$)[\s·,]*)+/u,"").replace(/^—\s*/,"").replace(/^(?:보고|요청|정정|결정|사고|안내)\s*·\s*/,"").trim()||e.trim()).replace(/\*\*/g,"")}function s(e){return e.replace(/#\d{4,6}\b/g,"PR")}},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,DaemonProvider:()=>c,Q:()=>u});var r=n(65863),l=n(24815),a=n(70086),s=n(89469),o=n(31324),d=n(16263);let i=(0,l.createContext)(null);function c(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[c,u]=(0,l.useState)(n),[m,p]=(0,l.useState)(""),[h]=(0,l.useState)(()=>new o.ki(n));(0,l.useEffect)(()=>{let e=(0,a.Fp)();u(e),h.updateConfig(e),p((0,s.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();h.updateConfig(t),u(t),(0,d.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,d.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let f=e=>{u(t=>{let n={...t,...e};return(0,a.Qc)(e),h.updateConfig(n),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},v=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,l.useMemo)(()=>({config:c,setConfig:f,client:h,sessionId:m,setSessionId:v}),[c,h,m]);return(0,r.jsx)(i.Provider,{value:b,children:t})}function u(){let e=(0,l.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},50984:(e,t,n)=>{Promise.resolve().then(n.bind(n,77800))},55049:(e,t,n)=>{"use strict";n.d(t,{EF:()=>o,m6:()=>s});var r=n(65863);let l=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),a=/fail|error|block|stall|cancel|abort/i;function s(e,t){if((null==e?void 0:e.kind)!=="ready")return null;let n=e.data.reduce((e,t)=>!e||Date.parse(t.startedAt)>Date.parse(e.startedAt)?t:e,null);return!n||l.has(n.status.toLowerCase())&&t-Date.parse(n.startedAt)>864e5?null:n}function o(e){var t,n;let{result:o,onSelect:d,selectedRun:i,expectedRunId:c,now:u=Date.now()}=e,m=void 0===i?s(o,u):i;if(c&&(null==m?void 0:m.runId)!==c)return(0,r.jsx)("p",{role:"status",children:"발행 진행 \xb7 노드 흐름: 런이 달라 못 잼"});if(!m)return null;let p=Math.max(0,m.path.findIndex(e=>{var t;return(null==(t=m.nodes.find(t=>t.nodeId===e))?void 0:t.ok)!==!0})),h=m.path.length>0&&m.path.every(e=>{var t;return(null==(t=m.nodes.find(t=>t.nodeId===e))?void 0:t.ok)===!0})?m.path.length-1:p,f=m.path[h],v=m.nodes.find(e=>e.nodeId===f),b="done"===m.status.toLowerCase()&&(null==v?void 0:v.ok)===!1,x=!b&&((null==v?void 0:v.ok)===!1||a.test(m.status))?null==v||null==(t=v.summary.split(/\r?\n/,1)[0])?void 0:t.trim():null,y=l.has(m.status.toLowerCase()),g=y?function(e){let t=Date.parse(e.startedAt),n=e.path.map(t=>{var n;let r=null==(n=e.nodes.find(e=>e.nodeId===t))?void 0:n.endedAt;return r?Date.parse(r):NaN}).filter(Number.isFinite);return Number.isFinite(t)&&0!==n.length?Math.max(0,Math.floor((Math.max(...n)-t)/6e4)):null}(m):null,w=y?null:Math.max(0,Math.floor((u-Date.parse(m.startedAt))/6e4));return(0,r.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":m.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>d(m),className:"flex w-full min-w-0 items-center gap-2 text-left text-sm hover:text-primary",children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap font-semibold",children:["발행 ",null!=(n=m.version)?n:"판 미상"]}),y?(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==g?" \xb7 걸린 시간 ".concat(g,"분"):""]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=f?f:"노드 미상"," (",m.path.length?h+1:0,"/",m.path.length,")"]}),(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(w)?w:0,"분"]})]}),(0,r.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:m.path.map((e,t)=>{let n=m.nodes.find(t=>t.nodeId===e),l=!y&&t===h,a=y||t<h;return(0,r.jsxs)("span",{"aria-current":l?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(l?"border-primary bg-primary/10 font-semibold":!y&&t>h?"opacity-50":""),children:[a?(null==n?void 0:n.ok)===!0?"✓ ":(null==n?void 0:n.ok)===!1?"✗ ":"":"",e]},"".concat(e,"-").concat(t))})})]}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["상태: ",m.status]}),b&&(0,r.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),x&&(0,r.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",x]})]})}},63169:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e}function a(e){return l(e)&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,19)===e.slice(0,19)}function s(e){return r(e)&&l(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&l(e.summary)&&(void 0===e.startedAt||null===e.startedAt||l(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||l(e.endedAt))}n.d(t,{HG:()=>x,Kh:()=>b,Nn:()=>f,oc:()=>v});let o=new Set(["pending","running","done","retry","timeout","failed"]),d=e=>void 0===e||"number"==typeof e&&Number.isFinite(e);function i(e){return!!(r(e)&&l(e.runId)&&l(e.status)&&l(e.startedAt)&&(null===e.version||l(e.version))&&Array.isArray(e.path)&&e.path.every(l)&&Array.isArray(e.nodes)&&e.nodes.every(s))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!l(e.version)||!l(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&l(e.id)&&o.has(e.state)&&d(e.plannedMin)&&d(e.installSec)&&d(e.rc)&&(void 0===e.waitReason||l(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...o].every(e=>Number.isInteger(t.counts[e]))&&Array.isArray(t.waitReasons)&&t.waitReasons.every(e=>r(e)&&l(e.reason)&&Number.isInteger(e.count))&&(null===t.etaMin||"number"==typeof t.etaMin)&&(null===t.staleMin||"number"==typeof t.staleMin)&&(void 0===t.overrunMin||"number"==typeof t.overrunMin)}(e.gateShards)&&delete e.gateShards,!0)}function c(e){return r(e)&&l(e.id)&&l(e.title)&&l(e.status)&&(void 0===e.owner||l(e.owner))&&l(e.updatedAt)&&(void 0===e.evidence||l(e.evidence))}let u=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&l(e.id)&&l(e.title)&&(null===e.open||u(e.open))&&(null===e.landed||u(e.landed))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||l(e.role))&&(null===e.now||r(e.now)&&l(e.now.text)&&l(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&l(e.title)&&l(e.at)&&(null===e.checklistId||l(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&l(e.id)&&l(e.title)&&"red"===e.status))&&(null===e.pendingDecisions||u(e.pendingDecisions))&&(null===e.checklist||r(e.checklist)&&["green","yellow","red","done"].every(t=>u(e.checklist[t])))&&(void 0===e.subSeats||null===e.subSeats||Array.isArray(e.subSeats)&&e.subSeats.every(m))}async function h(e,t,n){try{let r=await e.fetchResponse(t,{method:"GET"});if(403===r.status)return{kind:"forbidden"};if(!r.ok)return{kind:"error",status:r.status};let l=n(await r.json());return null===l?{kind:"error",status:r.status}:{kind:"ready",data:l}}catch(e){return{kind:"error",status:0}}}function f(e,t){return h(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&l(e.date)&&Array.isArray(e.seats)&&e.seats.every(p)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function v(e,t){return h(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(i)?e:null)}function b(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&l(e.log)?{log:e.log}:null)}function x(e,t){return h(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,s,o;if(!(r(e)&&l(e.version)&&(void 0===e.codename||l(e.codename))&&Array.isArray(e.items)&&e.items.every(c)&&["green","yellow","red","done"].every(t=>void 0===e[t]||Number.isInteger(e[t])&&e[t]>=0)&&(void 0===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(l))&&(void 0===e.byOwner||r(e.byOwner)&&Object.values(e.byOwner).every(e=>Number.isInteger(e)&&e>=0))&&(void 0===e.history||Array.isArray(e.history))))return null;let d={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in d&&d[t.status]++;return{version:e.version,...void 0!==e.codename?{codename:e.codename}:{},schedule:r(e.schedule)&&a(e.schedule.cutAt)&&(null===e.schedule.landBy||a(e.schedule.landBy))?{cutAt:e.schedule.cutAt,landBy:e.schedule.landBy}:null,items:e.items,green:null!=(t=e.green)?t:d.green,yellow:null!=(n=e.yellow)?n:d.yellow,red:null!=(s=e.red)?s:d.red,done:null!=(o=e.done)?o:d.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},76072:(e,t,n)=>{"use strict";var r=n(33912);n.o(r,"useParams")&&n.d(t,{useParams:function(){return r.useParams}}),n.o(r,"usePathname")&&n.d(t,{usePathname:function(){return r.usePathname}}),n.o(r,"useRouter")&&n.d(t,{useRouter:function(){return r.useRouter}}),n.o(r,"useSearchParams")&&n.d(t,{useSearchParams:function(){return r.useSearchParams}})},77800:(e,t,n)=>{"use strict";n.d(t,{SeatBoardView:()=>f});var r=n(65863),l=n(24815),a=n(76072),s=n(45695),o=n(63169),d=n(55049),i=n(22717);let c=[{seat:"OP",role:"COO"},{seat:"MK",role:"CMO"},{seat:"TC",role:"CTO"},{seat:"UX",role:"CXO"}];function u(e){return null===e?"못 읽음":String(e)}function m(e,t,n){let r=e.split(/\r?\n/);return t?r.filter(e=>(0,i.Wf)(e)&&!n.some(t=>e.includes(t))).map(i.Es):r}function p(e){var t,n,l,a,s,o;let{seat:d,role:c,publicCapture:p,identifiers:h}=e,f=null!=(t=null==d?void 0:d.landed)?t:null,v=null!=(n=null==d?void 0:d.blocked)?n:null,b=null!=(l=null==d?void 0:d.checklist)?l:null;return(0,r.jsxs)("article",{className:"min-w-0 space-y-5 rounded-2xl border bg-card p-5 shadow-sm","aria-label":"".concat(c," 자리"),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-3xl font-bold tracking-tight",children:c}),(0,r.jsx)("div",{className:"mt-3 min-h-12 break-words text-muted-foreground","aria-label":"지금 하는 일",children:(null==d?void 0:d.now)?m((0,i.q9)(d.now.text),p,h).map((e,t)=>(0,r.jsx)("p",{children:e},t)):"못 읽음"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 착지",children:[(0,r.jsxs)("h3",{className:"font-semibold",children:["오늘 착지 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===f?"text-muted-foreground":""),children:u(null!=(a=null==f?void 0:f.length)?a:null)})]}),f&&(0,r.jsx)("ul",{className:"mt-2 space-y-1",children:f.slice(-5).reverse().flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"#".concat(e.pr," \xb7 ").concat(t)},"".concat(e.pr,"-").concat(n))))})]}),(0,r.jsxs)("section",{"aria-label":"막힘",children:[(0,r.jsxs)("h3",{className:"font-semibold text-red-600 dark:text-red-400",children:["막힘 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat(null===v?"text-muted-foreground":""),children:u(null!=(s=null==v?void 0:v.length)?s:null)})]}),v&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:v.flatMap(e=>m(e.title,p,h).map((t,n)=>(0,r.jsx)("li",{className:"break-words",children:p?t:"".concat(e.id," \xb7 ").concat(t)},"".concat(e.id,"-").concat(n))))})]}),(0,r.jsxs)("p",{children:["대표 결정 대기 ",(0,r.jsx)("strong",{className:"".concat(p?"text-5xl":"text-3xl"," ").concat((null==d?void 0:d.pendingDecisions)==null?"text-muted-foreground":""),children:u(null!=(o=null==d?void 0:d.pendingDecisions)?o:null)})]}),(0,r.jsx)("section",{"aria-label":"칸 상태",className:"flex flex-wrap gap-2 border-t pt-3",children:b?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,t)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(b[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][t]," ",b[e]]},e))}):(0,r.jsx)("span",{className:"text-muted-foreground",children:"못 읽음"})}),(null==d?void 0:d.subSeats)&&d.subSeats.length>0&&(0,r.jsx)("ul",{"aria-label":"하위 자리",className:"space-y-1 border-t pt-3",children:d.subSeats.map(e=>{var t,n,l;let a="└ ".concat(e.id," ").concat(e.title," \xb7 열린 칸 ").concat(u(e.open)," \xb7 오늘 착지 ").concat(u(e.landed)," \xb7 막힘 ").concat(u(null!=(l=null==(t=e.blocked)?void 0:t.length)?l:null)),s=(null==(n=e.blocked)?void 0:n.length)?" \xb7 ".concat(e.blocked.map(e=>e.id).join(", ")):"",o=p?m(a,!0,h):[a],d=p?m(s,!0,h):[s];return o.map((t,n)=>(0,r.jsxs)("li",{className:"break-words",children:[t,d.join("")]},"".concat(e.id,"-").concat(n)))})})]})}function h(e){let{result:t,refreshedAt:n,publicCapture:l=!1,releaseStrip:a}=e;if((null==t?void 0:t.kind)==="forbidden")return(0,r.jsx)("p",{children:"운영자만 볼 수 있습니다"});let s=(null==t?void 0:t.kind)==="ready"?t.data.seats:[],o=s.flatMap(e=>{var t,n,r;return[...(null!=(t=e.landed)?t:[]).flatMap(e=>[String(e.pr),...e.checklistId?[e.checklistId]:[]]),...(null!=(n=e.blocked)?n:[]).map(e=>e.id),...(null!=(r=e.subSeats)?r:[]).flatMap(e=>{var t;return(null!=(t=e.blocked)?t:[]).map(e=>e.id)})]});return(0,r.jsxs)("main",{className:"mx-auto w-full max-w-[1920px] space-y-6 p-4 text-foreground md:p-8 ".concat(l?"flex min-h-screen flex-col text-base":""),children:[!l&&a,(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-muted-foreground",children:"운영 / 자리 현황"}),(0,r.jsx)("h1",{className:"text-3xl font-bold",children:"자리 현황"})]}),(0,r.jsxs)("section",{"aria-label":"오늘 합계",className:"flex flex-wrap items-center gap-x-8 gap-y-3 rounded-2xl border bg-card p-5",children:[["landed","blocked","pendingDecisions"].map(e=>{let n=(null==t?void 0:t.kind)!=="ready"||c.some(t=>{var n;let{seat:r}=t;return!s.find(e=>e.seat===r)||(null==(n=s.find(e=>e.seat===r))?void 0:n[e])===null})?"못 읽음":String(s.reduce((t,n)=>t+("pendingDecisions"===e?n.pendingDecisions:n[e].length),0));return(0,r.jsxs)("p",{children:["landed"===e?"오늘 착지":"blocked"===e?"막힘":"결정 대기"," ",(0,r.jsx)("strong",{className:"".concat(l?"text-5xl":"text-3xl").concat("못 읽음"===n?" text-muted-foreground":""),children:n})]},e)}),(0,r.jsxs)("p",{children:["마지막 갱신 ",(0,r.jsx)("time",{dateTime:null!=n?n:void 0,children:n?new Date(n).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"}):"못 읽음"})]})]}),null===t&&(0,r.jsx)("p",{role:"status",children:"자리 현황을 불러오는 중…"}),(null==t?void 0:t.kind)==="error"&&(0,r.jsxs)("p",{role:"alert",children:["자리 현황을 불러오지 못했습니다 (",t.status,")"]}),(null==t?void 0:t.kind)==="ready"&&(0,r.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 min-[1440px]:grid-cols-4",children:c.map(e=>{let{seat:t,role:n}=e;return(0,r.jsx)(p,{seat:s.find(e=>e.seat===t),role:n,publicCapture:l,identifiers:o},t)})}),l&&(0,r.jsx)("footer",{className:"mt-auto border-t pt-4 text-center font-semibold tracking-wide",children:"PUBLIC CAPTURE \xb7 가린 화면"})]})}function f(){let{client:e}=(0,s.Q)(),t=(0,a.useRouter)(),[n,i]=(0,l.useState)(null),[c,u]=(0,l.useState)(null),[m,p]=(0,l.useState)(null),[f,v]=(0,l.useState)(null);return((0,l.useEffect)(()=>{v("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,l.useEffect)(()=>{let t=!0,n=!1,r=!1,l=async()=>{if(!t||n||r||document.hidden)return;n=!0;let l=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),a=await (0,o.Nn)(e,l);n=!1,t&&(u(a),"forbidden"===a.kind&&(r=!0),"ready"===a.kind&&p(new Date().toISOString()))};u(null),p(null),l();let a=window.setInterval(()=>{l()},3e4),s=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(a),document.removeEventListener("visibilitychange",s)}},[e]),(0,l.useEffect)(()=>{if(!1!==f||(null==c?void 0:c.kind)==="forbidden")return;let t=!0,n=!1,r=!1,l=async()=>{if(!t||n||r||document.hidden)return;n=!0;let l=await (0,o.oc)(e);n=!1,t&&(i(l),"forbidden"===l.kind&&(r=!0))};i(null),l();let a=window.setInterval(()=>{l()},1e4),s=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(a),document.removeEventListener("visibilitychange",s)}},[e,f,(null==c?void 0:c.kind)==="forbidden"]),null===f)?null:(0,r.jsx)(h,{result:c,refreshedAt:m,publicCapture:f,releaseStrip:(0,r.jsx)(d.EF,{result:n,onSelect:e=>t.push("/ops/release?run=".concat(encodeURIComponent(e.runId)))})})}},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>s,f6:()=>l,oD:()=>a});let r="elanous.daemon.sessionId";function l(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=l();return localStorage.setItem(r,t),t}function s(){let e=l();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=50984)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4635],{45695:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var n=r(65863),s=r(24815),o=r(70086),a=r(89469),l=r(31324),i=r(16263);let c=(0,s.createContext)(null);function d(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[d,u]=(0,s.useState)(r),[m,f]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new l.ki(r));(0,s.useEffect)(()=>{let e=(0,o.Fp)();u(e),p.updateConfig(e),f((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,o.Fp)();p.updateConfig(t),u(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&f(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)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,o.Qc)(e),p.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},g=e=>{f(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:d,setConfig:x,client:p,sessionId:m,setSessionId:g}),[d,p,m]);return(0,n.jsx)(c.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},63346:(e,t,r)=>{Promise.resolve().then(r.bind(r,94200))},89469:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>a,f6:()=>s,oD:()=>o});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function o(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function a(){let e=s();return localStorage.setItem(n,e),e}},94200:(e,t,r)=>{"use strict";r.d(t,{OutputsList:()=>i});var n=r(65863),s=r(24815),o=r(45695);let a={OP:"COO",MK:"CMO",TC:"CTO",UX:"CXO"},l=new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function i(){let{client:e}=(0,o.Q)(),[t,r]=(0,s.useState)([]),[a,l]=(0,s.useState)("all"),[i,d]=(0,s.useState)("loading");return(0,s.useEffect)(()=>{let t=!0;return(function(e){let{limit:t,source:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new URLSearchParams;void 0!==t&&n.set("limit",String(t)),void 0!==r&&n.set("source",r);let s=n.toString();return e.fetchJson("/v1/outputs".concat(s?"?".concat(s):""))})(e).then(e=>{let{outputs:n}=e;t&&(r(n),d("ready"))}).catch(()=>{t&&d("error")}),()=>{t=!1}},[e]),(0,n.jsx)(c,{outputs:t,selected:a,onSelect:l,status:i})}function c(e){let{outputs:t,selected:r,onSelect:s,status:o}=e,i=Array.from(new Map(t.map(e=>[e.kind,e.kindLabel])).entries()),c="all"===r?t:t.filter(e=>e.kind===r);return(0,n.jsxs)("main",{className:"mx-auto w-full max-w-3xl space-y-8 px-5 py-10 sm:py-16",children:[(0,n.jsxs)("header",{className:"space-y-2",children:[(0,n.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"산출물"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"엘라누스가 만든 문서\xb7슬라이드\xb7보고서\xb7영상을 한곳에서 봅니다."})]}),"loading"===o&&(0,n.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"산출물을 불러오는 중…"}),"error"===o&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:"산출물 목록을 읽지 못했습니다"}),"ready"===o&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{role:"group","aria-label":"종류 고르기",className:"flex flex-wrap gap-2",children:[["all","전부"],...i].map(e=>{let[o,a]=e;return(0,n.jsxs)("button",{type:"button",onClick:()=>s(o),"aria-pressed":r===o,className:"rounded-full border px-3 py-1.5 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(r===o?"border-primary bg-primary text-primary-foreground":"border-border bg-card text-foreground hover:bg-muted"),children:[a," ","all"===o?t.length:t.filter(e=>e.kind===o).length]},o)})}),0===t.length?(0,n.jsx)("p",{className:"rounded-xl border border-dashed border-border px-5 py-10 text-center text-sm text-muted-foreground",children:"아직 만든 산출물이 없습니다 — 일을 맡기면 여기에 쌓입니다"}):(0,n.jsx)("ul",{className:"space-y-3","aria-label":"산출물 목록",children:c.map((e,t)=>{var r;return(0,n.jsxs)("li",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,n.jsx)("span",{className:"rounded-md bg-muted px-2 py-1 font-medium text-foreground",children:e.kindLabel}),e.seat&&(0,n.jsx)("span",{children:null!=(r=a[e.seat])?r:e.seat}),(0,n.jsx)("time",{dateTime:e.at,children:function(e){let t=Object.fromEntries(l.formatToParts(new Date(e)).map(e=>{let{type:t,value:r}=e;return[t,r]}));return"".concat(t.month,"월 ").concat(t.day,"일 ").concat(t.hour,":").concat(t.minute)}(e.at)}),(0,n.jsx)("span",{children:"exec"===e.source?"맡긴 일":"현장"})]}),(0,n.jsx)("h2",{className:"mt-3 font-semibold leading-snug",children:e.title}),e.url?(0,n.jsx)("a",{href:e.url,target:"_blank",rel:"noopener",className:"mt-3 inline-block text-sm font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"열기"}):e.fileName&&(0,n.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:e.fileName})]},"".concat(e.at,"-").concat(e.kind,"-").concat(t))})})]})]})}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=63346)),_N_E=e.O()}]);