elanous 0.2.21 → 0.2.22

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 (315) 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/1307-08b716476f1d50af.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/{2489-ff55a35b202c0f94.js → 2489-d238d3e2eb5b2bf5.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-d781be3e3a9cfd74.js → page-d85c43f46f58716b.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/app/board/{page-b0a80997903852d8.js → page-4e645600579ae952.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-2b1263165630d9c8.js → page-87edbfd19117823b.js} +1 -1
  14. package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/app/chat/{page-e2d6bed48ac20120.js → page-cbaf66b1e1804adf.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/app/consult/{page-111cabe4d1fd69ae.js → page-80ed511e02c81412.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/app/control/{page-544dd4bd4847eeb7.js → page-9f5610caaa06178c.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/app/decisions/{page-3ee191319bf97d87.js → page-ec8f3575e339de74.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/app/exec/{page-a449f1ed472b81c2.js → page-2a19c5cd3b562580.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/app/field/{page-9045094d6d3b5cd0.js → page-b6a09cde2e07521a.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/app/inside/{page-c06673596849ef45.js → page-f7eae1518ca0c353.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/app/{layout-9f81233f29dcd409.js → layout-8462d6a543cbb2d9.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/app/morning/{page-7a12f61be4a579d1.js → page-786fb4504d0f2fa9.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/app/{not-found-c85b0589591a99c9.js → not-found-75209f14597dcb8f.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/app/observatory/{page-725a4da02dd129eb.js → page-bf30affe3a85af7e.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/app/{page-21bec4afeb2f0917.js → page-76cf838050a8d681.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/app/reflection/{page-dc39ee7a36d26385.js → page-7ec8e289b4c14df6.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-84ae759f76053672.js → page-8c8ac17d52be2a79.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/app/sessions/{page-3db58ddb61fe2be9.js → page-d359ab048d63a9d9.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-c5315e30f3528dc4.js → page-b8b345c880bf78d1.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/app/settings/{page-2fe368efb6de3b6a.js → page-f151cc10ad026940.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/app/share/{page-c69762987b751174.js → page-bf495a1e284f4e00.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/workflows/{page-7f8d7fcdf058a845.js → page-69cb93d1a2e57e0e.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/app/workspace/{page-22163556cd38bc88.js → page-72ec543928d67c3e.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +1 -0
  58. package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +1 -0
  59. package/apps/pwa/out/approvals/index.html +1 -1
  60. package/apps/pwa/out/approvals/index.txt +14 -14
  61. package/apps/pwa/out/autopilot/index.html +1 -1
  62. package/apps/pwa/out/autopilot/index.txt +14 -14
  63. package/apps/pwa/out/board/index.html +1 -1
  64. package/apps/pwa/out/board/index.txt +14 -14
  65. package/apps/pwa/out/botlab/index.html +1 -1
  66. package/apps/pwa/out/botlab/index.txt +14 -14
  67. package/apps/pwa/out/bots/index.html +1 -1
  68. package/apps/pwa/out/bots/index.txt +14 -14
  69. package/apps/pwa/out/ceo/index.html +1 -1
  70. package/apps/pwa/out/ceo/index.txt +14 -14
  71. package/apps/pwa/out/chat/index.html +1 -1
  72. package/apps/pwa/out/chat/index.txt +14 -14
  73. package/apps/pwa/out/consult/index.html +1 -1
  74. package/apps/pwa/out/consult/index.txt +14 -14
  75. package/apps/pwa/out/control/index.html +1 -1
  76. package/apps/pwa/out/control/index.txt +14 -14
  77. package/apps/pwa/out/decisions/index.html +1 -1
  78. package/apps/pwa/out/decisions/index.txt +14 -14
  79. package/apps/pwa/out/design-check/index.html +1 -1
  80. package/apps/pwa/out/design-check/index.txt +14 -14
  81. package/apps/pwa/out/editor/index.html +1 -1
  82. package/apps/pwa/out/editor/index.txt +14 -14
  83. package/apps/pwa/out/exec/index.html +1 -1
  84. package/apps/pwa/out/exec/index.txt +14 -14
  85. package/apps/pwa/out/field/index.html +1 -1
  86. package/apps/pwa/out/field/index.txt +14 -14
  87. package/apps/pwa/out/healthz +1 -1
  88. package/apps/pwa/out/index.html +1 -1
  89. package/apps/pwa/out/index.txt +14 -14
  90. package/apps/pwa/out/inside/index.html +1 -1
  91. package/apps/pwa/out/inside/index.txt +14 -14
  92. package/apps/pwa/out/intake/index.html +1 -1
  93. package/apps/pwa/out/intake/index.txt +14 -14
  94. package/apps/pwa/out/live/index.html +1 -1
  95. package/apps/pwa/out/live/index.txt +14 -14
  96. package/apps/pwa/out/live-run/index.html +1 -1
  97. package/apps/pwa/out/live-run/index.txt +14 -14
  98. package/apps/pwa/out/loops/index.html +1 -1
  99. package/apps/pwa/out/loops/index.txt +14 -14
  100. package/apps/pwa/out/market/index.html +1 -1
  101. package/apps/pwa/out/market/index.txt +14 -14
  102. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  103. package/apps/pwa/out/missions/placeholder/index.txt +14 -14
  104. package/apps/pwa/out/morning/index.html +1 -1
  105. package/apps/pwa/out/morning/index.txt +14 -14
  106. package/apps/pwa/out/observatory/index.html +1 -1
  107. package/apps/pwa/out/observatory/index.txt +14 -14
  108. package/apps/pwa/out/ops/checklist/index.html +1 -1
  109. package/apps/pwa/out/ops/checklist/index.txt +14 -14
  110. package/apps/pwa/out/ops/release/index.html +1 -1
  111. package/apps/pwa/out/ops/release/index.txt +14 -14
  112. package/apps/pwa/out/ops/seats/index.html +1 -1
  113. package/apps/pwa/out/ops/seats/index.txt +14 -14
  114. package/apps/pwa/out/outputs/index.html +1 -1
  115. package/apps/pwa/out/outputs/index.txt +14 -14
  116. package/apps/pwa/out/reflection/index.html +1 -1
  117. package/apps/pwa/out/reflection/index.txt +15 -15
  118. package/apps/pwa/out/scheduler/index.html +1 -1
  119. package/apps/pwa/out/scheduler/index.txt +14 -14
  120. package/apps/pwa/out/sessions/index.html +1 -1
  121. package/apps/pwa/out/sessions/index.txt +14 -14
  122. package/apps/pwa/out/settings/devices/index.html +1 -1
  123. package/apps/pwa/out/settings/devices/index.txt +14 -14
  124. package/apps/pwa/out/settings/index.html +1 -1
  125. package/apps/pwa/out/settings/index.txt +14 -14
  126. package/apps/pwa/out/setup/done/index.html +1 -1
  127. package/apps/pwa/out/setup/done/index.txt +14 -14
  128. package/apps/pwa/out/setup/index.html +1 -1
  129. package/apps/pwa/out/setup/index.txt +14 -14
  130. package/apps/pwa/out/share/index.html +1 -1
  131. package/apps/pwa/out/share/index.txt +14 -14
  132. package/apps/pwa/out/showroom/index.html +1 -1
  133. package/apps/pwa/out/showroom/index.txt +14 -14
  134. package/apps/pwa/out/tasks/index.html +1 -1
  135. package/apps/pwa/out/tasks/index.txt +14 -14
  136. package/apps/pwa/out/term/index.html +1 -1
  137. package/apps/pwa/out/term/index.txt +14 -14
  138. package/apps/pwa/out/today/index.html +1 -1
  139. package/apps/pwa/out/today/index.txt +14 -14
  140. package/apps/pwa/out/trace/index.html +1 -1
  141. package/apps/pwa/out/trace/index.txt +14 -14
  142. package/apps/pwa/out/vault/index.html +1 -1
  143. package/apps/pwa/out/vault/index.txt +14 -14
  144. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  145. package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
  146. package/apps/pwa/out/workflows/index.html +1 -1
  147. package/apps/pwa/out/workflows/index.txt +14 -14
  148. package/apps/pwa/out/workspace/index.html +1 -1
  149. package/apps/pwa/out/workspace/index.txt +14 -14
  150. package/apps/pwa/out/worktrees/index.html +1 -1
  151. package/apps/pwa/out/worktrees/index.txt +14 -14
  152. package/graphs/catalog/catalog.yaml +1 -1
  153. package/graphs/drafts/recipes.yaml +2 -2
  154. package/graphs/test-diet/recipes.yaml +3 -0
  155. package/graphs/test-diet/test-diet.yaml +3 -1
  156. package/package.json +1 -1
  157. package/scripts/f-session-monitor.ts +69 -0
  158. package/scripts/hq/standby-snapshot.ts +7 -3
  159. package/scripts/knowledge-compress.ts +11 -0
  160. package/scripts/nightly-docops.ts +90 -3
  161. package/scripts/research-coo-admin-dates.ts +39 -0
  162. package/scripts/skills/public-check.ts +7 -2
  163. package/scripts/smart-merge/resync-shadow.ts +5 -3
  164. package/scripts/test-diet/lib.ts +81 -1
  165. package/scripts/test-diet/node.ts +48 -2
  166. package/scripts/verify-coo-admin-evidence.ts +83 -0
  167. package/src/acp/client.ts +4 -2
  168. package/src/agent/run-context.ts +4 -0
  169. package/src/agent-env/profile.ts +25 -5
  170. package/src/agent-mission/driver.ts +26 -12
  171. package/src/agent-mission/supervisor-metrics.ts +17 -2
  172. package/src/agent-substrate/acp-reviewer.ts +12 -5
  173. package/src/agent-substrate/pr-reviewer.ts +11 -4
  174. package/src/agent-substrate/review-intent.ts +102 -3
  175. package/src/autopilot/build/llm-conflict-merge.ts +22 -8
  176. package/src/autopilot/pr-manager.ts +18 -8
  177. package/src/away/release-watch.ts +47 -8
  178. package/src/briefing/brief-items.ts +104 -11
  179. package/src/chat/index.ts +1 -0
  180. package/src/cli/brief-cli.ts +20 -2
  181. package/src/cli/config-classify.ts +83 -0
  182. package/src/cli/control-cli.ts +14 -0
  183. package/src/cli/decisions-cli.ts +26 -16
  184. package/src/cli/logs-model-input.ts +1 -1
  185. package/src/cli/pr-cli.ts +65 -8
  186. package/src/cli/release-cli.ts +21 -4
  187. package/src/cli/tasks-cli.ts +108 -1
  188. package/src/connectors/types.ts +6 -6
  189. package/src/context-bus/context-now-surfaces.ts +18 -0
  190. package/src/context-bus/coord-events.ts +32 -4
  191. package/src/context-bus/long-term-memory.ts +23 -6
  192. package/src/context-bus/nightly-condense.ts +169 -21
  193. package/src/control/control-status.ts +87 -0
  194. package/src/control-plane/light-member.ts +5 -3
  195. package/src/control-plane/member.ts +172 -7
  196. package/src/core-turn/run-goal-loop.ts +22 -1
  197. package/src/dashboard/slash-runtime/dashboard-handlers.ts +9 -0
  198. package/src/decisions/decision-cards.ts +20 -1
  199. package/src/decisions/decision-ledger.ts +11 -8
  200. package/src/decisions/web-push-decision-cards.ts +19 -3
  201. package/src/discord-self-message.ts +2 -2
  202. package/src/domains/coo-admin-dates.evidence.json +876 -0
  203. package/src/domains/coo-admin-tool.ts +48 -14
  204. package/src/domains/ops-status.ts +53 -0
  205. package/src/domains/outbound-alert.ts +24 -1
  206. package/src/exec-requests/planner.ts +6 -0
  207. package/src/graph-kinds/registry.ts +6 -6
  208. package/src/graph-runner/graph-cli.ts +34 -2
  209. package/src/graph-runner/graph-run-api.ts +7 -0
  210. package/src/graph-runner/graph-tick.ts +73 -12
  211. package/src/graph-runner/runner.ts +43 -11
  212. package/src/graph-unify/wf-to-graph.ts +79 -0
  213. package/src/graph-wizard/generate.ts +34 -2
  214. package/src/graph-wizard/steps.ts +13 -0
  215. package/src/harness/harness-cli-command.ts +121 -23
  216. package/src/harness/harness-queue.ts +58 -14
  217. package/src/harness/launch-advice.ts +23 -0
  218. package/src/index.ts +36 -7
  219. package/src/knowledge/conclusion-compress.ts +93 -0
  220. package/src/knowledge/know-find.ts +9 -2
  221. package/src/knowledge/query.ts +20 -0
  222. package/src/llm.ts +26 -16
  223. package/src/loops/neighbor-runtime.ts +88 -0
  224. package/src/loops/orchestrator/author-depth.ts +29 -11
  225. package/src/loops/orchestrator/overlap.ts +7 -1
  226. package/src/loops/orchestrator/resync-shadow.ts +1 -1
  227. package/src/loops/orchestrator/tick.ts +35 -2
  228. package/src/loops/orchestrator/traffic.ts +2 -0
  229. package/src/loops/registry.ts +5 -0
  230. package/src/market/publish.ts +17 -1
  231. package/src/maturity/feature-maturity.ts +2 -1
  232. package/src/mss/logging/redaction.ts +17 -0
  233. package/src/nexus/api/draft-metrics.ts +22 -8
  234. package/src/nexus/api/graph-peer-edit.ts +77 -0
  235. package/src/nexus/api/graph-wizard-api.ts +9 -1
  236. package/src/nexus/api/graphs-api.ts +145 -7
  237. package/src/nexus/api/http-server.ts +93 -8
  238. package/src/nexus/api/plugins-market.ts +24 -0
  239. package/src/nexus/index.ts +3 -2
  240. package/src/oauth/claude-pty-maturity.ts +24 -0
  241. package/src/oauth/fallback-chain.ts +27 -14
  242. package/src/plugins/maker/market-bundle.ts +9 -0
  243. package/src/plugins/maker/plugin-maker.ts +9 -3
  244. package/src/plugins/maker/wizard-generate.ts +73 -9
  245. package/src/policy/llm-policy.ts +11 -6
  246. package/src/release-loop/checklist-board.ts +27 -0
  247. package/src/release-loop/checklist.ts +38 -0
  248. package/src/seat-address/seat-address.ts +1 -0
  249. package/src/seat-loop/seat-loop.ts +174 -20
  250. package/src/seat-loop/seat-report.ts +29 -1
  251. package/src/self-dev/dev-cli.ts +90 -8
  252. package/src/self-dev/dev-pipeline.ts +20 -1
  253. package/src/self-dev/draft-sweep.ts +45 -8
  254. package/src/self-dev/orchestrate.ts +3 -0
  255. package/src/self-dev/review-provider-fallback.ts +83 -0
  256. package/src/self-dev/run-supervisor.ts +5 -1
  257. package/src/self-implement/harness-policy-gates.ts +7 -5
  258. package/src/self-implement/host-regate.ts +28 -14
  259. package/src/self-implement/l8-merge-queue.ts +80 -8
  260. package/src/self-implement/orchestrator.ts +68 -27
  261. package/src/self-implement/seams.ts +5 -3
  262. package/src/self-implement/self-implement-cli.ts +4 -0
  263. package/src/shell-env-bootstrap.ts +19 -4
  264. package/src/steward/triage.ts +25 -8
  265. package/src/storage/file-lock.ts +33 -4
  266. package/src/task-agent/completion-evidence.ts +31 -3
  267. package/src/task-agent/cover.ts +61 -0
  268. package/src/task-agent/live-moves.ts +126 -3
  269. package/src/task-agent/shadow.ts +19 -4
  270. package/src/task-agent/task-hand.ts +2 -0
  271. package/src/task-orchestrator/surfaces/pod-pool.ts +138 -15
  272. package/src/task-orchestrator/surfaces/self-implement.ts +7 -0
  273. package/src/telegram-commands.ts +8 -0
  274. package/src/telegram-project-command.ts +6 -0
  275. package/src/telegram.ts +2 -2
  276. package/src/typecheck-ratchet.ts +2 -1
  277. package/src/user-config.ts +35 -4
  278. package/src/version/packed-revision.json +1 -1
  279. package/src/workflow-runtime/executor.ts +24 -2
  280. package/src/workflow-runtime/triggers/registry.ts +27 -0
  281. package/src/workflow-runtime/triggers/schedule-source.ts +30 -3
  282. package/apps/pwa/out/_next/static/chunks/1307-c97eba9fb72a9a5e.js +0 -1
  283. package/apps/pwa/out/_next/static/chunks/3857-995ea9f5ef33d71e.js +0 -1
  284. package/apps/pwa/out/_next/static/chunks/5977-59fedea50d13c762.js +0 -1
  285. package/apps/pwa/out/_next/static/chunks/8857-f1762140ef9a96b1.js +0 -1
  286. package/apps/pwa/out/_next/static/chunks/9247-7581825d511a64c0.js +0 -1
  287. package/apps/pwa/out/_next/static/chunks/9497-b0e758d1cd4ae8d7.js +0 -1
  288. package/apps/pwa/out/_next/static/chunks/app/approvals/page-937c92292a4ab4f0.js +0 -1
  289. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea998f7f5d156bea.js +0 -1
  290. package/apps/pwa/out/_next/static/chunks/app/ceo/page-33c328b64ca508f8.js +0 -1
  291. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e4bcb2c503dab04b.js +0 -1
  292. package/apps/pwa/out/_next/static/chunks/app/editor/page-300897dcbbd5ed76.js +0 -1
  293. package/apps/pwa/out/_next/static/chunks/app/intake/page-103fa3191c1b2e08.js +0 -1
  294. package/apps/pwa/out/_next/static/chunks/app/live/page-be8b4615c919e36c.js +0 -1
  295. package/apps/pwa/out/_next/static/chunks/app/live-run/page-c685b104e0dfa609.js +0 -1
  296. package/apps/pwa/out/_next/static/chunks/app/loops/page-8d693331cfbb6add.js +0 -1
  297. package/apps/pwa/out/_next/static/chunks/app/market/page-cef4f30a4c22fae1.js +0 -1
  298. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66ea1b54fc83fa15.js +0 -1
  299. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8cc707bd09a497d9.js +0 -1
  300. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-90b55be1f15ce0e8.js +0 -1
  301. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cb16606e08be65db.js +0 -1
  302. package/apps/pwa/out/_next/static/chunks/app/outputs/page-16dc64b74ed6a40a.js +0 -1
  303. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8d04132dd0ac5e10.js +0 -1
  304. package/apps/pwa/out/_next/static/chunks/app/setup/page-f23484de467c9ea3.js +0 -1
  305. package/apps/pwa/out/_next/static/chunks/app/showroom/page-5456692bda39aafb.js +0 -1
  306. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d75f7cd65845ce98.js +0 -1
  307. package/apps/pwa/out/_next/static/chunks/app/term/page-5603f5e568b25ce3.js +0 -1
  308. package/apps/pwa/out/_next/static/chunks/app/today/page-d2cc0f4e89f42028.js +0 -1
  309. package/apps/pwa/out/_next/static/chunks/app/trace/page-a6eb73b8a4840f1c.js +0 -1
  310. package/apps/pwa/out/_next/static/chunks/app/vault/page-c0a3f4d10edb83fa.js +0 -1
  311. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6c0b88068c143f15.js +0 -1
  312. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-141436fd26dd56fc.js +0 -1
  313. package/apps/pwa/out/_next/static/css/e81df11490b4413b.css +0 -1
  314. /package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → aBi6EyMtLsrl7J8eH4kF7}/_buildManifest.js +0 -0
  315. /package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → aBi6EyMtLsrl7J8eH4kF7}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6605],{457:(e,t,a)=>{Promise.resolve().then(a.bind(a,88843))},3704:(e,t,a)=>{"use strict";a.d(t,{A:()=>i});var r=a(46124);let n=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.filter((e,t,a)=>!!e&&""!==e.trim()&&a.indexOf(e)===t).join(" ").trim()},s=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,a)=>a?a.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,r.createContext)({}),c=(0,r.forwardRef)((e,t)=>{var a,s,c;let{color:i,size:d,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:h,iconNode:b,...x}=e,{size:f=24,strokeWidth:g=2,absoluteStrokeWidth:w=!1,color:y="currentColor",className:v=""}=null!=(a=(0,r.useContext)(o))?a:{},N=(null!=m?m:w)?24*Number(null!=u?u:g)/Number(null!=d?d:f):null!=u?u:g;return(0,r.createElement)("svg",{ref:t,...l,width:null!=(s=null!=d?d:f)?s:l.width,height:null!=(c=null!=d?d:f)?c:l.height,stroke:null!=i?i:y,strokeWidth:N,className:n("lucide",v,p),...!h&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(x)&&{"aria-hidden":"true"},...x},[...b.map(e=>{let[t,a]=e;return(0,r.createElement)(t,a)}),...Array.isArray(h)?h:[h]])}),i=(e,t)=>{let a=(0,r.forwardRef)((a,l)=>{let{className:o,...i}=a;return(0,r.createElement)(c,{ref:l,iconNode:t,className:n("lucide-".concat(s(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...i})});return a.displayName=s(e),a}},5997:(e,t,a)=>{"use strict";a.d(t,{Zr:()=>l,f6:()=>n,oD:()=>s});let r="elanous.daemon.sessionId";function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=n();return localStorage.setItem(r,t),t}function l(){let e=n();return localStorage.setItem(r,e),e}},15151:(e,t,a)=>{"use strict";a.d(t,{C:()=>i,DaemonProvider:()=>d,Q:()=>u});var r=a(55539),n=a(46124),s=a(8101),l=a(5997),o=a(18060),c=a(72215);let i=(0,n.createContext)(null);function d(e){let{children:t}=e,a={baseUrl:"",token:"",provider:""},[d,u]=(0,n.useState)(a),[m,p]=(0,n.useState)(""),[h]=(0,n.useState)(()=>new o.ki(a));(0,n.useEffect)(()=>{let e=(0,s.Fp)();u(e),h.updateConfig(e),p((0,l.oD)()),(0,c.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();h.updateConfig(t),u(t),(0,c.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,c.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 b=e=>{u(t=>{let a={...t,...e};return(0,s.Qc)(e),h.updateConfig(a),(0,c.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),a})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,c.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,n.useMemo)(()=>({config:d,setConfig:b,client:h,sessionId:m,setSessionId:x}),[d,h,m]);return(0,r.jsx)(i.Provider,{value:f,children:t})}function u(){let e=(0,n.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},42827:(e,t,a)=>{"use strict";a.d(t,{GM:()=>o,J3:()=>l,WF:()=>r,bR:()=>s,m:()=>c,r5:()=>n});let r="/v1/devices",n="/v1/approvals/merges",s="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",o="/v1/morning-digest/showroom",c="/v1/next-fluent/dispatch"},54508:(e,t,a)=>{"use strict";a.d(t,{V5:()=>s,tV:()=>l});var r=a(42827);class n extends Error{constructor(e,t,a){super(a||t),this.status=e,this.error=t,this.reason=a,this.name="MergeApprovalsApiError"}}function s(e,t){return e instanceof n?401===e.status||"unauthorized"===e.error?{text:"이 기기에 소유자 토큰이 없어 승인 목록을 못 읽었습니다 — 이미 연결된 기기의 설정 › 연결 토큰 만들기 에서 토큰을 만들어, 이 기기의 설정 › 데몬 연결 › 연결 토큰 칸에 붙이면 바로 보입니다.",href:"/app/settings/#bearer-token"}:"gh-failed"===e.error?{text:"데몬이 GitHub 를 읽지 못했습니다(데몬 기계의 gh 로그인\xb7네트워크) — 잠시 뒤 다시 열어 보세요.".concat(e.reason?" 사유: ".concat(e.reason.split("\n")[0].slice(0,160)):"")}:"gh-invalid-response"===e.error?{text:"GitHub 응답을 해석하지 못했습니다 — 잠시 뒤 다시 열어 보세요."}:"approvals-repo-unknown"===e.error?{text:"승인할 저장소를 모릅니다 — 데몬 설정 intake.approvals.repo(예: owner/repo)를 채워 주세요.",href:"/app/settings/"}:e.reason?{text:e.reason}:{text:"".concat(t," (").concat(e.status," ").concat(e.error,")")}:e instanceof TypeError?{text:"데몬에 닿지 못했습니다 — 데몬이 켜져 있는지, 이 기기가 같은 네트워크(tailnet)에 있는지 확인하세요."}:{text:e instanceof Error&&e.message?e.message:t}}function l(e){var t,a;let s=null!=(t=e.fetchImpl)?t:fetch,l=(null!=(a=e.baseUrl)?a:"").replace(/\/+$/,"");async function o(t,a){let r={...a,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},o=e.client?await e.client.fetchResponse(t,r):await s("".concat(l).concat(t),r),c=await o.json().catch(()=>null);if(!o.ok){var i;let e=c&&"object"==typeof c?c:{};throw new n(o.status,null!=(i=e.error)?i:"request-failed",e.reason)}return c}return{list:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"open";return o("merged"===e?"".concat(r.r5,"?state=merged"):r.r5)},get:e=>o("".concat(r.r5,"/").concat(e)),check:(e,t)=>o("".concat(r.r5,"/").concat(e,"/check"),{method:"POST",body:JSON.stringify({headSha:t})}),merge:(e,t)=>o("".concat(r.r5,"/").concat(e,"/merge"),{method:"POST",body:JSON.stringify({headSha:t})})}}},74780:(e,t,a)=>{"use strict";function r(e){return{slides:e.slides.map(e=>{let{image:t,caption:a,include:r}=e;return{image:t,caption:a,include:r}}),caption:{hook:e.caption.hook,body:e.caption.body},hashtags:[...e.hashtags],cover:{text:e.cover.text,sub:e.cover.sub},location:e.location}}a.d(t,{$Y:()=>l,LP:()=>c,Mz:()=>r,ll:()=>d,rH:()=>o});class n extends Error{constructor(e,t){super(t),this.status=e,this.name="GraphApprovalsApiError"}}let s={list:"목록을 보려면",decide:"승인하려면",save:"초안을 저장하려면"},l="/app/settings/#bearer-token";function o(e){return e instanceof n&&(401===e.status||403===e.status)}function c(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"decide";return e instanceof n?401===e.status||403===e.status?"".concat(s[t]," 이 기기를 데몬에 연결해야 합니다 — 설정 › 데몬 연결 › 연결 토큰 칸에 토큰을 넣어 주세요."):404===e.status?"이 실행을 찾지 못했습니다. 목록을 다시 확인해 주세요.":409===e.status?"이미 결정된 실행입니다. 목록을 다시 확인해 주세요.":400===e.status?"결정 내용을 확인한 뒤 다시 시도해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요.":e instanceof TypeError?"서버에 연결하지 못했습니다. 연결 상태를 확인해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요."}let i="/v1/graph-approvals";function d(e){var t,a;let r=(null!=(t=e.baseUrl)?t:"").replace(/\/+$/,""),s=null!=(a=e.fetchImpl)?a:fetch;async function l(t,a){let l={...a,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},o=e.client?await e.client.fetchResponse(t,l):await s("".concat(r).concat(t),l),c=await o.json().catch(()=>null);if(!o.ok){let e=c&&"object"==typeof c&&"error"in c&&"string"==typeof c.error?c.error:"request-failed";throw new n(o.status,e)}return c}return{list:()=>l(i),decide:(e,t,a)=>l("".concat(i,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t)),{method:"POST",body:JSON.stringify({decision:a})}),saveFeedDraft:(e,t,a)=>l("".concat(i,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t),"/feed-draft"),{method:"PUT",body:JSON.stringify(a)}),feedMedia:async(t,a,l)=>{let o="".concat(i,"/").concat(encodeURIComponent(t),"/").concat(encodeURIComponent(a),"/media?path=").concat(encodeURIComponent(l)),c={headers:e.authHeader?{authorization:e.authHeader}:{}},d=e.client?await e.client.fetchResponse(o,c):await s("".concat(r).concat(o),c);if(!d.ok)throw new n(d.status,"media-failed");return d.blob()}}}},76573:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});let r=(0,a(3704).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},88843:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>j});var r=a(55539),n=a(46124),s=a(65761),l=a(77362),o=a(15151),c=a(97479),i=a(54508);function d(e,t){return"UNKNOWN"===t&&e<3?3e3:null}async function u(e,t){let a,r=0,n=d(0,"UNKNOWN");for(;null!==n;){var s,l,o;if(await t.sleep(n),t.isActive&&!t.isActive())break;r++;try{a=await e(),null==(l=t.onDetail)||l.call(t,a)}catch(e){}null==(s=t.onAttempt)||s.call(t),n=d(r,null!=(o=null==a?void 0:a.mergeable)?o:"UNKNOWN")}return{attempts:r,...a?{last:a}:{}}}var m=a(76573);function p(e){let{view:t,target:a}=e,[s]=(0,n.useState)(()=>Date.now()),[l,o]=(0,n.useState)(s);(0,n.useEffect)(()=>{let e=window.setInterval(()=>o(Date.now()),100);return()=>window.clearInterval(e)},[]);let c=function(e,t,a){let r="".concat((Math.max(0,e)/1e3).toFixed(1),"초");return{title:"merged"===t?"GitHub 에서 반영된 코드 변경을 읽고 있습니다":a?"GitHub 에서 승인을 기다리는 코드 변경과 #".concat(a," 카드를 읽고 있습니다"):"GitHub 에서 승인을 기다리는 코드 변경을 읽고 있습니다",clock:r,hint:e>=8e3?"평소(2~5초)보다 오래 걸립니다 — GitHub 응답을 기다리는 중이며 멈추지 않았습니다.":null}}(l-s,t,a);return(0,r.jsxs)("section",{role:"status","aria-live":"polite","aria-busy":"true",className:"space-y-3","data-approvals-loading":!0,children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 rounded-xl border border-blue-500/40 bg-blue-500/5 p-4",children:[(0,r.jsx)(m.A,{className:"h-6 w-6 shrink-0 text-blue-500 motion-safe:animate-spin","aria-hidden":!0}),(0,r.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,r.jsx)("p",{className:"font-medium",children:c.title}),c.hint&&(0,r.jsx)("p",{className:"mt-1 text-sm text-amber-600 dark:text-amber-400",children:c.hint})]}),(0,r.jsx)("span",{className:"font-mono text-lg tabular-nums text-blue-600 dark:text-blue-300","aria-label":"경과 시간",children:c.clock})]}),(0,r.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted","aria-hidden":!0,children:(0,r.jsx)("div",{className:"h-full w-1/3 rounded-full bg-blue-500 motion-safe:animate-[approvals-slide_1.2s_ease-in-out_infinite]"})}),(0,r.jsx)("style",{children:"@keyframes approvals-slide{0%{transform:translateX(-100%)}100%{transform:translateX(300%)}}"}),[0,1].map(e=>(0,r.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-card p-5 motion-safe:animate-pulse","aria-hidden":!0,children:[(0,r.jsx)("div",{className:"h-4 w-2/3 rounded bg-muted"}),(0,r.jsx)("div",{className:"h-3 w-full rounded bg-muted"}),(0,r.jsx)("div",{className:"h-3 w-5/6 rounded bg-muted"})]},e))]})}function h(e){let{view:t,onChange:a}=e,n=(e,n)=>(0,r.jsx)("button",{type:"button",role:"tab","aria-selected":t===e,onClick:()=>a(e),className:"rounded-md px-3 py-1 text-sm ".concat(t===e?"bg-foreground text-background":"bg-muted text-foreground"),children:n});return(0,r.jsxs)("div",{role:"tablist","aria-label":"승인 목록 보기",className:"flex gap-2",children:[n("open","승인 대기"),n("merged","완료")]})}function b(e){let{brief:t,lineage:a,summary:n}=e;return(0,r.jsxs)(r.Fragment,{children:[null!==t?(0,r.jsx)("section",{"aria-label":"승인 요약",className:"mt-3 break-words text-sm leading-relaxed [&_a]:text-blue-600 [&_a]:underline [&_blockquote]:border-l-2 [&_blockquote]:pl-3 [&_h3]:mt-3 [&_h3]:font-semibold [&_li]:ml-5 [&_li]:list-disc [&_p]:my-2 [&_table]:block [&_table]:overflow-x-auto",children:(0,r.jsx)(s.oz,{remarkPlugins:[l.A],components:{a:e=>{let{href:t,children:a}=e;return(0,r.jsx)("a",{href:t,target:"_blank",rel:"noreferrer",children:a})}},children:t})}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("p",{className:"mt-3 rounded border border-amber-500/40 bg-amber-500/15 p-3 text-sm text-amber-800 dark:text-amber-300",children:"승인 요약 내용이 없습니다 — GitHub 본문을 보거나 발사자에게 요청하세요"}),(0,r.jsx)("p",{className:"mt-3 whitespace-pre-wrap text-sm",children:n})]}),a&&(0,r.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["아이디어 원장: ",a]})]})}function x(e){var t;let{gate:a,busy:n,blocked:s,mergeLabel:l,onCheck:o,onMerge:c}=e;return(0,r.jsxs)("div",{className:"mt-3 space-y-2","aria-label":"머지 전 검사",children:["none"===a.status&&(0,r.jsx)("button",{type:"button",onClick:o,disabled:n,className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:"머지 전 검사 시작"}),"running"===a.status&&(0,r.jsx)("p",{role:"status",className:"text-sm",children:"검사 중…"}),"passed"===a.status&&(0,r.jsxs)("p",{className:"text-sm text-green-700 dark:text-green-400",children:["검사 통과 (",null!=(t=a.os)?t:"unknown",")",a.baseDrifted?" \xb7 검사 뒤 main 이 움직였다 — 머지 때 겹치는 파일이 있으면 다시 검사를 요구한다":""]}),("failed"===a.status||"unmeasured"===a.status)&&(0,r.jsxs)("div",{role:"alert",className:"text-sm text-red-600",children:[(0,r.jsx)("p",{children:"failed"===a.status?"검사 실패":"검사 측정 불가"}),(0,r.jsx)("ul",{className:"list-inside list-disc",children:a.failures.map((e,t)=>(0,r.jsx)("li",{children:e},t))}),(0,r.jsx)("button",{type:"button",onClick:o,disabled:n,className:"mt-2 rounded-lg border px-3 py-2 disabled:opacity-50",children:"머지 전 검사 다시 시작"})]}),(0,r.jsx)("button",{type:"button",onClick:c,disabled:n||s||"passed"!==a.status,className:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white disabled:cursor-not-allowed disabled:opacity-50",children:null!=l?l:"승인하고 머지"})]})}function f(e){let{card:t,api:a,attempt:r,onAttempt:s,onUpdate:l}=e,o="UNKNOWN"===t.mergeable&&!t.merged&&"OPEN"===t.state;return(0,n.useEffect)(()=>{if(!o||r>0)return;let e=!0,n=[];return u(()=>a.get(t.number),{sleep:e=>new Promise(t=>{n.push(window.setTimeout(t,e))}),isActive:()=>e,onDetail:a=>{e&&l(a,t.headSha)},onAttempt:()=>{e&&s(t.number)}}),()=>{for(let t of(e=!1,n))window.clearTimeout(t)}},[a,t.number,o,r,s,l]),null}function g(){let e=(0,c.In)(),{client:t}=(0,o.Q)(),a=(0,n.useMemo)(()=>(0,i.tV)({client:t}),[t]),[s,l]=(0,n.useState)([]),[u,m]=(0,n.useState)(!0),[g,w]=(0,n.useState)(null),[y,v]=(0,n.useState)(null),[N,j]=(0,n.useState)({}),[k,S]=(0,n.useState)({}),[C,I]=(0,n.useState)(null),[E,U]=(0,n.useState)("open"),L=(0,n.useCallback)(e=>{S(t=>{var a;return{...t,[e]:(null!=(a=t[e])?a:0)+1}})},[]),R=(0,n.useCallback)((e,t)=>{l(a=>a.map(a=>a.number!==e.number||a.headSha!==t?a:{...e,gate:e.headSha===t?e.gate:{status:"none",failures:[]},merged:a.merged}))},[]);async function O(e){v(e.number),j(t=>({...t,[e.number]:""}));try{let{gate:t}=await a.check(e.number,e.headSha);l(a=>a.map(a=>a.number===e.number&&a.headSha===e.headSha?{...a,gate:t}:a))}catch(t){j(a=>({...a,[e.number]:(0,i.V5)(t,"검사를 시작하지 못했습니다.").text}))}finally{v(null)}}async function M(e){if(window.confirm("#".concat(e.number," ").concat(e.title,"\n현재 확인한 변경을 승인하고 머지할까요?"))){v(e.number),j(t=>({...t,[e.number]:""}));try{await a.merge(e.number,e.headSha),l(t=>t.map(t=>t.number===e.number?{...t,merged:!0,state:"MERGED"}:t))}catch(t){j(a=>({...a,[e.number]:(0,i.V5)(t,"머지하지 못했습니다.").text}))}finally{v(null)}}}return((0,n.useEffect)(()=>{let e=s.filter(e=>"OPEN"===e.state&&("running"===e.gate.status||"passed"===e.gate.status));if("open"!==E||!e.length)return;let t=!0,r=window.setInterval(()=>{for(let r of e)a.get(r.number).then(e=>{t&&R(e,r.headSha)}).catch(e=>{t&&j(t=>({...t,[r.number]:(0,i.V5)(e,"검사 상태를 불러오지 못했습니다.").text}))})},1e4);return()=>{t=!1,window.clearInterval(r)}},[a,s,R,E]),(0,n.useEffect)(()=>{let e=!0,t=Number(new URLSearchParams(window.location.search).get("pr")),r=Number.isSafeInteger(t)&&t>0?t:null;return(m(!0),w(null),I(r),"merged"===E)?(a.list("merged").then(t=>{let{items:a}=t;e&&l(a)}).catch(t=>{e&&w((0,i.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&m(!1)}),()=>{e=!1}):(a.list().then(async t=>{let{items:n}=t;if(!e)return;let s=n.find(e=>e.number===r);if(r&&!s)try{let t=await a.get(r);e&&l([t,...n])}catch(t){e&&w((0,i.V5)(t,"PR 을 불러오지 못했습니다.")),e&&l(n)}else l(r?[...n].sort((e,t)=>Number(t.number===r)-Number(e.number===r)):n)}).catch(t=>{e&&w((0,i.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&m(!1)}),()=>{e=!1})},[a,E]),"owner"===e||"open"!==E||u||s.length||g)?(0,r.jsxs)("main",{className:"mx-auto max-w-3xl space-y-5 p-4 pb-20 text-foreground sm:p-8",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"코드 변경 승인"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"자동으로 만든 코드 변경(PR)을 확인하고 승인합니다."})]}),(0,r.jsx)(h,{view:E,onChange:e=>{l([]),U(e)}}),u&&(0,r.jsx)(p,{view:E,target:C}),g&&(0,r.jsxs)("p",{role:"alert",className:"text-red-600","data-approvals-error":!0,children:[g.text,g.href&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsx)("a",{href:g.href,className:"font-semibold underline underline-offset-2","data-approvals-settings":!0,children:"설정 열기 →"})]})]}),!u&&!s.length&&!g&&(0,r.jsx)("p",{children:"merged"===E?"승인해 반영된 코드 변경이 아직 없습니다.":"승인을 기다리는 코드 변경이 없습니다."}),s.map(e=>{var t,n;let s=e.merged||"MERGED"===e.state,l="OPEN"!==e.state&&!s,o=e.draft?"초안 PR 은 머지할 수 없습니다. GitHub에서 초안을 해제한 뒤 다시 확인하세요.":e.checks.failure>0?"실패한 검사가 있습니다.":e.checks.pending>0?"검사가 아직 끝나지 않았습니다.":"CONFLICTING"===e.mergeable?"머지 충돌이 있습니다.":"MERGEABLE"!==e.mergeable?"머지 가능 여부가 아직 확인되지 않았습니다.":"main"!==e.base?"대상 브랜치가 main 이 아닙니다.":"",c=C===e.number,i=null!=(t=k[e.number])?t:0;return(0,r.jsxs)("article",{className:"rounded-xl border bg-card p-5 shadow-sm ".concat(c?"border-blue-500 ring-2 ring-blue-500/30":"border-border"),children:[(0,r.jsx)(f,{card:e,api:a,attempt:i,onAttempt:L,onUpdate:R}),(0,r.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,r.jsxs)("h2",{className:"font-semibold",children:["#",e.number," \xb7 ",e.title]}),(0,r.jsx)("span",{className:"rounded bg-muted px-2 py-1 text-xs",children:s?function(e){if(!e)return"머지됨";let t=new Date(e);if(Number.isNaN(t.getTime()))return"머지됨";let a=new Date(t.getTime()+324e5).toISOString();return"머지됨 ".concat(a.slice(5,10)," ").concat(a.slice(11,16)," KST")}(e.mergedAt):l?"닫힘":e.draft?"초안":"열림"})]}),(0,r.jsx)(b,{brief:e.brief,lineage:e.lineage,summary:e.summary}),(0,r.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["+",e.additions," 추가 / −",e.deletions," 삭제 \xb7 파일 ",e.changedFiles]}),(0,r.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 text-xs","aria-label":"검사 상태",children:[(0,r.jsxs)("span",{className:"rounded bg-green-500/15 px-2 py-1",children:["성공 ",e.checks.success]}),(0,r.jsxs)("span",{className:"rounded bg-red-500/15 px-2 py-1",children:["실패 ",e.checks.failure]}),(0,r.jsxs)("span",{className:"rounded bg-yellow-500/15 px-2 py-1",children:["대기 ",e.checks.pending]}),e.checks.success+e.checks.failure+e.checks.pending===0&&(0,r.jsx)("span",{className:"rounded bg-slate-500/15 px-2 py-1",children:"GitHub 검사 없음 — 머지 전 검사는 아래에서 별도로 실행"})]}),(0,r.jsxs)("details",{open:c,className:"mt-3 text-sm",children:[(0,r.jsx)("summary",{className:"cursor-pointer",children:"바뀐 파일 보기"}),(0,r.jsx)("ul",{className:"mt-2 list-inside list-disc break-all",children:e.files.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-4",children:[(0,r.jsx)("a",{className:"text-sm text-blue-600 underline",href:e.url,target:"_blank",rel:"noopener noreferrer",children:"GitHub 에서 보기"}),!s&&!l&&(0,r.jsx)(x,{gate:e.gate,busy:null!==y,blocked:!!o,mergeLabel:y===e.number?"머지 중…":"UNKNOWN"!==(n=e.mergeable)?"승인하고 머지":null===d(i,n)?"확인 종료":"확인 중…",onCheck:()=>O(e),onMerge:()=>M(e)})]}),o&&!s&&!l&&(0,r.jsxs)("p",{className:"mt-2 text-sm text-amber-600",children:[o,"UNKNOWN"===e.mergeable&&i>=3?" 자동 확인이 끝났습니다. 최신 상태는 페이지를 새로고침하세요.":""]}),N[e.number]&&(0,r.jsx)("p",{role:"alert",className:"mt-2 text-sm text-red-600",children:N[e.number]})]},e.number)})]}):null}var w=a(74780);function y(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),a="release-loop"===e.graphId?"릴리스 발행":"announce-loop"===e.graphId?"공지":e.graphId,r=Date.parse(e.since),n=Number.isNaN(r)?0:Math.max(0,Math.floor((t-r)/6e4)),s=n<1?"방금 전":n<60?"".concat(n,"분 전"):n<1440?"".concat(Math.floor(n/60),"시간 전"):"".concat(Math.floor(n/1440),"일 전");return{title:a,nodeId:e.nodeId,waiting:s,message:e.message,recent:e.recent.map(e=>"".concat(e.ok&&"fail"!==e.outcome&&"error"!==e.outcome?"✓":"✗"," ").concat(e.nodeId).concat(e.outcome?" \xb7 ".concat(e.outcome):"").concat(e.summary?" \xb7 ".concat(e.summary):""))}}function v(e){var t,a,s,l,o,c,i;let{item:d,api:u,onDecided:m,confirm:p}=e,[h,b]=(0,n.useState)(d.feed),[x,f]=(0,n.useState)(()=>(0,w.Mz)(d.feed)),[g,y]=(0,n.useState)(!1),[v,N]=(0,n.useState)(0),[j,k]=(0,n.useState)(!1),[S,C]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[U,L]=(0,n.useState)(""),[R,O]=(0,n.useState)(!1),M=(e,t)=>{L((0,w.LP)(e,t)),O((0,w.rH)(e))},[D,A]=(0,n.useState)({}),P=(0,n.useRef)(null),_=null!=p?p:e=>window.confirm(e),H=(i=(0,w.Mz)(h),JSON.stringify(x)!==JSON.stringify(i)),G=(0,n.useMemo)(()=>(function(e,t){let a=[];for(let r of(e.cover.image&&a.push({image:e.cover.image,isCover:!0}),t.slides))r.include&&a.push({image:r.image,caption:r.caption});return a})(h,x),[h,x]),T=G[Math.min(v,Math.max(0,G.length-1))],F=(0,n.useMemo)(()=>[h.cover.image,...h.slides.map(e=>e.image)].filter(e=>!!e),[h]);function V(e){N(t=>Math.max(0,Math.min(G.length-1,t+e)))}function z(e,t){f(a=>({...a,slides:a.slides.map((a,r)=>r===e?{...a,...t}:a)}))}function W(e,t){f(a=>{let r=e+t;if(r<0||r>=a.slides.length)return a;let n=[...a.slides];return[n[e],n[r]]=[n[r],n[e]],{...a,slides:n}})}async function Y(){C(!0),L(""),O(!1),E("");try{let e=await u.saveFeedDraft(d.graphId,d.runId,x);return b(e.feed),f((0,w.Mz)(e.feed)),E("저장했어요 \xb7 수정 ".concat(e.feed.revision," \xb7 아직 게시 전입니다")),!0}catch(e){return M(e,"save"),!1}finally{C(!1)}}async function J(){if(_("게시할까요? 승인하면 이 초안으로 게시 준비 묶음이 텔레그램으로 갑니다.")&&(!H||await Y())){C(!0),L("");try{await u.decide(d.graphId,d.runId,"approved"),m()}catch(e){M(e,"decide")}finally{C(!1)}}}async function K(){if(_("이 게시 초안을 거절할까요?")){C(!0),L("");try{await u.decide(d.graphId,d.runId,"rejected"),m()}catch(e){M(e,"decide")}finally{C(!1)}}}(0,n.useEffect)(()=>{let e=!0,t=[],a="undefined"!=typeof URL&&"function"==typeof URL.createObjectURL;return Promise.all(F.map(async r=>{try{let n=await u.feedMedia(d.graphId,d.runId,r);if(!e||!a)return null;let s=URL.createObjectURL(n);return t.push(s),[r,s]}catch(e){return null}})).then(t=>{e&&A(Object.fromEntries(t.filter(e=>!!e)))}),()=>{e=!1,a&&"function"==typeof URL.revokeObjectURL&&t.forEach(e=>URL.revokeObjectURL(e))}},[u,d.graphId,d.runId,F]);let $=(null==(t=h.brand)?void 0:t.name)||"브랜드",q=$.trim().charAt(0).toUpperCase()||"\xb7",Q=x.hashtags.join(" "),X=x.cover.text!==(null!=(s=h.cover.renderedText)?s:h.cover.text)||x.cover.sub!==(null!=(l=h.cover.renderedSub)?l:h.cover.sub);return(0,r.jsxs)("article",{"aria-label":"피드 미리보기","data-feed-revision":h.revision,className:"mx-auto w-full max-w-md overflow-hidden rounded-xl border border-border bg-card text-foreground shadow-sm",children:[(0,r.jsxs)("header",{className:"flex items-center gap-3 px-3 py-2",children:[(0,r.jsx)("span",{"aria-hidden":!0,className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm font-semibold",children:q}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("p",{className:"truncate text-sm font-semibold",children:$}),(null==(a=h.brand)?void 0:a.handle)&&(0,r.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:h.brand.handle})]}),(0,r.jsxs)("span",{className:"ml-auto shrink-0 text-xs text-muted-foreground",children:["수정 ",h.revision,H?" \xb7 저장 안 됨":""]})]}),(0,r.jsxs)("div",{className:"relative aspect-[4/5] w-full touch-pan-y select-none overflow-hidden bg-muted",onTouchStart:e=>{var t,a;P.current=null!=(a=null==(t=e.touches[0])?void 0:t.clientX)?a:null},onTouchEnd:e=>{var t;let a=P.current;P.current=null;let r=null==(t=e.changedTouches[0])?void 0:t.clientX;null==a||null==r||40>Math.abs(r-a)||V(r<a?1:-1)},children:[(null==T?void 0:T.image)&&D[T.image]?(0,r.jsx)("img",{src:D[T.image],alt:T.isCover?x.cover.text:null!=(o=T.caption)?o:"",className:"h-full w-full object-cover"}):(0,r.jsx)("div",{className:"flex h-full w-full items-center justify-center text-sm text-muted-foreground",children:"이미지 불러오는 중"}),G.length>1&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{type:"button","aria-label":"이전 장",disabled:0===v,onClick:()=>V(-1),className:"absolute left-2 top-1/2 -translate-y-1/2 rounded-full bg-black/40 px-2 py-1 text-white disabled:opacity-0",children:"‹"}),(0,r.jsx)("button",{type:"button","aria-label":"다음 장",disabled:v>=G.length-1,onClick:()=>V(1),className:"absolute right-2 top-1/2 -translate-y-1/2 rounded-full bg-black/40 px-2 py-1 text-white disabled:opacity-0",children:"›"})]})]}),G.length>1&&(0,r.jsx)("div",{"aria-label":"장 표시",className:"flex justify-center gap-1.5 py-2",children:G.map((e,t)=>(0,r.jsx)("span",{"data-dot":t===v?"on":"off",className:"h-1.5 w-1.5 rounded-full ".concat(t===v?"bg-primary":"bg-muted-foreground/40")},t))}),X&&(0,r.jsxs)("p",{"data-cover-pending":!0,className:"mx-3 mb-2 rounded border border-dashed border-border px-2 py-1 text-xs text-muted-foreground",children:["커버 문구 변경 — \xab",x.cover.text,x.cover.sub?" \xb7 ".concat(x.cover.sub):"","\xbb \xb7 게시 때 커버를 다시 그립니다"]}),(0,r.jsxs)("div",{className:"space-y-2 px-3 pb-3 text-sm",children:[(0,r.jsxs)("p",{className:"break-words",children:[(0,r.jsx)("span",{className:"font-semibold",children:$})," ",x.caption.hook]}),x.caption.body&&(j?(0,r.jsx)("p",{className:"whitespace-pre-wrap break-words",children:x.caption.body}):(0,r.jsx)("button",{type:"button",onClick:()=>k(!0),className:"text-muted-foreground",children:"더 보기"})),x.hashtags.length>0&&(0,r.jsx)("p",{className:"flex flex-wrap gap-x-1.5 text-primary",children:x.hashtags.map((e,t)=>(0,r.jsx)("span",{className:"whitespace-nowrap",children:e},"".concat(e,"-").concat(t)))}),x.location&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["\uD83D\uDCCD ",x.location]})]}),g&&(0,r.jsxs)("section",{"aria-label":"초안 편집",className:"space-y-3 border-t border-border px-3 py-3 text-sm",children:[(0,r.jsxs)("label",{className:"block",children:["커버 문구",(0,r.jsx)("input",{value:x.cover.text,onChange:e=>f({...x,cover:{...x.cover,text:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["커버 부제",(0,r.jsx)("input",{value:x.cover.sub,onChange:e=>f({...x,cover:{...x.cover,sub:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["첫 줄",(0,r.jsx)("input",{value:x.caption.hook,onChange:e=>f({...x,caption:{...x.caption,hook:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["본문",(0,r.jsx)("textarea",{value:x.caption.body,rows:4,onChange:e=>f({...x,caption:{...x.caption,body:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["해시태그(띄어쓰기로 구분)",(0,r.jsx)("input",{value:Q,onChange:e=>f({...x,hashtags:e.target.value.split(/\s+/).filter(Boolean)}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["위치(비우면 없음)",(0,r.jsx)("input",{value:null!=(c=x.location)?c:"",onChange:e=>f({...x,location:e.target.value.trim()?e.target.value:null}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsx)("ol",{"aria-label":"사진 순서",className:"space-y-2",children:x.slides.map((e,t)=>(0,r.jsxs)("li",{"data-slide":e.image,className:"rounded border border-border p-2 ".concat(e.include?"":"opacity-50"),children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"w-6 shrink-0 text-xs text-muted-foreground",children:t+1}),(0,r.jsx)("input",{"aria-label":"".concat(t+1,"번 사진 설명"),value:e.caption,onChange:e=>z(t,{caption:e.target.value}),className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:0===t,onClick:()=>W(t,-1),className:"rounded border px-2 py-0.5 disabled:opacity-40",children:"앞으로"}),(0,r.jsx)("button",{type:"button",disabled:t===x.slides.length-1,onClick:()=>W(t,1),className:"rounded border px-2 py-0.5 disabled:opacity-40",children:"뒤로"}),(0,r.jsx)("button",{type:"button",onClick:()=>z(t,{include:!e.include}),className:"rounded border px-2 py-0.5",children:e.include?"빼기":"되살리기"})]})]},e.image))})]}),(I||U)&&(0,r.jsx)("p",{role:U?"alert":"status",className:"px-3 pb-2 text-sm ".concat(U?"text-red-600":"text-muted-foreground"),children:U||I}),U&&R&&(0,r.jsx)("p",{className:"px-3 pb-2 text-sm",children:(0,r.jsx)("a",{href:w.$Y,className:"font-medium underline","data-connect-token-link":!0,children:"연결 토큰 칸 열기 →"})}),(0,r.jsxs)("footer",{className:"flex flex-wrap gap-2 border-t border-border px-3 py-3",children:[(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>y(e=>!e),className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:g?"편집 닫기":"편집"}),(0,r.jsx)("button",{type:"button",disabled:S||!H,onClick:()=>{Y()},className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:"수정 저장"}),(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>{J()},className:"rounded-lg bg-blue-600 px-3 py-2 text-sm font-medium text-white disabled:opacity-50",children:"최종 게시"}),(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>{K()},className:"ml-auto rounded-lg px-3 py-2 text-sm text-muted-foreground disabled:opacity-50",children:"거절"})]})]})}function N(){let e,{client:t}=(0,o.Q)(),a=(0,n.useMemo)(()=>(0,w.ll)({client:t}),[t]),[s,l]=(0,n.useState)([]),[c,i]=(0,n.useState)(""),[d,u]=(0,n.useState)(!1),[m,p]=(0,n.useState)(!1),h=(0,n.useRef)((e=0,{begin:()=>e+=1,isLatest:t=>t===e})).current,b=(0,n.useCallback)(async()=>{let e=h.begin();try{let t=await a.list();if(!h.isLatest(e))return;l(t.items),i(""),u(!1)}catch(t){h.isLatest(e)&&(i((0,w.LP)(t,"list")),u((0,w.rH)(t)))}},[a,h]);async function x(e,t){if("rejected"!==t||window.confirm("".concat(y(e).title," 실행을 거절할까요?"))){p(!0),i(""),h.begin();try{await a.decide(e.graphId,e.runId,t),await b()}catch(e){i((0,w.LP)(e,"decide")),u((0,w.rH)(e))}finally{p(!1)}}}(0,n.useEffect)(()=>{b();let e=window.setInterval(()=>{b()},3e4);return()=>window.clearInterval(e)},[b]);let f=s.filter(e=>!!e.feed),g=s.filter(e=>!e.feed);return s.length||c?(0,r.jsxs)(r.Fragment,{children:[f.length>0&&(0,r.jsxs)("section",{"aria-label":"게시 대기",className:"mx-auto max-w-3xl space-y-4 px-4 pt-6 text-foreground sm:px-8",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"게시 대기"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"고쳐서 저장해도 대기열에 남습니다. \xab최종 게시\xbb를 눌러야만 올라갑니다."}),f.map(e=>(0,r.jsx)(v,{item:e,api:a,onDecided:()=>{h.begin(),b()}},"".concat(e.graphId,"/").concat(e.runId)))]}),(g.length>0||c)&&(0,r.jsxs)("section",{"aria-label":"실행 승인",className:"mx-auto max-w-3xl space-y-4 px-4 pt-6 text-foreground sm:px-8",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"실행 승인"}),c&&(0,r.jsx)("p",{role:"alert",className:"text-sm text-red-600",children:c}),c&&d&&(0,r.jsx)("p",{className:"text-sm",children:(0,r.jsx)("a",{href:w.$Y,className:"font-medium underline","data-connect-token-link":!0,children:"연결 토큰 칸 열기 →"})}),g.map(e=>{let t=y(e);return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,r.jsx)("h3",{className:"font-semibold",children:t.title}),(0,r.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["멈춘 단계: ",t.nodeId," \xb7 ",t.waiting,"부터 대기 중"]}),(0,r.jsx)("p",{className:"mt-3 whitespace-pre-wrap break-words text-sm",children:t.message}),t.recent.length>0&&(0,r.jsxs)("div",{className:"mt-3 text-sm",children:[(0,r.jsx)("p",{className:"font-medium",children:"최근 단계"}),(0,r.jsx)("ul",{className:"mt-1 space-y-1",children:t.recent.map((e,t)=>(0,r.jsx)("li",{className:"break-words",children:e},t))})]}),(0,r.jsxs)("div",{className:"mt-4 flex gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:m,onClick:()=>{x(e,"approved")},className:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white disabled:opacity-50",children:"승인"}),(0,r.jsx)("button",{type:"button",disabled:m,onClick:()=>{x(e,"rejected")},className:"rounded-lg border px-4 py-2 text-sm disabled:opacity-50",children:"거절"})]})]},"".concat(e.graphId,"/").concat(e.runId))})]})]}):null}function j(){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(N,{}),(0,r.jsx)(g,{})]})}},97479:(e,t,a)=>{"use strict";a.d(t,{GC:()=>n,In:()=>i,OG:()=>o});var r=a(46124);let n="elanous.pwa.role",s="elanous:pwa-role";function l(){try{let e=window.localStorage.getItem(n);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function o(e){try{window.localStorage.setItem(n,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(s))}function c(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(s,e);let t=t=>{(t.key===n||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(s,e),window.removeEventListener("storage",t)}}function i(){return(0,r.useSyncExternalStore)(c,l,()=>"general")}}},e=>{e.O(0,[1826,8060,2463,2196,7358],()=>e(e.s=457)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2885],{5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>l,oD:()=>s});let r="elanous.daemon.sessionId";function l(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=l();return localStorage.setItem(r,t),t}function a(){let e=l();return localStorage.setItem(r,e),e}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(55539),l=n(46124),s=n(8101),a=n(5997),o=n(18060),i=n(72215);let d=(0,l.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,l.useState)(n),[m,x]=(0,l.useState)(""),[f]=(0,l.useState)(()=>new o.ki(n));(0,l.useEffect)(()=>{let e=(0,s.Fp)();c(e),f.updateConfig(e),x((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.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)},[f]);let h=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),f.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},g=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},p=(0,l.useMemo)(()=>({config:u,setConfig:h,client:f,sessionId:m,setSessionId:g}),[u,f,m]);return(0,r.jsx)(d.Provider,{value:p,children:t})}function c(){let e=(0,l.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},41127:(e,t,n)=>{Promise.resolve().then(n.bind(n,75326))},75326:(e,t,n)=>{"use strict";n.d(t,{BotsPageContent:()=>D});var r=n(55539),l=n(46124),s=n(15151),a=n(88744);function o(e){if(null==e)return null;let t=e.replace(/[,%\s]/g,"").replace(/\*/g,"").trim();if(""===t||"-"===t||"N/A"===t)return null;let n=Number(t);return Number.isFinite(n)?n:null}let i=e=>"string"==typeof e&&""!==e?e:null,d=e=>"number"==typeof e&&Number.isFinite(e)?e:null,u=e=>"boolean"==typeof e?e:null;function c(e){var t,n,r,l,s;let a=[],c=[];for(let t of null!=(n=e.artifacts)?n:[]){let e=null!=(r=i(null==t?void 0:t.name))?r:"(이름 없음)",n=i(null==t?void 0:t.text);if(null===n){c.push(e);continue}a.push(function(e,t){var n;let r=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")),n=t.slice(0,3).join(" / ").slice(0,160),r=t.slice(0,3).join("\n");return/^Traceback \(most recent call last\):/m.test(r)?{kindOf:"파이썬 예외(Traceback)",head:n}:/^⛔\s*.*(실패|failed|error)/mi.test(r)?{kindOf:"스킬이 \xab실패\xbb라고 말했다",head:n}:/^(Error|error):/m.test(r)?{kindOf:"오류",head:n}:/^\s*command not found|No such file or directory/m.test(r)?{kindOf:"명령\xb7파일이 \xab없다\xbb",head:n}:null}(t);if(null!==r)return{kind:"failure",name:e,kindOf:r.kindOf,head:r.head};let l=function(e){var t,n,r,l;let s=null!=(l=null!=(r=null==(t=/^대상:\s*(\S+)/m.exec(e))?void 0:t[1])?r:null==(n=/^##\s+(\S+)\s+Real-Time Quote/m.exec(e))?void 0:n[1])?l:null;if(null===s)return null;let a=t=>{var n,r;return null!=(r=null==(n=RegExp("\\*\\*".concat(t,":\\*\\*\\s*([-+0-9.,]+)"),"i").exec(e))?void 0:n[1])?r:null},i=/\*\*Change:\*\*\s*([-+0-9.,]+)\s*\(([-+0-9.]+)%\)/i.exec(e),d={symbol:s,close:o(a("Close")),change:i?o(i[1]):o(a("Change")),changePct:i?o(i[2]):null,open:o(a("Open")),high:o(a("High")),low:o(a("Low")),volume:o(a("Volume")),prevClose:o(a("Prev Close"))};return[d.close,d.change,d.open,d.high,d.low,d.volume,d.prevClose].some(e=>null!==e)?d:null}(t);if(null!==l)return{kind:"quote",name:e,quote:l};let s=null!=(n=function(e){var t,n,r,l,s,a,i,d;let u=e.split("\n"),c=u.findIndex(e=>e.includes("|")&&e.includes("외국인")&&e.includes("기관")&&e.includes("개인"));if(c<0)return null;let m=e=>e.split("|").map(e=>e.trim()).filter((e,t,n)=>""!==e||0!==t&&t!==n.length-1),x=m(u[c]),f=e=>x.findIndex(t=>t.includes(e)),[h,g,p,b]=[0,f("외국인"),f("기관"),f("개인")];if(g<0||p<0||b<0)return null;let j=[];for(let e=c+1;e<u.length;e+=1){let t=u[e];if(!t.includes("|")){if(j.length>0)break;continue}if(/^\s*\|?[\s:|-]+\|?\s*$/.test(t))continue;let n=m(t);if(n.length<=Math.max(g,p,b))continue;let r=(null!=(l=n[h])?l:"").trim();""!==r&&j.push({key:r,foreign:o(n[g]),institution:o(n[p]),individual:o(n[b])})}if(0===j.length)return null;let y="";for(let e=c;e>=0;e-=1){let t=/^#{2,3}\s+(.+)$/.exec((null!=(s=u[e])?s:"").trim());if(t){y=t[1];break}}return""===y&&(y=null!=(a=null==(t=u.find(e=>""!==e.trim()&&!e.includes("━")))?void 0:t.trim())?a:"(제목 없음)"),{title:y,unit:null!=(d=null==(n=/\((백만|천|억)\)/.exec(x.join(" ")))?void 0:n[1])?d:null!=(i=null==(r=/\(([^)]*원[^)]*)\)/.exec(x.join(" ")))?void 0:r[1])?i:null,rows:j}}(t))?n:function(e){let t,n=e.trimStart();if(!n.startsWith("{"))return null;try{t=JSON.parse(n)}catch(e){return null}let r=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];for(let t of n){let n=e[t];if("number"==typeof n&&Number.isFinite(n))return n}return null},l=[],s=t.periods;if("object"==typeof s&&null!==s&&!Array.isArray(s))for(let[e,t]of Object.entries(s))"object"==typeof t&&null!==t&&l.push({key:e,foreign:r(t,"frgn_net_shares","frgn_net_amount_million"),institution:r(t,"inst_net_shares","inst_net_amount_million"),individual:r(t,"prsn_net_shares","prsn_net_amount_million")});if(0===l.length&&Array.isArray(t.rows))for(let e of t.rows){if("object"!=typeof e||null===e)continue;let t="string"==typeof e.date?e.date:null;null!==t&&l.push({key:t,foreign:r(e,"frgn_net_shares","frgn_net_amount_million"),institution:r(e,"inst_net_shares","inst_net_amount_million"),individual:r(e,"prsn_net_shares","prsn_net_amount_million")})}if(0===l.length)return null;let a="string"==typeof t.ticker?t.ticker:null,o="string"==typeof t.name&&t.name!==a?t.name:null;return{title:null!==o&&null!==a?"".concat(o,"(").concat(a,") 투자자 수급"):null!==a?"".concat(a," 투자자 수급"):"투자자 수급",unit:"주",rows:l}}(t);if(null!==s)return{kind:"flow",name:e,flow:s};let a=function(e){let t,n=e.split("\n"),r=n.findIndex(e=>"---BEGIN_OMNI_CRAWL_JSON---"===e);if(r<0)return{news:null,why:null,fenced:!1};let l=n.findIndex((e,t)=>t>r&&"---END_OMNI_CRAWL_JSON---"===e);if(l<0)return{news:null,why:"Omni crawl JSON 끝 울타리를 \xab못 찾았다\xbb",fenced:!0};try{t=JSON.parse(n.slice(r+1,l).join("\n"))}catch(e){return{news:null,why:"Omni crawl 울타리 안 JSON을 \xab못 읽었다\xbb",fenced:!0}}if("object"!=typeof t||null===t||Array.isArray(t))return{news:null,why:"Omni crawl JSON 최상위가 객체가 아니다",fenced:!0};let s=t;if(!Array.isArray(s.results))return{news:null,why:"Omni crawl JSON에 results 배열이 없다",fenced:!0};let a=[];for(let e of s.results){if("object"!=typeof e||null===e||Array.isArray(e))continue;let t=e.items;if(Array.isArray(t))for(let e of t)"object"!=typeof e||null===e||Array.isArray(e)||a.push({title:"string"==typeof e.title?e.title:null,url:"string"==typeof e.url?e.url:null,date:"string"==typeof e.date?e.date:null})}return{news:{query:"string"==typeof s.query?s.query:null,items:a},why:null,fenced:!0}}(t);if(null!==a.news)return{kind:"news",name:e,news:a.news};let i=t.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")).slice(0,2).join(" / ").slice(0,120);if(a.fenced)return{kind:"unparsed",name:e,why:a.why,head:i};let d=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━"));if(t.length<2)return null;let n=[];for(let e of t.slice(1)){let t=/^\s{1,}(\S[^:]*?)\s+:\s+(.+?)\s*$/.exec(e);if(null===t)continue;let r=t[1].trim(),l=t[2].trim();""===r||""===l||r.includes("//")||n.push({label:r,value:l,num:o(l)})}return 0===n.length?null:{title:t[0].trim(),entries:n}}(t);return null!==d?{kind:"keyed",name:e,keyed:d}:{kind:"unparsed",name:e,why:"아는 꼴이 \xab아니다\xbb(시세\xb7수급표\xb7뉴스\xb7라벨:값 넷 다 아님)",head:i}}(e,n))}return{personaId:null!=(l=i(e.personaId))?l:"unknown",runId:i(e.runId),atUtc:i(e.atUtc),ok:u(e.ok),steps:d(e.steps),failed:d(e.failed),source:null!=(s=i(e.source))?s:"unknown",delivered:u(null==(t=e.delivery)?void 0:t.sent),artifacts:a,textless:c}}function m(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null===e)return"—";let n=Math.abs(e)>=1e3?e.toLocaleString("en-US"):String(e);return!0===t.sign&&e>0?"+".concat(n):n}async function x(e,t,n){try{var r,l,s=await e.fetchJson("/v1/bots/rounds?persona=".concat(encodeURIComponent(t),"&limit=").concat(n));if("object"!=typeof s||null===s)return{kind:"error",reason:"라우트 응답을 \xab못 읽었다\xbb(객체가 아니다)"};if(!Array.isArray(s.rounds))return{kind:"error",reason:"`rounds` 가 \xab배열이 아니다\xbb — 「0건」과 \xab다른 값\xbb이다"};let a=s.unreadableBy,o=void 0===a?null:Object.entries(a).filter(e=>{let[t]=e;return"result-missing"!==t}).reduce((e,t)=>{var n;let[,r]=t;return e+(null!=(n=d(r))?n:0)},0);return{kind:"ready",rounds:s.rounds.map(c),unreadable:null!=(r=d(s.unreadable))?r:0,unreadableNow:null!=o?o:null!=(l=d(s.unreadable))?l:0}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:String(e)}}}function f(e){let{a:t}=e,n=t.quote,l=null!==n.changePct&&n.changePct>0,s=null!==n.changePct&&n.changePct<0;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"quote-".concat(n.symbol),children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:n.symbol}),(0,r.jsx)("span",{className:"text-lg font-bold tabular-nums",children:m(n.close)}),(0,r.jsxs)("span",{className:"text-sm font-semibold tabular-nums ".concat(l?"text-emerald-600":s?"text-rose-600":"text-muted-foreground"),children:[m(n.change,{sign:!0}),null!==n.changePct&&" (".concat(m(n.changePct,{sign:!0}),"%)")]})]}),(0,r.jsx)("dl",{className:"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-muted-foreground sm:grid-cols-4",children:[["시가",n.open],["고가",n.high],["저가",n.low],["전일",n.prevClose]].map(e=>{let[t,n]=e;return(0,r.jsxs)("div",{className:"flex justify-between gap-2",children:[(0,r.jsx)("dt",{children:t}),(0,r.jsx)("dd",{className:"tabular-nums text-foreground",children:m(n)})]},t)})})]})}function h(e){let{a:t}=e,n=t.flow;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"flow-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),null!==n.unit&&(0,r.jsxs)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:["단위: ",n.unit]}),(0,r.jsx)("div",{className:"mt-2 overflow-x-auto",children:(0,r.jsxs)("table",{className:"w-full min-w-[22rem] text-xs",children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{className:"text-muted-foreground",children:[(0,r.jsx)("th",{className:"py-1 text-left font-medium",children:"기간"}),["외국인","기관","개인"].map(e=>(0,r.jsx)("th",{className:"py-1 text-right font-medium",children:e},e))]})}),(0,r.jsx)("tbody",{children:n.rows.slice(0,6).map(e=>(0,r.jsxs)("tr",{className:"border-t border-border/60",children:[(0,r.jsx)("td",{className:"py-1 font-mono",children:e.key}),[e.foreign,e.institution,e.individual].map((e,t)=>(0,r.jsx)("td",{className:"py-1 text-right tabular-nums ".concat(null===e?"text-muted-foreground":e>0?"text-emerald-600":e<0?"text-rose-600":""),children:m(e,{sign:!0})},t))]},e.key))})]})}),n.rows.length>6&&(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["…",n.rows.length-6,"줄 더 (전체는 회차 원본에)"]})]})}function g(e){let{a:t}=e,n=t.keyed;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"keyed-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),(0,r.jsx)("dl",{className:"mt-2 grid gap-1 sm:grid-cols-2",children:n.entries.map(e=>(0,r.jsxs)("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:e.label}),(0,r.jsx)("dd",{className:"font-semibold tabular-nums",children:e.value})]},e.label))})]})}function p(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"news-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:null===t.news.query?"뉴스":"뉴스: ".concat(t.news.query)}),0===t.news.items.length?(0,r.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"수집된 기사가 0건이다."}):(0,r.jsx)("ul",{className:"mt-2 space-y-2",children:t.news.items.map((e,t)=>{var n,l,s,a;return(0,r.jsxs)("li",{className:"text-sm",children:[null===e.url?null!=(n=e.title)?n:"(제목 없음)":(0,r.jsx)("a",{className:"font-medium underline underline-offset-2",href:e.url,children:null!=(l=e.title)?l:e.url}),null!==e.date&&(0,r.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:e.date})]},"".concat(null!=(a=null!=(s=e.url)?s:e.title)?a:"article","-").concat(t))})})]})}function b(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-rose-500/40 bg-rose-500/5 p-3","data-testid":"failure-block",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-baseline gap-2",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:t.name}),(0,r.jsx)("span",{className:"rounded bg-rose-500/15 px-2 py-0.5 text-xs font-medium text-rose-700",children:"이 단계가 \xab실패\xbb했다"})]}),(0,r.jsx)("p",{className:"mt-1 text-xs text-rose-700",children:t.kindOf}),(0,r.jsx)("p",{className:"mt-1 break-words font-mono text-xs text-muted-foreground",children:t.head})]})}function j(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-dashed border-border bg-background/40 p-3","data-testid":"unparsed-block",children:[(0,r.jsx)("h4",{className:"font-mono text-sm",children:t.name}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-amber-600",children:["⚠️ 이 산출을 \xab못 읽었다\xbb — ",t.why]}),(0,r.jsx)("p",{className:"mt-1 truncate text-xs text-muted-foreground",children:t.head})]})}function y(e){var t;let{round:n}=e,l=null!==n.failed&&n.failed>0;return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"round-".concat(null!=(t=n.runId)?t:"unknown"),children:[(0,r.jsxs)("header",{className:"flex flex-wrap items-baseline justify-between gap-2",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold",children:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Asia/Seoul";if(null===e)return"시각 \xab모름\xbb";let n=new Date(e);if(Number.isNaN(n.getTime()))return"시각을 \xab못 읽었다\xbb(".concat(e.slice(0,24),")");let r=new Intl.DateTimeFormat("ko-KR",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1});return"".concat(r.format(n)," KST")}(n.atUtc)}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,r.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat("cron"===n.source?"bg-emerald-500/15 text-emerald-700":"bg-muted text-muted-foreground"),children:"cron"===n.source?"무인(cron)":"manual"===n.source?"손":"출처 \xab모름\xbb"}),(0,r.jsxs)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(l?"bg-rose-500/15 text-rose-700":"bg-muted text-muted-foreground"),children:[null===n.steps?"단계 \xab모름\xbb":"".concat(n.steps,"단계"),l&&" \xb7 실패 ".concat(n.failed)]}),(0,r.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(!0===n.delivered?"bg-sky-500/15 text-sky-700":"bg-muted text-muted-foreground"),children:null===n.delivered?"배달 \xab모름\xbb":n.delivered?"폰에 갔다":"안 갔다"})]})]}),(0,r.jsxs)("div",{className:"mt-4 space-y-3",children:[n.artifacts.map((e,t)=>"quote"===e.kind?(0,r.jsx)(f,{a:e},t):"flow"===e.kind?(0,r.jsx)(h,{a:e},t):"news"===e.kind?(0,r.jsx)(p,{a:e},t):"keyed"===e.kind?(0,r.jsx)(g,{a:e},t):"failure"===e.kind?(0,r.jsx)(b,{a:e},t):(0,r.jsx)(j,{a:e},t)),0===n.artifacts.length&&0===n.textless.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 회차에 산출이 \xab없다\xbb."}),n.textless.length>0&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["본문을 \xab안 받은\xbb 산출 ",n.textless.length,"건: ",n.textless.join(" \xb7 ")]})]})]})}function N(e){let{client:t,persona:n,title:s,subtitle:a,limit:o=3}=e,[i,d]=(0,l.useState)({kind:"loading"});return(0,l.useEffect)(()=>{let e=!0;return d({kind:"loading"}),x(t,n,o).then(t=>{e&&d(t)}),()=>{e=!1}},[t,n,o]),(0,r.jsxs)("section",{className:"flex flex-col gap-4","aria-label":"".concat(n," rounds"),"data-testid":"rounds-".concat(n),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-xl font-bold",children:s}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:a})]}),"loading"===i.kind&&(0,r.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"투자 회차를 불러오는 중…"}),"error"===i.kind&&(0,r.jsxs)("div",{role:"alert",className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-sm",children:[(0,r.jsx)("p",{className:"font-medium text-destructive",children:"회차를 \xab못 받았다\xbb."}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:i.reason}),(0,r.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["⚠️ 라우트 ",(0,r.jsx)("code",{className:"font-mono",children:"/v1/bots/rounds"})," 가 아직 \xab없을 수\xbb 있다(\uD83C\uDD63 축). 그때는 이 자리가 비는 것이 \xab맞다\xbb — 화면이 그것을 말하고 있다."]})]}),"ready"===i.kind&&0===i.rounds.length&&(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["회차가 \xab0건\xbb이다.",i.unreadable>0&&" (못 읽은 자리 ".concat(i.unreadable,"곳 — 「없다」가 아니다)")]}),"ready"===i.kind&&i.rounds.length>0&&(0,r.jsxs)(r.Fragment,{children:[i.unreadableNow>0?(0,r.jsxs)("p",{role:"alert",className:"text-xs text-amber-600",children:["⚠️ ***지금 못 읽는 자리 ",i.unreadableNow,"곳*** — 아래 수는 \xab과소\xbb다."]}):i.unreadable>0?(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["못 읽은 자리 ",i.unreadable,"곳(옛 회차) — 「지금 깨진 것」은 \xab없다\xbb."]}):null,(0,r.jsx)("div",{className:"flex flex-col gap-4",children:i.rounds.map(e=>{var t,n;return(0,r.jsx)(y,{round:e},null!=(n=null!=(t=e.runId)?t:e.atUtc)?n:Math.random())})})]})]})}function w(e){let{client:t,limit:n=3}=e;return(0,r.jsx)(N,{client:t,persona:"investor",limit:n,title:"\uD83D\uDCC8 투자 회차",subtitle:"봇이 \xab실제로 낸\xbb 산출이다. ⛔ 차트는 \xab일부러\xbb 안 그린다 — 글만 낸다."})}function v(e){let{client:t,limit:n=2}=e;return(0,r.jsx)(N,{client:t,persona:"assistant",limit:n,title:"\uD83D\uDDD3️ 비서 회차",subtitle:"안 읽은 메일\xb7앞으로의 일정. ⛔ 「0」도 \xab잰 값\xbb이라 그대로 보여 준다."})}function k(e){let{client:t,limit:n=2}=e;return(0,r.jsx)(N,{client:t,persona:"newsbot",limit:n,title:"\uD83D\uDCF0 뉴스 회차",subtitle:"⚠️ 이 봇의 산출은 꼴이 여럿이다 — 못 읽은 것은 \xab이름을 대고\xbb 남는다."})}async function _(e){try{let t=await e.fetchJson("/v1/bots/commands");return{kind:"ready",commands:t}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}}}function S(e){let{client:t}=e,n=(0,a.v)(t),[s,o]=(0,l.useState)({kind:"loading"});(0,l.useEffect)(()=>{let e=!0;return o({kind:"loading"}),_(t).then(t=>{e&&o(t)}),()=>{e=!1}},[t]);let i=n.error,d="error"===s.kind?s.reason:null,u=null!==i||null!==d,c=!u&&(n.loading||"loading"===s.kind),m="ready"===s.kind?s.commands:[],x=!c&&!u;return(0,r.jsxs)("main",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"bots-panel",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot directory"}),(0,r.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Bots"}),(0,r.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"Commands are global: every bot exposes the same catalog."}),(0,r.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"This surface cannot send commands yet; it only shows what you can ask bots to do."})]}),c&&(0,r.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"Loading bot identities and command catalog…"}),i&&(0,r.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot identities: ",i]}),d&&(0,r.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot catalog: ",d]}),x&&0===n.personas.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bots are configured."}),x&&n.personas.length>0&&0===m.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bot commands are available."}),(0,r.jsx)(w,{client:t}),(0,r.jsx)(v,{client:t}),(0,r.jsx)(k,{client:t}),x&&n.personas.length>0&&m.length>0&&(0,r.jsx)("section",{className:"grid gap-4 md:grid-cols-2","aria-label":"Bot identities",children:n.personas.map(e=>{var t;return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"bot-card-".concat(e.personaId),children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:e.displayName}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:null!=(t=e.description)?t:"No description provided."}),(0,r.jsx)("h3",{className:"mt-5 text-sm font-semibold",children:"Available commands"}),(0,r.jsx)("ul",{className:"mt-3 space-y-3","aria-label":"Available bot commands",children:m.map(e=>(0,r.jsxs)("li",{className:"rounded-lg border border-border bg-background/60 p-3",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:e.name}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:e.description}),e.arguments.length>0?(0,r.jsx)("ul",{className:"mt-2 space-y-1","aria-label":"".concat(e.name," arguments"),children:e.arguments.map(e=>(0,r.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,r.jsx)("code",{className:"font-semibold text-foreground",children:e.name}),e.required?" (required)":" (optional)"," — ",e.description]},e.name))}):(0,r.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"No arguments."})]},e.name))})]},e.personaId)})})]})}function D(){let{client:e}=(0,s.Q)();return(0,r.jsx)(S,{client:e})}},88744:(e,t,n)=>{"use strict";n.d(t,{v:()=>a});var r=n(46124),l=n(72215);let s=null;function a(e){let[t,n]=(0,r.useState)(()=>s&&Date.now()-s.at<6e4?s.data:[]),[a,o]=(0,r.useState)(!1),[i,d]=(0,r.useState)(null),u=(0,r.useCallback)(async()=>{o(!0),d(null);try{let t=await e.listPersonas();s={at:Date.now(),data:t.personas},n(t.personas)}catch(e){d(e instanceof Error?e.message:String(e))}finally{o(!1)}},[e]);(0,r.useEffect)(()=>{if(s&&Date.now()-s.at<6e4)return void n(s.data);u()},[u]);let c=(0,r.useCallback)(async()=>{s=null,await u()},[u]);return(0,r.useEffect)(()=>{let t=e.personasEventsUrl();if(!t)return;let n=null;try{n=new EventSource(t)}catch(e){(0,l.cY)("showroom.personas.sse.construct-error",{error:String(e)});return}let r=e=>()=>{"hello"!==e&&((0,l.cY)("showroom.personas.sse.event",{kind:e}),s=null,u())};return n.addEventListener("hello",r("hello")),n.addEventListener("load-dir",r("load-dir")),n.addEventListener("reload-all",r("reload-all")),n.addEventListener("upsert",r("upsert")),n.addEventListener("remove",r("remove")),n.onerror=e=>{(0,l.cY)("showroom.personas.sse.error",{type:e.type})},()=>{try{null==n||n.close()}catch(e){}}},[e,u]),{personas:t,loading:a,error:i,reload:c}}}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=41127)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9084],{5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>s,oD:()=>l});let r="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function l(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=s();return localStorage.setItem(r,t),t}function a(){let e=s();return localStorage.setItem(r,e),e}},9122:(e,t,n)=>{Promise.resolve().then(n.bind(n,12487))},12487:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>D});var r=n(55539),s=n(3558),l=n.n(s),a=n(46124),i=n(15151),o=n(42006),d=n(99974),u=n(33626),c=n(43537);let m=e=>!!e&&"object"==typeof e&&!Array.isArray(e),f=e=>Number.isInteger(e)&&e>=0,p=e=>null===e||"number"==typeof e&&Number.isFinite(e);async function y(e){try{let n=await e.fetchResponse("/v1/drafts/metrics");if(!n.ok)return{kind:"unavailable",reason:null};var t=await n.json();if(!m(t))return{kind:"unavailable",reason:null};let r="string"==typeof t.reason?t.reason:null;if("measuring"===t.state)return{kind:"measuring"};if("unavailable"===t.state)return{kind:"unavailable",reason:r};let s=t.metrics;return"ready"===t.state&&m(s)&&"string"==typeof t.measuredAt&&Number.isFinite(Date.parse(t.measuredAt))&&f(s.inventory)&&f(s.needsOwner)&&f(s.converted48h)&&f(s.cohort48h)&&p(s.oldestAgeHours)&&p(s.conversion48h)?{kind:"ready",measuredAt:t.measuredAt,refreshError:r,metrics:{inventory:s.inventory,oldestAgeHours:s.oldestAgeHours,needsOwner:s.needsOwner,converted48h:s.converted48h,cohort48h:s.cohort48h,conversion48h:s.conversion48h}}:{kind:"unavailable",reason:null}}catch(e){return{kind:"unavailable",reason:null}}}function h(e){var t,n,s;let{value:l}=e,a="draft 재고";return(0,r.jsxs)("section",{"aria-label":a,className:"col-span-2 min-w-0 rounded-xl border border-border bg-card p-3 sm:p-4",children:[(0,r.jsx)("h2",{className:"text-xs font-medium text-muted-foreground sm:text-sm",children:a}),"loading"===l.kind?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"불러오는 중…"}):"measuring"===l.kind?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"측정 중"}):"unavailable"===l.kind?(0,r.jsx)("p",{className:"mt-2 text-sm",title:null!=(t=l.reason)?t:void 0,children:"못 읽음"}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("dl",{className:"mt-2 grid grid-cols-2 gap-x-3 gap-y-1 text-xs sm:grid-cols-4 sm:text-sm",children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:"열린 draft"}),(0,r.jsx)("dd",{className:"text-lg font-semibold tabular-nums sm:text-xl",children:l.metrics.inventory})]}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:"최장 나이"}),(0,r.jsx)("dd",{className:"text-lg font-semibold tabular-nums sm:text-xl",children:null===(n=l.metrics.oldestAgeHours)?"해당 없음":n>=48?"".concat((n/24).toFixed(1),"일"):"".concat(n.toFixed(1),"시간")})]}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:"주인 표식 없는 draft"}),(0,r.jsx)("dd",{className:"text-lg font-semibold tabular-nums sm:text-xl",children:l.metrics.needsOwner}),l.metrics.inventory>0&&l.metrics.needsOwner===l.metrics.inventory&&(0,r.jsx)("dd",{className:"text-muted-foreground",children:"처리 중 표식 0건"})]}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:"48h 전환율"}),(0,r.jsx)("dd",{className:"text-lg font-semibold tabular-nums sm:text-xl",children:null===l.metrics.conversion48h?"표본 없음":"".concat((100*l.metrics.conversion48h).toFixed(1),"%")}),null!==l.metrics.conversion48h&&(0,r.jsxs)("dd",{className:"text-muted-foreground tabular-nums",children:[l.metrics.converted48h,"/",l.metrics.cohort48h]})]})]}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:[(0,r.jsx)("time",{dateTime:l.measuredAt,children:(s=l.measuredAt,new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(s)))})," 측정",l.refreshError&&(0,r.jsx)("span",{className:"ml-1 text-amber-700",title:l.refreshError,children:"\xb7 갱신 실패 — 이전 값"})]})]})]})}let v={release:void 0,loops:void 0,decisions:void 0,merged:void 0,risks:void 0,grid:void 0,drafts:{kind:"loading"}},b=e=>"string"==typeof e&&Number.isFinite(Date.parse(e)),x=e=>!!e&&"object"==typeof e&&!Array.isArray(e);function g(e){return null!==e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.name&&"string"==typeof e.source&&(null===e.category||"string"==typeof e.category)&&(null===e.domain||"string"==typeof e.domain)&&(null===e.runVia||"string"==typeof e.runVia)&&["live","firing","stale","off"].includes(e.state)&&(null===e.cron||"string"==typeof e.cron)&&(null===e.intervalMs||"number"==typeof e.intervalMs&&Number.isFinite(e.intervalMs))&&Array.isArray(e.next)&&e.next.every(e=>"string"==typeof e)&&(null===e.lastRun||"object"==typeof e.lastRun&&null!==e.lastRun&&"string"==typeof e.lastRun.at&&(null===e.lastRun.status||"string"==typeof e.lastRun.status)&&(null===e.lastRun.exit||"number"==typeof e.lastRun.exit))}async function w(e){try{var t;let n=await e.fetchResponse(o.i6);if(!n.ok)return null;let r=await n.json();if(null===r||"object"!=typeof r||!("schedules"in r))return null;let s=r.schedules;if(!Array.isArray(s)||!s.every(g))return null;let l=(0,o.Yy)(s,Date.now()),a={};for(let e of l)a[e.verdict]=(null!=(t=a[e.verdict])?t:0)+1;let i=l.flatMap((e,t)=>"실패"===e.verdict&&b(e.lastRun)?[{id:"loop:".concat(e.id),kind:"실패 루프",title:e.name,at:s[t].lastRun.at}]:[]);return{summary:a,risks:i}}catch(e){return null}}async function j(e){try{let t=await e.fetchResponse(o.QK);if(!t.ok)return null;let n=await t.json();if(!x(n)||!x(n.loops)||!Array.isArray(n.loops.loops))return null;let r=n.loops.loops;if(!r.every(e=>x(e)&&"string"==typeof e.name&&"string"==typeof e.label&&(null===e.last||x(e.last)&&b(e.last.at)&&"string"==typeof e.last.status)))return null;return r.flatMap(e=>e.last&&["error","failed","failure","abandoned"].includes(e.last.status.toLowerCase())?[{id:"loop:".concat(e.name),kind:"실패 루프",title:e.label,at:e.last.at}]:[])}catch(e){return null}}async function N(e,t){try{let n=await e.fetchResponse("/v1/harness/runs?finishedSince=".concat(t)),r=n.ok?await n.json():null,s=x(r)?r.landed:null;return x(r)&&(void 0===r.landedTruncated||!1===r.landedTruncated)&&null==r.landedError&&Array.isArray(s)&&s.every(e=>x(e)&&"number"==typeof e.number&&b(e.mergedAt))?new Set(s.filter(e=>Date.parse(e.mergedAt)>=t).map(e=>e.number)).size:null}catch(e){return null}}async function k(e,t){try{let n=await e.fetchResponse("/v1/harness/runs?finishedSince=".concat(t-6048e5)),r=n.ok?await n.json():null;if(!x(r))return null;let s=r.finished,l=r.entries;return"complete"===r.completeness&&Array.isArray(s)&&Array.isArray(l)&&x(r.finishedObservation)&&Number.isInteger(r.finishedObservation.skippedFiles)&&0===r.finishedObservation.skippedFiles&&s.every(e=>x(e)&&"string"==typeof e.runId&&"string"==typeof e.status&&b(e.endedAt))&&l.every(e=>x(e)&&"string"==typeof e.runId&&"string"==typeof e.status)?[...s.filter(e=>"human-stop"===e.status||"failed"===e.status||"parked"===e.status||"cancelled"===e.status&&"soft-stopped"===e.stage).map(e=>({id:"run:".concat(e.runId),kind:"멈춘 하니스 런",title:"string"==typeof e.objective&&e.objective?e.objective:e.runId,at:e.endedAt})),...l.filter(e=>"ended-unclosed"===e.status&&b(e.lastActivityTimestamp)&&!s.some(t=>t.runId===e.runId)).map(e=>({id:"run:".concat(e.runId),kind:"멈춘 하니스 런",title:"string"==typeof e.objective&&e.objective?e.objective:e.runId,at:e.lastActivityTimestamp}))]:null}catch(e){return null}}async function A(e,t){try{let n=await (0,u.qK)(e);if(!Array.isArray(n)||!n.every(e=>x(e)&&"string"==typeof e.id))return null;return{count:n.length,risks:n.flatMap(e=>b(e.dueAt)&&Date.parse(e.dueAt)<t?[{id:"decision:".concat(e.id),kind:"기한 지난 결정",title:"string"==typeof e.title?e.title:e.id,at:e.dueAt}]:[])}}catch(e){return null}}async function R(e){try{let t=await e.fetchResponse("/v1/grid");if(!t.ok)return null;let n=await t.json();if(!x(n)||!x(n.hq)||!Array.isArray(n.members)||null!==n.poolReason&&"string"!=typeof n.poolReason)return null;let r=n.hq;if(null!==r.record&&(!x(r.record)||"string"!=typeof r.record.holder)||null!==r.ageSeconds&&("number"!=typeof r.ageSeconds||!Number.isFinite(r.ageSeconds))||null!==r.expired&&"boolean"!=typeof r.expired||null!==r.reason&&"string"!=typeof r.reason||!n.members.every(e=>x(e)&&"string"==typeof e.context&&"number"==typeof e.capacity&&Number.isFinite(e.capacity)&&(null===e.occupied||"number"==typeof e.occupied&&Number.isFinite(e.occupied))))return null;return n}catch(e){return null}}function S(e,t){return new Promise(n=>{let r=setTimeout(()=>n(t),15e3);e.then(e=>{clearTimeout(r),n(e)},()=>{clearTimeout(r),n(t)})})}function I(e){let{title:t,children:n}=e;return(0,r.jsxs)("section",{"aria-label":t,className:"min-w-0 rounded-xl border border-border bg-card p-3 sm:p-4",children:[(0,r.jsx)("h2",{className:"text-xs font-medium text-muted-foreground sm:text-sm",children:t}),(0,r.jsx)("div",{className:"mt-2 text-lg font-semibold leading-snug tabular-nums sm:text-xl",children:n})]})}function D(){var e,t;let{client:n}=(0,i.Q)(),[s,o]=(0,a.useState)(v);return(0,a.useEffect)(()=>{let e=!0;return o(v),!function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:()=>!0,r=Date.now(),s=function(e){let t=new Intl.DateTimeFormat("sv-SE",{timeZone:"Asia/Seoul"}).format(e);return Date.parse("".concat(t,"T00:00:00+09:00"))}(new Date(r)),l=S((0,c.Nn)(e),{kind:"error",status:0}),a=S(w(e),null),i=S(j(e),null),o=S(A(e,r),null),d=S(N(e,s),null),u=S(k(e,s),null),m=S(R(e),null);!function e(t,n,r){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:30;S(y(t),{kind:"unavailable",reason:null}).then(l=>{r()&&(n({drafts:l}),"measuring"===l.kind&&s>0&&setTimeout(()=>{r()&&e(t,n,r,s-1)},1e4))})}(e,t,n),l.then(e=>{var n;return t({release:"ready"===e.kind?4!==(n=e.data).seats.length||n.seats.some(e=>null===e.checklist)?null:{green:n.seats.reduce((e,t)=>e+t.checklist.green,0),yellow:n.seats.reduce((e,t)=>e+t.checklist.yellow,0)}:null})}),a.then(e=>{var n;return t({loops:null!=(n=null==e?void 0:e.summary)?n:null})}),o.then(e=>{var n;return t({decisions:null!=(n=null==e?void 0:e.count)?n:null})}),d.then(e=>t({merged:e})),m.then(e=>t({grid:e})),Promise.all([a,i,o,u]).then(e=>{let[n,r,s,l]=e;t({risks:n&&r&&s&&l?[...new Map([...n.risks,...r,...s.risks,...l].sort((e,t)=>Date.parse(e.at)-Date.parse(t.at)).map(e=>[e.id,e])).values()].sort((e,t)=>Date.parse(t.at)-Date.parse(e.at)||e.id.localeCompare(t.id)).slice(0,5):null})})}(n,t=>{e&&o(e=>({...e,...t}))},()=>e),()=>{e=!1}},[n]),(0,r.jsxs)("main",{className:"mx-auto w-full min-w-0 max-w-3xl px-3 py-4 text-foreground sm:px-6",children:[(0,r.jsxs)("header",{className:"mb-4",children:[(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"운영 \xb7 오늘"}),(0,r.jsx)("h1",{className:"text-xl font-semibold",children:"대표 조망판"})]}),(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:gap-4","aria-label":"대표 조망 카드",children:[(0,r.jsxs)(I,{title:"릴리스 판 진행",children:[void 0===s.release?"불러오는 중…":s.release?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"text-emerald-600",children:["green ",s.release.green]}),(0,r.jsxs)("span",{className:"block text-amber-600",children:["노랑 ",s.release.yellow]})]}):"못 읽음",(0,r.jsx)(l(),{href:"/ops/release",className:"mt-1 block rounded text-xs font-medium text-primary underline underline-offset-4 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary","aria-label":"발행 현황 보기 — 운영 › 릴리스",children:"발행 현황 보기 →"})]}),(0,r.jsxs)(I,{title:"루프 판정",children:[void 0===s.loops?"불러오는 중…":null===s.loops?"못 읽음":0===Object.keys(s.loops).length?"등록 0":(0,r.jsx)("div",{className:"flex flex-wrap gap-1 text-xs font-medium",children:Object.entries(s.loops).map(e=>{let[t,n]=e;return(0,r.jsxs)("span",{className:"rounded-full bg-muted px-2 py-1",children:[t," ",n]},t)})}),(0,r.jsx)(l(),{href:d.D,className:"mt-1 block rounded text-xs font-medium text-primary underline underline-offset-4 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary","aria-label":"루프 상호작용 보기 — 운영 › 루프 상호작용",children:"루프 상호작용 보기 →"})]}),(0,r.jsx)(I,{title:"결정 대기 카드",children:(0,r.jsx)(l(),{href:"/decisions",className:"rounded underline underline-offset-4 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary","aria-label":"결정 대기 카드 보기",children:void 0===s.decisions?"불러오는 중…":null!=(e=s.decisions)?e:"못 읽음"})}),(0,r.jsx)(I,{title:"오늘 병합 PR",children:void 0===s.merged?"불러오는 중…":null!=(t=s.merged)?t:"못 읽음"})]}),(0,r.jsxs)("div",{className:"mt-2 grid min-w-0 grid-cols-2 gap-2 sm:mt-4 sm:gap-4","aria-label":"위험과 그리드 카드",children:[(0,r.jsxs)("section",{"aria-label":"위험\xb7막힘 톱 5",className:"min-w-0 rounded-xl border border-border bg-card p-2 sm:p-4",children:[(0,r.jsx)("h2",{className:"text-xs font-medium text-muted-foreground sm:text-sm",children:"위험\xb7막힘 톱 5"}),void 0===s.risks?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"불러오는 중…"}):null===s.risks?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"못 읽음"}):0===s.risks.length?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"해당 없음"}):(0,r.jsx)("ol",{className:"mt-2 space-y-1 text-xs",children:s.risks.map(e=>(0,r.jsxs)("li",{className:"min-w-0 border-b border-border pb-1 last:border-0",children:[(0,r.jsxs)("span",{className:"block text-muted-foreground",children:[e.kind," \xb7 ",(0,r.jsx)("time",{dateTime:e.at,children:e.at.slice(0,16).replace("T"," ")})]}),(0,r.jsx)("span",{className:"block truncate",title:e.title,children:e.title})]},e.id))})]}),(0,r.jsxs)("section",{"aria-label":"그리드",className:"min-w-0 rounded-xl border border-border bg-card p-2 sm:p-4",children:[(0,r.jsx)("h2",{className:"text-xs font-medium text-muted-foreground sm:text-sm",children:"그리드"}),void 0===s.grid?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"불러오는 중…"}):null===s.grid?(0,r.jsx)("p",{className:"mt-2 text-sm",children:"못 읽음"}):(0,r.jsxs)("div",{className:"mt-2 space-y-2 text-xs",children:[(0,r.jsxs)("p",{className:"min-w-0 break-words",children:["본부 \xb7 ",s.grid.hq.reason?"본부 못 읽음":s.grid.hq.record?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{title:s.grid.hq.record.holder,children:s.grid.hq.record.holder}),null!==s.grid.hq.ageSeconds&&(0,r.jsxs)(r.Fragment,{children:[" \xb7 ",Math.floor(s.grid.hq.ageSeconds/60),"분 전"]}),s.grid.hq.expired&&(0,r.jsx)("span",{className:"ml-1 font-semibold text-red-600",children:"만료"})]}):"임대 없음"]}),s.grid.poolReason&&(0,r.jsxs)("p",{className:"break-words text-amber-700",title:s.grid.poolReason,children:["풀 못 읽음 \xb7 ",s.grid.poolReason.slice(0,40)]}),(0,r.jsx)("ul",{className:"space-y-1",children:s.grid.members.map(e=>{var t;return(0,r.jsxs)("li",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-1",children:[(0,r.jsx)("span",{className:"min-w-0 truncate",title:e.context,children:e.context}),(0,r.jsx)("span",{className:"shrink-0 tabular-nums",children:null===e.occupied?"측정 불가":"".concat(e.occupied,"/").concat(e.capacity)})]}),(0,r.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",role:"meter","aria-label":"".concat(e.context," 칸 사용"),"aria-valuemin":0,"aria-valuemax":Math.max(e.capacity,null!=(t=e.occupied)?t:0,1),...null===e.occupied?{}:{"aria-valuenow":e.occupied},children:null!==e.occupied&&(0,r.jsx)("div",{className:"h-full rounded-full bg-emerald-600",style:{width:"".concat(e.capacity>0?Math.min(100,Math.max(0,e.occupied/e.capacity*100)):0,"%")}})})]},e.context)})}),(0,r.jsxs)("p",{className:"font-medium tabular-nums",children:["칸 사용 ",s.grid.poolReason||s.grid.members.some(e=>null===e.occupied)?"측정 불가":s.grid.members.reduce((e,t)=>e+t.occupied,0),"/",s.grid.members.reduce((e,t)=>e+t.capacity,0)]})]})]}),(0,r.jsx)(h,{value:s.drafts})]})]})}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(55539),s=n(46124),l=n(8101),a=n(5997),i=n(18060),o=n(72215);let d=(0,s.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,s.useState)(n),[m,f]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(n));(0,s.useEffect)(()=>{let e=(0,l.Fp)();c(e),p.updateConfig(e),f((0,a.oD)()),(0,o.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,l.Fp)();p.updateConfig(t),c(t),(0,o.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,o.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let y=e=>{c(t=>{let n={...t,...e};return(0,l.Qc)(e),p.updateConfig(n),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},h=e=>{f(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},v=(0,s.useMemo)(()=>({config:u,setConfig:y,client:p,sessionId:m,setSessionId:h}),[u,p,m]);return(0,r.jsx)(d.Provider,{value:v,children:t})}function c(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},29325:(e,t,n)=>{"use strict";function r(e,t){if(!e.enabled||"off"===e.scheduleState)return"off";if("failed"===e.lastStatus||"error"===e.lastStatus||"failure"===e.lastStatus||"abandoned"===e.lastStatus||"expired"===e.lastStatus)return"failed";if("stale"===e.scheduleState)return"late";let n=null===e.lastRunAt?NaN:Date.parse(e.lastRunAt);if(void 0!==e.secondDueAt){let r=null===e.secondDueAt?NaN:Date.parse(e.secondDueAt);return Number.isFinite(n)&&Number.isFinite(t)&&Number.isFinite(r)&&r>n&&t>r?"late":"alive"}return Number.isFinite(t)&&Number.isFinite(n)&&null!==e.intervalMs&&Number.isFinite(e.intervalMs)&&e.intervalMs>0&&t-n>2*e.intervalMs?"late":"alive"}n.d(t,{u:()=>r})},33626:(e,t,n)=>{"use strict";async function r(e){let t=await e.fetchResponse("/v1/ops-board/notices");if(!t.ok)throw Error("notices list failed: ".concat(t.status));return(await t.json()).notices}async function s(e,t,n){let r=await e.fetchResponse("/v1/ops-board/notices",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({noticeId:t,body:n})});if(!r.ok)throw Error("notice reply failed: ".concat(r.status));return(await r.json()).reply}async function l(e){let t=await e.fetchResponse("/v1/decisions?status=open");if(!t.ok)throw Error("decisions list failed: ".concat(t.status));return(await t.json()).decisions}async function a(e,t,n,r){let s=await e.fetchResponse("/v1/decisions/".concat(encodeURIComponent(t),"/decide"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({choice:n,...void 0===r?{}:{note:r}})});if(!s.ok)throw Error("decision failed: ".concat(s.status));return s.json()}n.d(t,{LD:()=>a,aj:()=>s,kh:()=>r,qK:()=>l})},42006:(e,t,n)=>{"use strict";n.d(t,{QK:()=>a,i6:()=>l,Pz:()=>o,Em:()=>i,Yy:()=>d});var r=n(29325);let s={alive:"살아 있음",late:"늦음",failed:"실패",off:"꺼짐"},l="/v1/schedules?includeOff=1",a="/v1/dashboard/loops";async function i(e,t){var n,i,o,u,c,m,f,p;let[y,h]=await Promise.allSettled([e(l),e(a)]),v="fulfilled"===y.status?null==(n=y.value)?void 0:n.schedules:null,b="fulfilled"===h.status?null==(o=h.value)||null==(i=o.loops)?void 0:i.loops:null;if(!Array.isArray(v)&&!Array.isArray(b))throw Error("loop registries unavailable");if(!Array.isArray(v))throw Error("스케줄 레지스트리 조회 실패");if(!Array.isArray(b))throw Error("루프 레지스트리 조회 실패");let x=d(v,t).map(e=>({...e,id:"schedule:".concat(e.id)}));for(let e of b){let n=e.last?Date.parse(e.last.at):NaN,l=(0,r.u)({enabled:!1!==e.armed,lastRunAt:null!=(m=null==(u=e.last)?void 0:u.at)?m:null,lastStatus:null!=(f=null==(c=e.last)?void 0:c.status.toLowerCase())?f:null,intervalMs:null},t);x.push({id:"loop:".concat(e.name),name:e.label,layer:null!=(p=e.category)?p:"루프",owner:"미지정",mode:null===e.armed?"관측":e.armed?"armed":"off",lastRun:Number.isFinite(n)?e.last.at:null,verdict:"alive"===l?"판정 불가":s[l]})}return x}function o(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now,r=0,s=!0;return{async refresh(){let l=++r;try{let a=await i(e,n());s&&l===r&&t({rows:a,state:"ready"})}catch(e){s&&l===r&&t({rows:[],state:"error"})}},dispose(){s=!1}}}function d(e,t){return e.map(e=>{var n,l,a,i,o,d,u;let c=e.lastRun?Date.parse(e.lastRun.at):NaN,m=(0,r.u)({enabled:"off"!==e.state,lastRunAt:null!=(d=null==(n=e.lastRun)?void 0:n.at)?d:null,lastStatus:(null==(l=e.lastRun)?void 0:l.exit)!=null&&0!==e.lastRun.exit?"failed":(null==(a=e.lastRun)?void 0:a.status)==null||["ok","success","completed"].includes(e.lastRun.status.toLowerCase())?null!=(u=null==(o=e.lastRun)||null==(i=o.status)?void 0:i.toLowerCase())?u:null:"failed",intervalMs:e.cron?null:e.intervalMs,...e.cron?{scheduleState:e.state}:{}},t),f=!e.cron&&!(e.intervalMs&&e.intervalMs>0),p="alive"===m&&(!Number.isFinite(c)||f)?"판정 불가":s[m];return{id:e.id,name:e.name,layer:e.domain||e.category||e.source,owner:"미지정",mode:e.runVia||e.source,lastRun:Number.isFinite(c)?e.lastRun.at:null,verdict:p}})}},43537:(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 l(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 a(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:()=>b,Kh:()=>v,Nn:()=>y,oc:()=>h});let i=new Set(["pending","running","done","retry","timeout","failed"]),o=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(a))&&(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)&&i.has(e.state)&&o(e.plannedMin)&&o(e.installSec)&&o(e.rc)&&(void 0===e.waitReason||s(e.waitReason)))&&Number.isInteger(t.total)&&r(t.counts)&&[...i].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 f(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 p(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 p(e,"/v1/ops/seats".concat(t?"?date=".concat(encodeURIComponent(t)):""),e=>r(e)&&s(e.date)&&Array.isArray(e.seats)&&e.seats.every(f)&&new Set(e.seats.map(e=>e.seat)).size===e.seats.length?{date:e.date,seats:e.seats}:null)}function h(e,t){return p(e,"/v1/ops/release/runs".concat(t?"?version=".concat(encodeURIComponent(t)):""),e=>Array.isArray(e)&&e.every(d)?e:null)}function v(e,t,n){return p(e,"/v1/ops/release/runs/".concat(encodeURIComponent(t),"/nodes/").concat(encodeURIComponent(n),"/log"),e=>r(e)&&s(e.log)?{log:e.log}:null)}function b(e,t){return p(e,"/v1/ops/checklist?version=".concat(encodeURIComponent(t)),e=>{var t,n,a,i;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 o={green:0,yellow:0,red:0,done:0};for(let t of e.items)t.status in o&&o[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:o.green,yellow:null!=(n=e.yellow)?n:o.yellow,red:null!=(a=e.red)?a:o.red,done:null!=(i=e.done)?i:o.done,...void 0!==e.blocked?{blocked:e.blocked}:{},...void 0!==e.byOwner?{byOwner:e.byOwner}:{},...void 0!==e.history?{history:e.history}:{}}})}},99974:(e,t,n)=>{"use strict";n.d(t,{D:()=>r,F:()=>s});let r="/loops?view=interact";function s(e){return(null==e?void 0:e.get("view"))==="interact"?"interact":"status"}}},e=>{e.O(0,[3558,8060,2463,2196,7358],()=>e(e.s=9122)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6348],{514:(e,t,s)=>{Promise.resolve().then(s.bind(s,47106))},3004:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(3704).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},3704:(e,t,s)=>{"use strict";s.d(t,{A:()=>c});var r=s(46124);let n=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()},i=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var a={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 l=(0,r.createContext)({}),o=(0,r.forwardRef)((e,t)=>{var s,i,o;let{color:c,size:d,strokeWidth:u,absoluteStrokeWidth:h,className:m="",children:p,iconNode:f,...g}=e,{size:x=24,strokeWidth:b=2,absoluteStrokeWidth:y=!1,color:v="currentColor",className:w=""}=null!=(s=(0,r.useContext)(l))?s:{},k=(null!=h?h:y)?24*Number(null!=u?u:b)/Number(null!=d?d:x):null!=u?u:b;return(0,r.createElement)("svg",{ref:t,...a,width:null!=(i=null!=d?d:x)?i:a.width,height:null!=(o=null!=d?d:x)?o:a.height,stroke:null!=c?c:v,strokeWidth:k,className:n("lucide",w,m),...!p&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...f.map(e=>{let[t,s]=e;return(0,r.createElement)(t,s)}),...Array.isArray(p)?p:[p]])}),c=(e,t)=>{let s=(0,r.forwardRef)((s,a)=>{let{className:l,...c}=s;return(0,r.createElement)(o,{ref:a,iconNode:t,className:n("lucide-".concat(i(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),l),...c})});return s.displayName=i(e),s}},18068:(e,t,s)=>{"use strict";s.d(t,{Qb:()=>a,SI:()=>o,dJ:()=>l});let r="elanous:auth-required",n=null,i=!1;function a(e){null===n&&(n=e,window.dispatchEvent(new CustomEvent(r,{detail:{path:e}})))}function l(e){let t=window,s=t=>e(t.detail);return t.addEventListener(r,s),null===n||i||e({path:n}),()=>t.removeEventListener(r,s)}function o(){i=!0}},24231:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(3704).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"}]])},47106:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>E});var r=s(55539),n=s(81694),i=s(3004);let a=(0,s(3704).A)("circle-dashed",[["path",{d:"M10.1 2.182a10 10 0 0 1 3.8 0",key:"5ilxe3"}],["path",{d:"M13.9 21.818a10 10 0 0 1-3.8 0",key:"11zvb9"}],["path",{d:"M17.609 3.721a10 10 0 0 1 2.69 2.7",key:"1iw5b2"}],["path",{d:"M2.182 13.9a10 10 0 0 1 0-3.8",key:"c0bmvh"}],["path",{d:"M20.279 17.609a10 10 0 0 1-2.7 2.69",key:"1ruxm7"}],["path",{d:"M21.818 10.1a10 10 0 0 1 0 3.8",key:"qkgqxc"}],["path",{d:"M3.721 6.391a10 10 0 0 1 2.7-2.69",key:"1mcia2"}],["path",{d:"M6.391 20.279a10 10 0 0 1-2.69-2.7",key:"1fvljs"}]]);var l=s(74227),o=s(24231),c=s(46124),d=s(94306),u=s(21501),h=s(50363),m=s(67264),p=s(65354),f=s(79247);function g(e){let{available:t,declared:s,onPick:n,pendingId:i,previews:a,onPreview:l}=e,{systems:o,themes:c}=function(e){let t=[],s=[];for(let r of e)("design-system"===r.source?t:s).push(r);return{systems:t,themes:s}}(t);return(0,r.jsxs)("div",{className:"space-y-4",children:[o.length>0&&(0,r.jsx)(x,{title:"Design systems",hint:"Web \xb7 copies tokens.css and DESIGN.md into design/system/",items:o,declared:s,onPick:n,pendingId:i,previews:a,onPreview:l}),c.length>0&&(0,r.jsx)(x,{title:"Terminal themes",hint:"One line in DESIGN.md",items:c,declared:s,onPick:n,pendingId:i,previews:a,onPreview:l})]})}function x(e){let{title:t,hint:s,items:n,declared:i,onPick:a,pendingId:l,previews:o,onPreview:c}=e;return(0,r.jsxs)("section",{className:"space-y-2","aria-label":t,children:[(0,r.jsxs)("h3",{className:"flex items-baseline gap-2 text-xs font-medium uppercase tracking-wide text-muted-foreground",children:[t,(0,r.jsxs)("span",{className:"normal-case tracking-normal",children:[n.length," \xb7 ",s]})]}),(0,r.jsx)("ul",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-3",children:n.map(e=>(0,r.jsx)(b,{direction:e,chosen:e.id===i,onPick:a,pending:l===e.id,busy:null!==l,hasPreview:(null==o?void 0:o.has(e.id))===!0&&void 0!==c,onPreview:c},e.id))})]})}function b(e){var t,s,n,a,l,o,c,d,u;let{direction:h,chosen:m,onPick:p,pending:f,busy:g,hasPreview:x,onPreview:b}=e,y=null!=(n=h.swatch.bg)?n:h.isDark?"#111111":"#ffffff",v=null!=(a=h.swatch.fg)?a:h.swatch.text,w=null!=(o=null!=(l=null==(t=h.typography)?void 0:t.display)?l:null==(s=h.typography)?void 0:s.body)?o:null;return(0,r.jsxs)("li",{"data-direction":h.id,"data-direction-id":h.id,className:"flex flex-col gap-2 rounded-md border p-3 text-sm ".concat(m?"border-primary ring-1 ring-primary":""),children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5","aria-hidden":!0,children:[[y,v,h.swatch.accent].map((e,t)=>(0,r.jsx)("span",{className:"h-5 w-5 rounded-full border",style:{backgroundColor:e,borderColor:h.swatch.muted}},t)),h.category&&(0,r.jsx)("span",{className:"ml-auto truncate text-[11px] text-muted-foreground",children:h.category})]}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("p",{className:"truncate font-medium",children:null!=(c=h.label)?c:h.id}),(0,r.jsxs)("p",{className:"truncate text-xs text-muted-foreground",children:[(0,r.jsx)("code",{children:h.id}),w?" \xb7 ".concat(w):""]}),(0,r.jsx)("p",{className:"mt-1 line-clamp-2 text-xs text-muted-foreground",children:h.mood})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[x&&(0,r.jsx)("button",{type:"button",onClick:()=>null==b?void 0:b(h.id),className:"self-start rounded-md border px-2.5 py-1 text-xs hover:bg-muted","aria-label":"Preview ".concat(null!=(d=h.label)?d:h.id),children:"Preview"}),m?(0,r.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs text-primary",children:[(0,r.jsx)(i.A,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Selected"]}):(0,r.jsx)("button",{type:"button",disabled:g,onClick:()=>p(h.id),className:"self-start rounded-md border px-2.5 py-1 text-xs hover:bg-muted disabled:opacity-50","aria-label":"Select ".concat(null!=(u=h.label)?u:h.id),children:f?"Selecting…":"Select"})]})]})}let y=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;function v(e){return e.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean)}function w(e,t){if("undefined"==typeof document)return t;let s=document.getElementById(e);return s&&"value"in s&&"string"==typeof s.value?s.value:t}function k(e){let{onCreate:t,onSelect:s,pending:n,result:i,error:a}=e,[l,o]=(0,c.useState)("url"),[d,u]=(0,c.useState)(""),[h,m]=(0,c.useState)(""),[p,f]=(0,c.useState)(""),g=v(h).filter(e=>y.test(e)),x=v(h).length,b=x>=2&&x<=6&&p.trim().length>0&&g.length===x;return(0,r.jsxs)("section",{className:"rounded-md border p-3","aria-label":"Make my system","data-make-my-system":"",children:[(0,r.jsxs)("div",{className:"flex items-baseline justify-between gap-2",children:[(0,r.jsx)("h3",{className:"text-sm font-medium",children:"Make my system"}),(0,r.jsxs)("div",{className:"flex gap-1",role:"tablist",children:[(0,r.jsx)("button",{type:"button",role:"tab","aria-selected":"url"===l,className:"rounded-md px-2 py-1 text-xs ".concat("url"===l?"bg-muted":""),onClick:()=>o("url"),children:"From a website"}),(0,r.jsx)("button",{type:"button",role:"tab","aria-selected":"colors"===l,className:"rounded-md px-2 py-1 text-xs ".concat("colors"===l?"bg-muted":""),onClick:()=>o("colors"),children:"From colors"})]})]}),(0,r.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"Reference, not a copy — logos, names, images and text are not taken."}),"url"===l?(0,r.jsxs)("form",{className:"mt-2 flex flex-col gap-2 sm:flex-row",onSubmit:e=>{e.preventDefault();let s=d.trim();s&&!n&&t({kind:"url",url:s})},children:[(0,r.jsx)("label",{className:"sr-only",htmlFor:"make-system-url",children:"Website URL"}),(0,r.jsx)("input",{id:"make-system-url",type:"url",value:d,disabled:n,placeholder:"https://example.com",onChange:e=>u(e.target.value),className:"min-w-0 flex-1 rounded-md border bg-transparent px-2 py-1.5 text-sm"}),(0,r.jsx)("button",{type:"button",disabled:n,onClick:()=>{let e=w("make-system-url",d).trim();e&&!n&&t({kind:"url",url:e})},className:"rounded-md border px-3 py-1.5 text-sm hover:bg-muted disabled:opacity-50",children:n?"Measuring…":"Make it"})]}):(0,r.jsxs)("form",{className:"mt-2 space-y-2",onSubmit:e=>{e.preventDefault(),b&&!n&&t({kind:"palette",colors:g,id:p.trim()})},children:[(0,r.jsx)("label",{className:"block text-xs text-muted-foreground",htmlFor:"make-system-colors",children:"2–6 colors"}),(0,r.jsx)("input",{id:"make-system-colors",value:h,disabled:n,placeholder:"#f4efe6, #1f3a2e, #c8553d",onChange:e=>m(e.target.value),className:"w-full rounded-md border bg-transparent px-2 py-1.5 text-sm"}),g.length>0&&(0,r.jsx)("ul",{className:"flex gap-1","aria-label":"Color preview",children:g.map(e=>(0,r.jsx)("li",{className:"h-6 w-6 rounded-sm border",style:{backgroundColor:e},title:e},e))}),(0,r.jsx)("label",{className:"block text-xs text-muted-foreground",htmlFor:"make-system-id",children:"id"}),(0,r.jsx)("input",{id:"make-system-id",value:p,disabled:n,placeholder:"stumptowncoffee",onChange:e=>f(e.target.value),className:"w-full rounded-md border bg-transparent px-2 py-1.5 text-sm"}),(0,r.jsx)("button",{type:"button",disabled:n,onClick:()=>{let e=v(w("make-system-colors",h)).filter(e=>y.test(e)),s=w("make-system-id",p).trim();n||e.length<2||e.length>6||0===s.length||t({kind:"palette",colors:e,id:s})},className:"rounded-md border px-3 py-1.5 text-sm hover:bg-muted disabled:opacity-50",children:n?"Measuring…":"Make it"})]}),n&&(0,r.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Measuring…"}),a&&(0,r.jsx)("p",{className:"mt-2 text-sm text-error",role:"alert",children:a}),i&&(0,r.jsxs)("div",{className:"mt-2 space-y-1 text-sm",children:[(0,r.jsxs)("p",{children:["Made ",i.id," — ",i.tokens.length," tokens \xb7 ",i.unread," unread"]}),i.warnings.map(e=>(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:e},e)),(0,r.jsx)("button",{type:"button",onClick:()=>s(i.id),className:"rounded-md border px-2.5 py-1 text-xs hover:bg-muted",children:"Select it"})]})]})}let j={missing:"Missing",declared:"Declared",available:"Not declared"},N={missing:"bg-error/10 text-error",declared:"bg-green-600/10 text-green-700",available:"bg-muted text-muted-foreground"},S={missing:n.A,declared:i.A,available:a};function C(){return(0,d.Qj)()?(0,r.jsx)(M,{}):(0,r.jsxs)("div",{className:"mx-auto max-w-2xl space-y-2 p-6",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Design check"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Connect to a NEXUS daemon to see this repository's craft rulebooks."})]})}function M(){let{data:e,isLoading:t,error:s,refetch:i,isFetching:a}=function(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=(0,d.M1)();return(0,u.I)({queryKey:p.AF.designCheck(),queryFn:()=>s.getDesignCheck(),enabled:null==(e=t.enabled)||e,refetchInterval:3e4})}();return(0,r.jsxs)("div",{className:"mx-auto max-w-3xl space-y-4 p-6",children:[(0,r.jsxs)("header",{className:"flex items-start justify-between gap-4",children:[(0,r.jsxs)("div",{className:"space-y-1",children:[(0,r.jsxs)("h1",{className:"flex items-center gap-2 text-xl font-semibold tracking-tight",children:[(0,r.jsx)(l.A,{className:"h-5 w-5","aria-hidden":!0}),"Design check"]}),(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["Craft rulebooks declared by this repository's ",(0,r.jsx)("code",{children:"DESIGN.md"}),"."]})]}),(0,r.jsxs)("button",{type:"button",onClick:()=>void i(),className:"inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-sm hover:bg-muted","aria-label":"Refresh design check",children:[(0,r.jsx)(o.A,{className:"h-4 w-4 ".concat(a?"animate-spin":""),"aria-hidden":!0}),"Refresh"]})]}),t&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading…"}),s&&(0,r.jsxs)("p",{className:"rounded-md bg-error/10 p-3 text-sm text-error",children:["Could not reach the daemon: ",s instanceof Error?s.message:String(s)]}),e&&!1===e.ok&&(0,r.jsxs)("div",{className:"space-y-2 rounded-md border border-warning/40 bg-warning/5 p-4",children:[(0,r.jsxs)("p",{className:"flex items-center gap-2 text-sm font-medium",children:[(0,r.jsx)(n.A,{className:"h-4 w-4 text-warning","aria-hidden":!0}),"Design check blocked"]}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:function(e,t){switch(e){case"no-repository":return"The daemon is not running inside a git checkout, so there is no DESIGN.md to check.";case"craft-directory":return"elanous's craft rulebook directory could not be read: ".concat(null!=t?t:"(unknown path)");case"design-document":return"This repository has no readable DESIGN.md: ".concat(null!=t?t:"(unknown path)");default:return"The design check is blocked (".concat(e,").")}}(e.blockedOn,e.path)})]}),e&&!0===e.ok&&(0,r.jsx)(A,{data:e})]})}function A(e){let{data:t}=e,s=function(e){let t=new Set(e.unavailableRulebooks),s=new Map;for(let t of e.availableRulebooks)s.set(t,"available");for(let r of e.declaredRulebooks)s.set(r,t.has(r)?"missing":"declared");let r={missing:0,declared:1,available:2};return[...s.entries()].map(e=>{let[t,s]=e;return{name:t,status:s}}).sort((e,t)=>r[e.status]-r[t.status]||e.name.localeCompare(t.name))}(t),n=t.unavailableRulebooks.length;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"rounded-md p-3 text-sm ".concat(n?"bg-error/10 text-error":"bg-green-600/10 text-green-700"),children:n?"".concat(n," declared rulebook").concat(1===n?"":"s"," could not be found."):"All ".concat(t.declaredRulebooks.length," declared rulebook").concat(1===t.declaredRulebooks.length?"":"s"," resolve.")}),(0,r.jsxs)("dl",{className:"grid grid-cols-1 gap-1 text-xs text-muted-foreground sm:grid-cols-2",children:[(0,r.jsxs)("div",{className:"truncate sm:col-span-2",children:[(0,r.jsx)("dt",{className:"inline font-medium",children:"Repository: "}),(0,r.jsxs)("dd",{className:"inline",children:[(0,r.jsx)("code",{children:t.repoRoot}),t.repoSource&&(0,r.jsxs)("span",{className:"ml-1",children:["(","config"===t.repoSource?"harness.defaultRepo":"daemon folder",")"]})]})]}),(0,r.jsxs)("div",{className:"truncate",children:[(0,r.jsx)("dt",{className:"inline font-medium",children:"Document: "}),(0,r.jsx)("dd",{className:"inline",children:(0,r.jsx)("code",{children:t.documentPath})})]}),(0,r.jsxs)("div",{className:"truncate",children:[(0,r.jsx)("dt",{className:"inline font-medium",children:"Rulebooks: "}),(0,r.jsx)("dd",{className:"inline",children:(0,r.jsx)("code",{children:t.craftDirectory})})]})]}),(0,r.jsx)(O,{data:t}),0===s.length?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"elanous ships no craft rulebooks and this document declares none."}):(0,r.jsx)("ul",{className:"divide-y rounded-md border",children:s.map(e=>{let t=S[e.status];return(0,r.jsxs)("li",{className:"flex items-center justify-between gap-3 px-3 py-2",children:[(0,r.jsxs)("span",{className:"flex items-center gap-2 text-sm",children:[(0,r.jsx)(t,{className:"h-4 w-4 shrink-0","aria-hidden":!0}),(0,r.jsx)("code",{children:e.name})]}),(0,r.jsx)("span",{className:"shrink-0 rounded-full px-2 py-0.5 text-xs ".concat(N[e.status]),children:j[e.status]})]},e.name)})})]})}function O(e){var t,s,n,i;let{data:a}=e,l=function(){let e=(0,d.M1)(),t=(0,h.jE)();return(0,m.n)({mutationFn:t=>e.setDesignDirection(t),onSuccess:()=>t.invalidateQueries({queryKey:p.AF.designCheck()})})}(),o=function(){let e=(0,d.M1)(),t=(0,h.jE)();return(0,m.n)({mutationFn:t=>e.createDesignSystem(t),onSuccess:()=>t.invalidateQueries({queryKey:p.AF.designCheck()})})}(),x=function(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=(0,d.M1)();return(0,u.I)({queryKey:p.AF.designPreviews(),queryFn:()=>s.listDesignPreviews(),enabled:null==(e=t.enabled)||e,refetchInterval:3e4})}(),[b,y]=(0,c.useState)(null),[v,w]=(0,c.useState)(null),j=a.directions;if((0,c.useEffect)(()=>{if(!v||!j)return;let e=document.querySelector('[data-direction-id="'.concat(v.replace(/"/g,""),'"]'));null==e||e.scrollIntoView({block:"nearest"})},[v,j]),!j)return null;let N=l.isPending&&null!=(s=l.variables)?s:null;return(0,r.jsxs)("section",{className:"space-y-2",children:[(0,r.jsx)("h2",{className:"text-sm font-medium",children:"Design direction"}),(0,r.jsx)(k,{pending:o.isPending,result:null!=(n=o.data)?n:null,error:o.isError?function(e){switch(e instanceof f.Iu&&e.body&&"object"==typeof e.body?e.body.reason:void 0){case"bad-url":return"That address is not an http or https URL.";case"bad-id":return"The id may only use lowercase letters, digits, and hyphens.";case"id-taken":return"That id is already taken.";case"extract-failed":return"The page could not be measured.";case"no-colors":return"Give between 2 and 6 colors.";case"busy":return"Another system is being made — wait for it to finish.";default:if(e instanceof f.Iu&&401===e.status)return"Only the owner can make a system — sign in first.";return"Could not make the system: ".concat(e instanceof Error?e.message:String(e))}}(o.error):null,onCreate:e=>{o.mutate(e,{onSuccess:e=>w(e.id)})},onSelect:e=>{w(e),l.mutate(e)}}),j.unavailable&&(0,r.jsxs)("p",{className:"rounded-md bg-error/10 p-2 text-sm text-error",children:["Declared direction ",(0,r.jsx)("code",{children:j.unavailable})," is not registered."]}),null===j.declared&&!j.unavailable&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"None declared — pick one below."}),l.isError&&(0,r.jsx)("p",{className:"rounded-md bg-error/10 p-2 text-sm text-error",children:function(e){switch(e instanceof f.Iu&&e.body&&"object"==typeof e.body?e.body.reason:void 0){case"unknown-direction":return"The daemon does not know this direction.";case"no-repository":return"The daemon has no repository to write to (set harness.defaultRepo).";case"conflicting-system-file":return"design/system/ already holds a file the daemon will not overwrite.";case"cannot-read":return"The DESIGN.md could not be read.";case"cannot-write":return"The DESIGN.md could not be written.";default:if(e instanceof f.Iu&&401===e.status)return"Only the owner can pick a direction — sign in first.";return"Could not set the direction: ".concat(e instanceof Error?e.message:String(e))}}(l.error)}),b&&(0,r.jsx)(F,{system:b,onClose:()=>y(null),onSelect:()=>l.mutate(b),selecting:N===b,busy:null!==N,alreadySelected:j.declared===b}),(0,r.jsx)(g,{available:j.available,declared:j.declared,pendingId:N,previews:new Set((null!=(i=null==(t=x.data)?void 0:t.previews)?i:[]).map(e=>e.system)),onPreview:e=>y(e),onPick:e=>l.mutate(e)})]})}function F(e){let{system:t,onClose:s,onSelect:n,selecting:i,busy:a,alreadySelected:l}=e,o=function(e){let t=(0,d.M1)();return(0,u.I)({queryKey:p.AF.designPreview(null!=e?e:""),queryFn:()=>t.getDesignPreview(e),enabled:null!==e&&""!==e})}(t);return(0,r.jsxs)("div",{className:"space-y-2 rounded-md border p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,r.jsxs)("p",{className:"text-sm font-medium",children:["Preview \xb7 ",(0,r.jsx)("code",{children:t})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[l?(0,r.jsx)("span",{className:"text-xs text-primary",children:"Selected"}):(0,r.jsx)("button",{type:"button",disabled:a,onClick:n,className:"rounded-md border px-2.5 py-1 text-xs hover:bg-muted disabled:opacity-50","aria-label":"Select ".concat(t),children:i?"Selecting…":"Select"}),(0,r.jsx)("button",{type:"button",onClick:s,className:"rounded-md border px-2.5 py-1 text-xs hover:bg-muted","aria-label":"Close preview",children:"Close"})]})]}),o.isLoading&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading preview…"}),o.isError&&(0,r.jsxs)("p",{className:"text-sm text-error",children:["Could not load the preview: ",o.error instanceof Error?o.error.message:String(o.error)]}),o.data&&(0,r.jsx)("iframe",{sandbox:"",srcDoc:o.data.html,title:"Preview \xb7 ".concat(t),className:"h-80 w-full rounded-md border bg-white"})]})}function E(){return(0,r.jsx)(C,{})}},65354:(e,t,s)=>{"use strict";s.d(t,{AF:()=>r});let r={all:["nexus"],health:()=>[...r.all,"health"],snapshot:()=>[...r.all,"snapshot"],tabs:e=>e?[...r.all,"tabs",{kind:e}]:[...r.all,"tabs"],tab:e=>[...r.all,"tab",e],templates:()=>[...r.all,"templates"],template:e=>[...r.all,"template",e],config:()=>[...r.all,"config"],switches:()=>[...r.all,"switches"],switch:e=>[...r.all,"switch",e],secrets:()=>[...r.all,"secrets"],bindingChannels:()=>[...r.all,"bindings","channels"],bindings:e=>[...r.all,"bindings",e],binding:(e,t)=>[...r.all,"binding",e,t],logsTail:(e,t)=>t?[...r.all,"logs",e,{lines:t}]:[...r.all,"logs",e],workflows:()=>[...r.all,"workflows"],workflow:e=>[...r.all,"workflow",e],workflowRun:e=>[...r.all,"workflow-run",e],workflowRuns:()=>[...r.all,"workflow-runs"],pendingApprovals:()=>[...r.all,"workflow-pending-approvals"],platforms:()=>[...r.all,"platforms"],providers:()=>[...r.all,"providers"],worktrees:()=>[...r.all,"worktrees"],designCheck:()=>[...r.all,"design-check"],designPreviews:()=>[...r.all,"design-previews"],designPreview:e=>[...r.all,"design-preview",e],registryCatalog:()=>[...r.all,"registry-catalog"],resolvedView:()=>[...r.all,"resolved-view"]};r.snapshot(),r.tabs(),r.health(),r.snapshot(),r.config(),r.switches()},67264:(e,t,s)=>{"use strict";s.d(t,{n:()=>d});var r=s(46124),n=s(17600),i=s(92477),a=s(33814),l=s(40404),o=class extends a.Q{#e;#t=void 0;#s;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#n()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),(0,l.f8)(this.options,t)||this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#s,observer:this}),t?.mutationKey&&this.options.mutationKey&&(0,l.EN)(t.mutationKey)!==(0,l.EN)(this.options.mutationKey)?this.reset():this.#s?.state.status==="pending"&&this.#s.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#s?.removeObserver(this)}onMutationUpdate(e){this.#n(),this.#i(e)}getCurrentResult(){return this.#t}reset(){this.#s?.removeObserver(this),this.#s=void 0,this.#n(),this.#i()}mutate(e,t){return this.#r=t,this.#s?.removeObserver(this),this.#s=this.#e.getMutationCache().build(this.#e,this.options),this.#s.addObserver(this),this.#s.execute(e)}#n(){let e=this.#s?.state??(0,n.$)();this.#t={...e,isPending:"pending"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset}}#i(e){i.jG.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,s=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type==="success"){try{this.#r.onSuccess?.(e.data,t,s,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,s,r)}catch(e){Promise.reject(e)}}else if(e?.type==="error"){try{this.#r.onError?.(e.error,t,s,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,s,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},c=s(50363);function d(e,t){let s=(0,c.jE)(t),[n]=r.useState(()=>new o(s,e));r.useEffect(()=>{n.setOptions(e)},[n,e]);let a=r.useSyncExternalStore(r.useCallback(e=>n.subscribe(i.jG.batchCalls(e)),[n]),()=>n.getCurrentResult(),()=>n.getCurrentResult()),d=r.useCallback((e,t)=>{n.mutate(e,t).catch(l.lQ)},[n]);if(a.error&&(0,l.GU)(n.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:d,mutateAsync:a.mutate}}},72215:(e,t,s)=>{"use strict";let r;s.d(t,{cY:()=>d,x8:()=>l});let n={debug:0,info:1,warn:2,error:3},i="/v1/debug-logs/batch",a=null;function l(e){a=e}class o{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(n[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<n[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,s=JSON.stringify({records:e});try{var r,n;t=await (r=this.fetchFn(s),n=this.postTimeoutMs,new Promise((e,t)=>{let s=setTimeout(()=>t(Error("debug-forward timeout after ".concat(n,"ms"))),n);r.then(t=>{clearTimeout(s),e(t)},e=>{clearTimeout(s),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&a)try{await a(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let i=this.lastOkAt;this.lastOkAt=Date.now();let l=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:l,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:i},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(i,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=c,t="debug",s=1e4,r=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=s,this.flushMs=r,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function c(e){return(await fetch(i,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function d(e,t){if("undefined"==typeof console)return;let s=new Date().toISOString();if(void 0!==t){let r="";try{let e=new WeakSet;r=JSON.stringify(t,(t,s)=>{if("bigint"==typeof s)return"".concat(s.toString(),"n");if("function"==typeof s)return"[fn ".concat(s.name||"anon","]");if(s&&"object"==typeof s){if(e.has(s))return"[circular]";e.add(s)}return s})}catch(e){r="[unserializable: ".concat(String(e),"]")}r&&r.length>800&&(r=r.slice(0,797)+"..."),console.debug("[".concat(s,"] ").concat(e," ").concat(r),t),u(s,e,r)}else console.debug("[".concat(s,"] ").concat(e)),u(s,e,void 0)}function u(e,t,s){let n,i=function(){if(void 0!==r)return r;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return r=null,null;let t=new o(c,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return r=t,t}();if(!i)return;let a=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==s&&""!==s)try{n=JSON.parse(s)}catch(e){n=s}i.push({ts:e,category:t,event:a,...void 0!==n?{data:n}:{},source:{platform:"pwa"}})}},74227:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(3704).A)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]])},81694:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});let r=(0,s(3704).A)("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]])},94306:(e,t,s)=>{"use strict";s.d(t,{M1:()=>c,Qj:()=>d,tI:()=>o});var r=s(55539),n=s(46124),i=s(76642),a=s(50363);let l=(0,n.createContext)(null);function o(e){let{client:t,queryClient:s,defaultStaleTimeMs:o,children:c}=e,d=(0,n.useMemo)(()=>null!=s?s:new i.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[s,o]);return(0,r.jsx)(l.Provider,{value:t,children:(0,r.jsx)(a.Ht,{client:d,children:c})})}function c(){let e=(0,n.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function d(){return(0,n.useContext)(l)}}},e=>{e.O(0,[3324,1501,9247,2463,2196,7358],()=>e(e.s=514)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6766],{5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,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 o(){let e=a();return localStorage.setItem(n,e),e}},11986:(e,t,r)=>{"use strict";r.d(t,{$5:()=>i,dJ:()=>u});var n=r(46124);let a=new Set,s=new Set;function o(e,t){if(t!==a.has(e))for(let r of(t?a.add(e):a.delete(e),s))r()}function l(){return a.size>0}function d(e){return s.add(e),()=>{s.delete(e)}}function i(){return(0,n.useSyncExternalStore)(d,l,()=>!1)}function u(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];(0,n.useEffect)(()=>(o(e,t),()=>o(e,!1)),[e,t])}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>i,DaemonProvider:()=>u,Q:()=>c});var n=r(55539),a=r(46124),s=r(8101),o=r(5997),l=r(18060),d=r(72215);let i=(0,a.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(r),[m,p]=(0,a.useState)(""),[x]=(0,a.useState)(()=>new l.ki(r));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),x.updateConfig(e),p((0,o.oD)()),(0,d.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[x]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();x.updateConfig(t),c(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)},[x]);let f=e=>{c(t=>{let r={...t,...e};return(0,s.Qc)(e),x.updateConfig(r),(0,d.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},g=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,d.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,a.useMemo)(()=>({config:u,setConfig:f,client:x,sessionId:m,setSessionId:g}),[u,x,m]);return(0,n.jsx)(i.Provider,{value:h,children:t})}function c(){let e=(0,a.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},25578:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>eu});var n=r(55539),a=r(46124),s=r(50363),o=r(21501),l=r(58603),d=r(94306),i=r(79247),u=r(89810),c=r(16074),m=r(55519);function p(e){return"/app/editor/?mode=".concat(e)}var x=r(88928),f=r(69280);r(71588),r(34188);var g=r(67462),h=r(56671),b=r(41778);let v=/^[a-z0-9-]+$/,y=["recipes","overlay","overlays"],k=["ok","rework","fail"];function j(e){return"cmd:".concat(e)}function w(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"my-graph";return{graphId:e,entry:null,terminals:[],nodes:[],edges:[]}}function N(e,t,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",a=n.trim();if(t===r)throw Error("같은 노드끼리는 연결할 수 없습니다");return e.edges.some(e=>e.from===t&&e.to===r&&e.outcome===a)?e:{...e,edges:[...e.edges,{from:t,to:r,outcome:a}]}}function I(e,t){var r;let n=e.edges.filter(e=>e.from===t);return n.some(e=>!e.outcome)?"":null!=(r=k.find(e=>!n.some(t=>t.outcome===e)))?r:""}function S(e,t){return{...e,edges:e.edges.filter((e,r)=>r!==t)}}function C(e,t,r){var n;let a=null==(n=r.id)?void 0:n.trim();if(void 0!==a&&a!==t){if(!a)throw Error("노드 id 는 비울 수 없습니다");if(e.nodes.some(e=>e.id===a))throw Error("이미 있는 노드 id 입니다: ".concat(a))}let s=e=>a&&e===t?a:e;return{...e,entry:null===e.entry?null:s(e.entry),terminals:e.terminals.map(s),nodes:e.nodes.map(e=>{var n;if(e.id!==t)return e;let s=null!=(n=r.recipe)?n:a&&e.recipe===j(t)?j(a):e.recipe;return{...e,...r,id:a||t,recipe:s}}),edges:e.edges.map(e=>({...e,from:s(e.from),to:s(e.to)}))}}function E(e){let t=new Set(e.nodes.map(e=>e.id));return e.terminals.filter(e=>t.has(e))}function R(e){var t,r,n;let a=new h.yo({graph_id:e.graphId,version:"number"==typeof(null==(t=e.extra)?void 0:t.version)?e.extra.version:1,...e.entry?{entry_node:e.entry}:{},terminal_nodes:E(e)}).toString(),s=(0,m.lu)(a);for(let t of e.nodes)(0,m.bC)(s,{nodeId:t.id,kind:t.kind,recipe:t.recipe,maxVisits:t.maxVisits});for(let t of e.edges)t.outcome?(0,m.W3)(s,{from:t.from,outcome:t.outcome,to:t.to}):(0,m.lN)(s,t.from,t.to);for(let[t,n]of Object.entries(null!=(r=e.extra)?r:{}))s.has(t)||s.set(t,s.createNode(n));let o=s.get("nodes");e.nodes.forEach((e,t)=>{let r=(0,h.oP)(o)?o.items[t]:void 0;if((0,h.jh)(r)){var n;for(let[t,a]of Object.entries(null!=(n=e.extra)?n:{}))r.has(t)||r.set(t,s.createNode(a))}});let l=s.get("edges"),d=(0,h.oP)(l)?l.items.filter(e=>(0,h.jh)(e)):[];for(let t of e.edges){let e=d.find(e=>e.get("from")===t.from&&(t.outcome?e.has("map"):e.get("to")===t.to));if(e)for(let[r,a]of Object.entries(null!=(n=t.extra)?n:{}))"on"!==r&&e.has(r)||e.set(r,s.createNode(a))}return(0,m.ys)(s)}function z(e,t){let r={};try{var n;r=null!=(n=(0,h.parse)(e))?n:{}}catch(e){}return t.errors.map(e=>{var t,n,a,s,o,l;let d=/\/nodes\/(\d+)/.exec(null!=(o=e.path)?o:""),i=/\/edges\/(\d+)/.exec(null!=(l=e.path)?l:""),u=d?null==(n=r.nodes)||null==(t=n[Number(d[1])])?void 0:t.node_id:i?null==(s=r.edges)||null==(a=s[Number(i[1])])?void 0:a.from:void 0;return{message:e.message,source:"server",..."string"==typeof u?{nodeId:u}:{}}})}function A(e){var t,r;let n=(0,h.parse)(e);if(!n||"object"!=typeof n)throw Error("그래프 YAML 최상위가 맵이 아닙니다");let a=(Array.isArray(n.nodes)?n.nodes:[]).flatMap(e=>e&&"string"==typeof e.node_id?[{id:e.node_id,kind:"string"==typeof e.kind?e.kind:"",recipe:"string"==typeof e.recipe?e.recipe:"",maxVisits:"number"==typeof e.max_visits?e.max_visits:1,x:0,y:0,...O(e,["node_id","kind","recipe","max_visits"])}]:[]),s=(Array.isArray(n.edges)?n.edges:[]).flatMap(e=>e&&"string"==typeof e.from?"string"==typeof e.to?[{from:e.from,to:e.to,outcome:"",...O(e,["from","to"])}]:e.map&&"object"==typeof e.map?Object.entries(e.map).filter(e=>"string"==typeof e[1]).map(t=>{let[r,n]=t;return{from:e.from,to:n,outcome:r,...O(e,["from","map",..."outcome"===e.on?["on"]:[]])}}):[]:[]),o="string"==typeof n.entry_node?n.entry_node:null!=(r=null==(t=a[0])?void 0:t.id)?r:null;M(a,s,o,"horizontal");let l=new Set(a.map(e=>e.id)),d=(Array.isArray(n.terminal_nodes)?n.terminal_nodes:[]).filter(e=>"string"==typeof e&&l.has(e));return{graphId:"string"==typeof n.graph_id?n.graph_id:"my-graph",entry:o,terminals:d,nodes:a,edges:s,...O(n,["graph_id","entry_node","terminal_nodes","nodes","edges"])}}let D={width:180,height:72};function _(e){return"fail"===e?"실패 시":e}function M(e,t,r,n,a){let s=(0,b.Fq)(e.map(e=>({id:e.id,...D})),t,{entry:r,flow:n,rename:_,...void 0!==a?{lineLength:a}:{}});for(let t of e){let e=s.get(t.id);e&&(t.x=e.x,t.y=e.y)}}function O(e,t){let r=Object.fromEntries(Object.entries(e).filter(e=>{let[r]=e;return!t.includes(r)}));return Object.keys(r).length>0?{extra:r}:{}}function T(e){return{ok:!1,issues:[{source:"server",message:e}]}}async function P(e,t,r,n,a){try{let s=a&&Object.keys(a).length?a:void 0,o="create"===n?await e.createRunGraph(t,r,s):await e.putRunGraphYaml(t,r,s);return{ok:!0,id:t,created:"create"===n,..."number"==typeof o.version?{version:o.version}:{}}}catch(a){var s,o;if(!(a instanceof i.Iu))return T("저장 실패: ".concat(a instanceof Error?a.message:String(a)));let e=null!=(s=a.body)?s:{};if(Array.isArray(e.errors)&&e.errors.length>0)return{ok:!1,issues:z(r,{errors:e.errors})};if("create"===n&&(404===a.status||405===a.status))return T("새 그래프 저장(POST /v1/graphs)을 이 Daemon 이 아직 지원하지 않습니다 — 서버 업데이트 후 다시 저장하세요");if(409===a.status)return T("\xab".concat(t,"\xbb 는 이미 있는 그래프 id 입니다 — 다른 id 를 쓰세요"));if("reserved-id"===e.error)return T("\xab".concat(t,"\xbb 는 예약된 id 라 쓸 수 없습니다 — 다른 id 를 쓰세요"));if("graph-id-mismatch"===e.error)return T("YAML 의 graph_id 가 저장할 id 와 다릅니다");if(403===a.status)return T("\xab".concat(t,"\xbb 는 기본 제공 그래프라 덮어쓸 수 없습니다 — 다른 id 를 쓰세요"));if("update"===n&&404===a.status)return T("\xab".concat(t,"\xbb 가 서버에 없습니다 — 새 그래프로 저장하세요"));return T(null!=(o=e.reason)?o:e.error?"저장 실패: ".concat(e.error," (").concat(a.status,")"):"저장 실패 (".concat(a.status,")"))}}var V=r(25579);let L="application/x-elanous-graph-kind",F={agent:"#3b82f6",gate:"#f59e0b",git:"#10b981",judge:"#a855f7",observe:"#06b6d4",hitl:"#f43f5e",subgraph:"#8b5cf6"},Y={running:{word:"● 도는 중",ring:"#3b82f6",chip:"bg-blue-500/15 text-blue-400"},done:{word:"✓ 끝",ring:"#10b981",chip:"bg-emerald-500/15 text-emerald-400"},failed:{word:"✗ 실패",ring:"#ef4444",chip:"bg-red-500/15 text-red-400"},skipped:{word:"– 건너뜀",ring:"#6b7280",chip:"bg-muted text-muted-foreground"},awaiting_approval:{word:"⏸ 승인 대기",ring:"#f59e0b",chip:"bg-amber-500/15 text-amber-400"}},U={canvas:function(e){var t;let{data:r,selected:a}=e,s="vertical"===r.flow,o=r.runStatus?Y[r.runStatus]:void 0;return(0,n.jsxs)("div",{"data-testid":"canvas-node-".concat(r.id),"data-run-status":r.runStatus,className:"rounded-lg border bg-background px-3 py-2 shadow-sm ".concat(r.issueCount?"border-red-500":a?"border-primary":"border-border"),style:{width:D.width,borderLeft:"4px solid ".concat(null!=(t=F[r.kind])?t:"#64748b"),...o?{boxShadow:"0 0 0 2px ".concat(o.ring)}:{}},children:[(0,n.jsx)(x.h7,{id:"in",type:"target",position:s?f.yX.Top:f.yX.Left,className:"!h-3 !w-3"}),(0,n.jsxs)("div",{className:"flex items-center gap-1 text-[10px] text-muted-foreground",children:[(0,n.jsx)("span",{children:r.kind}),r.entry&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1 text-emerald-500",children:"시작"}),r.terminal&&(0,n.jsx)("span",{className:"rounded bg-sky-500/15 px-1 text-sky-500",children:"끝"}),r.issueCount>0&&(0,n.jsxs)("span",{className:"rounded bg-red-500/15 px-1 text-red-500",children:["오류 ",r.issueCount]}),o&&(0,n.jsx)("span",{className:"rounded px-1 font-semibold ".concat(o.chip),children:o.word})]}),r.label?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"max-w-[150px] truncate text-sm font-semibold text-foreground",title:r.label,children:r.label}),(0,n.jsx)("div",{className:"font-mono text-[10px] text-muted-foreground",children:r.id})]}):(0,n.jsx)("div",{className:"font-mono text-sm font-semibold text-foreground",children:r.id}),(0,n.jsx)("div",{className:"max-w-[150px] truncate text-[10px] text-muted-foreground",title:r.recipe,children:r.recipe}),(0,n.jsx)(x.h7,{id:"out",type:"source",position:s?f.yX.Bottom:f.yX.Right,className:"!h-3 !w-3"})]})}},G={"--xy-controls-button-background-color":"var(--card)","--xy-controls-button-background-color-hover":"var(--muted)","--xy-controls-button-color":"var(--foreground)","--xy-controls-button-color-hover":"var(--foreground)","--xy-controls-button-border-color":"var(--border)","--xy-controls-box-shadow":"0 0 0 1px var(--border)"};function K(e){var t,r;let{palette:s,client:o,initialGraph:l,initialSaved:d,nodeStatus:i,renderActions:u,onChange:c,onSaved:m,replace:p,highlight:f,wizardMode:h=!1,nodeLabels:C,wizardSteps:O}=e,[T,Y]=(0,a.useState)(()=>null!=l?l:w("")),[K,B]=(0,a.useState)(null),[W,q]=(0,a.useState)(null),[X,H]=(0,a.useState)(null),[Q,J]=(0,a.useState)(null),[$,ee]=(0,a.useState)(()=>d&&l?{id:l.graphId,yaml:R(l)}:null),[et,er]=(0,a.useState)(null),[en,ea]=(0,a.useState)([]),[es,eo]=(0,a.useState)(""),[el,ed]=(0,a.useState)(null),ei=(0,a.useRef)(null),eu=(0,a.useRef)(null),[ec,em]=(0,a.useState)("horizontal"),[ep,ex]=(0,a.useState)(void 0),ef=(0,a.useRef)(.85);ef.current=h?.6:.85,(0,a.useEffect)(()=>{let e=eu.current;if(!e||"undefined"==typeof ResizeObserver)return;let t=new ResizeObserver(e=>{var t;let[r]=e,n=null!=(t=null==r?void 0:r.contentRect.width)?t:1e3;em(n<640?"vertical":"horizontal"),ex(n<640?void 0:100*Math.floor(n/ef.current/100))});return t.observe(e),()=>t.disconnect()},[]);let eg=(0,a.useRef)(!1),eh=(0,a.useRef)({flow:ec,lineLength:ep});eh.current={flow:ec,lineLength:ep};let eb=(0,a.useCallback)(e=>eg.current||e.nodes.length<2?e:function(e,t,r){let n=e.nodes.map(e=>({...e}));return M(n,e.edges,e.entry,t,r),{...e,nodes:n}}(e,eh.current.flow,eh.current.lineLength),[]),ev=(0,a.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;setTimeout(()=>{let t=ei.current,r=eu.current;t&&Promise.resolve(t.fitView({padding:.12,maxZoom:1.1,minZoom:ef.current,...e?{duration:e}:{}})).then(()=>{let e=t.getNodes();if(!r||0===e.length)return;let n=t.getNodesBounds(e),{zoom:a,x:s,y:o}=t.getViewport(),l=r.getBoundingClientRect(),d=n.width*a+48>l.width,i=n.height*a+48>l.height;(d||i)&&t.setViewport({zoom:a,x:d?24-n.x*a:s,y:i?24-n.y*a:o})})},80)},[]),ey=(0,a.useRef)("horizontal:undefined");(0,a.useEffect)(()=>{let e="".concat(ec,":").concat(ep);e===ey.current||eg.current||(ey.current=e,Y(e=>eb(e)),ev())},[ec,ep,eb,ev]);let[ek,ej]=(0,a.useState)({}),ew=(0,a.useRef)(null);(0,a.useEffect)(()=>{var e,t;p&&ew.current!==p.rev&&(ew.current=p.rev,Y(eb(p.graph)),B(null),H(null),q(null),"vertical"===ec&&(null==(t=eu.current)||null==(e=t.scrollIntoView)||e.call(t,{block:"start",behavior:"smooth"})),ev(300))},[p]);let eN=(0,a.useMemo)(()=>{var e;return new Set(null!=(e=null==f?void 0:f.nodes)?e:[])},[f]),eI=(0,a.useMemo)(()=>{var e;return new Set(null!=(e=null==f?void 0:f.edges)?e:[])},[f]),eS=(0,a.useMemo)(()=>s.map(e=>e.kind),[s]),eC=(0,a.useMemo)(()=>R(T),[T]),eE=(0,a.useMemo)(()=>(function(e,t){var r,n;let a=[],s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return a.push({message:e,source:"local",...t})};v.test(e.graphId)||s("그래프 id 는 영문 소문자\xb7숫자\xb7- 만 쓸 수 있습니다"),y.includes(e.graphId)&&s("\xab".concat(e.graphId,"\xbb 는 예약된 그래프 id 입니다")),0===e.nodes.length&&s("노드가 하나도 없습니다");let o=new Map;for(let t of e.nodes)o.set(t.id,(null!=(r=o.get(t.id))?r:0)+1);for(let r of e.nodes)(!r.id.trim()||/\s/.test(r.id))&&s("노드 id 는 비우거나 공백을 넣을 수 없습니다",{nodeId:r.id}),(null!=(n=o.get(r.id))?n:0)>1&&s("노드 id \xab".concat(r.id,"\xbb 가 겹칩니다"),{nodeId:r.id}),t&&!t.includes(r.kind)&&s("팔레트에 없는 kind 입니다: ".concat(r.kind),{nodeId:r.id}),r.recipe.trim()||s("recipe 가 비었습니다",{nodeId:r.id}),(!Number.isInteger(r.maxVisits)||r.maxVisits<1)&&s("max_visits 는 1 이상의 정수여야 합니다",{nodeId:r.id});let l=new Set(e.nodes.map(e=>e.id));for(let t of(e.edges.forEach((e,t)=>{l.has(e.from)||s("간선 출발 \xab".concat(e.from,"\xbb 은 없는 노드입니다"),{edgeIndex:t}),l.has(e.to)||s("간선 도착 \xab".concat(e.to,"\xbb 은 없는 노드입니다"),{edgeIndex:t,...l.has(e.from)?{nodeId:e.from}:{}})}),l)){let r=e.edges.filter(e=>e.from===t),n=r.filter(e=>!e.outcome);n.length>1&&s("조건 없는 간선은 노드마다 하나만 둘 수 있습니다 — 결과 이름을 붙이세요",{nodeId:t}),n.length>0&&n.length<r.length&&s("조건 없는 간선과 결과 간선을 섞을 수 없습니다",{nodeId:t});let a=r.filter(e=>e.outcome).map(e=>e.outcome);new Set(a).size<a.length&&s("같은 결과 이름의 간선이 둘 이상입니다",{nodeId:t})}return e.nodes.length>0&&(e.entry&&l.has(e.entry)||s("시작 노드를 정하세요"),0===E(e).length&&s("끝 노드가 없습니다 — 노드를 골라 \xab끝 노드\xbb 로 표시하세요")),{ok:0===a.length,issues:a}})(T,eS),[T,eS]),eR=(null==X?void 0:X.yaml)===eC?X:null,ez=(null==eR?void 0:eR.server)?eR.issues:[],eA=[...eE.issues,...ez],eD={graphId:T.graphId,yaml:eC,graph:T,valid:eE.ok&&0===ez.length,saved:(null==$?void 0:$.id)===T.graphId&&$.yaml===eC},e_=(0,a.useRef)(eD);e_.current=eD,(0,a.useEffect)(()=>{null==c||c(e_.current)},[c,T,eC,eD.valid,eD.saved]),(0,a.useEffect)(()=>{if(!o)return;let e=!0;return o.getRunGraphs().then(t=>{e&&ea(t.graphs)}).catch(()=>{}),()=>{e=!1}},[o,$]);let eM=(0,a.useCallback)(e=>{Y(t=>{try{let r=e(t);return q(null),r}catch(e){return q(e instanceof Error?e.message:String(e)),t}})},[]),eO=(0,a.useCallback)(()=>ev(200),[ev]);function eT(e,t){let r=null;eM(n=>{let a=function(e,t){var r,n,a,s;let o=null!=(r=t.id)?r:function(e,t){var r;let n=(null!=(r=t.split(":").pop())?r:"node").replace(/[^A-Za-z0-9_-]/g,"-")||"node",a=new Set(e.nodes.map(e=>e.id));for(let e=1;;e++)if(!a.has("".concat(n,"-").concat(e)))return"".concat(n,"-").concat(e)}(e,t.kind);if(e.nodes.some(e=>e.id===o))throw Error("이미 있는 노드 id 입니다: ".concat(o));let l=void 0!==t.x&&void 0!==t.y?{x:t.x,y:t.y}:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"horizontal",r=e.nodes.length;return"vertical"===t?{x:40,y:40+130*r}:{x:40+r%5*240,y:40+180*Math.floor(r/5)}}(e,t.flow),d={id:o,kind:t.kind,recipe:null!=(n=t.recipe)?n:j(o),maxVisits:null!=(a=t.maxVisits)?a:1,...l};return{graph:{...e,entry:null!=(s=e.entry)?s:o,nodes:[...e.nodes,d]},id:o}}(n,{kind:e,flow:ec,...null!=t?t:{}});return r=a.id,a.graph}),r&&B({type:"node",id:r}),t||eO()}let eP=(0,a.useMemo)(()=>{var e;let t=new Map;for(let r of eA)r.nodeId&&t.set(r.nodeId,(null!=(e=t.get(r.nodeId))?e:0)+1);return t},[eA]),eV=(0,a.useMemo)(()=>new Set(E(T)),[T]),eL=T.nodes.map(e=>{var t;return{id:e.id,type:"canvas",position:{x:e.x,y:e.y},selected:(null==K?void 0:K.type)==="node"&&K.id===e.id,className:[i?(0,g.V)(i[e.id]):"",eN.has(e.id)?"graph-wizard-new":""].filter(Boolean).join(" ")||void 0,data:{id:e.id,kind:e.kind,recipe:e.recipe,...(null==C?void 0:C[e.id])?{label:C[e.id]}:{},entry:T.entry===e.id,terminal:eV.has(e.id),issueCount:null!=(t=eP.get(e.id))?t:0,flow:ec,...(null==i?void 0:i[e.id])?{runStatus:i[e.id]}:{}}}}),eF=(0,a.useMemo)(()=>(0,b.gL)(T.nodes.map(e=>{var t;return{id:e.id,x:e.x,y:e.y,...null!=(t=ek[e.id])?t:D}}),(0,b.IU)(T.edges),{flow:ec,rename:_}),[T.nodes,T.edges,ek,ec]).map(e=>{let t=e.indexes.some(e=>{let t=T.edges[e];return void 0!==t&&eI.has("".concat(t.from,"->").concat(t.to,":").concat(t.outcome))});return{id:e.id,source:e.from,target:e.to,sourceHandle:"out",targetHandle:"in",type:"tidy",data:{route:e},selected:(null==K?void 0:K.type)==="edge"&&e.indexes.includes(K.index),animated:t||(null==i?void 0:i[e.from])==="done"&&(null==i?void 0:i[e.to])==="running",...t?{style:{stroke:"#a855f7",strokeWidth:3}}:{}}});async function eY(){if(er(null),!eE.ok||!o)return void H({yaml:eC,issues:eE.issues,server:!1});J("validate");try{let e=await o.validateGraph("harness",eC);H({yaml:eC,issues:e.ok&&0===e.errors.length?[]:z(eC,e),server:!0})}catch(e){H({yaml:eC,issues:[{source:"server",message:"검증 요청 실패: ".concat(e instanceof Error?e.message:String(e))}],server:!0})}finally{J(null)}}async function eU(){if(!o||!eE.ok)return void eY();J("save"),er(null);let e=T.graphId;try{let t=await P(o,e,eC,(null==$?void 0:$.id)===e?"update":"create",O);t.ok?(ee({id:e,yaml:eC,...void 0!==t.version?{version:t.version}:{}}),er("\xab".concat(e,"\xbb 를 ").concat(t.created?"새로 ":"","저장했습니다").concat(void 0!==t.version?" (v".concat(t.version,")"):"")),null==m||m(e)):H({yaml:eC,issues:t.issues,server:!0,from:"save"})}finally{J(null)}}async function eG(e){if(o&&e){J("load");try{let t=await o.getRunGraphYaml(e),r=A(t.yaml);eg.current=!1,Y(eb(r)),B(null),H(null),ee("mine"===t.source?{id:t.id,yaml:R(r)}:null),er("mine"===t.source?"\xab".concat(e,"\xbb 를 불러왔습니다"):"\xab".concat(e,"\xbb 는 기본 제공 그래프입니다 — id 를 바꿔 내 그래프로 저장하세요")),eO()}catch(e){q("불러오기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{J(null)}}}let eK=(null==K?void 0:K.type)==="node"&&null!=(t=T.nodes.find(e=>e.id===K.id))?t:null,eZ=(null==K?void 0:K.type)==="edge"&&null!=(r=T.edges[K.index])?r:null,eB=eA.filter(e=>!e.nodeId),eW="validate"===Q?null:eR,eq=(0,a.useRef)(null);return(0,a.useEffect)(()=>{var e;T.graphId||null==(e=eq.current)||e.focus()},[T.graphId]),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col","data-graph-id":T.graphId,"aria-label":"그래프 만들기",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-xs",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-muted-foreground",children:["그래프 id",(0,n.jsx)("input",{ref:eq,"aria-label":"그래프 id",value:T.graphId,spellCheck:!1,placeholder:"예: my-graph",autoCapitalize:"off",autoCorrect:"off",onChange:e=>eM(t=>{var r;return r=e.target.value,{...t,graphId:r.trim()}}),className:"w-36 rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{Y(w("")),B(null),H(null),ee(null),er(null),q(null)},className:"rounded border border-border px-2 py-1",children:"새 그래프"}),o&&(0,n.jsxs)("select",{"aria-label":"그래프 불러오기",value:"",disabled:null!==Q,onChange:e=>{eG(e.target.value)},className:"max-w-[10rem] rounded border border-border bg-background px-1 py-1",children:[(0,n.jsx)("option",{value:"",children:"불러오기…"}),en.map(e=>(0,n.jsxs)("option",{value:e.id,children:[e.id,"mine"===e.source?" \xb7 내 그래프":""]},e.id))]}),(0,n.jsx)("span",{className:"text-muted-foreground",children:eD.saved?"저장됨".concat((null==$?void 0:$.version)!==void 0?" \xb7 v".concat($.version):""):(null==$?void 0:$.id)===T.graphId?"저장 안 된 변경":"아직 저장 안 함"}),(0,n.jsxs)("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{eY()},disabled:null!==Q,title:o?"저장하지 않고 서버의 그래프 로더로 검증합니다":"Daemon 연결이 없어 로컬 검사만 합니다",className:"rounded border border-border px-3 py-1 disabled:opacity-50",children:"validate"===Q?"검증 중…":"검증"}),(0,n.jsx)("button",{type:"button",onClick:()=>{eU()},disabled:!o||null!==Q||eD.saved,className:"rounded bg-primary px-3 py-1 text-primary-foreground disabled:opacity-50",children:"save"===Q?"저장 중…":"저장"}),null==u?void 0:u(eD)]})]}),eW&&(0===eW.issues.length?(0,n.jsxs)("p",{role:"status","data-testid":"graph-check-line",className:"border-b border-emerald-500/40 bg-emerald-500/10 px-3 py-1.5 text-sm font-medium text-emerald-500",children:["✓ 검증 통과",eW.server?"":" (로컬 검사 — Daemon 연결 없음)"]}):(0,n.jsxs)("div",{role:"alert","data-testid":"graph-check-line",className:"border-b border-red-500/40 bg-red-500/10 px-3 py-1.5 text-sm text-red-500",children:[(0,n.jsxs)("p",{className:"font-medium",children:["✗ ","save"===eW.from?"저장 실패":"검증 실패"," ",eW.issues.length,"건"]}),(0,n.jsx)("ul",{className:"mt-0.5 list-disc pl-5 text-xs",children:eW.issues.map((e,t)=>(0,n.jsxs)("li",{children:[e.nodeId?(0,n.jsxs)("span",{className:"font-mono",children:[e.nodeId,": "]}):null,e.message]},t))})]})),(W||et)&&(0,n.jsx)("p",{role:W?"alert":"status",className:"border-b border-border px-3 py-1 text-xs ".concat(W?"text-red-500":"text-emerald-500"),children:null!=W?W:et}),(0,n.jsx)("datalist",{id:"graph-canvas-outcomes",children:k.map(e=>(0,n.jsx)("option",{value:e},e))}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col ".concat(h?"":"min-[900px]:flex-row"),children:[(0,n.jsxs)("aside",{"aria-label":"노드 팔레트",className:h?"flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5":"shrink-0 border-b border-border p-2 min-[900px]:w-44 min-[900px]:overflow-y-auto min-[900px]:border-b-0 min-[900px]:border-r",children:[(0,n.jsx)("p",{className:"text-[11px] text-muted-foreground ".concat(h?"shrink-0":"mb-1"),children:h?"눌러서 추가":(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"min-[900px]:hidden",children:"눌러서 추가"}),(0,n.jsx)("span",{className:"hidden min-[900px]:inline",children:"끌어 놓거나 눌러서 추가"})]})}),(0,n.jsx)("ul",{className:h?"flex min-w-0 gap-1 overflow-x-auto":"flex gap-1 overflow-x-auto min-[900px]:flex-col min-[900px]:overflow-visible",children:s.map(e=>{var t,r;return(0,n.jsx)("li",{className:"shrink-0",children:(0,n.jsxs)("button",{type:"button",draggable:!0,title:e.description||e.kind,"aria-label":"".concat(e.kind," 노드 추가"),onDragStart:t=>{t.dataTransfer.setData(L,e.kind),t.dataTransfer.effectAllowed="copy"},onClick:()=>eT(e.kind),className:"flex w-full items-center gap-1 rounded border border-border bg-background px-2 py-1.5 text-left text-xs hover:bg-muted",style:{borderLeft:"4px solid ".concat(null!=(t=F[e.kind])?t:"#64748b")},children:[(0,n.jsx)("span",{"aria-hidden":!0,children:"+"}),e.kind,e.plugin&&(0,n.jsx)("small",{className:"rounded bg-accent/15 px-1 text-accent",children:e.plugin})]})},"".concat(null!=(r=e.plugin)?r:"core",":").concat(e.kind))})})]}),(0,n.jsxs)("div",{className:h?"flex min-h-0 flex-1 flex-col min-[900px]:flex-row":"contents",children:[(0,n.jsxs)("section",{ref:eu,"aria-label":"그래프 캔버스",className:"relative h-[56vh] min-h-[300px] shrink-0 bg-background min-[900px]:h-auto min-[900px]:min-w-0 min-[900px]:flex-1",onDragOver:e=>{Array.from(e.dataTransfer.types).includes(L)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy")},onDrop:e=>{var t,r;let n=e.dataTransfer.getData(L);if(!n||!eS.includes(n))return;e.preventDefault();let a=null!=(r=null==(t=ei.current)?void 0:t.screenToFlowPosition({x:e.clientX,y:e.clientY}))?r:{x:40,y:40};eT(n,{x:a.x-85,y:a.y-30})},children:[0===T.nodes.length&&(0,n.jsx)("div",{className:"pointer-events-none absolute inset-0 z-10 flex items-center justify-center p-6 text-center text-sm text-muted-foreground",children:"빈 캔버스입니다. 팔레트에서 노드를 끌어 놓거나 눌러서 추가하세요."}),(0,n.jsxs)(x.Gc,{nodes:eL,edges:eF,nodeTypes:U,edgeTypes:V.T,onInit:e=>{ei.current=e},onNodesChange:function(e){for(let t of e){if("dimensions"===t.type&&t.dimensions){let{id:e,dimensions:r}=t;ej(t=>{var n,a;return(null==(n=t[e])?void 0:n.width)===r.width&&(null==(a=t[e])?void 0:a.height)===r.height?t:{...t,[e]:r}})}if("position"===t.type&&t.position){let{id:e,position:r}=t;t.dragging&&(eg.current=!0),eM(t=>(function(e,t,r,n){return{...e,nodes:e.nodes.map(e=>e.id===t?{...e,x:r,y:n}:e)}})(t,e,r.x,r.y))}}},onConnect:e=>{e.source&&e.target&&eM(t=>N(t,e.source,e.target,I(t,e.source)))},onNodeClick:(e,t)=>B({type:"node",id:t.id}),onEdgeClick:(e,t)=>B({type:"edge",index:Number(t.id.slice(1))}),onPaneClick:()=>B(null),deleteKeyCode:null,fitView:!0,fitViewOptions:{padding:.12,maxZoom:1.1,minZoom:h?.6:.85},minZoom:.3,maxZoom:1.5,className:"!bg-background",style:G,children:[(0,n.jsx)(x.VS,{}),(0,n.jsx)(x.H2,{showInteractive:!1,position:"bottom-left"})]})]}),(!h||K)&&(0,n.jsxs)("aside",{"aria-label":"속성",className:"shrink-0 overflow-y-auto border-t border-border p-3 text-xs min-[900px]:w-72 min-[900px]:border-l min-[900px]:border-t-0",children:[eK?(0,n.jsx)(Z,{graph:T,nodeId:eK.id,palette:s,issues:eA.filter(e=>e.nodeId===eK.id),linkTarget:es,linkOutcome:el,setLinkTarget:eo,setLinkOutcome:ed,onEdit:eM,onRenamed:e=>B({type:"node",id:e}),onRemoved:()=>B(null)},eK.id):eZ&&(null==K?void 0:K.type)==="edge"?(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("h2",{className:"text-sm font-semibold",children:["간선 ",(0,n.jsxs)("span",{className:"font-mono",children:[eZ.from," → ",eZ.to]})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["결과 이름 (비우면 조건 없이 이어짐)",(0,n.jsx)("input",{"aria-label":"간선 결과",list:"graph-canvas-outcomes",value:eZ.outcome,placeholder:"예: pass \xb7 fail",onChange:e=>eM(t=>{var r,n;return r=K.index,n={outcome:e.target.value},{...t,edges:t.edges.map((e,t)=>{var a;if(t!==r)return e;let s=(null!=(a=n.outcome)?a:e.outcome).trim(),{extra:o,...l}={...e,...n,outcome:s};return o&&!!s==!!e.outcome?{...l,extra:o}:l})}}),className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{eM(e=>S(e,K.index)),B(null)},className:"self-start rounded border border-red-500 px-2 py-1 text-red-500",children:"간선 삭제"})]}):(0,n.jsxs)("div",{className:"flex flex-col gap-2 text-muted-foreground",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold text-foreground",children:"속성"}),(0,n.jsx)("p",{children:"노드를 누르면 id\xb7kind\xb7recipe 를 고칠 수 있습니다. 노드 오른쪽 점을 다른 노드로 끌거나, 노드를 고른 뒤 \xab다음 노드 연결\xbb 로 간선을 잇습니다."}),(0,n.jsxs)("p",{children:["노드 ",T.nodes.length," \xb7 간선 ",T.edges.length,T.entry?" \xb7 시작 ".concat(T.entry):""]})]}),eB.length>0&&(0,n.jsx)("ul",{"aria-label":"그래프 오류",className:"mt-3 flex flex-col gap-1 border-t border-border pt-2",children:eB.map((e,t)=>(0,n.jsx)("li",{className:"text-red-500",children:e.message},t))}),(0,n.jsxs)("details",{className:"mt-3 border-t border-border pt-2",children:[(0,n.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"YAML 보기"}),(0,n.jsx)("pre",{"aria-label":"그래프 YAML",className:"mt-2 max-h-64 overflow-auto rounded bg-muted p-2 font-mono text-[11px] text-foreground",children:eC})]})]})]})]})]})}function Z(e){var t,r,s,o;let{graph:l,nodeId:d,palette:i,issues:u,linkTarget:c,linkOutcome:m,setLinkTarget:p,setLinkOutcome:x,onEdit:f,onRenamed:g,onRemoved:h}=e,b=l.nodes.find(e=>e.id===d),[v,y]=(0,a.useState)(b.id),[k,j]=(0,a.useState)(null),w=l.nodes.filter(e=>e.id!==d).map(e=>e.id),E=w.includes(c)?c:null!=(t=w[0])?t:"",R=null!=m?m:I(l,d),z=i.find(e=>e.kind===b.kind),A=l.edges.map((e,t)=>({edge:e,index:t})).filter(e=>{let{edge:t}=e;return t.from===d});function D(){let e=v.trim();if(e!==b.id)try{C(l,b.id,{id:e}),f(t=>C(t,b.id,{id:e})),j(null),g(e)}catch(e){j(e instanceof Error?e.message:String(e))}}return(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("h2",{className:"text-sm font-semibold",children:["노드 ",(0,n.jsx)("span",{className:"font-mono",children:b.id})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["id",(0,n.jsx)("input",{"aria-label":"노드 id",value:v,spellCheck:!1,onChange:e=>y(e.target.value),onBlur:D,onKeyDown:e=>{"Enter"===e.key&&D()},className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),k&&(0,n.jsx)("p",{role:"alert",className:"text-red-500",children:k}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["kind",(0,n.jsxs)("select",{"aria-label":"노드 kind",value:b.kind,onChange:e=>f(t=>C(t,d,{kind:e.target.value})),className:"rounded border border-border bg-background px-1 py-1 text-foreground",children:[!z&&(0,n.jsxs)("option",{value:b.kind,children:[b.kind," (팔레트에 없음)"]}),i.map(e=>{var t;return(0,n.jsxs)("option",{value:e.kind,children:[e.kind,e.plugin?" \xb7 ".concat(e.plugin):""]},"".concat(null!=(t=e.plugin)?t:"core",":").concat(e.kind))})]})]}),(null==z?void 0:z.description)&&(0,n.jsx)("p",{className:"text-[11px] text-muted-foreground",children:z.description}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["recipe",(0,n.jsx)("input",{"aria-label":"recipe",value:b.recipe,spellCheck:!1,onChange:e=>f(t=>C(t,d,{recipe:e.target.value})),className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["최대 방문 (max_visits)",(0,n.jsx)("input",{"aria-label":"max_visits",type:"number",min:1,step:1,value:b.maxVisits,onChange:e=>f(t=>C(t,d,{maxVisits:Number(e.target.value)})),className:"w-24 rounded border border-border bg-background px-2 py-1 text-foreground"})]}),(0,n.jsxs)("label",{className:"flex items-center gap-2 text-foreground",children:[(0,n.jsx)("input",{type:"checkbox","aria-label":"끝 노드",checked:l.terminals.includes(d),onChange:e=>f(t=>(function(e,t,r){if(!e.nodes.some(e=>e.id===t))return e;let n=e.terminals.filter(e=>e!==t);return{...e,terminals:r?[...n,t]:n}})(t,d,e.target.checked))}),"끝 노드 (여기서 실행이 끝남)"]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2",children:[l.entry===d?(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-2 py-1 text-emerald-500",children:"시작 노드"}):(0,n.jsx)("button",{type:"button",onClick:()=>f(e=>e.nodes.some(e=>e.id===d)?{...e,entry:d}:e),className:"rounded border border-border px-2 py-1",children:"시작 노드로"}),(0,n.jsx)("button",{type:"button",onClick:()=>{f(e=>(function(e,t){var r,n;let a=e.nodes.filter(e=>e.id!==t);return{...e,entry:e.entry===t?null!=(n=null==(r=a[0])?void 0:r.id)?n:null:e.entry,terminals:e.terminals.filter(e=>e!==t),nodes:a,edges:e.edges.filter(e=>e.from!==t&&e.to!==t)}})(e,d)),h()},className:"rounded border border-red-500 px-2 py-1 text-red-500",children:"노드 삭제"})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 border-t border-border pt-2 text-muted-foreground",children:["실패 시 다음 노드",(0,n.jsxs)("select",{"aria-label":"실패 시 다음 노드",value:null!==(r=null!=(o=null==(s=l.edges.find(e=>e.from===d&&"fail"===e.outcome))?void 0:s.to)?o:null)&&void 0!==r?r:"",onChange:e=>f(t=>(function(e,t,r){if(r===t)throw Error("실패 경로를 자기 자신으로 둘 수 없습니다");let n=e.edges.filter(e=>e.from!==t||"fail"!==e.outcome).map(e=>null===r||e.from!==t||e.outcome?e:{...e,outcome:"ok"});return{...e,edges:null===r?n:[...n,{from:t,to:r,outcome:"fail"}]}})(t,d,e.target.value||null)),className:"rounded border border-border bg-background px-1 py-1 font-mono text-foreground",children:[(0,n.jsx)("option",{value:"",children:"선택 안 함"}),w.map(e=>(0,n.jsx)("option",{value:e,children:e},e))]})]}),(0,n.jsxs)("fieldset",{className:"mt-1 flex flex-col gap-1 border-t border-border pt-2",children:[(0,n.jsx)("legend",{className:"text-muted-foreground",children:"다음 노드 연결"}),0===w.length?(0,n.jsx)("p",{className:"text-muted-foreground",children:"이을 다른 노드가 없습니다."}):(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[(0,n.jsx)("select",{"aria-label":"연결할 노드",value:E,onChange:e=>p(e.target.value),className:"rounded border border-border bg-background px-1 py-1 font-mono text-foreground",children:w.map(e=>(0,n.jsx)("option",{value:e,children:e},e))}),(0,n.jsx)("input",{"aria-label":"연결 결과",list:"graph-canvas-outcomes",value:R,placeholder:"결과(비우면 조건 없음)",onChange:e=>x(e.target.value),className:"w-24 rounded border border-border bg-background px-2 py-1 font-mono text-foreground"}),(0,n.jsx)("button",{type:"button",onClick:()=>{f(e=>N(e,d,E,R)),x(null)},className:"rounded border border-border px-2 py-1",children:"연결"})]}),A.length>0&&(0,n.jsx)("ul",{className:"flex flex-col gap-1",children:A.map(e=>{let{edge:t,index:r}=e;return(0,n.jsxs)("li",{className:"flex items-center gap-2 font-mono",children:[(0,n.jsxs)("span",{children:["→ ",t.to,t.outcome?" (".concat(t.outcome,")"):""]}),(0,n.jsx)("button",{type:"button","aria-label":"".concat(t.to," 간선 삭제"),onClick:()=>f(e=>S(e,r)),className:"rounded px-1 text-red-500 hover:bg-red-500/10",children:"삭제"})]},r)})})]}),u.length>0&&(0,n.jsx)("ul",{"aria-label":"노드 오류",className:"flex flex-col gap-1 border-t border-border pt-2",children:u.map((e,t)=>(0,n.jsx)("li",{className:"text-red-500",children:e.message},t))})]})}let B=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);async function W(e,t){try{let r=await e.startRunGraphRun(t);return"string"==typeof(null==r?void 0:r.runId)?{kind:"started",runId:r.runId}:{kind:"error",status:0,message:"런 id 가 없다"}}catch(r){if(!(r instanceof i.Iu))return{kind:"error",status:0,message:"데몬에 닿지 못했다"};let e=r.body;if(403===r.status)return{kind:"forbidden"};if(422===r.status&&B(e)&&Array.isArray(e.issues))return{kind:"not-runnable",issues:e.issues.filter(e=>"string"==typeof e)};let t=B(e)&&"string"==typeof e.reason?e.reason:B(e)&&"string"==typeof e.error?e.error:"";return{kind:"error",status:r.status,message:t}}}async function q(e,t,r){try{var n;return n=await e.getRunGraphRun(t,r),B(n)&&"string"==typeof n.runId&&"string"==typeof n.status&&Array.isArray(n.path)&&Array.isArray(n.nodes)?n:null}catch(e){return null}}let X=new Set(["done","failed","budget-exceeded","awaiting-approval"]);function H(e){return Object.fromEntries(Object.entries(function(e){let t={};for(let r of e.nodes){let e=r.startedAt&&r.endedAt?Math.max(0,Date.parse(r.endedAt)-Date.parse(r.startedAt)):void 0,n=r.ok?"done":"failed";t[r.nodeId]={status:n,...void 0!==e&&Number.isFinite(e)?{durationMs:e}:{},...r.error?{error:r.error}:{}}}return e.currentNode&&!X.has(e.status)&&(t[e.currentNode.nodeId]={status:"running"}),"awaiting-approval"===e.status&&e.currentNode&&(t[e.currentNode.nodeId]={status:"awaiting_approval"}),t}(e)).map(e=>{let[t,r]=e;return[t,r.status]}))}function Q(e){let{context:t,client:r,onStatus:s}=e,[o,l]=(0,a.useState)({kind:"idle"}),d=(0,a.useRef)(t.graphId),i=t.graphId?t.valid?t.saved?null:"저장한 뒤 실행할 수 있습니다 — 서버는 저장된 판을 돌립니다":"검증을 통과해야 실행할 수 있습니다":"그래프 id 가 없습니다";(0,a.useEffect)(()=>{d.current!==t.graphId&&(d.current=t.graphId,l({kind:"idle"}),s(void 0))},[t.graphId,s]);let u="running"===o.kind?o.runId:null,c="running"===o.kind&&null!==o.run&&X.has(o.run.status);(0,a.useEffect)(()=>{if(!u||c)return;let e=!1,n="running"===o.kind?o:null,a=setTimeout(async()=>{let a=await q(r,t.graphId,u);if(!e&&n){if(!a){let e=n.misses+1;l(e>=5?{kind:"refused",lines:["런 상태를 ".concat(e,"번 연속 읽지 못했습니다 — 데몬을 확인한 뒤 다시 실행하세요")]}:{...n,misses:e,tick:n.tick+1});return}if(Date.now()-n.since>18e4&&!X.has(a.status)){l({kind:"refused",lines:["데모 실행이 ".concat(Math.round(3),"분 넘게 끝나지 않습니다 — 원장이 \xab도는 중\xbb으로 남았을 수 있습니다(데몬 재시작 등)")]}),s(H(a));return}l({...n,run:a,misses:0,tick:n.tick+1}),s(H(a))}},1e3);return()=>{e=!0,clearTimeout(a)}},[u,c,o,r,t.graphId,s]);let m=async()=>{l({kind:"starting"}),s(void 0);let e=await W(r,t.graphId);"started"===e.kind?l({kind:"running",runId:e.runId,run:null,misses:0,since:Date.now(),tick:0}):"not-runnable"===e.kind?l({kind:"refused",lines:e.issues}):"forbidden"===e.kind?l({kind:"refused",lines:["운영자만 실행할 수 있습니다"]}):l({kind:"refused",lines:["실행을 시작하지 못했습니다".concat(e.message?" — ".concat(e.message):"").concat(e.status?" (".concat(e.status,")"):"")]})},p="starting"===o.kind||"running"===o.kind&&!c,x="running"===o.kind?o.run:null,f=(null==x?void 0:x.status)==="done"?"text-emerald-700 dark:text-emerald-400":x&&X.has(x.status)?"text-red-700 dark:text-red-400":"text-sky-700 dark:text-sky-400";return(0,n.jsxs)("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{m()},disabled:p||null!==i,title:null!=i?i:"저장된 그래프를 데모 레시피로 실행합니다",className:"rounded border border-sky-600/60 bg-sky-600/10 px-2.5 py-1 text-xs font-semibold text-sky-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-sky-300",children:"▶ 데모 실행"}),i&&"idle"===o.kind&&(0,n.jsx)("span",{className:"text-xs text-muted-foreground",children:i}),"starting"===o.kind&&(0,n.jsx)("span",{role:"status",className:"text-xs text-sky-700 dark:text-sky-400",children:"데모 실행 \xb7 시작하는 중"}),"running"===o.kind&&(0,n.jsx)("span",{role:"status","aria-live":"polite",className:"text-xs font-semibold ".concat(f),children:x?function(e){let t=e.path.length,r=t-new Set(e.path).size;switch(e.status){case"starting":return"데모 실행 \xb7 시작하는 중";case"running":return"데모 실행 \xb7 도는 중".concat(e.currentNode?" ".concat(e.currentNode.nodeId):""," \xb7 지난 노드 ").concat(e.nodes.length);case"done":return"데모 실행 \xb7 성공 \xb7 거친 노드 ".concat(t).concat(r?"(다시 지남 ".concat(r,")"):"");case"budget-exceeded":return"데모 실행 \xb7 방문 한도 초과".concat(e.path.at(-1)?" ".concat(e.path.at(-1)):""," — max_visits 를 늘려 저장하고 다시 실행");case"awaiting-approval":return"데모 실행 \xb7 승인 대기".concat(e.currentNode?" ".concat(e.currentNode.nodeId):"");default:{let t=[...e.nodes].reverse().find(e=>!e.ok);return"데모 실행 \xb7 실패".concat(t?" ".concat(t.nodeId):"").concat(e.error?" — ".concat(e.error):(null==t?void 0:t.error)?" — ".concat(t.error):"")}}}(x):"데모 실행 \xb7 시작하는 중"}),"refused"===o.kind&&(0,n.jsx)("span",{role:"alert",className:"text-xs font-semibold text-red-700 dark:text-red-400",children:o.lines.join(" \xb7 ")})]})}var J=r(11986);let $=["매일 아침 AI 뉴스 요약해서 텔레그램으로","PR 리뷰하고 문제 없으면 머지","조사해서 표로 정리하고 내가 승인하면 게시"];function ee(e){if("string"==typeof e)return e;if(e&&"object"==typeof e){let t="string"==typeof e.nodeId?e.nodeId:"string"==typeof e.path?e.path:"",r="string"==typeof e.message?e.message:JSON.stringify(e);return t?"".concat(t,": ").concat(r):r}return String(e)}async function et(e,t,r){if(!t.prompt.trim())return{kind:"empty"};try{let n=await e.graphWizard(t,r?{signal:r}:void 0);return er(n)}catch(e){if((null==r?void 0:r.aborted)||e instanceof Error&&"AbortError"===e.name)return{kind:"cancelled"};if(e instanceof i.Iu){var n,a;if(404===e.status||405===e.status)return{kind:"unsupported"};if(422===e.status&&e.body&&"object"==typeof e.body&&"ok"in e.body)return er(e.body);let t=null!=(n=e.body)?n:{};if(400===e.status&&(!t.reason||"prompt required"===t.reason))return{kind:"empty"};if(400===e.status)return{kind:"error",message:"요청을 받지 않았습니다 — ".concat(t.reason)};return{kind:"error",message:null!=(a=t.reason)?a:t.error?"".concat(t.error," (").concat(e.status,")"):"요청 실패 (".concat(e.status,")")}}return{kind:"error",message:e instanceof Error?e.message:String(e)}}}function er(e){var t;let r,n=(null!=(t=e.issues)?t:[]).map(ee),a="string"==typeof e.yaml?e.yaml:"",s=null;if(a.trim()){try{s=A(a)}catch(e){r=e instanceof Error?e.message:String(e)}s&&0===s.nodes.length&&(s=null,r="초안에 노드가 없습니다")}else r="응답에 YAML 이 없습니다";return{kind:"draft",ok:!0===e.ok&&0===n.length,yaml:a,graph:s,issues:n,...r?{parseError:r}:{},...e.base?{base:e.base}:{},..."number"==typeof e.attempts?{attempts:e.attempts}:{},...e.summary?{summary:e.summary}:{},...e.labels&&"object"==typeof e.labels?{labels:Object.fromEntries(Object.entries(e.labels).filter(e=>"string"==typeof e[1]&&""!==e[1].trim()))}:{},...e.steps&&"object"==typeof e.steps&&!Array.isArray(e.steps)?{steps:e.steps}:{},..."string"==typeof e.baseReason&&e.baseReason.trim()?{baseReason:e.baseReason.trim()}:{}}}function en(e){return e.baseReason?e.base?"기반: ".concat(e.base," — 이유 ").concat(e.baseReason):"기반 선택 이유: ".concat(e.baseReason):null}function ea(e){return"".concat(e.from,"->").concat(e.to,":").concat(e.outcome)}function es(e){var t,r,s;let{client:o,current:l,laid:d,onApply:i,onRestore:u,initialPrompt:c,className:m=""}=e,[p,x]=(0,a.useState)([]),[f,g]=(0,a.useState)(""),[h,b]=(0,a.useState)(null),[v,y]=(0,a.useState)(0),[k,j]=(0,a.useState)(!1),w=(0,a.useRef)(1),N=(0,a.useRef)(null),I=(0,a.useRef)(null),S=(0,a.useRef)(!1),C=(0,a.useRef)(p);C.current=p;let E=(0,a.useRef)(null);function z(e){let t=w.current++;return x(r=>[...r,{...e,id:t}]),t}async function A(e,t,r){let n=e.trim();if(h)return;if(!n)return void z({role:"assistant",text:"무엇을 만들지 한 줄로 적어 주세요.",tone:"warn"});let a=void 0!==t?t:l(),s=!a||0===a.graph.nodes.length,u=C.current.filter(e=>!e.undone&&(void 0===r||e.id<r)).map(e=>({role:e.role,text:e.text})),c=z({role:"user",text:n});g("");let m=new AbortController;b({startedAt:Date.now(),controller:m});try{var p,x,f,v;let e=await et(o,(v=s?null:a.yaml,{prompt:n.trim(),kind:"harness",...v?{currentYaml:v}:{},...u.length?{history:u.slice(-10).map(e=>({role:e.role,text:e.text}))}:{}}),m.signal);if("cancelled"===e.kind)return void z({role:"assistant",text:"취소했습니다 — 캔버스는 그대로입니다.",tone:"warn"});if("unsupported"===e.kind)return void z({role:"assistant",text:"이 Daemon 이 아직 그래프 마법사를 지원하지 않습니다 — 서버 업데이트 후 다시 시도하세요",tone:"error"});if("empty"===e.kind)return void z({role:"assistant",text:"무엇을 만들지 한 줄로 적어 주세요.",tone:"warn"});if("error"===e.kind)return void z({role:"assistant",text:"만들기 실패: ".concat(e.message),tone:"error"});let t=s?null:a.graph,r=d?d():E.current;if(e.graph){let n=function(e,t){if(!t||0===t.nodes.length)return!1;if(!e)return!0;let r=new Map(e.nodes.map(e=>[e.id,e]));return t.nodes.some(e=>{let t=r.get(e.id);return!t||t.x!==e.x||t.y!==e.y})}(r,t),a=function(e,t){var r,n,a;let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=null==(r=s.keepPositions)||r,l=new Map((null!=(n=null==e?void 0:e.nodes)?n:[]).map(e=>[e.id,e])),d=t.nodes.map(e=>{let t=o?l.get(e.id):void 0;return t?{...e,x:t.x,y:t.y}:e}),i=new Set((null!=(a=null==e?void 0:e.edges)?a:[]).map(ea));return{graph:{...t,nodes:d},added:{nodes:t.nodes.filter(e=>!l.has(e.id)).map(e=>e.id),edges:t.edges.filter(e=>!i.has(ea(e))).map(ea)}}}(t,e.graph,{keepPositions:n});i(a.graph,a.added,!n,e.labels,e.steps),(null==(p=(x=window).matchMedia)?void 0:p.call(x,"(max-width: 1023.98px)").matches)&&j(!0),E.current=a.graph}z({role:"assistant",text:null!=(f=e.summary)?f:s?"그래프 초안을 만들었습니다.":"그래프를 고쳤습니다.",tone:e.ok?"ok":e.graph?"warn":"error",status:function(e){let t=e.base?" \xb7 기반 템플릿 ".concat(e.base):"",r=void 0!==e.attempts?"(시도 ".concat(e.attempts,")"):"";return e.ok?"초안".concat(t," \xb7 검증 통과").concat(r):"초안".concat(t," \xb7 검증 실패 ").concat(e.issues.length,"건").concat(r)}(e),...en(e)?{baseLine:en(e)}:{},...e.issues.length?{issues:e.issues}:{},...e.parseError?{parseError:e.parseError}:{},...e.graph?{before:t,applied:!0,laidBefore:r,...e.steps?{steps:e.steps}:{}}:{},prompt:n,userId:c})}finally{b(null)}}function D(e){var t,r,n;let a=C.current.find(t=>t.id===e);if(!a||"assistant"!==a.role||!a.applied||a.undone)return;let s=[...C.current].reverse().find(t=>"assistant"===t.role&&t.applied&&!t.undone&&t.id<e);u(null!=(t=a.before)?t:null,s&&"assistant"===s.role?s.steps:void 0),E.current=null!=(r=a.laidBefore)?r:null;let o=null!=(n=a.userId)?n:e;x(e=>e.map(e=>e.id>=o?{...e,undone:!0}:e))}function _(){var e;g("검증 오류를 고쳐줘"),null==(e=I.current)||e.focus()}(0,J.dJ)("graph-wizard"),(0,a.useEffect)(()=>{if(!h)return;y(0);let e=setInterval(()=>y(Math.floor((Date.now()-h.startedAt)/1e3)),1e3);return()=>clearInterval(e)},[h]),(0,a.useEffect)(()=>{let e=N.current;e&&"function"==typeof e.scrollTo&&e.scrollTo({top:e.scrollHeight})},[p,h,k]),(0,a.useEffect)(()=>{c&&!S.current&&(S.current=!0,A(c))},[c]);let M=null!=(s=null==(t=[...p].reverse().find(e=>"assistant"===e.role))?void 0:t.text)?s:"",O=null==(r=[...p].reverse().find(e=>"assistant"===e.role&&e.applied&&!e.undone))?void 0:r.id;return(0,n.jsxs)("aside",{"aria-label":"말로 만들기","data-testid":"graph-wizard-chat",className:"flex min-h-0 shrink-0 flex-col border-border bg-background ".concat(k?"":"max-lg:h-[38vh]"," max-lg:border-t lg:h-auto lg:w-[360px] lg:shrink-0 lg:border-l ").concat(m),children:[(0,n.jsxs)("header",{className:"flex items-center gap-2 border-b border-border px-3 py-2 text-sm",children:[(0,n.jsx)("strong",{className:"shrink-0",children:"말로 만들기"}),k&&M?(0,n.jsx)("span",{"data-testid":"wizard-collapsed-line",className:"min-w-0 truncate text-xs text-muted-foreground lg:hidden",children:M}):null,(0,n.jsx)("span",{className:"text-xs text-muted-foreground ".concat(k&&M?"max-lg:hidden":""),children:"말하면 노드와 간선이 생깁니다"}),(0,n.jsx)("button",{type:"button",onClick:()=>j(e=>!e),"aria-expanded":!k,className:"ml-auto shrink-0 whitespace-nowrap rounded px-2 py-0.5 text-xs text-muted-foreground hover:bg-muted lg:hidden",children:k?"펼치기":"접기"})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col ".concat(k?"max-lg:hidden":""),children:[(0,n.jsxs)("ol",{ref:N,className:"flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto px-3 py-2 text-sm","aria-live":"polite",children:[0===p.length&&(0,n.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,n.jsx)("p",{children:"만들고 싶은 일을 한 줄로 적으세요. 이어서 말하면 지금 그래프를 고칩니다."}),(0,n.jsx)("div",{className:"mt-2 flex flex-wrap gap-1.5",children:$.map(e=>(0,n.jsx)("button",{type:"button",onClick:()=>{A(e)},disabled:null!==h,className:"rounded-full border border-border px-2.5 py-1 text-left text-foreground hover:bg-muted disabled:opacity-50",children:e},e))})]}),p.map(e=>"user"===e.role?(0,n.jsx)("li",{"data-role":"user",className:"max-w-[85%] self-end whitespace-pre-wrap break-words rounded-lg bg-primary/15 px-3 py-1.5 text-foreground ".concat(e.undone?"opacity-50 line-through decoration-muted-foreground/60":""),children:e.text},e.id):(0,n.jsxs)("li",{"data-role":"assistant","data-tone":e.tone,className:"rounded-lg border px-3 py-1.5 ".concat(e.undone?"opacity-50":""," ").concat("ok"===e.tone?"border-emerald-500/40":"warn"===e.tone?"border-amber-500/40":"border-red-500/40"),children:[(0,n.jsx)("p",{className:"error"===e.tone?"text-red-500":"text-foreground",children:e.text}),e.status&&(0,n.jsxs)("p",{"data-testid":"wizard-status",className:"mt-0.5 text-xs ".concat("ok"===e.tone?"text-emerald-500":"text-amber-500"),children:["ok"===e.tone?"✓ ":"✗ ",e.status]}),e.baseLine&&(0,n.jsx)("p",{"data-testid":"wizard-base",className:"mt-0.5 text-xs text-muted-foreground",children:e.baseLine}),e.parseError&&(0,n.jsxs)("p",{className:"mt-0.5 text-xs text-red-500",children:["초안을 캔버스에 올리지 못했습니다: ",e.parseError]}),e.issues&&(0,n.jsx)("ul",{"data-testid":"wizard-issues",className:"mt-1 list-disc pl-5 text-xs text-red-500",children:e.issues.map((e,t)=>(0,n.jsx)("li",{children:e},t))}),e.undone&&(0,n.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:"되돌림"}),(0,n.jsxs)("div",{className:"mt-1 flex flex-wrap gap-1.5 text-xs",children:[e.applied&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:()=>D(e.id),disabled:null!==h,title:e.id===O?"이 답 전의 캔버스로":"이 답과 그 뒤의 답을 모두 되돌립니다",className:"rounded border border-border px-2 py-0.5 hover:bg-muted disabled:opacity-50",children:"되돌리기"}),e.prompt&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:()=>(function(e){var t;let r=C.current.find(t=>t.id===e);if(!r||"assistant"!==r.role||!r.prompt)return;let n=r.applied?r.before?{graph:r.before,yaml:R(r.before)}:null:void 0;D(e);let a=f.trim();A(a?"".concat(r.prompt,"\n추가 지시: ").concat(a):r.prompt,n,null!=(t=r.userId)?t:e)})(e.id),disabled:null!==h,title:"이 답을 되돌리고 같은 말(+ 입력창의 추가 지시)로 다시 만듭니다",className:"rounded border border-border px-2 py-0.5 hover:bg-muted disabled:opacity-50",children:"다시 만들기"}),e.issues&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:_,disabled:null!==h,className:"rounded border border-amber-500/50 px-2 py-0.5 text-amber-500 hover:bg-amber-500/10 disabled:opacity-50",children:"고쳐서 다시"})]})]},e.id)),h&&(0,n.jsxs)("li",{role:"status","data-testid":"wizard-pending",className:"rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"inline-block h-2 w-2 animate-pulse rounded-full bg-primary"}),(0,n.jsx)("span",{"data-testid":"wizard-phase",className:"text-foreground",children:v<4?"요청을 읽는 중…":v<12?"노드 구성 중…":v<22?"간선 잇는 중…":"검증하고 고치는 중…"}),(0,n.jsxs)("span",{className:"tabular-nums",children:[v,"초"]}),(0,n.jsx)("button",{type:"button",onClick:()=>h.controller.abort(),className:"ml-auto rounded border border-border px-2 py-0.5 text-foreground hover:bg-muted",children:"취소"})]}),(0,n.jsx)("div",{className:"mt-1.5 h-1 overflow-hidden rounded bg-muted","aria-hidden":!0,children:(0,n.jsx)("div",{className:"h-full rounded bg-primary transition-[width] duration-1000 ease-linear",style:{width:"".concat(Math.min(92,Math.round(100*(1-Math.exp(-v/15)))),"%")}})})]})]}),(0,n.jsxs)("form",{className:"flex items-end gap-2 border-t border-border px-3 py-2",onSubmit:e=>{e.preventDefault(),A(f)},children:[(0,n.jsx)("textarea",{ref:I,"aria-label":"만들고 싶은 일",value:f,rows:2,placeholder:"예: 매일 아침 AI 뉴스 요약해서 텔레그램으로",onChange:e=>g(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),A(f))},className:"min-h-[2.5rem] flex-1 resize-none rounded border border-border bg-background px-2 py-1.5 text-sm text-foreground"}),(0,n.jsx)("button",{type:"submit",disabled:null!==h,className:"rounded bg-primary px-3 py-2 text-sm text-primary-foreground disabled:opacity-50",children:"만들기"})]})]})]})}function eo(e){let{onStart:t}=e,[r,s]=(0,a.useState)(""),[o,l]=(0,a.useState)(null);function d(e){if(!e.trim())return void l("무엇을 만들지 한 줄로 적어 주세요.");l(null),t(e.trim())}return(0,n.jsxs)("section",{"aria-label":"말로 만들기","data-testid":"graph-wizard-entry",className:"border-b border-border bg-primary/5 px-4 py-3",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold",children:"말로 만들기"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"하고 싶은 일을 말하면 그래프 초안이 생깁니다. 이어서 말하며 고치세요."}),(0,n.jsxs)("form",{className:"mt-2 flex flex-col gap-2 min-[640px]:flex-row min-[640px]:items-end",onSubmit:e=>{e.preventDefault(),d(r)},children:[(0,n.jsx)("textarea",{"aria-label":"만들고 싶은 일",value:r,rows:2,onChange:e=>s(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),d(r))},placeholder:"예: PR 리뷰하고 문제 없으면 머지",className:"min-h-[2.5rem] flex-1 resize-none rounded border border-border bg-background px-2 py-1.5 text-sm text-foreground"}),(0,n.jsx)("button",{type:"submit",className:"rounded bg-primary px-4 py-2 text-sm text-primary-foreground",children:"만들기"})]}),o&&(0,n.jsx)("p",{role:"status",className:"mt-1 text-xs text-amber-500",children:o}),(0,n.jsx)("div",{className:"mt-2 flex flex-wrap gap-1.5 text-xs",children:$.map(e=>(0,n.jsx)("button",{type:"button",onClick:()=>d(e),className:"rounded-full border border-border px-2.5 py-1 hover:bg-muted",children:e},e))})]})}function el(e){let{palette:t,fallback:r}=e;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("strong",{children:"노드 팔레트"}),t.map(e=>{var t;return(0,n.jsxs)("span",{title:e.description,className:"rounded border border-border px-2 py-0.5",children:[e.kind," ",e.plugin&&(0,n.jsx)("small",{className:"rounded bg-accent/15 px-1 text-accent",children:e.plugin})]},"".concat(null!=(t=e.plugin)?t:"core",":").concat(e.kind))})]}),r&&(0,n.jsx)("p",{role:"status",className:"mt-1 text-warning",children:"어휘 목록을 불러오지 못해 코어 팔레트를 표시합니다."})]})}function ed(e){let{palette:t,fallback:r}=e;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("details",{className:"border-b border-border px-3 py-2 text-xs min-[640px]:hidden","aria-label":"노드 팔레트",children:[(0,n.jsxs)("summary",{className:"cursor-pointer",children:["노드 더하기 (",t.length,")"]}),(0,n.jsx)("div",{className:"mt-2",children:(0,n.jsx)(el,{palette:t,fallback:r})})]}),(0,n.jsx)("div",{className:"hidden border-b border-border px-3 py-2 text-xs min-[640px]:block","aria-label":"노드 팔레트",children:(0,n.jsx)(el,{palette:t,fallback:r})})]})}function ei(){let e=(0,l.useSearchParams)(),t="harness"===e.get("mode")?"harness":"workflow",r=(0,d.Qj)(),x=(0,s.jE)(),[f,g]=(0,a.useState)(null),[h,b]=(0,a.useState)(void 0),v=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2600,[t,r]=(0,a.useState)(void 0),[n,s]=(0,a.useState)(void 0),[o,l]=(0,a.useState)({}),[d,i]=(0,a.useState)(void 0),u=(0,a.useRef)(null),c=(0,a.useRef)(0),m=(0,a.useRef)(null),p=(0,a.useRef)(!1),x=(0,a.useCallback)(e=>{u.current=e,p.current&&(m.current=e.graph,p.current=!1)},[]),f=(0,a.useCallback)(()=>m.current,[]),g=(0,a.useCallback)(()=>u.current?{graph:u.current.graph,yaml:u.current.yaml}:null,[]),h=(0,a.useCallback)(function(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;i(o&&Object.keys(o).length?o:void 0),a&&Object.keys(a).length&&l(e=>({...e,...a})),c.current+=1,p.current=!0,r({rev:c.current,graph:e,...n?{autoLayout:n}:{}}),s(t)},[]),b=(0,a.useCallback)((e,t)=>{var n,a;i(t&&Object.keys(t).length?t:void 0),c.current+=1,p.current=!0,r({rev:c.current,graph:null!=e?e:w(null!=(a=null==(n=u.current)?void 0:n.graphId)?a:"")}),s(void 0)},[]),v=(0,a.useCallback)(()=>{u.current=null,m.current=null,p.current=!1,r(void 0),s(void 0),l({}),i(void 0)},[]);return(0,a.useEffect)(()=>{if(!n)return;let t=setTimeout(()=>s(void 0),e);return()=>clearTimeout(t)},[n,e]),{replace:t,highlight:n,labels:o,steps:d,onChange:x,current:g,laid:f,apply:h,restore:b,reset:v}}(),[y,k]=(0,a.useState)(!1),j=(0,a.useCallback)(e=>{v.reset(),k(!!e.wizardPrompt),g({key:Date.now(),...e})},[v.reset]),N=e.get("wizard"),I=(0,a.useRef)(null);(0,a.useEffect)(()=>{"harness"===t&&N&&r&&I.current!==N&&(I.current=N,j({saved:!1,wizardPrompt:N}))},[t,N,r,j]);let S=(0,a.useCallback)(e=>b(e),[]),C=(0,o.I)({queryKey:["graph-kinds",t],queryFn:()=>r.getGraphKinds(t),enabled:null!==r,retry:!1}),E=(0,a.useMemo)(()=>{var e;return(null==(e=C.data)?void 0:e.kinds.length)?C.data.kinds:("harness"===t?m.DN:m.CF).map(e=>({graph:t,kind:e,plugin:null,description:"",schema:{},core:!0}))},[C.data,t]),R=C.isError||C.isSuccess&&!C.data.kinds.length;return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col",children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border px-4 py-2",children:[(0,n.jsx)("h1",{className:"text-sm font-semibold",children:"편집기"}),(0,n.jsx)("nav",{"aria-label":"그래프 편집 모드",className:"flex gap-1",children:["workflow","harness"].map(e=>(0,n.jsx)("a",{href:p(e),"aria-current":t===e?"page":void 0,className:"rounded px-3 py-1 text-xs ".concat(t===e?"bg-accent/15 text-text-primary":"text-text-tertiary hover:bg-surface-elevated"),children:"workflow"===e?"워크플로":"실행 그래프"},e))})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[r&&!("harness"===t&&f)&&(0,n.jsx)(ed,{palette:E,fallback:R}),r&&!("harness"===t&&f)&&(0,n.jsx)(eo,{onStart:e=>{if("harness"===t)j({saved:!1,wizardPrompt:e});else window.location.assign("".concat(p("harness"),"&wizard=").concat(encodeURIComponent(e)))}}),"workflow"===t?(0,n.jsx)(u.N,{palette:E}):r&&f?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border px-3 py-1.5 text-xs",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{g(null),b(void 0)},className:"rounded px-2 py-1 text-muted-foreground hover:bg-muted",children:"← 그래프 목록"}),R&&(0,n.jsx)("span",{role:"status",className:"text-amber-500",children:"어휘 목록을 불러오지 못해 코어 팔레트를 씁니다."})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col lg:flex-row",children:[(0,n.jsx)("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col max-lg:overflow-y-auto",children:(0,n.jsx)(K,{palette:E,client:r,wizardMode:y,...f.graph?{initialGraph:f.graph,initialSaved:f.saved}:{},...h?{nodeStatus:h}:{},...v.replace?{replace:v.replace}:{},...v.highlight?{highlight:v.highlight}:{},nodeLabels:v.labels,...v.steps?{wizardSteps:v.steps}:{},onChange:v.onChange,renderActions:e=>(0,n.jsx)(Q,{context:e,client:r,onStatus:S}),onSaved:()=>{x.invalidateQueries({queryKey:["run-graphs"]})}},f.key)}),(0,n.jsx)(es,{client:function(e){let t=e.graphWizard;return t?{graphWizard:(e,r)=>t(e,r)}:{graphWizard:async()=>{throw new i.Iu(404,"/v1/graphs/wizard",null)}}}(r),current:v.current,laid:v.laid,onApply:(e,t,r,n,a)=>{k(!0),v.apply(e,t,r,n,a)},onRestore:v.restore,...f.wizardPrompt?{initialPrompt:f.wizardPrompt}:{}},f.key)]})]}):r?(0,n.jsx)(c.F,{palette:E,onNewGraph:()=>j({saved:!1}),onOpenInCanvas:(e,t)=>j({graph:A(t),saved:!0})}):(0,n.jsx)("p",{className:"p-4 text-sm text-text-tertiary",children:"Daemon 연결이 설정되지 않았습니다. Settings 에서 Base URL 을 입력하세요."})]})]})}function eu(){return(0,n.jsx)(a.Suspense,{fallback:(0,n.jsx)("p",{className:"p-4 text-sm",children:"편집기를 불러오는 중…"}),children:(0,n.jsx)(ei,{})})}},64624:(e,t,r)=>{Promise.resolve().then(r.bind(r,25578))}},e=>{e.O(0,[2551,4723,9182,3324,1501,2743,2549,7175,3522,8060,9247,8857,8695,9497,2463,2196,7358],()=>e(e.s=64624)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[131],{5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>i,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 i(){let e=a();return localStorage.setItem(n,e),e}},9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var n=r(55539),a=r(89545),s=r(17154),i=r(44373);let l=(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 o(e){let{className:t,variant:r="default",size:s="default",...o}=e;return(0,n.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:s,className:t})),...o})}},11667:(e,t,r)=>{Promise.resolve().then(r.bind(r,65202))},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>u,Q:()=>d});var n=r(55539),a=r(46124),s=r(8101),i=r(5997),l=r(18060),o=r(72215);let c=(0,a.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,d]=(0,a.useState)(r),[p,f]=(0,a.useState)(""),[h]=(0,a.useState)(()=>new l.ki(r));(0,a.useEffect)(()=>{let e=(0,s.Fp)();d(e),h.updateConfig(e),f((0,i.oD)()),(0,o.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,s.Fp)();h.updateConfig(t),d(t),(0,o.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,o.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[h]);let m=e=>{d(t=>{let r={...t,...e};return(0,s.Qc)(e),h.updateConfig(r),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},v=e=>{f(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,a.useMemo)(()=>({config:u,setConfig:m,client:h,sessionId:p,setSessionId:v}),[u,h,p]);return(0,n.jsx)(c.Provider,{value:g,children:t})}function d(){let e=(0,a.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},18273:(e,t,r)=>{"use strict";r.d(t,{SY:()=>b});var n=r(55539),a=r(46124),s=r(15151),i=r(9734),l=r(23196);let o=["absorbed","discarded","routed","checked"],c={new:"대기 중",queued:"대기 중",absorbed:"흡수됨",routed:"다른 갈래로 넘김",checked:"확인됨",discarded:"버림",deferred:"미룸"};function u(e){var t,r,n;return null===e?{label:"찾을 수 없음",settled:!1,noteRef:null}:{label:Object.hasOwn(c,e.status)?c[e.status]:e.status,settled:o.includes(e.status),noteRef:null!=(n=null==(r=e.outputs)||null==(t=r.find(e=>"note"===e.kind))?void 0:t.ref)?n:null}}let d={"headless.spawn":"실행 시작","gate.baseline":"게이트 검사","review.diff-scope":"리뷰 중","headless.done":"실행 종료","run-terminal":"종료"};function p(e){var t,r,n,a,s;let i=e.at(-1),l=e.find(e=>"run-terminal"===e.event),o=null==l||null==(t=l.payload)?void 0:t.runStatus;return{stage:i?null!=(n=d[i.event])?n:i.event:null,lastEventAt:null!=(a=null==i?void 0:i.ts)?a:null,done:void 0!==l,outcome:l?"completed"===o||"failed"===o?o:"unknown":null,error:null!=(s=null==l||null==(r=l.payload)?void 0:r.error)?s:null}}let f="elanous.intake.recent",h={absorb:"→ 흡수",tasks:"→ 작업",graph:"→ 그래프","ask-human":"→ 직접 고르세요"};function m(e){if(null==e?void 0:e.storage)return e.storage;try{return globalThis.localStorage}catch(e){return null}}function v(e){try{var t;let r=null==(t=m(e))?void 0:t.getItem(f);if(!r)return[];let n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(e){return[]}}async function g(e,t,r){let n=(0,l.cE)(r);return"absorb"===t?{absorbIds:(await (0,l.IH)(e,r)).ids,recentPreview:n}:{acceptanceId:(await (0,l.ZJ)(e,r)).acceptanceId,recentPreview:n}}function b(){var e,t;let{state:r,deps:o}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{client:c,sessionId:d}=(0,s.Q)(),[b,x]=(0,a.useState)(""),[y,k]=(0,a.useState)(!1),[w,I]=(0,a.useState)(null),[j,S]=(0,a.useState)(null),[N,E]=(0,a.useState)(null),[O,z]=(0,a.useState)(null),[C,T]=(0,a.useState)({}),[R,J]=(0,a.useState)(null),P=(0,a.useRef)(null),[U,D]=(0,a.useState)([]),[M,_]=(0,a.useState)({}),A=(0,a.useRef)(M),V=(0,a.useMemo)(()=>[...new Set(U.filter(e=>"absorb"===e.track).flatMap(e=>{var t;return null!=(t=e.ids)?t:[]}))],[U]),$=(0,a.useRef)(V);$.current=V;let Y=(0,a.useRef)(()=>{}),[H,q]=(0,a.useState)(null),[F,G]=(0,a.useState)(!1),Q=(0,a.useRef)(!1),B=(0,a.useRef)(0),L=(0,a.useRef)(b);L.current=b;let W=(0,a.useRef)(null),Z=(0,a.useRef)(C),K=(0,a.useRef)(U),X=(0,a.useMemo)(()=>[...new Set([...U.filter(e=>"graph"===e.track).map(e=>e.runId),null==O?void 0:O.runId].filter(e=>!!e))],[U,null==O?void 0:O.runId]);(0,a.useEffect)(()=>{D(v(o))},[o]),(0,a.useEffect)(()=>{K.current=U},[U]),(0,a.useEffect)(()=>{let e=!1,t=new Map,r=async n=>{var a;if(e||!$.current.includes(n)||u(null!=(a=A.current[n])?a:null).settled)return;let s=null;try{s=await (0,l.Gm)(c,n)}catch(e){}e||(A.current={...A.current,[n]:s},_(A.current),$.current.includes(n)&&!u(s).settled?t.set(n,setTimeout(()=>{r(n)},6e4)):t.delete(n))};return Y.current=e=>{var n;t.has(e)||u(null!=(n=A.current[e])?n:null).settled||(t.set(e,null),r(e))},$.current.forEach(Y.current),()=>{for(let r of(e=!0,t.values()))null!==r&&clearTimeout(r);t.clear(),Y.current=()=>{}}},[c]),(0,a.useEffect)(()=>{V.forEach(Y.current)},[V]);let ee=(0,a.useCallback)(e=>{var t,r;D(function(e,t){let r=[e,...v(t)].slice(0,20);try{var n;null==(n=m(t))||n.setItem(f,JSON.stringify(r))}catch(e){}return r}({...e,at:null!=(r=null==o||null==(t=o.now)?void 0:t.call(o))?r:new Date().toISOString()},o))},[o]),et=(0,a.useCallback)(async()=>{let e=b.trim();if(e&&!y){k(!0),I(null),S(null);try{var t;let r=await g(c,"absorb",e);S(null!=(t=r.absorbIds)?t:[]),ee({track:"absorb",preview:r.recentPreview,ids:r.absorbIds})}catch(e){I(e instanceof Error?e.message:String(e))}finally{k(!1)}}},[y,c,ee,b]),er=(0,a.useCallback)(async()=>{var e;let t=b.trim();if(!t||y||!d)return;let r=null!=(e=P.current)?e:crypto.randomUUID();P.current=r,k(!0),I(null),J(null);try{let e=await (0,l.qI)(c,t,d,r);P.current=null,J(e.cardId),ee({track:"split",preview:(0,l.cE)(t),cardId:e.cardId})}catch(e){I(e instanceof Error?e.message:String(e))}finally{k(!1)}},[y,c,ee,d,b]),en=(0,a.useCallback)(async()=>{let e=b.trim();if(e&&!y){k(!0),I(null),E(null),z(null);try{var t;let r=await g(c,"graph",e);E(null!=(t=r.acceptanceId)?t:null),W.current=Date.now(),ee({track:"graph",preview:r.recentPreview,acceptanceId:r.acceptanceId})}catch(e){I(e instanceof Error?e.message:String(e))}finally{k(!1)}}},[y,c,ee,b]);(0,a.useEffect)(()=>{let e=++B.current;if(q(null),!b.trim())return;let t=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},n=e.trim();if(!n)return()=>{};let a=r.setTimeout(()=>t(n),500);return()=>r.clearTimeout(a)}(b,t=>{(0,l.sg)(c,t).then(t=>{B.current===e&&q(t)},()=>{B.current===e&&q(null)})});return()=>{++B.current,t()}},[c,b]);let ea=(0,a.useCallback)(async()=>{let e=b.trim();if(!e||Q.current||y||(null==H?void 0:H.reason)!=="rule-unknown")return;let t=++B.current;Q.current=!0,G(!0);try{let r=await (0,l.sg)(c,e,{classify:!0});B.current===t&&L.current.trim()===e&&q(r)}catch(r){B.current===t&&L.current.trim()===e&&q({track:"ask-human",confidence:0,reason:"classifier-failed:request-error",decidedBy:"classifier"})}finally{Q.current=!1,G(!1)}},[y,c,null==H?void 0:H.reason,b]);(0,a.useEffect)(()=>{if(!N)return;let e=!1,t=async()=>{var t,r;if(e)return;let n=null!=(t=W.current)?t:Date.now();if(!(Date.now()-n>3e5))try{let t=await (0,l.PM)(c,N);if(!e&&(z(t),t.runId&&K.current.some(e=>"graph"===e.track&&e.acceptanceId===N&&e.runId!==t.runId))){let e=K.current.map(e=>"graph"===e.track&&e.acceptanceId===N?{...e,runId:t.runId}:e);K.current=e;try{null==(r=m(o))||r.setItem(f,JSON.stringify(e))}catch(e){}D(e)}}catch(e){}};t();let r=setInterval(()=>{t()},5e3);return()=>{e=!0,clearInterval(r)}},[N,c,o]),(0,a.useEffect)(()=>{Z.current=C},[C]),(0,a.useEffect)(()=>{let e;if(0===X.length)return;let t=!1,r=!1,n=async()=>{if(t||r)return;let a=X.filter(e=>{var t;return!p(null!=(t=Z.current[e])?t:[]).done});if(0!==a.length){r=!0;try{let e=await Promise.allSettled(a.map(e=>(0,l.dy)(c,e)));if(t)return;let r={};e.forEach((e,t)=>{"fulfilled"===e.status&&(r[a[t]]=e.value)}),Object.keys(r).length>0&&(Z.current={...Z.current,...r},T(Z.current))}finally{r=!1,!t&&X.some(e=>{var t;return!p(null!=(t=Z.current[e])?t:[]).done})&&(e=setTimeout(()=>{n()},3e4))}}};return n(),()=>{t=!0,e&&clearTimeout(e)}},[c,X]);let es=null!=r?r:{text:b,busy:y,error:w,absorbIds:j,acceptanceId:N,graph:O,runEvents:C,wishCardId:R,recent:U,route:H},ei=(0,a.useMemo)(()=>{var e,t;return es.acceptanceId?{acceptanceId:es.acceptanceId,phase:null==(e=es.graph)?void 0:e.phase,runId:null==(t=es.graph)?void 0:t.runId}:null},[es.acceptanceId,es.graph]),el=0===es.text.trim().length,eo=null!=(e=es.route)?e:null,ec=eo?"absorb"===(t=eo.track)?"absorb":"tasks"===t?"split":"graph"===t?"graph":null:null,eu=e=>ec===e?"ring-2 ring-ring":void 0;return(0,n.jsxs)("section",{className:"mx-auto flex max-w-lg flex-col gap-4 p-4","data-testid":"intake-front-door",children:[(0,n.jsx)("header",{className:"space-y-1",children:(0,n.jsx)("h1",{className:"font-heading text-lg font-medium",children:"Intake"})}),(0,n.jsx)("textarea",{value:es.text,onChange:e=>{P.current=null,x(e.target.value)},rows:6,disabled:es.busy,"data-testid":"intake-front-door-field","aria-label":"intake",className:"w-full resize-y rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs focus:outline-none focus:ring-2 focus:ring-ring"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"intake-front-door-explainer",children:"보내면 elanous 가 이 글을 처리합니다(흡수 \xb7 작업 분할 \xb7 그래프 실행)."}),eo&&(0,n.jsxs)("div",{"data-testid":"intake-route-chip","data-auto-submit":"0",className:"space-y-0.5 text-sm",children:[(0,n.jsx)("p",{"data-testid":"intake-route-chip-label",children:h[eo.track]}),"classifier"===eo.decidedBy&&(0,n.jsxs)("p",{"data-testid":"intake-route-chip-classifier",children:["분류기 판정 \xb7 확신 ",Math.round(100*eo.confidence),"%"]}),(0,n.jsx)("p",{"data-testid":"intake-route-chip-reason",className:"text-xs text-muted-foreground",children:function(e){if("classifier"!==e.decidedBy)return e.reason;if(e.reason.startsWith("classifier-failed:"))return"분류기가 못 갈랐습니다 — 직접 골라 주세요";if(e.reason.startsWith("classifier-low-confidence:")){var t,r;let n=e.reason.slice(26);return"분류기 추정: ".concat(null!=(r=null==(t=h[n])?void 0:t.slice(2))?r:n," (확신 낮음)")}return e.reason}(eo)}),"rule-unknown"===eo.reason&&(0,n.jsx)(i.$,{type:"button",size:"sm",variant:"outline",disabled:F||es.busy||el,onClick:()=>void ea(),"data-testid":"intake-route-classify",children:"분류기로 가르기"})]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,n.jsx)(i.$,{type:"button",size:"sm",className:eu("absorb"),"aria-pressed":"absorb"===ec,disabled:el||es.busy,onClick:()=>void et(),"data-testid":"intake-absorb","data-emphasized":"absorb"===ec?"true":"false",children:"흡수"}),(0,n.jsx)(i.$,{type:"button",size:"sm",variant:"outline",className:eu("split"),"aria-pressed":"split"===ec,disabled:el||es.busy||!d,onClick:()=>void er(),"data-testid":"intake-split","data-emphasized":"split"===ec?"true":"false",children:"작업으로 나누기"}),(0,n.jsx)(i.$,{type:"button",size:"sm",variant:"secondary",className:eu("graph"),"aria-pressed":"graph"===ec,disabled:el||es.busy,onClick:()=>void en(),"data-testid":"intake-graph","data-emphasized":"graph"===ec?"true":"false",children:"그래프로 실행"})]}),es.absorbIds&&(0,n.jsxs)("div",{"data-testid":"intake-absorb-result",className:"space-y-1 text-sm",children:[(0,n.jsx)("p",{children:"대기열에 넣었습니다(아침 정기 흡수에서 처리)"}),(0,n.jsx)("ul",{children:es.absorbIds.map(e=>(0,n.jsx)("li",{"data-testid":"intake-absorb-id",children:e},e))})]}),ei&&(0,n.jsxs)("div",{"data-testid":"intake-graph-result",className:"space-y-1 text-sm",children:[(0,n.jsx)("p",{"data-testid":"intake-acceptance-id",children:ei.acceptanceId}),ei.phase&&(0,n.jsx)("p",{"data-testid":"intake-graph-phase",children:ei.phase}),ei.runId&&(0,n.jsx)("p",{"data-testid":"intake-graph-run",children:ei.runId})]}),es.error&&(0,n.jsx)("p",{className:"text-sm text-destructive","data-testid":"intake-front-door-error",children:es.error}),es.wishCardId&&(0,n.jsxs)("p",{className:"text-sm","data-testid":"intake-wish-card-id",children:["소원 카드 ",es.wishCardId]}),es.recent.length>0&&(0,n.jsx)("ul",{"data-testid":"intake-recent",className:"space-y-1 text-xs text-muted-foreground",children:es.recent.map((e,t)=>{var r;let a=(e=>{var t,r,n;let a=null!=(r=e.runId)?r:e.acceptanceId===es.acceptanceId?null==ei?void 0:ei.runId:void 0;return a?p(null!=(n=null==(t=es.runEvents)?void 0:t[a])?n:[]):null})(e);return(0,n.jsxs)("li",{"data-testid":"intake-recent-row",children:[e.track," \xb7 ",e.preview,e.ids?" \xb7 ".concat(e.ids.join(", ")):"","absorb"===e.track&&(null==(r=e.ids)?void 0:r.map(e=>{var t,r;let a=Object.hasOwn(M,e)?u(null!=(t=M[e])?t:null):null;return(0,n.jsxs)("span",{"data-testid":"intake-absorb-status",children:[" \xb7 흡수: ",null!=(r=null==a?void 0:a.label)?r:"조회 중",(null==a?void 0:a.noteRef)?" \xb7 ".concat(a.noteRef):""]},e)})),e.cardId?" \xb7 카드 ".concat(e.cardId):"",e.acceptanceId?" \xb7 ".concat(e.acceptanceId):"",(null==a?void 0:a.stage)&&(0,n.jsxs)("span",{"data-testid":"intake-run-stage",children:[" \xb7 단계: ",a.stage]}),(null==a?void 0:a.lastEventAt)&&(0,n.jsxs)("time",{"data-testid":"intake-run-last-event",dateTime:a.lastEventAt,children:[" \xb7 마지막 사건: ",a.lastEventAt]}),(null==a?void 0:a.done)&&(0,n.jsxs)("span",{"data-testid":"intake-run-outcome",children:[" \xb7 ","completed"===a.outcome?"완료":"failed"===a.outcome?"실패":"결과 미상",a.error?" \xb7 ".concat(a.error.split("\n")[0]):""]})]},"".concat(e.at,"-").concat(t))})})]})}},23196:(e,t,r)=>{"use strict";r.d(t,{Gm:()=>u,IH:()=>s,PM:()=>o,ZJ:()=>l,cE:()=>a,dy:()=>c,qI:()=>i,sg:()=>d});let n=/https?:\/\/[^\s<>"']+/g;function a(e){return e.slice(0,40)}async function s(e,t){let r=function(e){var t;let r=null!=(t=e.match(n))?t:[];return 0===r.length?[{text:e}]:r.map(e=>({url:e}))}(t),a=await e.fetchJson("/v1/intake-ledger/items",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({items:r,source:"pwa"})});return{ids:a.ids,added:a.added,merged:a.merged}}function i(e,t,r,n){return e.fetchJson("/v1/task-cards/wish",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:t,sessionId:r,ref:n})})}async function l(e,t){return{acceptanceId:(await e.fetchJson("/v1/harness/ask",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:t})})).acceptanceId}}function o(e,t){return e.fetchJson("/v1/harness/ask-status?acceptanceId=".concat(encodeURIComponent(t)))}function c(e,t){return e.fetchJson("/v1/harness/run-events?runId=".concat(encodeURIComponent(t)))}function u(e,t){return e.fetchJson("/v1/intake-ledger/items/".concat(encodeURIComponent(t)))}function d(e,t,r){return e.fetchJson("/v1/intake/route",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:t,consent:"route",source:"pwa",...(null==r?void 0:r.classify)!==void 0?{classify:r.classify}:{}})})}},42827:(e,t,r)=>{"use strict";r.d(t,{GM:()=>l,J3:()=>i,WF:()=>n,bR:()=>s,m:()=>o,r5:()=>a});let n="/v1/devices",a="/v1/approvals/merges",s="/v1/templates/capability-preview",i="/v1/idle-nudge/preview",l="/v1/morning-digest/showroom",o="/v1/next-fluent/dispatch"},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>s});var n=r(20852),a=r(30984);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))}},54508:(e,t,r)=>{"use strict";r.d(t,{V5:()=>s,tV:()=>i});var n=r(42827);class a extends Error{constructor(e,t,r){super(r||t),this.status=e,this.error=t,this.reason=r,this.name="MergeApprovalsApiError"}}function s(e,t){return e instanceof a?401===e.status||"unauthorized"===e.error?{text:"이 기기에 소유자 토큰이 없어 승인 목록을 못 읽었습니다 — 이미 연결된 기기의 설정 › 연결 토큰 만들기 에서 토큰을 만들어, 이 기기의 설정 › 데몬 연결 › 연결 토큰 칸에 붙이면 바로 보입니다.",href:"/app/settings/#bearer-token"}:"gh-failed"===e.error?{text:"데몬이 GitHub 를 읽지 못했습니다(데몬 기계의 gh 로그인\xb7네트워크) — 잠시 뒤 다시 열어 보세요.".concat(e.reason?" 사유: ".concat(e.reason.split("\n")[0].slice(0,160)):"")}:"gh-invalid-response"===e.error?{text:"GitHub 응답을 해석하지 못했습니다 — 잠시 뒤 다시 열어 보세요."}:"approvals-repo-unknown"===e.error?{text:"승인할 저장소를 모릅니다 — 데몬 설정 intake.approvals.repo(예: owner/repo)를 채워 주세요.",href:"/app/settings/"}:e.reason?{text:e.reason}:{text:"".concat(t," (").concat(e.status," ").concat(e.error,")")}:e instanceof TypeError?{text:"데몬에 닿지 못했습니다 — 데몬이 켜져 있는지, 이 기기가 같은 네트워크(tailnet)에 있는지 확인하세요."}:{text:e instanceof Error&&e.message?e.message:t}}function i(e){var t,r;let s=null!=(t=e.fetchImpl)?t:fetch,i=(null!=(r=e.baseUrl)?r:"").replace(/\/+$/,"");async function l(t,r){let n={...r,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},l=e.client?await e.client.fetchResponse(t,n):await s("".concat(i).concat(t),n),o=await l.json().catch(()=>null);if(!l.ok){var c;let e=o&&"object"==typeof o?o:{};throw new a(l.status,null!=(c=e.error)?c:"request-failed",e.reason)}return o}return{list:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"open";return l("merged"===e?"".concat(n.r5,"?state=merged"):n.r5)},get:e=>l("".concat(n.r5,"/").concat(e)),check:(e,t)=>l("".concat(n.r5,"/").concat(e,"/check"),{method:"POST",body:JSON.stringify({headSha:t})}),merge:(e,t)=>l("".concat(n.r5,"/").concat(e,"/merge"),{method:"POST",body:JSON.stringify({headSha:t})})}}},65202:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var n=r(55539),a=r(3558),s=r.n(a),i=r(46124),l=r(15151),o=r(54508);function c(e){let{items:t}=e,r=t.filter(e=>"OPEN"===e.state&&!e.draft);if(0===r.length)return null;let a=r.slice(0,3);return(0,n.jsx)("div",{className:"mx-auto max-w-lg px-4 pt-4",children:(0,n.jsxs)("section",{"aria-label":"승인 대기",className:"rounded-lg border border-emerald-600/40 bg-emerald-500/10 p-3 text-sm",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("p",{className:"font-semibold",children:["흡수 아이디어 승인 대기 ",r.length,"건"]}),(0,n.jsx)(s(),{href:"/approvals",className:"rounded-md bg-emerald-700 px-3 py-1 text-white hover:bg-emerald-800",children:"Approvals 에서 보기 →"})]}),(0,n.jsxs)("ul",{className:"mt-2 space-y-1",children:[a.map(e=>(0,n.jsxs)("li",{className:"break-words",children:[(0,n.jsxs)(s(),{href:"/approvals?pr=".concat(e.number),className:"underline",children:["#",e.number]})," \xb7 ",e.title]},e.number)),r.length>a.length&&(0,n.jsxs)("li",{className:"text-muted-foreground",children:["외 ",r.length-a.length,"건"]})]})]})})}function u(){let{client:e}=(0,l.Q)(),t=(0,i.useMemo)(()=>(0,o.tV)({client:e}),[e]),[r,a]=(0,i.useState)([]);return(0,i.useEffect)(()=>{let e=!0;return t.list().then(t=>{let{items:r}=t;e&&a(r)}).catch(()=>{e&&a([])}),()=>{e=!1}},[t]),(0,n.jsx)(c,{items:r})}var d=r(18273);function p(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(u,{}),(0,n.jsx)(d.SY,{})]})}}},e=>{e.O(0,[211,8682,3558,8060,2463,2196,7358],()=>e(e.s=11667)),_N_E=e.O()}]);