elanous 0.2.23 → 0.2.24

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 (347) 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/{272-b23d2e92161d11fd.js → 272-0eed0fb0aab716b6.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{3961-fbef064c213b2b18.js → 3961-aaae04ed1d32622f.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/app/approvals/{page-d5341ac96203a983.js → page-3b9fc39362473ae7.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/app/board/{page-55c631c032dcc47e.js → page-d7602d489edf5f37.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-ad3bd8084048bee4.js → page-24282bf9f90031a5.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/app/ceo/{page-5c5d0e370f495ef6.js → page-4eb84d454f8c3415.js} +1 -1
  11. package/apps/pwa/out/_next/static/chunks/app/chat/{page-c325e21543cd48a8.js → page-b2e494bdad57fcb5.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/app/consult/{page-6168a7c43e6ef8f5.js → page-c0ab229673a8b0eb.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/app/editor/{page-25bb425afdb27541.js → page-bf88c0f558d8ef54.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/app/exec/{page-32d72fdef1afe11a.js → page-52fec523e5b5d3ad.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/app/inside/{page-2bd9ce9c020d02d4.js → page-22725e2570f1126b.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/app/intake/{page-a34096245e63b9f2.js → page-1891335950d68b70.js} +1 -1
  21. package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/app/live/{page-4cc66d22ca4ec502.js → page-c314b75c11234998.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83b14c729fcea837.js → page-9f9c85415f61782b.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-ccdb83ed40c8d724.js → page-8526c17ae38e6a50.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/app/morning/{page-7ad3de8fa06fdea9.js → page-f998637a8402115c.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-786111f30b6f0969.js → page-6f23159fedb41f67.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-48fb31810693c357.js → page-1d809a87139dd024.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/app/ops/seats/{page-4e17cce5e2ed0fee.js → page-da9e570234d481fd.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-cb154acadb025414.js → page-b92caddb5c715f30.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/app/reflection/{page-c2dd2b19c93f90ab.js → page-57ffeeb6019440fd.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/app/sessions/{page-d3c007c8a0ddd7ee.js → page-2c2b3f29cec1efa4.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-7837ce2aacb97b04.js → page-9369279f72fc7b51.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/app/showroom/{page-119be9a0444d2482.js → page-b5c0c996f329371e.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/app/tasks/{page-fa806c018833e332.js → page-89881ccbcf728978.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/app/today/{page-d431fbdea6ad93dd.js → page-58d4e5cb30ef4871.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-847c3de6ca8a4416.js → page-acf868c64d77f950.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/workspace/{page-74e69ba2c8e970d4.js → page-bc79f0833533fa84.js} +1 -1
  52. package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-70038f41ae7cf931.js → page-d5c4398eea03d8f3.js} +1 -1
  53. package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
  54. package/apps/pwa/out/approvals/index.html +1 -1
  55. package/apps/pwa/out/approvals/index.txt +14 -14
  56. package/apps/pwa/out/autopilot/index.html +1 -1
  57. package/apps/pwa/out/autopilot/index.txt +14 -14
  58. package/apps/pwa/out/board/index.html +1 -1
  59. package/apps/pwa/out/board/index.txt +14 -14
  60. package/apps/pwa/out/botlab/index.html +1 -1
  61. package/apps/pwa/out/botlab/index.txt +14 -14
  62. package/apps/pwa/out/bots/index.html +1 -1
  63. package/apps/pwa/out/bots/index.txt +14 -14
  64. package/apps/pwa/out/ceo/index.html +1 -1
  65. package/apps/pwa/out/ceo/index.txt +14 -14
  66. package/apps/pwa/out/chat/index.html +1 -1
  67. package/apps/pwa/out/chat/index.txt +14 -14
  68. package/apps/pwa/out/consult/index.html +1 -1
  69. package/apps/pwa/out/consult/index.txt +14 -14
  70. package/apps/pwa/out/control/index.html +1 -1
  71. package/apps/pwa/out/control/index.txt +14 -14
  72. package/apps/pwa/out/decisions/index.html +1 -1
  73. package/apps/pwa/out/decisions/index.txt +14 -14
  74. package/apps/pwa/out/design-check/index.html +1 -1
  75. package/apps/pwa/out/design-check/index.txt +14 -14
  76. package/apps/pwa/out/editor/index.html +1 -1
  77. package/apps/pwa/out/editor/index.txt +14 -14
  78. package/apps/pwa/out/exec/index.html +1 -1
  79. package/apps/pwa/out/exec/index.txt +14 -14
  80. package/apps/pwa/out/field/index.html +1 -1
  81. package/apps/pwa/out/field/index.txt +14 -14
  82. package/apps/pwa/out/healthz +1 -1
  83. package/apps/pwa/out/index.html +1 -1
  84. package/apps/pwa/out/index.txt +14 -14
  85. package/apps/pwa/out/inside/index.html +1 -1
  86. package/apps/pwa/out/inside/index.txt +14 -14
  87. package/apps/pwa/out/intake/index.html +1 -1
  88. package/apps/pwa/out/intake/index.txt +14 -14
  89. package/apps/pwa/out/live/index.html +1 -1
  90. package/apps/pwa/out/live/index.txt +14 -14
  91. package/apps/pwa/out/live-run/index.html +1 -1
  92. package/apps/pwa/out/live-run/index.txt +14 -14
  93. package/apps/pwa/out/loops/index.html +1 -1
  94. package/apps/pwa/out/loops/index.txt +14 -14
  95. package/apps/pwa/out/market/index.html +1 -1
  96. package/apps/pwa/out/market/index.txt +14 -14
  97. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  98. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  99. package/apps/pwa/out/morning/index.html +1 -1
  100. package/apps/pwa/out/morning/index.txt +14 -14
  101. package/apps/pwa/out/observatory/index.html +1 -1
  102. package/apps/pwa/out/observatory/index.txt +14 -14
  103. package/apps/pwa/out/ops/checklist/index.html +1 -1
  104. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  105. package/apps/pwa/out/ops/release/index.html +1 -1
  106. package/apps/pwa/out/ops/release/index.txt +14 -14
  107. package/apps/pwa/out/ops/seats/index.html +1 -1
  108. package/apps/pwa/out/ops/seats/index.txt +14 -14
  109. package/apps/pwa/out/outputs/index.html +1 -1
  110. package/apps/pwa/out/outputs/index.txt +14 -14
  111. package/apps/pwa/out/reflection/index.html +1 -1
  112. package/apps/pwa/out/reflection/index.txt +15 -15
  113. package/apps/pwa/out/scheduler/index.html +1 -1
  114. package/apps/pwa/out/scheduler/index.txt +14 -14
  115. package/apps/pwa/out/sessions/index.html +1 -1
  116. package/apps/pwa/out/sessions/index.txt +14 -14
  117. package/apps/pwa/out/settings/devices/index.html +1 -1
  118. package/apps/pwa/out/settings/devices/index.txt +14 -14
  119. package/apps/pwa/out/settings/index.html +1 -1
  120. package/apps/pwa/out/settings/index.txt +14 -14
  121. package/apps/pwa/out/setup/done/index.html +1 -1
  122. package/apps/pwa/out/setup/done/index.txt +14 -14
  123. package/apps/pwa/out/setup/index.html +1 -1
  124. package/apps/pwa/out/setup/index.txt +14 -14
  125. package/apps/pwa/out/share/index.html +1 -1
  126. package/apps/pwa/out/share/index.txt +14 -14
  127. package/apps/pwa/out/showroom/index.html +1 -1
  128. package/apps/pwa/out/showroom/index.txt +14 -14
  129. package/apps/pwa/out/tasks/index.html +1 -1
  130. package/apps/pwa/out/tasks/index.txt +14 -14
  131. package/apps/pwa/out/term/index.html +1 -1
  132. package/apps/pwa/out/term/index.txt +14 -14
  133. package/apps/pwa/out/today/index.html +1 -1
  134. package/apps/pwa/out/today/index.txt +14 -14
  135. package/apps/pwa/out/trace/index.html +1 -1
  136. package/apps/pwa/out/trace/index.txt +14 -14
  137. package/apps/pwa/out/vault/index.html +1 -1
  138. package/apps/pwa/out/vault/index.txt +14 -14
  139. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  140. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  141. package/apps/pwa/out/workflows/index.html +1 -1
  142. package/apps/pwa/out/workflows/index.txt +14 -14
  143. package/apps/pwa/out/workspace/index.html +1 -1
  144. package/apps/pwa/out/workspace/index.txt +14 -14
  145. package/apps/pwa/out/worktrees/index.html +1 -1
  146. package/apps/pwa/out/worktrees/index.txt +14 -14
  147. package/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
  148. package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
  149. package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
  150. package/catalog/providers/openrouter.yaml +2 -0
  151. package/graphs/implement-loop.yaml +31 -0
  152. package/graphs/ops/harness-gc.yaml +17 -0
  153. package/graphs/ops/recipes.yaml +3 -0
  154. package/graphs/overlays/README.md +1 -1
  155. package/graphs/overlays/stop-heal-ladder.yaml +105 -0
  156. package/package.json +1 -1
  157. package/scripts/add-api-key.sh +1 -1
  158. package/scripts/ci-typecheck-changed.ts +71 -14
  159. package/scripts/fleet/bedrock-pod-secret.ts +122 -0
  160. package/scripts/fleet/node-setup-linux.sh +97 -0
  161. package/scripts/fleet/node-setup.sh +11 -0
  162. package/scripts/fleet/zai-pod-secret.ts +86 -0
  163. package/scripts/land-global-checks.ts +3 -0
  164. package/scripts/measure-log-diet-2.ts +213 -0
  165. package/scripts/measure-tsc-affected-roots.ts +289 -0
  166. package/scripts/release-loop/gate-executor.ts +28 -0
  167. package/scripts/release-loop/gate-node.ts +262 -26
  168. package/scripts/release-loop/resume-release.ts +9 -3
  169. package/scripts/release-loop/resume.ts +41 -0
  170. package/scripts/release-loop/unattended-release.ts +22 -7
  171. package/scripts/tsc-baseline-cache.ts +147 -0
  172. package/scripts/usage-rollup.ts +58 -6
  173. package/src/agent/run-context.ts +10 -0
  174. package/src/agent-mission/driver.ts +18 -3
  175. package/src/agent-mission/resource-ladder.ts +8 -3
  176. package/src/agent-mission/review-loop.ts +8 -2
  177. package/src/agent-substrate/acp-implementer.ts +139 -0
  178. package/src/agent-substrate/pr-reviewer.ts +31 -4
  179. package/src/agent-substrate/self-review-cli.ts +48 -9
  180. package/src/autopilot/mission-critique.ts +18 -5
  181. package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
  182. package/src/autopilot/mission-trace.ts +12 -1
  183. package/src/autopilot/system-lookback-run.ts +16 -10
  184. package/src/bench/bench.ts +183 -0
  185. package/src/budget/fetchers/grok.ts +15 -5
  186. package/src/budget/llm-cost.ts +37 -5
  187. package/src/budget/types.ts +8 -2
  188. package/src/budget/unified-usage.ts +88 -6
  189. package/src/cli/bench-cli.ts +34 -0
  190. package/src/cli/guardian-cli.ts +26 -1
  191. package/src/cli/image-cli.ts +101 -0
  192. package/src/cli/log-event-names.ts +4 -0
  193. package/src/cli/pr-cli.ts +62 -5
  194. package/src/cli/pr-land-overlap-evidence.ts +160 -12
  195. package/src/cli/release-cli.ts +18 -9
  196. package/src/cli/rfc-status.ts +52 -2
  197. package/src/cli/self-update.ts +104 -0
  198. package/src/cli/tasks-cli.ts +109 -4
  199. package/src/cli/usage-cli.ts +91 -8
  200. package/src/core-turn/run-goal-loop.ts +5 -4
  201. package/src/dashboard/ad-run-setup-bindings.ts +279 -0
  202. package/src/dashboard/index.ts +18 -276
  203. package/src/dashboard/stale-install-check.ts +11 -0
  204. package/src/debug/log-diet.ts +38 -7
  205. package/src/debug/log.ts +19 -1
  206. package/src/domains/release-tool.ts +39 -0
  207. package/src/error-report/report.ts +21 -4
  208. package/src/github/pr-labels.ts +1 -0
  209. package/src/graph-runner/graph-cli.ts +42 -1
  210. package/src/graph-runner/runner.ts +167 -6
  211. package/src/grok/usage.ts +23 -2
  212. package/src/grounding/ref-index.ts +253 -0
  213. package/src/harness/dispatch-backpressure.ts +10 -2
  214. package/src/harness/harness-clean.ts +199 -78
  215. package/src/harness/harness-cli-command.ts +122 -7
  216. package/src/harness/harness-gc.ts +331 -0
  217. package/src/harness/harness-stop.ts +4 -2
  218. package/src/harness/harness-substrate-default.ts +142 -7
  219. package/src/harness/launch-registry.ts +6 -0
  220. package/src/harness/worktree-branch-prefix.ts +9 -0
  221. package/src/hq/fence.ts +187 -0
  222. package/src/hq/seats.ts +38 -22
  223. package/src/images/image-ledger.ts +179 -0
  224. package/src/index.ts +93 -11
  225. package/src/instance/child-scope.ts +32 -1
  226. package/src/instance/dev-project.ts +133 -0
  227. package/src/instance/resolve.ts +24 -0
  228. package/src/instance/spawn-elanous.ts +45 -0
  229. package/src/intake-plane/ref-prefetch.ts +110 -0
  230. package/src/intelligence-map/model-catalog.ts +72 -0
  231. package/src/llm/bedrock-eventstream.ts +215 -0
  232. package/src/llm/bedrock-provider.ts +114 -41
  233. package/src/llm/bedrock.ts +174 -28
  234. package/src/llm/openrouter-byok-cost.ts +96 -0
  235. package/src/llm/openrouter-deepseek.ts +151 -0
  236. package/src/llm/openrouter-upstream-pins.config.ts +25 -0
  237. package/src/llm/zai-coding-plan.ts +700 -0
  238. package/src/llm.ts +87 -16
  239. package/src/loops/checker.ts +148 -9
  240. package/src/loops/orchestrator/resync-shadow.ts +34 -7
  241. package/src/maturity/feature-maturity.ts +2 -2
  242. package/src/model-tier/llm-tier-map.ts +9 -5
  243. package/src/models/prompts.ts +2 -1
  244. package/src/mss/logging/log-store.ts +58 -11
  245. package/src/nexus/api/missions.ts +73 -2
  246. package/src/nexus/api/ops-api.ts +18 -0
  247. package/src/nexus/index.ts +7 -75
  248. package/src/nexus/tools-kind.ts +78 -0
  249. package/src/oauth/codex-account-rotation.ts +39 -2
  250. package/src/oauth/codex-account-store.ts +323 -24
  251. package/src/oauth/fallback-chain.ts +53 -15
  252. package/src/onboarding/first-run.ts +37 -18
  253. package/src/onboarding/web-first.ts +20 -2
  254. package/src/ops/machine-heartbeat.ts +185 -0
  255. package/src/ops/overview-cache.ts +175 -0
  256. package/src/ops/overview.ts +8 -0
  257. package/src/prompt-cache/openai.ts +3 -0
  258. package/src/prompt-cache/types.ts +5 -0
  259. package/src/prompt-enhance/enhance.ts +23 -0
  260. package/src/release-loop/placement.ts +16 -1
  261. package/src/requirements/requirement-ledger.ts +536 -0
  262. package/src/retro/daily.ts +5 -5
  263. package/src/seat-loop/seat-loop.ts +32 -10
  264. package/src/self-dev/dev-cli.ts +44 -10
  265. package/src/self-dev/dev-pipeline.ts +7 -2
  266. package/src/self-dev/draft-residue.ts +14 -2
  267. package/src/self-dev/draft-sweep.ts +103 -0
  268. package/src/self-dev/graph-journey-route.ts +6 -0
  269. package/src/self-dev/orchestrate-cli.ts +25 -3
  270. package/src/self-dev/orchestrate.ts +41 -6
  271. package/src/self-dev/run-supervisor.ts +188 -15
  272. package/src/self-dev/run-types.ts +13 -0
  273. package/src/self-dev/supervisor-verdict-edges.ts +1 -0
  274. package/src/self-implement/budget-gate.ts +53 -13
  275. package/src/self-implement/child-context-composition.ts +139 -0
  276. package/src/self-implement/child-llm-preference.ts +13 -5
  277. package/src/self-implement/claude-acp-implement.ts +67 -0
  278. package/src/self-implement/flex-signals.ts +59 -0
  279. package/src/self-implement/frozen-merges.ts +8 -3
  280. package/src/self-implement/goal-author-decompose.ts +10 -2
  281. package/src/self-implement/goal-author.ts +24 -9
  282. package/src/self-implement/graph-overlay-condition.ts +28 -0
  283. package/src/self-implement/graph-overlay-yaml.ts +41 -7
  284. package/src/self-implement/graph-templates.ts +33 -1
  285. package/src/self-implement/graph-yaml.ts +56 -0
  286. package/src/self-implement/heal-intake.ts +5 -1
  287. package/src/self-implement/orchestrator.ts +144 -15
  288. package/src/self-implement/running-runs.ts +75 -5
  289. package/src/self-implement/seams.ts +47 -1
  290. package/src/self-implement/self-implement-cli.ts +9 -4
  291. package/src/self-implement/stop-autoheal.ts +69 -2
  292. package/src/session-runtime/retry-policy.ts +2 -1
  293. package/src/steward/launch.ts +5 -4
  294. package/src/steward/triage-budget.ts +62 -0
  295. package/src/steward/triage.ts +83 -22
  296. package/src/task-agent/actions.ts +62 -5
  297. package/src/task-agent/completion-evidence.ts +5 -0
  298. package/src/task-agent/cover.ts +101 -3
  299. package/src/task-agent/judge.ts +16 -0
  300. package/src/task-agent/land-order-ledger.ts +95 -0
  301. package/src/task-agent/live-move-history.ts +87 -1
  302. package/src/task-agent/live-moves.ts +350 -20
  303. package/src/task-agent/rejudge-on-head.ts +75 -20
  304. package/src/task-agent/review-prior-fix.ts +146 -0
  305. package/src/task-agent/run-adopt.ts +136 -0
  306. package/src/task-agent/shadow.ts +53 -9
  307. package/src/task-agent/task-hand.ts +54 -7
  308. package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
  309. package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
  310. package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
  311. package/src/task-orchestrator/surfaces/pod-child-providers.ts +14 -1
  312. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +79 -6
  313. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -5
  314. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +11 -5
  315. package/src/task-orchestrator/surfaces/pod-pool.ts +20 -4
  316. package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
  317. package/src/task-orchestrator/surfaces/self-implement-pod.ts +213 -23
  318. package/src/task-orchestrator/surfaces/self-implement.ts +19 -1
  319. package/src/typecheck-ratchet.ts +1 -0
  320. package/src/user-config.ts +51 -11
  321. package/src/version/packed-revision.json +1 -1
  322. package/src/workflow-runtime/triggers/registry.ts +59 -0
  323. package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
  324. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +0 -1
  325. package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +0 -1
  326. package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +0 -1
  327. package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +0 -1
  328. package/apps/pwa/out/_next/static/chunks/app/design-check/page-a648bc464c9dc754.js +0 -1
  329. package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +0 -1
  330. package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +0 -1
  331. package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +0 -1
  332. package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +0 -1
  333. package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +0 -1
  334. package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +0 -1
  335. package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +0 -1
  336. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +0 -1
  337. package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +0 -1
  338. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +0 -1
  339. package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +0 -1
  340. package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +0 -1
  341. package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +0 -1
  342. package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +0 -1
  343. package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +0 -1
  344. package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +0 -1
  345. package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +0 -1
  346. /package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → Q-7iofoxOEv1WX18S35of}/_buildManifest.js +0 -0
  347. /package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → Q-7iofoxOEv1WX18S35of}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5354],{7681:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(26940),s=n(10672),a=n(69865),l=n(86447),o=n(37990),i=n(49393);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}},10299:(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}:{}}})}},20335:(e,t,n)=>{Promise.resolve().then(n.bind(n,28899))},28899:(e,t,n)=>{"use strict";n.d(t,{ChecklistView:()=>c});var r=n(26940),s=n(10672),a=n(7681),l=n(10299);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})}},86447:(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,[7990,753,4658,7358],()=>e(e.s=20335)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5354],{7681:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(26940),s=n(10672),a=n(69865),l=n(86447),o=n(37990),i=n(49393);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}},10299:(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}:{}}})}},10860:(e,t,n)=>{Promise.resolve().then(n.bind(n,28899))},28899:(e,t,n)=>{"use strict";n.d(t,{ChecklistView:()=>c});var r=n(26940),s=n(10672),a=n(7681),l=n(10299);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})}},86447:(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,[7990,753,4658,7358],()=>e(e.s=10860)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6231],{15285:(e,n,l)=>{Promise.resolve().then(l.bind(l,93986))},61495:(e,n,l)=>{"use strict";l.d(n,{EF:()=>u,m6:()=>s});var t=l(26940);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 u(e){var n,l;let{result:u,onSelect:d,selectedRun:i,now:o=Date.now()}=e,c=void 0===i?s(u,o):i;if(!c)return null;let m=Math.max(0,c.path.findIndex(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)!==!0})),h=c.path.length>0&&c.path.every(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)===!0})?c.path.length-1:m,p=c.path[h],x=c.nodes.find(e=>e.nodeId===p),f="done"===c.status.toLowerCase()&&(null==x?void 0:x.ok)===!1,v=!f&&((null==x?void 0:x.ok)===!1||a.test(c.status))?null==x||null==(n=x.summary.split(/\r?\n/,1)[0])?void 0:n.trim():null,b=r.has(c.status.toLowerCase()),w=b?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}(c):null,k=b?null:Math.max(0,Math.floor((o-Date.parse(c.startedAt))/6e4));return(0,t.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":c.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>d(c),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=c.version)?l:"판 미상"]}),b?(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==w?" \xb7 걸린 시간 ".concat(w,"분"):""]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=p?p:"노드 미상"," (",c.path.length?h+1:0,"/",c.path.length,")"]}),(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(k)?k:0,"분"]})]}),(0,t.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:c.path.map((e,n)=>{let l=c.nodes.find(n=>n.nodeId===e),r=!b&&n===h,a=b||n<h;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":!b&&n>h?"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:["상태: ",c.status]}),f&&(0,t.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,t.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},93986:(e,n,l)=>{"use strict";l.d(n,{ReleaseRunsView:()=>m});var t=l(26940),r=l(10672),a=l(7681),s=l(10299),u=l(61495),d=l(83327);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,l;let{result:r,version:a,versions:s=[],selectedRun:u,openedNodeId:i,log:c,onVersion:m,onRun:h,onNode:p,releaseStrip:x}=e;if((null==r?void 0:r.kind)==="forbidden"||(null==c?void 0:c.kind)==="forbidden")return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let f=(null==r?void 0:r.kind)==="ready"?r.data:[],v=a?f.filter(e=>e.version===a):f,b=u&&null!=(n=v.find(e=>e.runId===u.runId))?n:null,w=[...new Set([...s,...f.map(e=>e.version).filter(e=>!!e)])];return a&&!w.includes(a)&&w.push(a),(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:[x,(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:a,onChange:e=>m(e.target.value),placeholder:"전체 판"}),(0,t.jsx)("datalist",{id:"ops-release-versions",children:w.map(e=>(0,t.jsx)("option",{value:e},e))})]}),null===r?(0,t.jsx)("p",{role:"status",children:"런을 불러오는 중…"}):"error"===r.kind?(0,t.jsxs)("p",{role:"alert",children:["런을 불러오지 못했습니다 (",r.status,")"]}):null,(null==r?void 0:r.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===v.length&&(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 판의 런이 없습니다."}),v.map(e=>{var n;return(0,t.jsxs)("button",{type:"button","aria-pressed":(null==b?void 0:b.runId)===e.runId,onClick:()=>h(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)})]}),b&&(0,t.jsxs)("section",{className:"min-w-0 space-y-3","aria-label":"노드 진행","data-run-id":b.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!=(l=b.version)?l:"판 미상"," \xb7 ",b.status]})]}),(0,t.jsx)(d.af,{run:b,openedNodeId:i,onNode:p}),i&&b.path.includes(i)?(0,t.jsx)(d.Jv,{run:b,nodeId:i,log:c}):(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"노드를 누르면 요약 전문과 로그 꼬리가 열립니다."})]})]})]})}function m(){var e,n,l;let{client:d}=(0,a.Q)(),[o,m]=(0,r.useState)(null),[h,p]=(0,r.useState)([]),[x,f]=(0,r.useState)(null),[v,b]=(0,r.useState)(null),[w,k]=(0,r.useState)(null),[N,j]=(0,r.useState)(null),[I,g]=(0,r.useState)(null),[y,S]=(0,r.useState)(!1),R=(0,r.useRef)(0),C=(0,r.useRef)(!1),D=(0,r.useRef)(null),E=(0,r.useRef)([]),A=(0,r.useRef)(d);(0,r.useEffect)(()=>{var e,n;let l=new URLSearchParams(null!=(n=null==(e=window.location)?void 0:e.search)?n:"").get("run");l&&k(l)},[]),(0,r.useEffect)(()=>{let e=!0;return(A.current!==d&&(A.current=d,C.current=!1,S(!1),p([]),D.current=null,f(null)),C.current)?()=>{e=!1}:(R.current++,j(null),g(null),b(null),E.current=[],null===o&&(D.current=null,f(null)),(0,s.oc)(d,o||void 0).then(n=>{if(e&&!C.current&&(b(n),"forbidden"===n.kind&&(C.current=!0,S(!0)),"ready"===n.kind)&&(E.current=n.data,p(e=>[...new Set([...e,...n.data.map(e=>e.version).filter(e=>!!e)])]),null===o&&null===D.current)){var l,t,r,a,s,d,i,c;let e=new URLSearchParams(null!=(s=null==(l=window.location)?void 0:l.search)?s:"").get("run");D.current=null!=(c=null!=(i=null!=(d=null==(t=n.data.find(n=>n.runId===e))?void 0:t.version)?d:null==(r=(0,u.m6)(n,Date.now()))?void 0:r.version)?i:null==(a=n.data[0])?void 0:a.version)?c:null,f(D.current)}}),()=>{e=!1})},[d,o]);let F=!y&&((null==v?void 0:v.kind)==="ready"||(null==v?void 0:v.kind)==="error")&&E.current.some(e=>!i.includes(e.status.toLowerCase()));(0,r.useEffect)(()=>{if(!F)return;let e=!0,n=!1,l=async()=>{if(n||document.hidden||!e||C.current||!E.current.some(e=>!i.includes(e.status.toLowerCase())))return;n=!0;let l=await (0,s.oc)(d,o||void 0);n=!1,e&&!C.current&&(b(l),"ready"===l.kind&&(E.current=l.data),"forbidden"===l.kind&&(C.current=!0,S(!0)))},t=window.setInterval(()=>{l()},1e4),r=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",r),()=>{e=!1,window.clearInterval(t),document.removeEventListener("visibilitychange",r)}},[d,o,F]);let L=null===o?x:o,M=(null==v?void 0:v.kind)==="ready"?v.data.filter(e=>!L||e.version===L):[],_=null!=(n=null!=(e=M.find(e=>e.runId===w))?e:(0,u.m6)({kind:"ready",data:M},Date.now()))?n:M[0],K=null!=(l=null!=L?L:null==_?void 0:_.version)?l:"",T=null==_?void 0:_.runId;(0,r.useEffect)(()=>{R.current++,j(null),g(null)},[T]);let P=(0,r.useCallback)(e=>{(e!==x||null!==o)&&(R.current++,f(null),m(e),k(null),j(null),g(null))},[o,x]),O=e=>{R.current++,k(e),j(null),g(null)};if(y)return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let U=N&&N.runId===T?N.nodeId:null,V=I&&I.runId===T&&I.nodeId===U?I.result:null;return(0,t.jsx)(c,{result:v,version:K,versions:h,selectedRun:null!=_?_:null,openedNodeId:U,log:V,onVersion:P,onRun:O,onNode:e=>{if(!_||(null==v?void 0:v.kind)!=="ready")return;let n=++R.current,l=_.runId;if((null==N?void 0:N.runId)===l&&N.nodeId===e){j(null),g(null);return}j({runId:l,nodeId:e}),g(null),(0,s.Kh)(d,l,e).then(t=>{n!==R.current||C.current||("forbidden"===t.kind&&(C.current=!0,S(!0)),g({runId:l,nodeId:e,result:t}))})},releaseStrip:(0,t.jsx)(u.EF,{result:v,selectedRun:null!=_?_:null,onSelect:e=>{if(e.version!==L){var n;m(null!=(n=e.version)?n:""),f(null)}O(e.runId)}})})}}},e=>{e.O(0,[7990,5105,753,4658,7358],()=>e(e.s=15285)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6231],{49458:(e,n,l)=>{Promise.resolve().then(l.bind(l,93986))},61495:(e,n,l)=>{"use strict";l.d(n,{EF:()=>u,m6:()=>s});var t=l(26940);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 u(e){var n,l;let{result:u,onSelect:d,selectedRun:i,now:o=Date.now()}=e,c=void 0===i?s(u,o):i;if(!c)return null;let m=Math.max(0,c.path.findIndex(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)!==!0})),h=c.path.length>0&&c.path.every(e=>{var n;return(null==(n=c.nodes.find(n=>n.nodeId===e))?void 0:n.ok)===!0})?c.path.length-1:m,p=c.path[h],x=c.nodes.find(e=>e.nodeId===p),f="done"===c.status.toLowerCase()&&(null==x?void 0:x.ok)===!1,v=!f&&((null==x?void 0:x.ok)===!1||a.test(c.status))?null==x||null==(n=x.summary.split(/\r?\n/,1)[0])?void 0:n.trim():null,b=r.has(c.status.toLowerCase()),w=b?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}(c):null,k=b?null:Math.max(0,Math.floor((o-Date.parse(c.startedAt))/6e4));return(0,t.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":c.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>d(c),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=c.version)?l:"판 미상"]}),b?(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==w?" \xb7 걸린 시간 ".concat(w,"분"):""]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=p?p:"노드 미상"," (",c.path.length?h+1:0,"/",c.path.length,")"]}),(0,t.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(k)?k:0,"분"]})]}),(0,t.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:c.path.map((e,n)=>{let l=c.nodes.find(n=>n.nodeId===e),r=!b&&n===h,a=b||n<h;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":!b&&n>h?"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:["상태: ",c.status]}),f&&(0,t.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,t.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},93986:(e,n,l)=>{"use strict";l.d(n,{ReleaseRunsView:()=>m});var t=l(26940),r=l(10672),a=l(7681),s=l(10299),u=l(61495),d=l(83327);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,l;let{result:r,version:a,versions:s=[],selectedRun:u,openedNodeId:i,log:c,onVersion:m,onRun:h,onNode:p,releaseStrip:x}=e;if((null==r?void 0:r.kind)==="forbidden"||(null==c?void 0:c.kind)==="forbidden")return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let f=(null==r?void 0:r.kind)==="ready"?r.data:[],v=a?f.filter(e=>e.version===a):f,b=u&&null!=(n=v.find(e=>e.runId===u.runId))?n:null,w=[...new Set([...s,...f.map(e=>e.version).filter(e=>!!e)])];return a&&!w.includes(a)&&w.push(a),(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:[x,(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:a,onChange:e=>m(e.target.value),placeholder:"전체 판"}),(0,t.jsx)("datalist",{id:"ops-release-versions",children:w.map(e=>(0,t.jsx)("option",{value:e},e))})]}),null===r?(0,t.jsx)("p",{role:"status",children:"런을 불러오는 중…"}):"error"===r.kind?(0,t.jsxs)("p",{role:"alert",children:["런을 불러오지 못했습니다 (",r.status,")"]}):null,(null==r?void 0:r.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===v.length&&(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 판의 런이 없습니다."}),v.map(e=>{var n;return(0,t.jsxs)("button",{type:"button","aria-pressed":(null==b?void 0:b.runId)===e.runId,onClick:()=>h(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)})]}),b&&(0,t.jsxs)("section",{className:"min-w-0 space-y-3","aria-label":"노드 진행","data-run-id":b.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!=(l=b.version)?l:"판 미상"," \xb7 ",b.status]})]}),(0,t.jsx)(d.af,{run:b,openedNodeId:i,onNode:p}),i&&b.path.includes(i)?(0,t.jsx)(d.Jv,{run:b,nodeId:i,log:c}):(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:"노드를 누르면 요약 전문과 로그 꼬리가 열립니다."})]})]})]})}function m(){var e,n,l;let{client:d}=(0,a.Q)(),[o,m]=(0,r.useState)(null),[h,p]=(0,r.useState)([]),[x,f]=(0,r.useState)(null),[v,b]=(0,r.useState)(null),[w,k]=(0,r.useState)(null),[N,j]=(0,r.useState)(null),[I,g]=(0,r.useState)(null),[y,S]=(0,r.useState)(!1),R=(0,r.useRef)(0),C=(0,r.useRef)(!1),D=(0,r.useRef)(null),E=(0,r.useRef)([]),A=(0,r.useRef)(d);(0,r.useEffect)(()=>{var e,n;let l=new URLSearchParams(null!=(n=null==(e=window.location)?void 0:e.search)?n:"").get("run");l&&k(l)},[]),(0,r.useEffect)(()=>{let e=!0;return(A.current!==d&&(A.current=d,C.current=!1,S(!1),p([]),D.current=null,f(null)),C.current)?()=>{e=!1}:(R.current++,j(null),g(null),b(null),E.current=[],null===o&&(D.current=null,f(null)),(0,s.oc)(d,o||void 0).then(n=>{if(e&&!C.current&&(b(n),"forbidden"===n.kind&&(C.current=!0,S(!0)),"ready"===n.kind)&&(E.current=n.data,p(e=>[...new Set([...e,...n.data.map(e=>e.version).filter(e=>!!e)])]),null===o&&null===D.current)){var l,t,r,a,s,d,i,c;let e=new URLSearchParams(null!=(s=null==(l=window.location)?void 0:l.search)?s:"").get("run");D.current=null!=(c=null!=(i=null!=(d=null==(t=n.data.find(n=>n.runId===e))?void 0:t.version)?d:null==(r=(0,u.m6)(n,Date.now()))?void 0:r.version)?i:null==(a=n.data[0])?void 0:a.version)?c:null,f(D.current)}}),()=>{e=!1})},[d,o]);let F=!y&&((null==v?void 0:v.kind)==="ready"||(null==v?void 0:v.kind)==="error")&&E.current.some(e=>!i.includes(e.status.toLowerCase()));(0,r.useEffect)(()=>{if(!F)return;let e=!0,n=!1,l=async()=>{if(n||document.hidden||!e||C.current||!E.current.some(e=>!i.includes(e.status.toLowerCase())))return;n=!0;let l=await (0,s.oc)(d,o||void 0);n=!1,e&&!C.current&&(b(l),"ready"===l.kind&&(E.current=l.data),"forbidden"===l.kind&&(C.current=!0,S(!0)))},t=window.setInterval(()=>{l()},1e4),r=()=>{document.hidden||l()};return document.addEventListener("visibilitychange",r),()=>{e=!1,window.clearInterval(t),document.removeEventListener("visibilitychange",r)}},[d,o,F]);let L=null===o?x:o,M=(null==v?void 0:v.kind)==="ready"?v.data.filter(e=>!L||e.version===L):[],_=null!=(n=null!=(e=M.find(e=>e.runId===w))?e:(0,u.m6)({kind:"ready",data:M},Date.now()))?n:M[0],K=null!=(l=null!=L?L:null==_?void 0:_.version)?l:"",T=null==_?void 0:_.runId;(0,r.useEffect)(()=>{R.current++,j(null),g(null)},[T]);let P=(0,r.useCallback)(e=>{(e!==x||null!==o)&&(R.current++,f(null),m(e),k(null),j(null),g(null))},[o,x]),O=e=>{R.current++,k(e),j(null),g(null)};if(y)return(0,t.jsx)("p",{children:"운영자만 볼 수 있습니다"});let U=N&&N.runId===T?N.nodeId:null,V=I&&I.runId===T&&I.nodeId===U?I.result:null;return(0,t.jsx)(c,{result:v,version:K,versions:h,selectedRun:null!=_?_:null,openedNodeId:U,log:V,onVersion:P,onRun:O,onNode:e=>{if(!_||(null==v?void 0:v.kind)!=="ready")return;let n=++R.current,l=_.runId;if((null==N?void 0:N.runId)===l&&N.nodeId===e){j(null),g(null);return}j({runId:l,nodeId:e}),g(null),(0,s.Kh)(d,l,e).then(t=>{n!==R.current||C.current||("forbidden"===t.kind&&(C.current=!0,S(!0)),g({runId:l,nodeId:e,result:t}))})},releaseStrip:(0,t.jsx)(u.EF,{result:v,selectedRun:null!=_?_:null,onSelect:e=>{if(e.version!==L){var n;m(null!=(n=e.version)?n:""),f(null)}O(e.runId)}})})}}},e=>{e.O(0,[7990,5105,753,4658,7358],()=>e(e.s=49458)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{7681:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,DaemonProvider:()=>c,Q:()=>u});var r=n(26940),a=n(10672),l=n(69865),s=n(86447),o=n(37990),d=n(49393);let i=(0,a.createContext)(null);function c(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[c,u]=(0,a.useState)(n),[m,p]=(0,a.useState)(""),[h]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,l.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,a.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,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,l.Qc)(e),h.updateConfig(n),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},v=(0,a.useMemo)(()=>({config:c,setConfig:f,client:h,sessionId:m,setSessionId:b}),[c,h,m]);return(0,r.jsx)(i.Provider,{value:v,children:t})}function u(){let e=(0,a.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},10299:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function a(e){return"string"==typeof e}function l(e){return a(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)&&a(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&a(e.summary)&&(void 0===e.startedAt||null===e.startedAt||a(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||a(e.endedAt))}n.d(t,{HG:()=>x,Kh:()=>v,Nn:()=>f,oc:()=>b});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)&&a(e.runId)&&a(e.status)&&a(e.startedAt)&&(null===e.version||a(e.version))&&Array.isArray(e.path)&&e.path.every(a)&&Array.isArray(e.nodes)&&e.nodes.every(s))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!a(e.version)||!a(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&a(e.id)&&o.has(e.state)&&d(e.plannedMin)&&d(e.installSec)&&d(e.rc)&&(void 0===e.waitReason||a(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)&&a(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)&&a(e.id)&&a(e.title)&&a(e.status)&&(void 0===e.owner||a(e.owner))&&a(e.updatedAt)&&(void 0===e.evidence||a(e.evidence))}let u=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&a(e.id)&&a(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)&&a(e.id)&&a(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||a(e.role))&&(null===e.now||r(e.now)&&a(e.now.text)&&a(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&a(e.title)&&a(e.at)&&(null===e.checklistId||a(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&a(e.id)&&a(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 a=n(await r.json());return null===a?{kind:"error",status:r.status}:{kind:"ready",data:a}}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)&&a(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 b(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 v(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&a(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)&&a(e.version)&&(void 0===e.codename||a(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(a))&&(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)&&l(e.schedule.cutAt)&&(null===e.schedule.landBy||l(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}:{}}})}},23059:(e,t,n)=>{"use strict";n.d(t,{Es:()=>s,Wf:()=>a,q9:()=>l});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 a(e){return!r.test(e)}function l(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")}},51154:(e,t,n)=>{"use strict";n.d(t,{SeatBoardView:()=>f});var r=n(26940),a=n(10672),l=n(83261),s=n(7681),o=n(10299),d=n(61495),i=n(23059);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,a,l,s,o;let{seat:d,role:c,publicCapture:p,identifiers:h}=e,f=null!=(t=null==d?void 0:d.landed)?t:null,b=null!=(n=null==d?void 0:d.blocked)?n:null,v=null!=(a=null==d?void 0:d.checklist)?a: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!=(l=null==f?void 0:f.length)?l: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===b?"text-muted-foreground":""),children:u(null!=(s=null==b?void 0:b.length)?s:null)})]}),b&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:b.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:v?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,t)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(v[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][t]," ",v[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,a;let l="└ ".concat(e.id," ").concat(e.title," \xb7 열린 칸 ").concat(u(e.open)," \xb7 오늘 착지 ").concat(u(e.landed)," \xb7 막힘 ").concat(u(null!=(a=null==(t=e.blocked)?void 0:t.length)?a:null)),s=(null==(n=e.blocked)?void 0:n.length)?" \xb7 ".concat(e.blocked.map(e=>e.id).join(", ")):"",o=p?m(l,!0,h):[l],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:a=!1,releaseStrip:l}=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(a?"flex min-h-screen flex-col text-base":""),children:[!a&&l,(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(a?"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:a,identifiers:o},t)})}),a&&(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,l.useRouter)(),[n,i]=(0,a.useState)(null),[c,u]=(0,a.useState)(null),[m,p]=(0,a.useState)(null),[f,b]=(0,a.useState)(null);return((0,a.useEffect)(()=>{b("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,a.useEffect)(()=>{let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),l=await (0,o.Nn)(e,a);n=!1,t&&(u(l),"forbidden"===l.kind&&(r=!0),"ready"===l.kind&&p(new Date().toISOString()))};u(null),p(null),a();let l=window.setInterval(()=>{a()},3e4),s=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(l),document.removeEventListener("visibilitychange",s)}},[e]),(0,a.useEffect)(()=>{if(!1!==f||(null==c?void 0:c.kind)==="forbidden")return;let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=await (0,o.oc)(e);n=!1,t&&(i(a),"forbidden"===a.kind&&(r=!0))};i(null),a();let l=window.setInterval(()=>{a()},1e4),s=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(l),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)))})})}},61495:(e,t,n)=>{"use strict";n.d(t,{EF:()=>o,m6:()=>s});var r=n(26940);let a=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),l=/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||a.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,now:c=Date.now()}=e,u=void 0===i?s(o,c):i;if(!u)return null;let m=Math.max(0,u.path.findIndex(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)!==!0})),p=u.path.length>0&&u.path.every(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)===!0})?u.path.length-1:m,h=u.path[p],f=u.nodes.find(e=>e.nodeId===h),b="done"===u.status.toLowerCase()&&(null==f?void 0:f.ok)===!1,v=!b&&((null==f?void 0:f.ok)===!1||l.test(u.status))?null==f||null==(t=f.summary.split(/\r?\n/,1)[0])?void 0:t.trim():null,x=a.has(u.status.toLowerCase()),y=x?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}(u):null,g=x?null:Math.max(0,Math.floor((c-Date.parse(u.startedAt))/6e4));return(0,r.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":u.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>d(u),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=u.version)?n:"판 미상"]}),x?(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==y?" \xb7 걸린 시간 ".concat(y,"분"):""]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=h?h:"노드 미상"," (",u.path.length?p+1:0,"/",u.path.length,")"]}),(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(g)?g:0,"분"]})]}),(0,r.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:u.path.map((e,t)=>{let n=u.nodes.find(t=>t.nodeId===e),a=!x&&t===p,l=x||t<p;return(0,r.jsxs)("span",{"aria-current":a?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(a?"border-primary bg-primary/10 font-semibold":!x&&t>p?"opacity-50":""),children:[l?(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:["상태: ",u.status]}),b&&(0,r.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,r.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},83261:(e,t,n)=>{"use strict";var r=n(12265);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}})},85017:(e,t,n)=>{Promise.resolve().then(n.bind(n,51154))},86447:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>s,f6:()=>a,oD:()=>l});let r="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function 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=a();return localStorage.setItem(r,t),t}function s(){let e=a();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[7990,753,4658,7358],()=>e(e.s=85017)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2624],{7681:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,DaemonProvider:()=>c,Q:()=>u});var r=n(26940),a=n(10672),l=n(69865),s=n(86447),o=n(37990),d=n(49393);let i=(0,a.createContext)(null);function c(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[c,u]=(0,a.useState)(n),[m,p]=(0,a.useState)(""),[h]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,l.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,a.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,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,l.Qc)(e),h.updateConfig(n),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},v=(0,a.useMemo)(()=>({config:c,setConfig:f,client:h,sessionId:m,setSessionId:b}),[c,h,m]);return(0,r.jsx)(i.Provider,{value:v,children:t})}function u(){let e=(0,a.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},10299:(e,t,n)=>{"use strict";function r(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function a(e){return"string"==typeof e}function l(e){return a(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)&&a(e.nodeId)&&(null===e.ok||"boolean"==typeof e.ok)&&a(e.summary)&&(void 0===e.startedAt||null===e.startedAt||a(e.startedAt))&&(void 0===e.endedAt||null===e.endedAt||a(e.endedAt))}n.d(t,{HG:()=>x,Kh:()=>v,Nn:()=>f,oc:()=>b});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)&&a(e.runId)&&a(e.status)&&a(e.startedAt)&&(null===e.version||a(e.version))&&Array.isArray(e.path)&&e.path.every(a)&&Array.isArray(e.nodes)&&e.nodes.every(s))&&(void 0!==e.gateShards&&!function(e){if(!r(e)||!a(e.version)||!a(e.updatedAt)||!Array.isArray(e.shards)||!r(e.summary))return!1;let t=e.summary;return e.shards.every(e=>r(e)&&a(e.id)&&o.has(e.state)&&d(e.plannedMin)&&d(e.installSec)&&d(e.rc)&&(void 0===e.waitReason||a(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)&&a(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)&&a(e.id)&&a(e.title)&&a(e.status)&&(void 0===e.owner||a(e.owner))&&a(e.updatedAt)&&(void 0===e.evidence||a(e.evidence))}let u=e=>Number.isInteger(e)&&e>=0;function m(e){return r(e)&&a(e.id)&&a(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)&&a(e.id)&&a(e.title)))}function p(e){return r(e)&&["OP","MK","TC","UX"].includes(e.seat)&&(void 0===e.role||a(e.role))&&(null===e.now||r(e.now)&&a(e.now.text)&&a(e.now.at))&&(null===e.landed||Array.isArray(e.landed)&&e.landed.every(e=>r(e)&&u(e.pr)&&a(e.title)&&a(e.at)&&(null===e.checklistId||a(e.checklistId))))&&(null===e.blocked||Array.isArray(e.blocked)&&e.blocked.every(e=>r(e)&&a(e.id)&&a(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 a=n(await r.json());return null===a?{kind:"error",status:r.status}:{kind:"ready",data:a}}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)&&a(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 b(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 v(e,t,n){return h(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&a(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)&&a(e.version)&&(void 0===e.codename||a(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(a))&&(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)&&l(e.schedule.cutAt)&&(null===e.schedule.landBy||l(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}:{}}})}},23059:(e,t,n)=>{"use strict";n.d(t,{Es:()=>s,Wf:()=>a,q9:()=>l});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 a(e){return!r.test(e)}function l(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")}},51154:(e,t,n)=>{"use strict";n.d(t,{SeatBoardView:()=>f});var r=n(26940),a=n(10672),l=n(83261),s=n(7681),o=n(10299),d=n(61495),i=n(23059);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,a,l,s,o;let{seat:d,role:c,publicCapture:p,identifiers:h}=e,f=null!=(t=null==d?void 0:d.landed)?t:null,b=null!=(n=null==d?void 0:d.blocked)?n:null,v=null!=(a=null==d?void 0:d.checklist)?a: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!=(l=null==f?void 0:f.length)?l: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===b?"text-muted-foreground":""),children:u(null!=(s=null==b?void 0:b.length)?s:null)})]}),b&&(0,r.jsx)("ul",{className:"mt-2 space-y-1 text-red-600 dark:text-red-400",children:b.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:v?(0,r.jsx)(r.Fragment,{children:["green","yellow","red","done"].map((e,t)=>(0,r.jsxs)("span",{"aria-label":"".concat(e," ").concat(v[e]),children:[["\uD83D\uDFE2","\uD83D\uDFE1","\uD83D\uDD34","✅"][t]," ",v[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,a;let l="└ ".concat(e.id," ").concat(e.title," \xb7 열린 칸 ").concat(u(e.open)," \xb7 오늘 착지 ").concat(u(e.landed)," \xb7 막힘 ").concat(u(null!=(a=null==(t=e.blocked)?void 0:t.length)?a:null)),s=(null==(n=e.blocked)?void 0:n.length)?" \xb7 ".concat(e.blocked.map(e=>e.id).join(", ")):"",o=p?m(l,!0,h):[l],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:a=!1,releaseStrip:l}=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(a?"flex min-h-screen flex-col text-base":""),children:[!a&&l,(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(a?"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:a,identifiers:o},t)})}),a&&(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,l.useRouter)(),[n,i]=(0,a.useState)(null),[c,u]=(0,a.useState)(null),[m,p]=(0,a.useState)(null),[f,b]=(0,a.useState)(null);return((0,a.useEffect)(()=>{b("public"===new URLSearchParams(window.location.search).get("capture"))},[]),(0,a.useEffect)(()=>{let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(new Date),l=await (0,o.Nn)(e,a);n=!1,t&&(u(l),"forbidden"===l.kind&&(r=!0),"ready"===l.kind&&p(new Date().toISOString()))};u(null),p(null),a();let l=window.setInterval(()=>{a()},3e4),s=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(l),document.removeEventListener("visibilitychange",s)}},[e]),(0,a.useEffect)(()=>{if(!1!==f||(null==c?void 0:c.kind)==="forbidden")return;let t=!0,n=!1,r=!1,a=async()=>{if(!t||n||r||document.hidden)return;n=!0;let a=await (0,o.oc)(e);n=!1,t&&(i(a),"forbidden"===a.kind&&(r=!0))};i(null),a();let l=window.setInterval(()=>{a()},1e4),s=()=>{document.hidden||a()};return document.addEventListener("visibilitychange",s),()=>{t=!1,window.clearInterval(l),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)))})})}},61495:(e,t,n)=>{"use strict";n.d(t,{EF:()=>o,m6:()=>s});var r=n(26940);let a=new Set(["done","completed","success","succeeded","failed","error","cancelled","aborted"]),l=/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||a.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,now:c=Date.now()}=e,u=void 0===i?s(o,c):i;if(!u)return null;let m=Math.max(0,u.path.findIndex(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)!==!0})),p=u.path.length>0&&u.path.every(e=>{var t;return(null==(t=u.nodes.find(t=>t.nodeId===e))?void 0:t.ok)===!0})?u.path.length-1:m,h=u.path[p],f=u.nodes.find(e=>e.nodeId===h),b="done"===u.status.toLowerCase()&&(null==f?void 0:f.ok)===!1,v=!b&&((null==f?void 0:f.ok)===!1||l.test(u.status))?null==f||null==(t=f.summary.split(/\r?\n/,1)[0])?void 0:t.trim():null,x=a.has(u.status.toLowerCase()),y=x?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}(u):null,g=x?null:Math.max(0,Math.floor((c-Date.parse(u.startedAt))/6e4));return(0,r.jsxs)("section",{"aria-label":"발행 진행",...void 0!==i?{"data-run-id":u.runId}:{},className:"min-w-0 rounded-2xl border bg-card p-3 text-foreground",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>d(u),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=u.version)?n:"판 미상"]}),x?(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 끝남",null!==y?" \xb7 걸린 시간 ".concat(y,"분"):""]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 ",null!=h?h:"노드 미상"," (",u.path.length?p+1:0,"/",u.path.length,")"]}),(0,r.jsxs)("span",{className:"shrink-0 whitespace-nowrap",children:["\xb7 경과 ",Number.isFinite(g)?g:0,"분"]})]}),(0,r.jsx)("span",{className:"min-w-0 flex-1 overflow-x-auto whitespace-nowrap","aria-label":"발행 노드 순서",children:u.path.map((e,t)=>{let n=u.nodes.find(t=>t.nodeId===e),a=!x&&t===p,l=x||t<p;return(0,r.jsxs)("span",{"aria-current":a?"step":void 0,className:"mr-1 inline-block rounded-full border px-2 py-0.5 ".concat(a?"border-primary bg-primary/10 font-semibold":!x&&t>p?"opacity-50":""),children:[l?(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:["상태: ",u.status]}),b&&(0,r.jsx)("p",{role:"status",className:"truncate text-sm text-amber-700 dark:text-amber-400",children:"경고: 노드 실패 보고 \xb7 런은 끝남"}),v&&(0,r.jsxs)("p",{role:"alert",className:"truncate text-sm text-red-600 dark:text-red-400",children:["막힘: ",v]})]})}},77474:(e,t,n)=>{Promise.resolve().then(n.bind(n,51154))},83261:(e,t,n)=>{"use strict";var r=n(12265);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}})},86447:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>s,f6:()=>a,oD:()=>l});let r="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function 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=a();return localStorage.setItem(r,t),t}function s(){let e=a();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[7990,753,4658,7358],()=>e(e.s=77474)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4635],{7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var n=r(26940),s=r(10672),o=r(69865),a=r(86447),l=r(37990),i=r(49393);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}},49579:(e,t,r)=>{Promise.resolve().then(r.bind(r,78514))},78514:(e,t,r)=>{"use strict";r.d(t,{OutputsList:()=>i});var n=r(26940),s=r(10672),o=r(7681);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))})})]})]})}},86447:(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}}},e=>{e.O(0,[7990,753,4658,7358],()=>e(e.s=49579)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4635],{7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var n=r(26940),s=r(10672),o=r(69865),a=r(86447),l=r(37990),i=r(49393);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}},10900:(e,t,r)=>{Promise.resolve().then(r.bind(r,78514))},78514:(e,t,r)=>{"use strict";r.d(t,{OutputsList:()=>i});var n=r(26940),s=r(10672),o=r(7681);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))})})]})]})}},86447:(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}}},e=>{e.O(0,[7990,753,4658,7358],()=>e(e.s=10900)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{26712:(e,r,t)=>{Promise.resolve().then(t.bind(t,37257))},29961:(e,r,t)=>{"use strict";t.d(r,{GC:()=>s,In:()=>u,OG:()=>i});var n=t(10672);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 u(){return(0,n.useSyncExternalStore)(o,l,()=>"general")}},37257:(e,r,t)=>{"use strict";t.d(r,{QL:()=>p,WelcomeHome:()=>w});var n=t(26940),s=t(10672),a=t(45544),l=t.n(a),i=t(83261),o=t(75633),u=t(48619),c=t(29961),d=t(34971);let f=["/term","/chat","/intake","/live","/editor","/market","/setup"];var m=t(68940),h=t(84809),g=t(29957);let x=[...g.Ue.filter(e=>!(0,g.wu)(e.href)).map(e=>({href:function(e){if(!(g.Ue.some(r=>r.href===e)||g.OE.some(r=>r.href===e)))throw Error("Unknown sidebar route: ".concat(e));return e}(e.href),label:e.label,navigable:!0})),...g.OE.map(e=>({href:e.href,label:e.href,navigable:!1,reason:e.reason}))],b=[...x.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=x}=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,u.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 w(){let{role:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return null==(0,s.useContext)(o.AppRouterContext)?(0,n.jsx)(E,{role:e}):(0,n.jsx)(j,{role:e})}function j(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,h.P)(l.data,a);return(0,s.useEffect)(()=>{"/setup"===o&&t.replace("/setup")},[o,t]),(0,n.jsx)(E,{role:r})}function E(e){var r;let{role:t}=e,s=(0,c.In)(),a=null!=t?t:s,{core:l,more:i}=(r=b.filter(e=>(0,d.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,d.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,d.EX)(a,e.href))})})]})]})})}},48619:(e,r,t)=>{"use strict";t.d(r,{cn:()=>a});var n=t(71742),s=t(28122);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))}},68940:(e,r,t)=>{"use strict";t.d(r,{_r:()=>a});var n=t(10672),s=t(18960);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(26324)},83261:(e,r,t)=>{"use strict";var n=t(12265);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}})},84809:(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}}},e=>{e.O(0,[8925,6038,5544,7086,5287,753,4658,7358],()=>e(e.s=26712)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4538],{88:(e,t,r)=>{"use strict";r.d(t,{DailyReflectionPanel:()=>c});var n=r(26940),s=r(10672),a=r(17585),i=r(7681),o=r(1212);function d(e){let{snapshot:t}=e,r=0===t.notesSaved&&0===t.ocrRuns&&0===t.sessionsToday;return(0,n.jsxs)("article",{"data-testid":"daily-reflection","data-date":t.date,className:"flex flex-col gap-4 rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,n.jsx)("h2",{className:"font-heading text-base font-medium","data-testid":"reflection-date",children:t.date}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"reflection-generated-at",children:["생성 ",function(e){try{return new Date(e).toLocaleTimeString("ko-KR",{hour:"2-digit",minute:"2-digit"})}catch(t){return e}}(t.generatedAt)]})]}),r?(0,n.jsx)("p",{"data-testid":"reflection-empty",className:"rounded-md bg-muted/50 px-3 py-4 text-center text-sm text-muted-foreground",children:"오늘 기록된 활동이 없습니다."}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("dl",{className:"grid grid-cols-3 gap-3 text-sm",children:[(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"노트 저장"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-notes-saved",children:t.notesSaved})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"OCR 실행"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-ocr-runs",children:t.ocrRuns})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"세션"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-sessions-today",children:t.sessionsToday})]})]}),t.topSessions.length>0&&(0,n.jsxs)("section",{children:[(0,n.jsxs)("h3",{className:"mb-2 text-xs font-medium text-muted-foreground",children:["활성 세션 Top ",t.topSessions.length]}),(0,n.jsx)("ul",{"data-testid":"reflection-top-sessions",className:"flex flex-col gap-2 text-xs",children:t.topSessions.map(e=>(0,n.jsxs)("li",{"data-testid":"reflection-session-row","data-session-id":e.id,className:"rounded-md border border-border px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsx)("code",{className:"truncate font-mono text-[11px]",children:e.id}),(0,n.jsxs)("span",{className:"shrink-0 text-muted-foreground",children:["msgs ",e.msgCount]})]}),e.lastMsgPreview&&(0,n.jsx)("p",{className:"mt-1 line-clamp-2 text-muted-foreground",children:e.lastMsgPreview})]},e.id))})]})]})]})}let l={date:"",notesSaved:0,ocrRuns:0,sessionsToday:0,topSessions:[],generatedAt:""};function c(){let{config:e}=(0,i.Q)(),[t,r]=(0,s.useState)(l),[c,u]=(0,s.useState)(!1),[m,p]=(0,s.useState)(null),g=(0,s.useCallback)(async()=>{if(e.baseUrl){u(!0);try{let t=await fetch("".concat(e.baseUrl,"/v1/reflection/today"),{...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok)return void p("HTTP ".concat(t.status));let n=await t.json();r(n.snapshot),p(null)}catch(e){p(String(e instanceof Error?e.message:e))}finally{u(!1)}}},[e.baseUrl,e.token]);return(0,s.useEffect)(()=>{g();let e=setInterval(()=>{g()},3e5);return()=>clearInterval(e)},[g]),(0,n.jsxs)("section",{"data-testid":"daily-reflection-panel",className:"mx-auto flex max-w-md flex-col gap-3 p-4",children:[(0,n.jsxs)("header",{className:"flex items-start justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"font-heading text-lg font-medium",children:"오늘의 회고"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"오늘 elanous 활동 요약 \xb7 5분마다 자동 갱신"})]}),(0,n.jsx)(o.$,{type:"button",variant:"ghost",size:"sm","aria-label":"refresh reflection",onClick:()=>void g(),disabled:c,children:(0,n.jsx)(a.A,{className:c?"h-3.5 w-3.5 animate-spin":"h-3.5 w-3.5"})})]}),m&&(0,n.jsxs)("p",{"data-testid":"reflection-panel-error",className:"rounded bg-destructive/10 px-2 py-1 text-xs text-destructive",children:["fetch 실패: ",m]}),(0,n.jsx)(d,{snapshot:t})]})}},1212:(e,t,r)=>{"use strict";r.d(t,{$:()=>d});var n=r(26940),s=r(80167),a=r(22912),i=r(48619);let o=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function d(e){let{className:t,variant:r="default",size:a="default",...d}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(o({variant:r,size:a,className:t})),...d})}},7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>l,DaemonProvider:()=>c,Q:()=>u});var n=r(26940),s=r(10672),a=r(69865),i=r(86447),o=r(37990),d=r(49393);let l=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,p]=(0,s.useState)(""),[g]=(0,s.useState)(()=>new o.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),g.updateConfig(e),p((0,i.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();g.updateConfig(t),u(t),(0,d.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,d.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let f=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),g.updateConfig(r),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:f,client:g,sessionId:m,setSessionId:x}),[c,g,m]);return(0,n.jsx)(l.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(l);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},17585:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(22958).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},22958:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var n=r(10672);let s=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var i={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,n.createContext)({}),d=(0,n.forwardRef)((e,t)=>{var r,a,d;let{color:l,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:g,iconNode:f,...x}=e,{size:h=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,color:w="currentColor",className:y=""}=null!=(r=(0,n.useContext)(o))?r:{},k=(null!=m?m:b)?24*Number(null!=u?u:v)/Number(null!=c?c:h):null!=u?u:v;return(0,n.createElement)("svg",{ref:t,...i,width:null!=(a=null!=c?c:h)?a:i.width,height:null!=(d=null!=c?c:h)?d:i.height,stroke:null!=l?l:w,strokeWidth:k,className:s("lucide",y,p),...!g&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(x)&&{"aria-hidden":"true"},...x},[...f.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(g)?g:[g]])}),l=(e,t)=>{let r=(0,n.forwardRef)((r,i)=>{let{className:o,...l}=r;return(0,n.createElement)(d,{ref:i,iconNode:t,className:s("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...l})});return r.displayName=a(e),r}},41304:(e,t,r)=>{Promise.resolve().then(r.bind(r,88)),Promise.resolve().then(r.bind(r,88725))},48619:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(71742),s=r(28122);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},53869:(e,t,r)=>{"use strict";r.d(t,{K:()=>n}),r(10672);let n={emit:async function(e){return{ok:!1,reason:"not-configured"}}}},86447:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>i,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function i(){let e=s();return localStorage.setItem(n,e),e}},88725:(e,t,r)=>{"use strict";r.d(t,{ReflectionRouteIntentBeacon:()=>a});var n=r(10672),s=r(53869);function a(){return(0,n.useEffect)(()=>{let e=function(){try{let e=new URLSearchParams(window.location.search);if("push"===e.get("from"))return"push";let t=document.referrer||"";if(t&&t.startsWith(window.location.origin))return"manual";return"unknown"}catch(e){return"unknown"}}();s.K.emit({surface:"pwa",intent:{layer:"navigation",kind:"pwa.navigation.reflection_opened",target:{kind:"route",id:"/reflection",label:"Reflection"},value:{source:e}},surface_state:{route:"/reflection"}})},[]),null}}},e=>{e.O(0,[8925,4054,7990,753,4658,7358],()=>e(e.s=41304)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4538],{88:(e,t,r)=>{"use strict";r.d(t,{DailyReflectionPanel:()=>c});var n=r(26940),s=r(10672),a=r(17585),i=r(7681),o=r(1212);function d(e){let{snapshot:t}=e,r=0===t.notesSaved&&0===t.ocrRuns&&0===t.sessionsToday;return(0,n.jsxs)("article",{"data-testid":"daily-reflection","data-date":t.date,className:"flex flex-col gap-4 rounded-2xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,n.jsx)("h2",{className:"font-heading text-base font-medium","data-testid":"reflection-date",children:t.date}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"reflection-generated-at",children:["생성 ",function(e){try{return new Date(e).toLocaleTimeString("ko-KR",{hour:"2-digit",minute:"2-digit"})}catch(t){return e}}(t.generatedAt)]})]}),r?(0,n.jsx)("p",{"data-testid":"reflection-empty",className:"rounded-md bg-muted/50 px-3 py-4 text-center text-sm text-muted-foreground",children:"오늘 기록된 활동이 없습니다."}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("dl",{className:"grid grid-cols-3 gap-3 text-sm",children:[(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"노트 저장"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-notes-saved",children:t.notesSaved})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"OCR 실행"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-ocr-runs",children:t.ocrRuns})]}),(0,n.jsxs)("div",{className:"rounded-md bg-muted/30 px-3 py-2 text-center",children:[(0,n.jsx)("dt",{className:"text-[10px] uppercase tracking-wide text-muted-foreground",children:"세션"}),(0,n.jsx)("dd",{className:"font-mono text-lg","data-testid":"reflection-sessions-today",children:t.sessionsToday})]})]}),t.topSessions.length>0&&(0,n.jsxs)("section",{children:[(0,n.jsxs)("h3",{className:"mb-2 text-xs font-medium text-muted-foreground",children:["활성 세션 Top ",t.topSessions.length]}),(0,n.jsx)("ul",{"data-testid":"reflection-top-sessions",className:"flex flex-col gap-2 text-xs",children:t.topSessions.map(e=>(0,n.jsxs)("li",{"data-testid":"reflection-session-row","data-session-id":e.id,className:"rounded-md border border-border px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsx)("code",{className:"truncate font-mono text-[11px]",children:e.id}),(0,n.jsxs)("span",{className:"shrink-0 text-muted-foreground",children:["msgs ",e.msgCount]})]}),e.lastMsgPreview&&(0,n.jsx)("p",{className:"mt-1 line-clamp-2 text-muted-foreground",children:e.lastMsgPreview})]},e.id))})]})]})]})}let l={date:"",notesSaved:0,ocrRuns:0,sessionsToday:0,topSessions:[],generatedAt:""};function c(){let{config:e}=(0,i.Q)(),[t,r]=(0,s.useState)(l),[c,u]=(0,s.useState)(!1),[m,p]=(0,s.useState)(null),g=(0,s.useCallback)(async()=>{if(e.baseUrl){u(!0);try{let t=await fetch("".concat(e.baseUrl,"/v1/reflection/today"),{...e.token?{headers:{authorization:"Bearer ".concat(e.token)}}:{}});if(!t.ok)return void p("HTTP ".concat(t.status));let n=await t.json();r(n.snapshot),p(null)}catch(e){p(String(e instanceof Error?e.message:e))}finally{u(!1)}}},[e.baseUrl,e.token]);return(0,s.useEffect)(()=>{g();let e=setInterval(()=>{g()},3e5);return()=>clearInterval(e)},[g]),(0,n.jsxs)("section",{"data-testid":"daily-reflection-panel",className:"mx-auto flex max-w-md flex-col gap-3 p-4",children:[(0,n.jsxs)("header",{className:"flex items-start justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"font-heading text-lg font-medium",children:"오늘의 회고"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"오늘 elanous 활동 요약 \xb7 5분마다 자동 갱신"})]}),(0,n.jsx)(o.$,{type:"button",variant:"ghost",size:"sm","aria-label":"refresh reflection",onClick:()=>void g(),disabled:c,children:(0,n.jsx)(a.A,{className:c?"h-3.5 w-3.5 animate-spin":"h-3.5 w-3.5"})})]}),m&&(0,n.jsxs)("p",{"data-testid":"reflection-panel-error",className:"rounded bg-destructive/10 px-2 py-1 text-xs text-destructive",children:["fetch 실패: ",m]}),(0,n.jsx)(d,{snapshot:t})]})}},1212:(e,t,r)=>{"use strict";r.d(t,{$:()=>d});var n=r(26940),s=r(80167),a=r(22912),i=r(48619);let o=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function d(e){let{className:t,variant:r="default",size:a="default",...d}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(o({variant:r,size:a,className:t})),...d})}},7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>l,DaemonProvider:()=>c,Q:()=>u});var n=r(26940),s=r(10672),a=r(69865),i=r(86447),o=r(37990),d=r(49393);let l=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,p]=(0,s.useState)(""),[g]=(0,s.useState)(()=>new o.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),g.updateConfig(e),p((0,i.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();g.updateConfig(t),u(t),(0,d.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,d.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let f=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),g.updateConfig(r),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:f,client:g,sessionId:m,setSessionId:x}),[c,g,m]);return(0,n.jsx)(l.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(l);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},17585:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});let n=(0,r(22958).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},22958:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var n=r(10672);let s=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var i={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,n.createContext)({}),d=(0,n.forwardRef)((e,t)=>{var r,a,d;let{color:l,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:g,iconNode:f,...x}=e,{size:h=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,color:w="currentColor",className:y=""}=null!=(r=(0,n.useContext)(o))?r:{},k=(null!=m?m:b)?24*Number(null!=u?u:v)/Number(null!=c?c:h):null!=u?u:v;return(0,n.createElement)("svg",{ref:t,...i,width:null!=(a=null!=c?c:h)?a:i.width,height:null!=(d=null!=c?c:h)?d:i.height,stroke:null!=l?l:w,strokeWidth:k,className:s("lucide",y,p),...!g&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(x)&&{"aria-hidden":"true"},...x},[...f.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(g)?g:[g]])}),l=(e,t)=>{let r=(0,n.forwardRef)((r,i)=>{let{className:o,...l}=r;return(0,n.createElement)(d,{ref:i,iconNode:t,className:s("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...l})});return r.displayName=a(e),r}},48619:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(71742),s=r(28122);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},53869:(e,t,r)=>{"use strict";r.d(t,{K:()=>n}),r(10672);let n={emit:async function(e){return{ok:!1,reason:"not-configured"}}}},86447:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>i,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function i(){let e=s();return localStorage.setItem(n,e),e}},88725:(e,t,r)=>{"use strict";r.d(t,{ReflectionRouteIntentBeacon:()=>a});var n=r(10672),s=r(53869);function a(){return(0,n.useEffect)(()=>{let e=function(){try{let e=new URLSearchParams(window.location.search);if("push"===e.get("from"))return"push";let t=document.referrer||"";if(t&&t.startsWith(window.location.origin))return"manual";return"unknown"}catch(e){return"unknown"}}();s.K.emit({surface:"pwa",intent:{layer:"navigation",kind:"pwa.navigation.reflection_opened",target:{kind:"route",id:"/reflection",label:"Reflection"},value:{source:e}},surface_state:{route:"/reflection"}})},[]),null}},96036:(e,t,r)=>{Promise.resolve().then(r.bind(r,88)),Promise.resolve().then(r.bind(r,88725))}},e=>{e.O(0,[8925,4054,7990,753,4658,7358],()=>e(e.s=96036)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{1212:(e,t,r)=>{"use strict";r.d(t,{$:()=>i});var n=r(26940),a=r(80167),s=r(22912),l=r(48619);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function i(e){let{className:t,variant:r="default",size:s="default",...i}=e;return(0,n.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(o({variant:r,size:s,className:t})),...i})}},7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var n=r(26940),a=r(10672),s=r(69865),l=r(86447),o=r(37990),i=r(49393);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(r),[m,x]=(0,a.useState)(""),[g]=(0,a.useState)(()=>new o.ki(r));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),g.updateConfig(e),x((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&x(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let p=e=>{c(t=>{let r={...t,...e};return(0,s.Qc)(e),g.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,a.useMemo)(()=>({config:u,setConfig:p,client:g,sessionId:m,setSessionId:f}),[u,g,m]);return(0,n.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},11765:(e,t,r)=>{Promise.resolve().then(r.bind(r,26010))},26010:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>y});var n=r(26940),a=r(10672),s=r(7681),l=r(1212),o=r(81669),i=r(76514),d=r(45544),u=r.n(d);function c(e){var t,r,n,a,s,l,o,i,d,u,c,m,x,g,p,f;return{id:e.id,name:e.name,cron:e.cron,intervalMs:e.intervalMs,category:null!=(l=e.category)?l:e.source,domain:null!=(o=e.domain)?o:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(i=e.runVia)?i:e.source,lastRun:null!=(d=null==(t=e.lastRun)?void 0:t.at)?d:null,lastStatus:null!=(u=null==(r=e.lastRun)?void 0:r.status)?u:null,lastExit:null!=(m=null!=(c=null==(n=e.lastRun)?void 0:n.exit)?c:e.lastExit)?m:null,lastDurationMs:null!=(x=null==(a=e.lastRun)?void 0:a.durationMs)?x:null,lastVia:null!=(g=null==(s=e.lastRun)?void 0:s.via)?g:null,stale:"stale"===e.state,command:null!=(p=e.command)?p:"",note:null!=(f=e.note)?f:null,state:e.state,next:e.next,flags:e.flags}}async function m(e){let t="Unknown error";for(let r of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let n=function(e){if(!e||"object"!=typeof e)return null;if(Array.isArray(e.schedules))return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString(),r=e.map(c),n={},a={},s={};for(let e of r){var l,o,i;n[e.category]=(null!=(l=n[e.category])?l:0)+1,a[e.source]=(null!=(o=a[e.source])?o:0)+1,e.state&&(s[e.state]=(null!=(i=s[e.state])?i:0)+1)}return{total:r.length,adopted:r.filter(e=>"elanous"===e.runVia).length,byCategory:n,bySource:a,byState:s,jobs:r,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(r));if(n)return{kind:"ready",data:n};t="unexpected response from ".concat(r)}catch(e){t=e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}return{kind:"error",reason:t}}let x={live:{label:"켜짐",tone:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",tip:"실제 발화 경로(crontab\xb7launchd\xb7trigger)에 올라 있다"},firing:{label:"발화 중",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30",tip:"발화 경로에 올라 있고 최근 실행 기록이 있다"},stale:{label:"유실 의심",tone:"bg-amber-500/15 text-amber-300 ring-amber-500/30",tip:"예정 시각이 지났는데 실행 기록이 없다"},off:{label:"꺼짐",tone:"bg-muted text-muted-foreground ring-border",tip:"어느 발화 경로에도 없다(레지스트리에만 있다)"}},g={elanous:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",daemon:"bg-sky-500/15 text-sky-200 ring-sky-500/30",crontab:"bg-muted text-muted-foreground ring-border"},p={finance:"Finance",elanous:"elanous (core)",general:"General"};function f(e){let{label:t,onClick:r,disabled:a,danger:s}=e;return(0,n.jsx)("button",{type:"button",onClick:r,disabled:a,className:["rounded-md px-1.5 py-0.5 text-[10px] ring-1 transition-colors disabled:opacity-40",s?"text-red-300 ring-red-500/30 hover:bg-red-500/15":"text-muted-foreground ring-border hover:bg-accent/40 hover:text-foreground"].join(" "),children:t})}function b(e){var t,r,a,s,l,o,i;let{job:d,onAction:u,acting:c}=e,m="daemon"===d.runVia||d.id.includes(":"),p=d.state?x[d.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let r=Math.round((t-Date.now())/6e4);if(r<1)return"next <1m";if(r<60)return"next ".concat(r,"m");let n=Math.floor(r/60);return n<24?"next ".concat(n,"h"):"next ".concat(Math.floor(n/24),"d")}(null==(t=d.next)?void 0:t[0]),h=d.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),r=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(r){let e=r[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let n=e.lastIndexOf("/");return n>=0?e.slice(n+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(d.command),v=d.note?"".concat(d.note,"\n\n").concat(d.command):d.command;return(0,n.jsxs)("div",{className:["flex flex-col gap-1 rounded-xl border border-border bg-card p-3 sm:flex-row sm:items-center sm:justify-between",d.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"truncate text-sm font-medium",children:d.name}),p?(0,n.jsx)("span",{className:"shrink-0 whitespace-nowrap rounded-full px-1.5 py-0.5 text-[10px] ring-1 ".concat(p.tone),title:p.tip,"data-schedule-state":d.state,children:p.label}):!d.enabled&&(0,n.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(r=d.flags)?void 0:r.includes("duplicate"))&&(0,n.jsx)("span",{className:"rounded-full bg-red-500/15 px-1.5 py-0.5 text-[10px] text-red-300 ring-1 ring-red-500/30",title:"같은 명령이 두 번 발화한다",children:"duplicate"})]}),(0,n.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(d.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,n.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:d.cron?d.cron:d.intervalMs?"every ".concat(Math.round(d.intervalMs/1e3),"s"):"—"}),b&&d.enabled&&(0,n.jsx)("span",{className:"text-muted-foreground",title:null==(a=d.next)?void 0:a.join("\n"),children:b}),(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:d.category}),(0,n.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=g[d.runVia])?s:g.crontab),children:d.runVia}),d.lastStatus&&(0,n.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===d.lastStatus?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-red-500/15 text-red-300 ring-red-500/30"),title:null!=(o=d.lastError)?o:"ok"===d.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=d.lastExit)?l:"?"),children:["ok"===d.lastStatus?"✓":"✗",null!=d.lastDurationMs?" ".concat(Math.round(d.lastDurationMs),"ms"):"",d.lastVia&&"crontab"!==d.lastVia?" ".concat(d.lastVia):""]}),d.stale&&!p&&(0,n.jsx)("span",{className:"rounded-full bg-amber-500/15 px-2 py-0.5 text-amber-300 ring-1 ring-amber-500/30",title:"예정 시각이 지났는데 미실행(유실 의심)",children:"stale"}),(0,n.jsx)("span",{className:"text-muted-foreground",title:null!=(i=d.lastRun)?i:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return"".concat(r,"s ago");let n=Math.floor(r/60);if(n<60)return"".concat(n,"m ago");let a=Math.floor(n/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(d.lastRun)}),!m&&(0,n.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===d.runVia&&(0,n.jsx)(f,{label:"adopt",onClick:()=>u("adopt",d),disabled:c}),"elanous"===d.runVia&&(0,n.jsx)(f,{label:"release",onClick:()=>u("release",d),disabled:c}),(0,n.jsx)(f,{label:d.enabled?"disable":"enable",onClick:()=>u(d.enabled?"disable":"enable",d),disabled:c}),(0,n.jsx)(f,{label:"✕",onClick:()=>u("delete",d),disabled:c,danger:!0})]})]})]})}function h(e){let{load:t,groups:r,onRefresh:a,onAction:s,busy:o,acting:i}=e;return"loading"===t.kind?(0,n.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,n.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,n.jsx)("p",{children:"Failed to load schedules"}),(0,n.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,n.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:o,children:"Retry"})]}):0===t.data.jobs.length?(0,n.jsx)("div",{className:"rounded-xl border border-dashed border-border px-3 py-10 text-center text-sm text-muted-foreground",children:"no schedules"}):(0,n.jsx)("div",{className:"space-y-6",children:r.map(e=>{var t;return(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=p[e.domain])?t:e.domain}),(0,n.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,n.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,n.jsx)(b,{job:e,onAction:s,acting:i},e.id))})]},e.domain)})})}function v(){let{client:e}=(0,s.Q)(),[t,r]=(0,a.useState)({kind:"loading"}),[d,c]=(0,a.useState)(!1),[g,p]=(0,a.useState)(!1),f=(0,a.useRef)(0),b=(0,a.useRef)(null),v="ready"===t.kind?t.data:null,[y,j]=(0,a.useState)(null);(0,a.useEffect)(()=>{j(function(e){let t=new URLSearchParams(e).get("ids");if(!t)return null;let r=t.split(",").map(e=>e.trim()).filter(Boolean);return r.length?r:null}(window.location.search))},[]);let k=(0,a.useCallback)(async()=>{var t,n,a,s,l;if(b.current===e)return;b.current=e;let i=++f.current;c(!0),r({kind:"loading"});try{let s=await m(t=>e.fetchJson(t));t=f.current,n=b.current,i===t&&n===e&&(r(s),"error"===s.kind&&(a=s.reason,(0,o.oR.error)("scheduler load failed: ".concat(a))))}finally{s=f.current,l=b.current,i===s&&l===e&&(b.current=null,c(!1))}},[e]),N=(0,a.useCallback)(async(t,r,n)=>{if("delete"!==t||window.confirm("삭제: ".concat(r.name,"?\n(자동 백업되어 복구 가능)"))){p(!0);try{let a=await e.fetchJson("/v1/schedules/action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,id:r.id,...void 0!==n?{note:n}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?o.oR.error("".concat(t," 실패: ").concat(a.error)):(o.oR.success("note"===t?"설명 저장: ".concat(r.name):"".concat(t,": ").concat(r.name)),await k())}catch(e){o.oR.error("".concat(t," 실패: ").concat(e instanceof Error?e.message:e))}finally{p(!1)}}},[e,k]);(0,a.useEffect)(()=>{k();let e=window.setInterval(()=>void k(),3e4);return()=>window.clearInterval(e)},[k]);let w=(0,a.useMemo)(()=>{if(!v)return[];let e=new Map;for(let n of v.jobs){var t,r;if(y&&!y.includes(n.id))continue;let a=(r=n.domain)&&r.trim()?r:"general",s=null!=(t=e.get(a))?t:[];s.push(n),e.set(a,s)}let n=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let r=n.indexOf(e[0]),a=n.indexOf(t[0]);return(r<0?99:r)-(a<0?99:a)}).map(e=>{let[t,r]=e;return{domain:t,jobs:r.sort((e,t)=>{var r,n;return(Date.parse(null!=(r=t.lastRun)?r:"0")||0)-(Date.parse(null!=(n=e.lastRun)?n:"0")||0)})}})},[v,y]);return(0,n.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,n.jsx)(i.r,{active:"scheduler"}),(0,n.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(u(),{href:"/loops",className:"rounded-lg border border-border px-3 py-2 text-sm hover:bg-accent",children:"루프 현황 →"}),v&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:v.total})]}),v.byState?["live","firing","stale","off"].map(e=>{var t,r,a;return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:x[e].label}),(0,n.jsx)("div",{className:"text-sm font-semibold ".concat("stale"===e&&(null==(t=v.byState)?void 0:t[e])?"text-amber-300":""),children:null!=(a=null==(r=v.byState)?void 0:r[e])?a:0})]},e)}):(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:v.adopted})]})]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void k(),disabled:d,children:"Refresh"})]})]}),y&&(0,n.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-primary/40 bg-primary/10 px-3 py-2 text-xs","data-schedule-ids-filter":!0,children:[(0,n.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",y.length]}),v&&w.reduce((e,t)=>e+t.jobs.length,0)<y.length&&(0,n.jsxs)("span",{className:"text-amber-300",children:["— ",y.length-w.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,n.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{j(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,n.jsx)(h,{load:t,groups:w,onRefresh:()=>void k(),onAction:N,busy:d,acting:g})]})}function y(){return(0,n.jsx)(v,{})}},48619:(e,t,r)=>{"use strict";r.d(t,{cn:()=>s});var n=r(71742),a=r(28122);function s(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,n.$)(t))}},76514:(e,t,r)=>{"use strict";r.d(t,{r:()=>o});var n=r(26940),a=r(45544),s=r.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,n.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,n.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,r)=>(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsxs)(s(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,n.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,n.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),r<l.length-1&&(0,n.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},86447:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>l,f6:()=>a,oD:()=>s});let n="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=a();return localStorage.setItem(n,t),t}function l(){let e=a();return localStorage.setItem(n,e),e}}},e=>{e.O(0,[8925,4054,5544,1669,7990,753,4658,7358],()=>e(e.s=11765)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{1212:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(26940),s=r(80167),a=r(22912),o=r(48619);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},2790:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>p});var n=r(26940),s=r(10672),a=r(83261),o=r(81669),i=r(7681),l=r(1212),d=r(39782);function c(e){return"pwa"===e.origin?"pwa":"telegram"===e.source||"tg"===e.origin?"telegram":"cli"}function u(e){let{source:t,origin:r}=e,s=c({source:t,origin:r}),a="telegram"===s?{label:"텔레그램",tone:"bg-sky-500/15 text-sky-300 ring-sky-500/30"}:"pwa"===s?{label:"PWA 챗",tone:"bg-fuchsia-500/15 text-fuchsia-300 ring-fuchsia-500/30"}:{label:"CLI",tone:"bg-slate-500/15 text-slate-300 ring-slate-500/30"};return(0,n.jsx)("span",{className:["rounded px-1.5 py-0.5 text-[11px] ring-1",a.tone].join(" "),children:a.label})}function m(e){let{messages:t,onTimeTravel:r,busy:s}=e,a=t.filter(e=>"user"===e.role||"assistant"===e.role);if(0===a.length)return(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"메시지 없음."});let o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}},7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(26940),s=r(10672),a=r(69865),o=r(86447),i=r(37990),l=r(49393);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},33532:(e,t,r)=>{Promise.resolve().then(r.bind(r,2790))},39782:(e,t,r)=>{"use strict";r.d(t,{KW:()=>a,jU:()=>n,nj:()=>s});class n{async list(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.client.fetchJson("/v1/sessions/store".concat(e?"?includeEmpty=1":""))}async transcript(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)))}async fork(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e),"/fork"),{method:"POST",...void 0!==t.beforeUser?{headers:{"content-type":"application/json"},body:JSON.stringify({beforeUser:t.beforeUser})}:{}})}async delete(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"DELETE"})}constructor(e){this.client=e}}function s(e,t){let r=t.trim().toLowerCase();if(!r)return{kind:"none"};let n=e.filter(e=>e.id.toLowerCase().startsWith(r));return 1===n.length?{kind:"one",id:n[0].id}:0===n.length?{kind:"none"}:{kind:"ambiguous",count:n.length}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=Date.parse(e);if(!Number.isFinite(r))return"";let n=Math.max(0,Math.floor((t-r)/1e3));return n<30?"방금":n<3600?"".concat(Math.floor(n/60),"분 전"):n<86400?"".concat(Math.floor(n/3600),"시간 전"):"".concat(Math.floor(n/86400),"일 전")}},48619:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(71742),s=r(28122);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},83261:(e,t,r)=>{"use strict";var n=r(12265);r.o(n,"useParams")&&r.d(t,{useParams:function(){return n.useParams}}),r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}}),r.o(n,"useSearchParams")&&r.d(t,{useSearchParams:function(){return n.useSearchParams}})},86447:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function o(){let e=s();return localStorage.setItem(n,e),e}}},e=>{e.O(0,[8925,4054,1669,7990,753,4658,7358],()=>e(e.s=33532)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{1212:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(26940),s=r(80167),a=r(22912),o=r(48619);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},2790:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>p});var n=r(26940),s=r(10672),a=r(83261),o=r(81669),i=r(7681),l=r(1212),d=r(39782);function c(e){return"pwa"===e.origin?"pwa":"telegram"===e.source||"tg"===e.origin?"telegram":"cli"}function u(e){let{source:t,origin:r}=e,s=c({source:t,origin:r}),a="telegram"===s?{label:"텔레그램",tone:"bg-sky-500/15 text-sky-300 ring-sky-500/30"}:"pwa"===s?{label:"PWA 챗",tone:"bg-fuchsia-500/15 text-fuchsia-300 ring-fuchsia-500/30"}:{label:"CLI",tone:"bg-slate-500/15 text-slate-300 ring-slate-500/30"};return(0,n.jsx)("span",{className:["rounded px-1.5 py-0.5 text-[11px] ring-1",a.tone].join(" "),children:a.label})}function m(e){let{messages:t,onTimeTravel:r,busy:s}=e,a=t.filter(e=>"user"===e.role||"assistant"===e.role);if(0===a.length)return(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"메시지 없음."});let o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}},7681:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(26940),s=r(10672),a=r(69865),o=r(86447),i=r(37990),l=r(49393);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},39782:(e,t,r)=>{"use strict";r.d(t,{KW:()=>a,jU:()=>n,nj:()=>s});class n{async list(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.client.fetchJson("/v1/sessions/store".concat(e?"?includeEmpty=1":""))}async transcript(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)))}async fork(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e),"/fork"),{method:"POST",...void 0!==t.beforeUser?{headers:{"content-type":"application/json"},body:JSON.stringify({beforeUser:t.beforeUser})}:{}})}async delete(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"DELETE"})}constructor(e){this.client=e}}function s(e,t){let r=t.trim().toLowerCase();if(!r)return{kind:"none"};let n=e.filter(e=>e.id.toLowerCase().startsWith(r));return 1===n.length?{kind:"one",id:n[0].id}:0===n.length?{kind:"none"}:{kind:"ambiguous",count:n.length}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=Date.parse(e);if(!Number.isFinite(r))return"";let n=Math.max(0,Math.floor((t-r)/1e3));return n<30?"방금":n<3600?"".concat(Math.floor(n/60),"분 전"):n<86400?"".concat(Math.floor(n/3600),"시간 전"):"".concat(Math.floor(n/86400),"일 전")}},48619:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(71742),s=r(28122);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},83261:(e,t,r)=>{"use strict";var n=r(12265);r.o(n,"useParams")&&r.d(t,{useParams:function(){return n.useParams}}),r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}}),r.o(n,"useSearchParams")&&r.d(t,{useSearchParams:function(){return n.useSearchParams}})},86447:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function o(){let e=s();return localStorage.setItem(n,e),e}},93069:(e,t,r)=>{Promise.resolve().then(r.bind(r,2790))}},e=>{e.O(0,[8925,4054,1669,7990,753,4658,7358],()=>e(e.s=93069)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{17344:(e,t,s)=>{Promise.resolve().then(s.bind(s,96488))},73365:(e,t,s)=>{"use strict";s.d(t,{GM:()=>n,J3:()=>l,WF:()=>a,bR:()=>c,m:()=>r,r5:()=>i});let a="/v1/devices",i="/v1/approvals/merges",c="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",n="/v1/morning-digest/showroom",r="/v1/next-fluent/dispatch"},96488:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(26940),i=s(10672),c=s(73365);class l extends Error{constructor(e,t,s){super("devices ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="DevicesApiError"}}function n(e){let{api:t}=e,[s,c]=(0,i.useState)(null),[n,r]=(0,i.useState)(null),[o,d]=(0,i.useState)(!0);return((0,i.useEffect)(()=>{let e=!1;return t.fleet().then(t=>{e||(c(t),d(!1))}).catch(t=>{e||(r(t instanceof l?"(".concat(t.status,") ").concat(t.path):String(t)),d(!1))}),()=>{e=!0}},[t]),o)?(0,a.jsx)("div",{className:"text-sm opacity-70",children:"Loading device fleet…"}):n?(0,a.jsx)("div",{role:"alert",className:"rounded bg-rose-50 px-3 py-2 text-sm text-rose-900",children:n}):s?0===s.totalDevices?(0,a.jsxs)("div",{className:"rounded border border-zinc-200 bg-zinc-50 p-4 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"No Apple devices detected yet."}),(0,a.jsxs)("p",{className:"mt-1 opacity-70",children:["The iOS Companion writes ",(0,a.jsx)("code",{children:"~/.elanous/devices.json"})," on iCloud sync. Install it on at least one Apple device to populate this list."]})]}):(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsxs)("caption",{className:"text-xs opacity-60 text-left mb-2",children:["snapshot @ ",new Date(s.snapshotAt).toLocaleString()," \xb7 ",s.totalDevices," devices"]}),(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-zinc-200 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("th",{className:"text-left py-1",children:"kind"}),(0,a.jsx)("th",{className:"text-right py-1",children:"count"}),(0,a.jsx)("th",{className:"text-left py-1 pl-3",children:"capabilities"})]})}),(0,a.jsx)("tbody",{children:s.kinds.map(e=>(0,a.jsxs)("tr",{className:"border-b border-zinc-100 align-top",children:[(0,a.jsx)("td",{className:"py-1 font-medium",children:e.kind}),(0,a.jsx)("td",{className:"py-1 text-right tabular-nums",children:e.count}),(0,a.jsx)("td",{className:"py-1 pl-3 text-xs",children:0===e.capabilities.length?(0,a.jsx)("span",{className:"opacity-50",children:"(none advertised)"}):e.capabilities.map(e=>(0,a.jsx)("span",{className:"mr-1 inline-block rounded bg-zinc-100 px-1.5 py-0.5",children:e},e))})]},e.kind))})]}):(0,a.jsx)("div",{className:"text-sm opacity-70",children:"No fleet data."})}function r(){let e=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch;async function i(t,i){let c={"content-type":"application/json"};e.authHeader&&(c.authorization=e.authHeader);let n=await a("".concat(s).concat(t),{...i,headers:c}),r=await n.json().catch(()=>null);if(!n.ok)throw new l(n.status,t,r);return r}return{fleet:async()=>await i(c.WF),preview:async e=>await i(c.bR,{method:"POST",body:JSON.stringify(e)})}})({baseUrl:window.location.origin}),[]);return(0,a.jsxs)("section",{className:"flex flex-col gap-4 p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-lg font-semibold",children:"Device fleet"}),(0,a.jsx)("p",{className:"text-xs opacity-70",children:"Detected Apple devices \xb7 OMF v1 templates use this to decide which capabilities to fire vs gracefully degrade. iPhone-only fleets still get full template value via the fallback chain."})]}),(0,a.jsx)(n,{api:e})]})}}},e=>{e.O(0,[753,4658,7358],()=>e(e.s=17344)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{73365:(e,t,s)=>{"use strict";s.d(t,{GM:()=>n,J3:()=>l,WF:()=>a,bR:()=>c,m:()=>r,r5:()=>i});let a="/v1/devices",i="/v1/approvals/merges",c="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",n="/v1/morning-digest/showroom",r="/v1/next-fluent/dispatch"},85363:(e,t,s)=>{Promise.resolve().then(s.bind(s,96488))},96488:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(26940),i=s(10672),c=s(73365);class l extends Error{constructor(e,t,s){super("devices ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="DevicesApiError"}}function n(e){let{api:t}=e,[s,c]=(0,i.useState)(null),[n,r]=(0,i.useState)(null),[o,d]=(0,i.useState)(!0);return((0,i.useEffect)(()=>{let e=!1;return t.fleet().then(t=>{e||(c(t),d(!1))}).catch(t=>{e||(r(t instanceof l?"(".concat(t.status,") ").concat(t.path):String(t)),d(!1))}),()=>{e=!0}},[t]),o)?(0,a.jsx)("div",{className:"text-sm opacity-70",children:"Loading device fleet…"}):n?(0,a.jsx)("div",{role:"alert",className:"rounded bg-rose-50 px-3 py-2 text-sm text-rose-900",children:n}):s?0===s.totalDevices?(0,a.jsxs)("div",{className:"rounded border border-zinc-200 bg-zinc-50 p-4 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"No Apple devices detected yet."}),(0,a.jsxs)("p",{className:"mt-1 opacity-70",children:["The iOS Companion writes ",(0,a.jsx)("code",{children:"~/.elanous/devices.json"})," on iCloud sync. Install it on at least one Apple device to populate this list."]})]}):(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsxs)("caption",{className:"text-xs opacity-60 text-left mb-2",children:["snapshot @ ",new Date(s.snapshotAt).toLocaleString()," \xb7 ",s.totalDevices," devices"]}),(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-zinc-200 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("th",{className:"text-left py-1",children:"kind"}),(0,a.jsx)("th",{className:"text-right py-1",children:"count"}),(0,a.jsx)("th",{className:"text-left py-1 pl-3",children:"capabilities"})]})}),(0,a.jsx)("tbody",{children:s.kinds.map(e=>(0,a.jsxs)("tr",{className:"border-b border-zinc-100 align-top",children:[(0,a.jsx)("td",{className:"py-1 font-medium",children:e.kind}),(0,a.jsx)("td",{className:"py-1 text-right tabular-nums",children:e.count}),(0,a.jsx)("td",{className:"py-1 pl-3 text-xs",children:0===e.capabilities.length?(0,a.jsx)("span",{className:"opacity-50",children:"(none advertised)"}):e.capabilities.map(e=>(0,a.jsx)("span",{className:"mr-1 inline-block rounded bg-zinc-100 px-1.5 py-0.5",children:e},e))})]},e.kind))})]}):(0,a.jsx)("div",{className:"text-sm opacity-70",children:"No fleet data."})}function r(){let e=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch;async function i(t,i){let c={"content-type":"application/json"};e.authHeader&&(c.authorization=e.authHeader);let n=await a("".concat(s).concat(t),{...i,headers:c}),r=await n.json().catch(()=>null);if(!n.ok)throw new l(n.status,t,r);return r}return{fleet:async()=>await i(c.WF),preview:async e=>await i(c.bR,{method:"POST",body:JSON.stringify(e)})}})({baseUrl:window.location.origin}),[]);return(0,a.jsxs)("section",{className:"flex flex-col gap-4 p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-lg font-semibold",children:"Device fleet"}),(0,a.jsx)("p",{className:"text-xs opacity-70",children:"Detected Apple devices \xb7 OMF v1 templates use this to decide which capabilities to fire vs gracefully degrade. iPhone-only fleets still get full template value via the fallback chain."})]}),(0,a.jsx)(n,{api:e})]})}}},e=>{e.O(0,[753,4658,7358],()=>e(e.s=85363)),_N_E=e.O()}]);