elanous 0.2.6 → 0.2.8

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 (517) hide show
  1. package/.env.example +10 -7
  2. package/README.md +4 -0
  3. package/apps/pwa/out/404/index.html +1 -1
  4. package/apps/pwa/out/404.html +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{3995-bee512a7063036ce.js → 2375-cb6debea56cce4fb.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +25 -0
  16. package/apps/pwa/out/_next/static/chunks/{8d0d9faf-97887ff99713b84e.js → 2ea96958-e8c7e112de50b067.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/{5329.8b7e4bca684b6eec.js → 3403.4bc97b4066945a94.js} +2 -2
  18. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{7633.0654fe6ea259c1ee.js → 4323.c5dfb6f503304775.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/4836-3084c58c1725a40b.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{2984-977cfa339fcd65a5.js → 5080-1613752891fcadb4.js} +3 -3
  24. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{763-7d0e1913b5074e98.js → 5791-bb82743fa6299562.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/{4240-7153881b0b377306.js → 6062-73e68343a9814f6a.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/{91ff6dda-3b33d42d20657429.js → 8046cadf-211ca3c0e00f2b72.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8894-7317998f6cb97d8c.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/9454-a3e0953307216c58.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/approvals/page-9aa47b0bc6d570ff.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f4d2ecbbae6088d6.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/board/page-2053e49930c82748.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/botlab/page-d4b6df905f185055.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/bots/page-a70ba27c33003dd0.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/chat/page-186fc6952f027acc.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/consult/page-18166f885d831d3e.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/app/control/page-1c9d6cfe68b121c2.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/design-check/page-cbbe03c0da7b081a.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/editor/page-c108ff1fdb665c97.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/exec/page-147a328753d983e2.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/field/page-799395a9df7d95aa.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/intake/page-6a8158b71d1fe9d7.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/layout-9567560270857531.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/live/page-e7ed3d010153d818.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/market/page-c0c0d19d51342d3e.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2e002ad8faa43291.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/morning/page-b672e02e4bec8deb.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/not-found-1ba4a5d857276334.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/observatory/page-9db2226f38c542fb.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/page-70ee65f5f7a151dc.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0bb8e43203efb23b.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-092e1bcf27d751cc.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/sessions/page-eb52580c4b75b905.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7464c1987dd76e6d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/settings/page-e573437b0a1c728f.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-294300625e49e4d3.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/setup/page-085847b088675978.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/share/page-9fe9d38c36999eb4.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/showroom/page-d8ab4d1489223459.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6141f67f531d8b6a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/term/page-295a02b1026b8255.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/trace/page-1eb9a0e1e054209d.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/vault/page-82efa177a30f3741.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d0be51cec4f62606.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/app/workflows/page-2e367075ffdbc062.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/app/workspace/page-647ed2b66c1d49f1.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ba058c56e38f2792.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/{webpack-37b8bf78a3c6eec5.js → webpack-e5bea36f183b25e6.js} +1 -1
  95. package/apps/pwa/out/_next/static/css/5ef72a618a8994f3.css +1 -0
  96. package/apps/pwa/out/_next/static/lywc8m_HDzH9MKSDQhyEj/_buildManifest.js +1 -0
  97. package/apps/pwa/out/approvals/index.html +1 -1
  98. package/apps/pwa/out/approvals/index.txt +22 -22
  99. package/apps/pwa/out/autopilot/index.html +1 -1
  100. package/apps/pwa/out/autopilot/index.txt +22 -22
  101. package/apps/pwa/out/board/index.html +1 -1
  102. package/apps/pwa/out/board/index.txt +22 -22
  103. package/apps/pwa/out/botlab/index.html +1 -1
  104. package/apps/pwa/out/botlab/index.txt +21 -21
  105. package/apps/pwa/out/bots/index.html +1 -1
  106. package/apps/pwa/out/bots/index.txt +21 -21
  107. package/apps/pwa/out/chat/index.html +1 -1
  108. package/apps/pwa/out/chat/index.txt +21 -21
  109. package/apps/pwa/out/consult/index.html +1 -0
  110. package/apps/pwa/out/consult/index.txt +32 -0
  111. package/apps/pwa/out/control/index.html +1 -1
  112. package/apps/pwa/out/control/index.txt +22 -22
  113. package/apps/pwa/out/design-check/index.html +1 -1
  114. package/apps/pwa/out/design-check/index.txt +22 -22
  115. package/apps/pwa/out/editor/index.html +1 -1
  116. package/apps/pwa/out/editor/index.txt +22 -22
  117. package/apps/pwa/out/exec/index.html +1 -0
  118. package/apps/pwa/out/exec/index.txt +32 -0
  119. package/apps/pwa/out/field/index.html +1 -0
  120. package/apps/pwa/out/field/index.txt +32 -0
  121. package/apps/pwa/out/healthz +1 -1
  122. package/apps/pwa/out/index.html +1 -1
  123. package/apps/pwa/out/index.txt +21 -21
  124. package/apps/pwa/out/intake/index.html +1 -1
  125. package/apps/pwa/out/intake/index.txt +22 -22
  126. package/apps/pwa/out/live/index.html +1 -1
  127. package/apps/pwa/out/live/index.txt +22 -22
  128. package/apps/pwa/out/market/index.html +1 -1
  129. package/apps/pwa/out/market/index.txt +21 -21
  130. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  131. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  132. package/apps/pwa/out/morning/index.html +1 -1
  133. package/apps/pwa/out/morning/index.txt +22 -22
  134. package/apps/pwa/out/observatory/index.html +1 -1
  135. package/apps/pwa/out/observatory/index.txt +22 -22
  136. package/apps/pwa/out/reflection/index.html +1 -1
  137. package/apps/pwa/out/reflection/index.txt +22 -22
  138. package/apps/pwa/out/scheduler/index.html +1 -1
  139. package/apps/pwa/out/scheduler/index.txt +22 -22
  140. package/apps/pwa/out/sessions/index.html +1 -1
  141. package/apps/pwa/out/sessions/index.txt +21 -21
  142. package/apps/pwa/out/settings/devices/index.html +1 -1
  143. package/apps/pwa/out/settings/devices/index.txt +22 -22
  144. package/apps/pwa/out/settings/index.html +1 -1
  145. package/apps/pwa/out/settings/index.txt +22 -22
  146. package/apps/pwa/out/setup/done/index.html +1 -1
  147. package/apps/pwa/out/setup/done/index.txt +22 -22
  148. package/apps/pwa/out/setup/index.html +1 -1
  149. package/apps/pwa/out/setup/index.txt +22 -22
  150. package/apps/pwa/out/share/index.html +1 -1
  151. package/apps/pwa/out/share/index.txt +22 -22
  152. package/apps/pwa/out/showroom/index.html +1 -1
  153. package/apps/pwa/out/showroom/index.txt +21 -21
  154. package/apps/pwa/out/tasks/index.html +1 -1
  155. package/apps/pwa/out/tasks/index.txt +22 -22
  156. package/apps/pwa/out/term/index.html +1 -1
  157. package/apps/pwa/out/term/index.txt +22 -22
  158. package/apps/pwa/out/trace/index.html +1 -1
  159. package/apps/pwa/out/trace/index.txt +22 -22
  160. package/apps/pwa/out/vault/index.html +1 -1
  161. package/apps/pwa/out/vault/index.txt +22 -22
  162. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  163. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  164. package/apps/pwa/out/workflows/index.html +1 -1
  165. package/apps/pwa/out/workflows/index.txt +22 -22
  166. package/apps/pwa/out/workspace/index.html +1 -1
  167. package/apps/pwa/out/workspace/index.txt +22 -22
  168. package/apps/pwa/out/worktrees/index.html +1 -1
  169. package/apps/pwa/out/worktrees/index.txt +22 -22
  170. package/bin/elanous.cjs +107 -0
  171. package/graphs/field/field-feed.yaml +24 -0
  172. package/graphs/field/recipes.yaml +12 -0
  173. package/graphs/landing/landing-heal.yaml +3 -1
  174. package/graphs/landing/recipes.yaml +3 -0
  175. package/graphs/release/recipes.yaml +10 -0
  176. package/graphs/release/release-loop.yaml +10 -3
  177. package/graphs/test-diet/recipes.yaml +9 -0
  178. package/graphs/test-diet/test-diet.yaml +22 -0
  179. package/package.json +6 -5
  180. package/persona-presets/_index.yaml +10 -0
  181. package/persona-presets/_schema.json +146 -0
  182. package/persona-presets/dana.yaml +26 -0
  183. package/persona-presets/haru.yaml +27 -0
  184. package/persona-presets/kai.yaml +27 -0
  185. package/persona-presets/leo.yaml +27 -0
  186. package/persona-presets/mira.yaml +30 -0
  187. package/persona-presets/nari.yaml +27 -0
  188. package/persona-presets/sora.yaml +27 -0
  189. package/persona-presets/yuna.yaml +27 -0
  190. package/plugins/card-followup/README.md +13 -4
  191. package/plugins/card-followup/graphs/card-followup.yaml +3 -1
  192. package/plugins/card-followup/graphs/recipes.yaml +5 -1
  193. package/plugins/card-followup/graphs/run-step.ts +122 -18
  194. package/plugins/card-followup/graphs/sales-strategy.ts +173 -0
  195. package/plugins/card-followup/plugin.json +1 -1
  196. package/plugins/doc-draft/README.md +13 -0
  197. package/plugins/doc-draft/examples/brief-sample.json +8 -0
  198. package/plugins/doc-draft/graphs/doc-draft.yaml +14 -0
  199. package/plugins/doc-draft/graphs/recipes.yaml +9 -0
  200. package/plugins/doc-draft/graphs/run-step.ts +113 -0
  201. package/plugins/doc-draft/plugin.json +24 -0
  202. package/plugins/geo-check/README.md +3 -1
  203. package/plugins/geo-check/graphs/run-step.ts +58 -13
  204. package/plugins/geo-check/plugin.json +1 -1
  205. package/plugins/job-coach/.codex-plugin/plugin.json +1 -1
  206. package/plugins/job-coach/README.md +1 -1
  207. package/plugins/job-coach/graphs/run-step.ts +2 -2
  208. package/plugins/job-coach/plugin.json +1 -1
  209. package/plugins/job-coach/plugin.ts +1 -1
  210. package/scripts/affinity/endcard.sh +3 -2
  211. package/scripts/affinity/reframe.sh +3 -1
  212. package/scripts/ci-public-export-leak-gate.ts +48 -0
  213. package/scripts/codex-quota-alert.ts +122 -258
  214. package/scripts/coord-tracks.json +4 -4
  215. package/scripts/field-feed/deliver-node.ts +57 -0
  216. package/scripts/field-feed/feed-node.ts +67 -0
  217. package/scripts/field-feed/lib.ts +164 -0
  218. package/scripts/field-feed/reel-node.ts +24 -0
  219. package/scripts/field-feed/start.ts +62 -0
  220. package/scripts/fixtures/vflow-sample.ndjson +6 -0
  221. package/scripts/install.sh +109 -21
  222. package/scripts/landing-heal/clean-checkout.ts +114 -0
  223. package/scripts/landing-heal/run-mission.ts +38 -3
  224. package/scripts/lib/pwa-scenarios/scenarios.ts +2 -1
  225. package/scripts/persona-presets/lint.ts +79 -0
  226. package/scripts/public-export.ts +8 -4
  227. package/scripts/release-loop/baseline-from-logs.ts +92 -0
  228. package/scripts/release-loop/checklist-gate-node.ts +2 -2
  229. package/scripts/release-loop/env-known-failures.ts +31 -0
  230. package/scripts/release-loop/gate-node.ts +108 -22
  231. package/scripts/release-loop/known-issues-node.ts +159 -0
  232. package/scripts/release-loop/npm-publish-node.ts +124 -0
  233. package/scripts/release-loop/ops-upgrade-node.ts +95 -0
  234. package/scripts/release-loop/publish-node.ts +23 -1
  235. package/scripts/release-loop/release-readiness.ts +58 -0
  236. package/scripts/release-loop/shard-plan.ts +17 -0
  237. package/scripts/release-loop/unattended-release.ts +93 -0
  238. package/scripts/storyboard/storyboard.ts +167 -0
  239. package/scripts/test-diet/lib.ts +88 -0
  240. package/scripts/test-diet/node.ts +102 -0
  241. package/scripts/ux/measure-first-text.ts +102 -0
  242. package/scripts/vflow-collect.ts +20 -7
  243. package/scripts/vflow-search.ts +73 -0
  244. package/scripts/video-free-line-test-walker.ts +36 -0
  245. package/scripts/video-pipeline.ts +2 -2
  246. package/skills/explainer-video/SKILL.md +12 -9
  247. package/skills/explainer-video/engine/build.mjs +1 -1
  248. package/skills/explainer-video/engine/reel.mjs +138 -31
  249. package/skills/explainer-video/engine/reel.sh +2 -1
  250. package/skills/explainer-video/examples/elanous-0.2.5/script.json +1 -1
  251. package/skills/grill-me/SKILL.md +1 -1
  252. package/skills/omni-digest/docs/diagrams/noncode-terminal-promotion-path-2026-08-13.mmd +1 -1
  253. package/src/a2a/server.ts +2 -0
  254. package/src/acp/auth-methods.ts +30 -0
  255. package/src/acp/elanous-aware-peers.ts +30 -0
  256. package/src/acp/server.ts +96 -20
  257. package/src/agent/monad-agent-turn.ts +25 -6
  258. package/src/agent/shared-app-tools.ts +5 -3
  259. package/src/agent-substrate/review-intent.ts +6 -2
  260. package/src/agent-substrate/shard-boundary-intent.ts +70 -0
  261. package/src/auth/github-app-token.ts +4 -1
  262. package/src/autopilot/track-agent-shadow.ts +151 -0
  263. package/src/autopilot/track-agent.ts +23 -3
  264. package/src/boot/acp-server-help.ts +16 -0
  265. package/src/boot/daemon-prompt-turn.ts +31 -10
  266. package/src/boot/daemon-tools/index.ts +7 -1
  267. package/src/budget/codex-credit-pace.ts +84 -0
  268. package/src/budget/codex-credit-plan.ts +154 -0
  269. package/src/budget/codex-reset-credit-state.ts +2 -0
  270. package/src/channel-import/detect.ts +191 -0
  271. package/src/channel-import/run.ts +111 -0
  272. package/src/chat/chat-cli.ts +4 -1
  273. package/src/chat/short-question.ts +40 -0
  274. package/src/cli/agent-cli.ts +24 -15
  275. package/src/cli/ask-bare.ts +42 -0
  276. package/src/cli/cli-user-error.ts +25 -0
  277. package/src/cli/codex-credit-plan-view.ts +25 -0
  278. package/src/cli/config-test-sync.ts +4 -0
  279. package/src/cli/decisions-cli.ts +13 -3
  280. package/src/cli/dependence-gauge.ts +237 -0
  281. package/src/cli/doctor-bundle.ts +128 -0
  282. package/src/cli/doctor-cli.ts +41 -1
  283. package/src/cli/doctor-local-llm.ts +95 -0
  284. package/src/cli/doctor-modes.ts +48 -0
  285. package/src/cli/import-cli.ts +60 -0
  286. package/src/cli/intake-cli.ts +12 -2
  287. package/src/cli/intake-source-cli.ts +58 -0
  288. package/src/cli/machine-cli.ts +23 -0
  289. package/src/cli/mcp-login.ts +13 -4
  290. package/src/cli/msg-cli.ts +137 -0
  291. package/src/cli/persona-cli.ts +116 -0
  292. package/src/cli/plugin-cli.ts +25 -0
  293. package/src/cli/pr-cli.ts +36 -0
  294. package/src/cli/provider-cli.ts +5 -0
  295. package/src/cli/release-cli.ts +50 -8
  296. package/src/cli/release-run-if-ready.ts +48 -0
  297. package/src/cli/setup-cli.ts +27 -6
  298. package/src/cli/setup-recommend.ts +8 -0
  299. package/src/cli/skills-cli.ts +173 -0
  300. package/src/cli/start-cli.ts +13 -4
  301. package/src/cli/usage-cli.ts +11 -1
  302. package/src/codex/setup.ts +37 -16
  303. package/src/dashboard/index.ts +18 -2
  304. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -2
  305. package/src/dashboard/slash-runtime/help-from-registry.ts +4 -2
  306. package/src/decisions/decision-cards.ts +291 -0
  307. package/src/decisions/decision-ledger.ts +5 -2
  308. package/src/decisions/discord-decision-cards.ts +133 -0
  309. package/src/decisions/telegram-decision-cards.ts +100 -0
  310. package/src/directives/version-at.ts +77 -0
  311. package/src/discord.ts +73 -6
  312. package/src/domains/core-tools.ts +37 -14
  313. package/src/domains/outbound-alert.ts +94 -12
  314. package/src/domains/repeated-failure.ts +1 -1
  315. package/src/error-report/report.ts +200 -0
  316. package/src/exec-requests/planner.ts +146 -0
  317. package/src/exec-requests/runner.ts +378 -0
  318. package/src/exec-requests/store.ts +78 -0
  319. package/src/field/field-feed-auto.ts +48 -0
  320. package/src/field/field-media.ts +8 -3
  321. package/src/field/field-reel.ts +203 -0
  322. package/src/grok/credential.ts +7 -5
  323. package/src/harness/aside-run-status.ts +33 -0
  324. package/src/harness/browser-verify.ts +48 -17
  325. package/src/harness/harness-cli-command.ts +25 -3
  326. package/src/harness/image-load-state.ts +21 -0
  327. package/src/harness/process-garbage.ts +45 -0
  328. package/src/hooks/error-report.ts +210 -0
  329. package/src/hooks/receiver.ts +41 -1
  330. package/src/import/apply.ts +128 -0
  331. package/src/import/plan.ts +197 -0
  332. package/src/index.ts +168 -21
  333. package/src/input-core/text-entry.ts +13 -5
  334. package/src/instance/leader.ts +13 -1
  335. package/src/intake-plane/collect-github.ts +5 -3
  336. package/src/intake-plane/collect-telegram-saved.ts +15 -3
  337. package/src/intake-plane/discord-seat-work.ts +56 -0
  338. package/src/intake-plane/intake-sources.ts +202 -0
  339. package/src/intake-plane/items.ts +28 -12
  340. package/src/intake-plane/seat-answer.ts +96 -0
  341. package/src/intake-plane/seat-doc-route.ts +221 -0
  342. package/src/intake-plane/submit-intake-work.ts +9 -1
  343. package/src/intake-plane/telegram-seat-work.ts +72 -0
  344. package/src/llm/model-defaults.ts +24 -1
  345. package/src/llm.ts +5 -4
  346. package/src/machines/machine-ledger.ts +127 -0
  347. package/src/market/pack-internal-refs.ts +28 -0
  348. package/src/market/publish.ts +31 -4
  349. package/src/maturity/feature-maturity.ts +65 -0
  350. package/src/model-tier/turn-tier.ts +24 -0
  351. package/src/msg/msg-store.ts +149 -0
  352. package/src/native-tool-catalog.ts +2 -1
  353. package/src/nexus/api/chat-fast-path-config.ts +28 -0
  354. package/src/nexus/api/consult-requests.ts +128 -0
  355. package/src/nexus/api/discord-trigger-bot.ts +3 -0
  356. package/src/nexus/api/error-reports.ts +108 -0
  357. package/src/nexus/api/exec-requests.ts +51 -0
  358. package/src/nexus/api/field-uploads.ts +40 -3
  359. package/src/nexus/api/graph-approvals-feed.ts +140 -0
  360. package/src/nexus/api/graph-approvals.ts +71 -4
  361. package/src/nexus/api/http-server.ts +82 -8
  362. package/src/nexus/api/outbound-report.ts +7 -0
  363. package/src/nexus/api/running-runs-background.ts +68 -0
  364. package/src/nexus/api/running-runs-child.ts +6 -0
  365. package/src/nexus/api/seat-requests.ts +254 -0
  366. package/src/nexus/api/share-captures.ts +91 -0
  367. package/src/nexus/api/skill-problems.ts +56 -0
  368. package/src/nexus/api/terminals.ts +24 -8
  369. package/src/nexus/api/trace-run-scan.ts +37 -0
  370. package/src/nexus/api/trace.ts +19 -3
  371. package/src/nexus/index.ts +28 -1
  372. package/src/nexus/setup-status.ts +11 -7
  373. package/src/notify/llm-budget-alert.ts +16 -10
  374. package/src/oauth/browser-availability.ts +14 -0
  375. package/src/oauth/codex-account-rotation.ts +26 -4
  376. package/src/oauth/codex-account-store.ts +20 -2
  377. package/src/oauth/codex-browser-login.ts +173 -0
  378. package/src/oauth/codex-quota-policy.ts +16 -0
  379. package/src/oauth/codex.ts +4 -1
  380. package/src/oauth/fallback-chain.ts +5 -5
  381. package/src/oauth/store.ts +42 -5
  382. package/src/onboarding/continue-here.ts +34 -0
  383. package/src/onboarding/entry-hints.ts +8 -0
  384. package/src/onboarding/full-screen-io.ts +35 -3
  385. package/src/onboarding/help/skills.md +1 -1
  386. package/src/onboarding/non-interactive.ts +1 -0
  387. package/src/onboarding/subscription-hint.ts +27 -0
  388. package/src/onboarding/web-first.ts +90 -0
  389. package/src/onboarding.ts +287 -26
  390. package/src/persona/presets.ts +105 -0
  391. package/src/plugins/maker/node-install.ts +92 -0
  392. package/src/plugins/maker/node-maker.ts +139 -0
  393. package/src/plugins/maker/plugin-maker.ts +19 -7
  394. package/src/policy/llm-policy.ts +268 -0
  395. package/src/prompt-library/session-guidance.ts +7 -1
  396. package/src/prompt-library/universal-preamble.ts +2 -2
  397. package/src/relay/relay-cli.ts +20 -0
  398. package/src/relay/relay-server.ts +220 -0
  399. package/src/release-loop/checklist.ts +37 -13
  400. package/src/self-dev/decompose.ts +1 -0
  401. package/src/self-dev/dev-pipeline.ts +6 -3
  402. package/src/self-dev/orchestrate.ts +18 -11
  403. package/src/self-dev/run-record-mirror.ts +44 -0
  404. package/src/self-dev/run-store.ts +12 -3
  405. package/src/self-implement/harness-policy-gates.ts +4 -1
  406. package/src/self-implement/report-origin.ts +12 -1
  407. package/src/session/chat.ts +17 -5
  408. package/src/shell-env-bootstrap.ts +44 -7
  409. package/src/skills/connect-claude-plugin.ts +142 -0
  410. package/src/skills/connect.ts +70 -0
  411. package/src/skills/index.ts +29 -1
  412. package/src/skills/repair.ts +124 -0
  413. package/src/skills/runner.ts +11 -2
  414. package/src/skills/shared-agent-skill-roots.ts +25 -0
  415. package/src/skills/trigger-extract.ts +1 -1
  416. package/src/steward/failure-streak.ts +78 -0
  417. package/src/steward/steward-cards.ts +24 -0
  418. package/src/steward/triage-budget.ts +127 -0
  419. package/src/steward/triage-plan.ts +75 -0
  420. package/src/steward/triage.ts +244 -42
  421. package/src/task-cards/card-store.ts +1 -1
  422. package/src/task-orchestrator/surfaces/pod-command-job.ts +16 -8
  423. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +11 -5
  424. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +68 -0
  425. package/src/task-orchestrator/surfaces/self-implement-pod.ts +78 -4
  426. package/src/telegram-commands.ts +13 -0
  427. package/src/telegram.ts +72 -2
  428. package/src/tool-runtime/elanous-skills-list-runtime.ts +3 -3
  429. package/src/tool-runtime/self-cognition-runtimes.ts +160 -2
  430. package/src/user-config.ts +189 -15
  431. package/src/version/packed-revision.json +1 -1
  432. package/src/video-pipeline/recipes/character.ts +42 -5
  433. package/src/video-pipeline/recipes/ffmpeg.ts +1 -1
  434. package/src/video-pipeline/recipes/free-line.ts +16 -3
  435. package/src/video-pipeline/recipes/remote.ts +7 -1
  436. package/src/video-pipeline/vflow-reference.ts +109 -0
  437. package/apps/pwa/out/_next/static/chunks/1169-696263ac7af8c4d4.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/1883.c91a2648af4842fd.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/1947-9d64872eeb9cfdec.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/2808-dc06482994b40f70.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/3165-95515ca5f299a120.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/3190-e9282753e7ebde85.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/4259-99614149577e77cb.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/4283-329eabeaf233e6cd.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/4328-cb5058b1acc2de5e.js +0 -25
  446. package/apps/pwa/out/_next/static/chunks/4801-ecee6ef62b349b18.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/5110-8058791dd25a2e14.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/5330-c41e9670f594c38f.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/5423-e95fd125d1794349.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/5478-b5eae07dc79ea619.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/5787-96ee6642b9a661e5.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/6448-79d72368589f98bc.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/6522-9866c002b5531836.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/6729-b4a558b7aa891e0c.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/6969-cb03f9410b7d2e03.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/7007-3b9861091bb8dd21.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/7930-8dc7e20fc6fc19ca.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/8071-187edbc22a86741f.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/8198-d4101ad70cb9a579.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/8250.4a2c5553a07cdf47.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/8293-123b91e7b0330dc0.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/8296-d6d5d87dfa911d41.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/8305-603963c33ee8eec3.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/8612-4a0066f20951b8fd.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/9181-cf4e1b61c4783f92.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/9262-26c2ecbd5a67e4a2.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/9328-45abdebce4fbecb7.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/9355-dbc67205adf8745f.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/9763.255b90dd69875689.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/9933-66d31ec25c0231af.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-bd06fb55f4da0381.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4e586142da455a25.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-889ad5cddcf45b0d.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/app/board/page-47ba401d56572c27.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/app/botlab/page-0b54f9c83458e038.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/app/bots/page-4fcc296ef6c8ed90.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/app/chat/page-fe9fda494a87f4e5.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/app/control/page-f9642e25ce129590.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e1063e8ba5f3e2e7.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/app/editor/page-9d0df30027d8aa9d.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/app/healthz/route-bd06fb55f4da0381.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/app/intake/page-d97adf2c9455b8d0.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/app/layout-236b80d202110362.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/app/live/page-21a30f35f1a276ad.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/app/market/page-b1a5be357c4fa25d.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1705a60303f7f573.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/app/morning/page-76b337c11ad0e237.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/app/not-found-7c0f85fbb56f64c6.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/app/observatory/page-65ca16b20617b44d.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/app/page-e7f9b8fc29411c1d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/app/reflection/page-92ea6213d1aeec04.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-a913a005aacb5476.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2d78804a40dfdef6.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-08a99148e780ac00.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/app/settings/page-deb674e7ed36f815.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-49f8de0534d192d7.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/setup/layout-bd06fb55f4da0381.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/setup/page-ba162a28d2176e18.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/share/page-1ff1a37b550ab41a.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/showroom/page-ccaa698f56c0fbdb.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/tasks/page-53b944082de1d7db.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/term/page-9b70adf1552789bf.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/trace/page-30d482aa63241fe8.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/vault/page-aecf786f54651d8a.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6ab9b62c7b6e08f2.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/workflows/page-08949735455e0c9a.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/workspace/page-a1479005234a46c2.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3890e90bd232732.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/beb5cf10-9adcc10b83930090.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/framework-d68d41c88e05c801.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/main-app-11c63971b7a9593b.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/main-d09452353bd0d9cc.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/pages/_app-184d727cebeca767.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/pages/_error-21bbbbac99b720b1.js +0 -1
  515. package/apps/pwa/out/_next/static/css/eaa74e8bb2f62269.css +0 -1
  516. package/apps/pwa/out/_next/static/qMI0jnlZaBjjm4aIDYNGM/_buildManifest.js +0 -1
  517. /package/apps/pwa/out/_next/static/{qMI0jnlZaBjjm4aIDYNGM → lywc8m_HDzH9MKSDQhyEj}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9933],{27668:(e,t,r)=>{r.d(t,{Er:()=>a,cj:()=>c,yR:()=>i});let n=/^(oauth\.|harness\.decision|llm\.router)/;function a(e){let t=[],r=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var a;let e=null!=(a=t.data)?a:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])r(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)r(null==t?void 0:t.name);continue}if(n.test(t.category))for(let t of(r(e.account),["what","why","reason"])){let n=e[t];if("string"==typeof n)for(let e of n.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))r(e[1])}}return t}function l(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function s(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),r=e.length?RegExp("(^|[^\\w-])(".concat(e.map(l).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,n=new Map;return(e,a)=>{let l=e.replace(/\b[a-z0-9-]+\.tail[0-9a-f]+\.ts\.net\b/gi,"tailnet-host").replace(/\bmsb\d+\b/gi,e=>(e=>{let t=e.toLowerCase();n.has(t)||n.set(t,"remote-".concat(n.size+1));let r=n.get(t);return e===e.toUpperCase()?r.toUpperCase():r})(e)).replace(/\bmbp\b/gi,e=>e===e.toUpperCase()?"LOCAL":"local").replace(/\/Users\/[^/\s"']+/g,"~").replace(/(크레딧|credits?|💳)(\s*[:=]?\s*)[\d][\d,.]*/gi,"$1$2•••").replace(/[\d][\d,.]*(\s*)(크레딧|credits?)/gi,"•••$1$2").replace(/\$\s?[\d][\d,.]*/g,"$•••").replace(/(잔량?|remaining|left)(\s*[:=]?\s*)(?:[A-Za-z0-9][\w.-]*\s+)?\d+(?:\.\d+)?\s?%/gi,"$1$2•••");return a&&r&&(l=l.replace(r,(e,r,n)=>{var a;return"".concat(r).concat(null!=(a=t.get(n))?a:"account")})),l}}function o(e,t){if("string"==typeof e)return t(e);if(Array.isArray(e))return e.map(e=>o(e,t));if(e&&"object"==typeof e){let r={};for(let[n,a]of Object.entries(e))"apiEquivalentUsd"===n||"usd"===n||/credit(s|Balance)?$/i.test(n)||(r[n]=o(a,t));return r}return e}function i(e){let t=s(a(e));return e.map(e=>{let r=n.test(e.category);return{...e,event:t(e.event,!1),data:e.data?o(e.data,e=>t(e,r)):e.data}})}function c(e,t){let r=s(t);return o(e,e=>r(e,!0))}},69933:(e,t,r)=>{r.d(t,{zV:()=>eQ});var n=r(35563),a=r(19707),l=r(84240),s=r(81453),o=r(3853),i=r(57093),c=r(37661),d=r(27405);r(98529);var u=r(45787),m=r(53403);function p(e){let t=e.split("\n"),r=t[0];if(!r)return null;let n=/^\[elanous\/term\/([a-zA-Z]+)\] (.+)$/.exec(r);if(!n)return null;let a=n[1];if("terminalOutput"!==a&&"terminalExit"!==a&&"terminalInputActivity"!==a&&"terminalFrame"!==a)return null;let l=[];for(let e=1;e<t.length;e++){let r=t[e];if(/^<<elanous-term-end /.test(r))break;l.push(r)}try{let e=JSON.parse(l.join("\n"));if("string"!=typeof e.terminalId)return null;if("terminalOutput"===a){if("string"!=typeof e.data)return null;return{method:a,payload:{terminalId:e.terminalId,data:e.data}}}if("terminalExit"===a){if("number"!=typeof e.code)return null;return{method:a,payload:{terminalId:e.terminalId,code:e.code}}}if("terminalFrame"===a){if("string"!=typeof e.frame||"string"!=typeof e.instance||"number"!=typeof e.at||!Number.isFinite(e.at))return null;return{method:a,payload:{terminalId:e.terminalId,frame:e.frame,instance:e.instance,at:e.at}}}if("string"!=typeof e.peerId||"number"!=typeof e.timestamp||"number"!=typeof e.bytes)return null;return{method:a,payload:{terminalId:e.terminalId,peerId:e.peerId,timestamp:e.timestamp,bytes:e.bytes}}}catch(e){return null}}let h="elanous.pwa.peerId",f=null;function b(){if(f)return f;let e=window.sessionStorage.getItem(h);return e&&0!==e.length||(e=function(){if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues){let e=new Uint32Array(2);return crypto.getRandomValues(e),(BigInt(e[0])<<32n|BigInt(e[1])).toString(36).slice(0,8)}return Math.random().toString(36).slice(2,10)}(),window.sessionStorage.setItem(h,e)),f=e,e}var g=r(62531);let x=/^\x1b\[[?>=][\d;]*[a-zA-Z$]/,v=/^\x1b\[\d+;\d+R$/,w=/^\x1b\[0?n$/,y=/^\x1b\][\d;]+;[^\x07\x1b]*(?:\x07|\x1b\\)$/,k=/^\x1b\[\d+;\d+;\d+t$/,j=new Map;function N(e,t){let r=j.get(e);return r?(r.sender(t),!0):((0,m.cY)("webterm.input.no-sender",{terminalId:e,bytes:new TextEncoder().encode(t).length}),!1)}function S(e){var t;let{sessionId:l,terminalId:h,clearRequest:f=0,readOnly:N=!1,onForeignInputActivity:S}=e,I=(0,a.useRef)(null),C=(0,a.useRef)(null),T=(0,a.useRef)(void 0),Y=(0,a.useRef)(h);Y.current!==h&&(Y.current=h,T.current=void 0);let E=(0,a.useRef)(l);E.current=l;let R=(0,a.useRef)(S);R.current=S;let{client:A,config:z,setSessionId:P}=(0,u.Q)(),[M,D]=(0,a.useState)(()=>({state:"CONNECTING",terminalId:h,connectingSince:Date.now()})),[U,L]=(0,a.useState)(0),$=(0,a.useRef)(0),[O,F]=(0,a.useState)(()=>Date.now()),[B,Q]=(0,a.useState)(null),q=(null==B?void 0:B.terminalId)===h?B:null,H=M.terminalId===h?M.state:"CONNECTING",_=M.terminalId===h?M.connectingSince:O;(0,a.useEffect)(()=>{if("CONNECTING"!==H)return;F(Date.now());let e=window.setInterval(()=>F(Date.now()),1e3);return()=>window.clearInterval(e)},[H,h]),(0,a.useEffect)(()=>{var e,t,n;if(!I.current)return;let a=new s.B({fontFamily:'"JetBrainsMono Nerd Font", "JetBrains Mono", monospace',fontSize:13,theme:{background:"#0d0c08",foreground:"#e9e3d4",cursor:"#e9e3d4"},allowProposedApi:!0,scrollback:5e3,cursorBlink:!N,disableStdin:N});(0,m.cY)("webterm.xterm.boot",{sessionId:l,terminalId:h,readOnly:N});let u=new o.Y;a.loadAddon(u),a.loadAddon(new i.c((e,t)=>(0,m.cY)("webterm.link.click",{uri:t}))),a.loadAddon(new c.I);let f=new d.V;a.loadAddon(f),(async()=>{try{let e=await r.e(7633).then(r.bind(r,67633));a.loadAddon(new e.WebglAddon)}catch(e){(0,m.cY)("webterm.webgl.fallback",{reason:String(e)})}})(),(async()=>{try{let e=await r.e(5329).then(r.bind(r,45329));a.loadAddon(new e.ImageAddon),(0,m.cY)("webterm.image-addon.loaded")}catch(e){(0,m.cY)("webterm.image-addon.fallback",{reason:String(e)})}})(),a.unicode.activeVersion="11",a.open(I.current),C.current=a,u.fit();let S=(0,g.o1)("xtermScrollback",h),T=(0,g.N2)(S);"string"==typeof T&&T.length>0&&a.write(T);let Y=()=>{},z=A.connectAcp({...l?{sessionId:l}:{},onSession:e=>{e&&(E.current=e,Y(e)),e&&e!==l&&((0,m.cY)("webterm.acp.session.adopted",{from:l,to:e}),P(e))}});(0,m.cY)("webterm.acp.session.attach",{sessionId:l,terminalId:h});let M=z.onState((e,t)=>{let r=Date.now();D(n=>({state:e,terminalId:h,connectingSince:"CONNECTING"===e?r:n.connectingSince,...(null==t?void 0:t.message)?{reason:t.message}:{}})),"OPEN"===e&&($.current=0),"CONNECTING"===e&&F(r),(0,m.cY)("webterm.xterm.acp-state",{terminalId:h,state:e,reason:null==t?void 0:t.message})}),U=()=>{},L=!1,O=Date.now(),B=new Promise(e=>{let t=!1;U=r=>{t||(t=!0,(0,m.cY)("webterm.shell.ready",{terminalId:h,via:r,ms:Date.now()-O}),e())}}),q=setTimeout(()=>U("cap-20s"),2e4);z.ready.then(e=>e?z.send("terminal/spawn",{sessionId:e,terminalId:h,cols:a.cols,rows:a.rows,replay:!0}):void U("no-session")).then(e=>{if(void 0===e)return;(0,m.cY)("webterm.spawn.result",e);let t="string"!=typeof e.snapshot||0===e.snapshot.trim().length;if("spawned"===e.status||"attached"===e.status&&t?L=!0:U("attached"===e.status?"attached":"status:".concat(String(e.status))),!N&&E.current){try{u.fit()}catch(e){}(0,m.cY)("webterm.xterm.size-sync",{terminalId:h,cols:a.cols,rows:a.rows,status:e.status}),z.send("terminal/resize",{sessionId:E.current,terminalId:h,cols:a.cols,rows:a.rows}).catch(e=>(0,m.cY)("webterm.resize.send-error",{reason:String(e)}))}"attached"===e.status&&"string"==typeof e.snapshot&&e.snapshot.length>0&&((0,m.cY)("webterm.attach.replay",{terminalId:h,bytes:e.snapshot.length}),a.write("\x1b[2J\x1b[H"+e.snapshot.split("\n").join("\r\n")+"\r\n"))}).catch(e=>{(0,m.cY)("webterm.spawn.error",{reason:String(e)}),U("spawn-error")});let H=z.on("sessionUpdate",e=>{var t,r,n;let l=null!=(r=e.params)?r:{},s=E.current;if(l.sessionId&&s&&l.sessionId!==s)return;let o=l.update;if(!o||"agent_thought_chunk"!==o.sessionUpdate)return;let i=(null==(t=o.content)?void 0:t.type)==="text"?o.content.text:null;if(!i)return;let c=p(i);c&&("terminalOutput"===c.method&&c.payload.terminalId===h?((0,m.cY)("webterm.ws.frame.in",{terminalId:h,bytes:c.payload.data.length}),a.write(c.payload.data),L&&(L=!1,U("first-output"))):"terminalExit"===c.method&&c.payload.terminalId===h?((0,m.cY)("webterm.pty.exit",{terminalId:h,code:c.payload.code}),a.write("\r\n\x1b[2m[exit ".concat(c.payload.code,"]\x1b[0m\r\n"))):"terminalInputActivity"===c.method&&c.payload.terminalId===h&&c.payload.peerId!==b()&&((0,m.cY)("webterm.peer.input",{terminalId:h,peerId:c.payload.peerId.slice(0,4),bytes:c.payload.bytes}),null==(n=R.current)||n.call(R,{peerId:c.payload.peerId,bytes:c.payload.bytes,timestamp:c.payload.timestamp})))}),_=function(e){let t,{send:r,ready:n,getSessionId:a,terminalId:l,getPeerId:s,log:o,shellReady:i}=e,c=!i,d=[],u="",m=!1,p=!1,h=!1,f=!1,b=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(h)return;let r=new TextEncoder().encode(t+d.join("")).length;d.length=0,o("webterm.input.send-error",{reason:String(e),dropped:r})},g=async()=>{if(u&&c&&!p&&!h){p=!0;try{for(;d.length&&!h;){let e=d.shift();try{let t=a();await r("terminal/input",{sessionId:m&&t?t:u,terminalId:l,data:e,peerId:s()})}catch(t){b(t,e);break}}}finally{p=!1}}};return i&&i.then(()=>{c=!0,g()}),n.then(e=>{if(!h){if(!e){f=!0,b(t="ACP handshake returned no session");return}u=e,g()}},e=>{f=!0,t=e,b(e)}),{confirmSession(e){!h&&u&&e&&(m=!0)},push(e){if(!h){if(f)return void b(t,e);d.push(e),g()}},dispose(){h=!0,d.length=0}}}({send:(e,t)=>z.send(e,t),ready:z.ready,shellReady:B,getSessionId:()=>E.current,terminalId:h,getPeerId:b,log:(e,t)=>{(0,m.cY)(e,t),t.dropped>0&&Q({terminalId:h,dropped:t.dropped})}});Y=_.confirmSession;let V=N?null:function(e,t){let r={sender:t};return j.set(e,r),()=>{j.get(e)===r&&j.delete(e)}}(h,_.push),G=N?null:a.onData(e=>{if(e&&!(e.length<2)&&27===e.charCodeAt(0)&&(x.test(e)||v.test(e)||w.test(e)||y.test(e)||k.test(e)))return void(0,m.cY)("webterm.xterm.onData.capability-swallow",{terminalId:h,bytes:e.length});(0,m.cY)("webterm.xterm.onData",{terminalId:h,bytes:e.length}),_.push(e)}),J=N?null:a.onResize(e=>{let{cols:t,rows:r}=e;(0,m.cY)("webterm.xterm.onResize",{terminalId:h,cols:t,rows:r}),z.send("terminal/resize",{sessionId:E.current,terminalId:h,cols:t,rows:r}).catch(e=>(0,m.cY)("webterm.resize.send-error",{reason:String(e)}))}),K=I.current,W=null,Z=e=>{if(1!==e.touches.length){W=null;return}W={y:e.touches[0].clientY,viewportY:a.buffer.active.viewportY}},X=e=>{var t,r,n;if(!W||1!==e.touches.length)return;let l=a.rows>0?(null!=(n=null==(r=a.element)||null==(t=r.querySelector(".xterm-screen"))?void 0:t.getBoundingClientRect().height)?n:0)/a.rows:0,s=function(e){if(!(e.cellHeight>0))return 0;let t=-Math.trunc((e.currentY-e.startY)/e.cellHeight)-(e.currentViewportY-e.startViewportY);return 0===t?0:t}({startY:W.y,currentY:e.touches[0].clientY,cellHeight:l,startViewportY:W.viewportY,currentViewportY:a.buffer.active.viewportY});0!==s&&a.scrollLines(s)},ee=()=>{W=null};null==(e=K.addEventListener)||e.call(K,"touchstart",Z,{passive:!0}),null==(t=K.addEventListener)||t.call(K,"touchmove",X,{passive:!0}),null==(n=K.addEventListener)||n.call(K,"touchend",ee,{passive:!0});let et=function(e){var t,r;let n=null!=(t=e.trailingDebounceMs)?t:32,a=null,l=!1,s=()=>{if((a=null,!l)&&e.onTrailing)try{e.onTrailing()}catch(e){}},o=t=>{var r,o;if(l)return;let i=performance.now(),c=null==(o=e.target)||null==(r=o.getBoundingClientRect)?void 0:r.call(o),d=c?Math.round(c.width):void 0,u=c?Math.round(c.height):void 0;if((null==c?void 0:c.height)===0){null!==a&&(clearTimeout(a),a=null),(0,m.cY)("webterm.resize.skip",{source:t,...void 0!==d?{w:d}:{},h:u,reason:"zero-height"});return}let p=null;try{e.onImmediate()}catch(e){p=e instanceof Error?e.message:String(e)}(0,m.cY)("webterm.resize.trigger",{source:t,dt:Math.round((performance.now()-i)*100)/100,...void 0!==d?{w:d}:{},...void 0!==u?{h:u}:{},...p?{err:p}:{}}),e.onTrailing&&(null!==a&&clearTimeout(a),a=setTimeout(s,n))},i=null;"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>o("ro"))).observe(e.target);let c=()=>o("win");window.addEventListener("resize",c);let d=null!=(r=window.visualViewport)?r:null,u=()=>o("vv");return d&&d.addEventListener("resize",u),{dispose(){if(!l){if(l=!0,null!==a&&(clearTimeout(a),a=null),i){try{i.disconnect()}catch(e){}i=null}window.removeEventListener("resize",c),d&&d.removeEventListener("resize",u)}},flushPending(){null!==a&&(clearTimeout(a),s())}}}({target:I.current,onImmediate:()=>{try{u.fit()}catch(e){}},onTrailing:()=>{try{u.fit()}catch(e){}}});return()=>{var e,t,r;try{let e=f.serialize();"string"==typeof e&&(0,g.Os)((0,g.o1)("xtermScrollback",h),e)}catch(e){(0,m.cY)("webterm.xterm.snapshot.error",{reason:String(e)})}try{et.dispose()}catch(e){}null==(e=K.removeEventListener)||e.call(K,"touchstart",Z),null==(t=K.removeEventListener)||t.call(K,"touchmove",X),null==(r=K.removeEventListener)||r.call(K,"touchend",ee),null==V||V(),_.dispose(),clearTimeout(q),H(),M();try{null==G||G.dispose()}catch(e){}try{null==J||J.dispose()}catch(e){}try{z.close()}catch(e){}C.current===a&&(C.current=null);try{a.dispose()}catch(e){}(0,m.cY)("webterm.xterm.teardown",{terminalId:h})}},[h,N,A,U]);let V="FAILED"===H||"CLOSED"===H?(t=M.reason)&&/auth_failed|\b1008\b|unauthori[sz]ed|\b401\b/i.test(t)?"auth":"transient":null,G=(0,a.useRef)(z.token);(0,a.useEffect)(()=>{G.current!==z.token&&(G.current=z.token,"auth"===V&&z.token&&((0,m.cY)("webterm.acp.reconnect",{terminalId:h,why:"token-changed"}),L(e=>e+1)))},[z.token]),(0,a.useEffect)(()=>{var e,t,r;if(null===V)return;let n=e=>{$.current+=1,(0,m.cY)("webterm.acp.reconnect",{terminalId:h,why:e,attempt:$.current,reason:M.reason}),L(e=>e+1)},a="undefined"==typeof document?null:document,l=window,s=()=>{(null==a?void 0:a.visibilityState)==="visible"&&n("visible")},o=()=>n("online");null==a||null==(e=a.addEventListener)||e.call(a,"visibilitychange",s),null==l||null==(t=l.addEventListener)||t.call(l,"online",o);let i="transient"===V?setTimeout(()=>n("backoff"),(r=$.current,Math.min(3e4,1e3*2**Math.max(0,r)))):void 0;return()=>{var e,t;null==a||null==(e=a.removeEventListener)||e.call(a,"visibilitychange",s),null==l||null==(t=l.removeEventListener)||t.call(l,"online",o),void 0!==i&&clearTimeout(i)}},[V,h]),(0,a.useEffect)(()=>{var e;e=T.current,void 0!==e&&e!==f&&C.current&&(C.current.clear(),(0,m.cY)("webterm.controls.clear.applied",{terminalId:h})),T.current=f},[f,h]);let J="CONNECTING"===H?$.current>0?"다시 연결 중(".concat($.current,"회)"):"연결 중":"OPEN"===H?"연결됨":"auth"===V?"토큰 없음":"FAILED"===H?"연결 실패 \xb7 곧 다시 붙습니다":"연결 끊김 \xb7 곧 다시 붙습니다",K="OPEN"===H?"text-emerald-300":"CONNECTING"===H?"text-amber-300":"text-red-300",W=h.trim()||"대상 미지정",Z=Math.max(0,Math.floor((O-_)/1e3));return(0,n.jsxs)("div",{className:"relative h-full w-full bg-[#0d0c08]",children:[(0,n.jsx)("div",{ref:I,className:"h-full w-full"}),q&&(0,n.jsxs)("div",{role:"alert",className:"pointer-events-none absolute bottom-2 left-2 right-2 rounded bg-red-950/95 px-3 py-2 text-sm text-red-100",children:["터미널 입력 전송 실패: ",q.dropped,"바이트가 버려졌습니다. 명령이 일부만 실행됐을 수 있습니다. 입력을 확인하고 다시 입력하세요."]}),"auth"===V&&(0,n.jsxs)("div",{role:"alert",className:"absolute left-2 right-2 top-10 z-30 space-y-1 rounded bg-amber-950/95 px-3 py-2 text-sm text-amber-100","data-webterm-auth-missing":!0,children:[(0,n.jsx)("p",{children:"이 기기에 소유자 토큰이 없어 터미널에 연결하지 못했습니다 — 설정에서 토큰을 붙이면 바로 연결됩니다."}),(0,n.jsx)("p",{className:"text-xs text-amber-200/90",children:"토큰 얻기: 이미 연결된 기기의 설정 › Connect token 에서 만들거나, 데몬 기계에서 pbcopy < ~/.elanous/acp-token → 이 기기의 설정 › Daemon › Bearer token 칸에 붙여 넣기"}),(0,n.jsx)("a",{href:"/app/settings/#bearer-token",className:"inline-block font-medium underline","data-webterm-auth-settings":!0,children:"설정 열기 →"})]}),(0,n.jsxs)("span",{"aria-live":"polite",className:"sr-only",children:["ACP: ",J]}),(0,n.jsxs)("span",{className:"pointer-events-none absolute right-2 top-2 rounded bg-black/70 px-2 py-1 text-xs ".concat(K),children:["ACP: ",J,"CONNECTING"===H&&" \xb7 ".concat(Z,"초 \xb7 ").concat(W," \xb7 ").concat(z.baseUrl)]})]})}let I={failures:0,stopped:!1,message:null,screen:null},C=/^\[screen \d+x\d+ cursor=[^\]\n]*\]\r?\n/;function T(e){let t=e.replace(C,"").replace(/\r?\n/g,"\r\n");return"\x1b[H\x1b[2J".concat(t)}function Y(e,t){var r;if(e.stopped)return e;if((null==t?void 0:t.status)==="success"&&"string"==typeof t.screen)return{failures:0,stopped:!1,message:null,screen:T(t.screen)};if((null==t?void 0:t.status)==="unknown-pty")return{...e,stopped:!0,message:"PTY 가 끝났습니다"};if((null==t?void 0:t.status)==="denied")return{...e,failures:0,stopped:!0,message:t.reason||"화면 조회가 거부되었습니다"};let n=e.failures+1;return(null==t?void 0:t.status)!=="owner-unreachable"?{...e,failures:n,stopped:n>=5,message:(null==t?void 0:t.reason)||"화면 조회에 실패했습니다"}:{...e,failures:n,stopped:n>=5,message:n>=5?"소유 프로세스에 닿지 않습니다":null!=(r=t.reason)?r:null}}function E(e){var t,r;let{terminal:l,client:o,onClose:d}=e,u=(0,a.useRef)(null),p=(0,a.useRef)(null),h=(0,a.useRef)(null),f=(0,a.useRef)(I),[b,g]=(0,a.useState)(!1),[x,v]=(0,a.useState)(!1),w=(0,a.useRef)(!1),[y,k]=(0,a.useState)(null),[j,N]=(0,a.useState)("connecting");return(0,a.useEffect)(()=>{var e,t,r;let n;if(!u.current)return;let a={closed:!1,owned:!1,accepting:!1,queue:Promise.resolve(),takeover:null,release:null};h.current=a,w.current=!1,v(!1);let d={sourceRoot:null==(e=l.sourceRoot)?void 0:e.dbPath},b=new s.B({cols:110,rows:40,fontFamily:'"JetBrainsMono Nerd Font", "JetBrains Mono", monospace',fontSize:13,theme:{background:"#0d0c08",foreground:"#e9e3d4",cursor:"#e9e3d4"},cursorBlink:!1,disableStdin:!0,scrollback:0,allowProposedApi:!0});b.loadAddon(new i.c),b.loadAddon(new c.I),b.unicode.activeVersion="11",b.open(u.current),b.write("\x1b[?25l"),p.current=b,f.current=I,g(!1),k(null);let x=b.onData(e=>{if(!a.accepting||a.closed||!e)return;let t=e.startsWith("\x1b")||"\r"===e||"\n"===e||""===e||" "===e||"\x03"===e;a.queue=a.queue.then(async()=>{try{let r=t?await o.sendTerminalKey(l.id,e,d):await o.sendTerminalText(l.id,e,d);if(a.closed)return;"success"!==r.status&&("denied"===r.status&&(a.accepting=!1,g(!1),b.options.disableStdin=!0),k(r.reason||"입력 실패: ".concat(r.status)))}catch(e){a.closed||k("입력 전송 실패: ".concat(String(e)))}})}),y=u.current,j=!1,S=e=>{a.queue=a.queue.then(async()=>{try{var t;if(!o.sendTerminalMouse)return;let r=await o.sendTerminalMouse(l.id,e,d);if(a.closed||"success"===r.status)return;if((t=r.reason)&&/mouse mode is off|\?1006/i.test(t)){"click"!==e.kind||j||(j=!0,k("이 앱은 마우스를 받지 않는다(마우스 모드 꺼짐) — 키보드로 조작하세요."));return}k(r.reason||"마우스 전송 실패: ".concat(r.status))}catch(e){a.closed||k("마우스 전송 실패: ".concat(String(e)))}})},C=e=>{var t;let r=null==(t=b.element)?void 0:t.querySelector(".xterm-screen");return r?function(e,t,r,n,a){if(!(r.width>0)||!(r.height>0)||n<1||a<1)return null;let l=Math.floor((e-r.left)/r.width*n)+1,s=Math.floor((t-r.top)/r.height*a)+1;return{x:Math.min(n,Math.max(1,l)),y:Math.min(a,Math.max(1,s))}}(e.clientX,e.clientY,r.getBoundingClientRect(),b.cols,b.rows):null},E=()=>a.accepting&&!a.closed&&"none"===b.modes.mouseTrackingMode,R=e=>{var t;if(!E())return;let r=0===(t=e.button)?"left":1===t?"middle":2===t?"right":null,n=C(e);r&&n&&S({...n,kind:"click",button:r})},A=e=>{if(!E()||0===e.deltaY)return;let t=C(e);t&&(e.preventDefault(),e.stopPropagation(),S({...t,kind:e.deltaY<0?"scroll-up":"scroll-down"}))};null==(t=y.addEventListener)||t.call(y,"mousedown",R,{capture:!0}),null==(r=y.addEventListener)||r.call(y,"wheel",A,{passive:!1,capture:!0});let z=async()=>{var e,t,r,s;if(!a.closed&&(e=!document.hidden,t=f.current,e&&!t.stopped)){try{let e=await o.snapshotTerminal(l.id,{ansi:!0,sourceRoot:d.sourceRoot});if(a.closed)return;let t=Y(f.current,e);f.current=t,null!==t.screen&&"success"===e.status&&b.write(t.screen+"\x1b[?25l"),k(t.message)}catch(t){if(a.closed)return;let e=Y(f.current,null);f.current=e,k(e.message)}a.closed||(r=!document.hidden,s=f.current,!r||s.stopped)||(n=setTimeout(()=>{z()},800))}},P=!o.streamTerminal,M=null,D=()=>{!o.streamTerminal||a.closed||P||(N("connecting"),M=o.streamTerminal(l.id,{sourceRoot:d.sourceRoot},e=>{a.closed||("mode"===e.type?N("bytes"===e.mode?"stream-bytes":"stream-screen"):"reset"===e.type||"screen"===e.type?(b.write(T(e.screen)+"\x1b[?25l"),k(null)):"data"===e.type?b.write(e.chunk):"end"===e.type?(k("PTY 가 끝났습니다"),f.current={...f.current,stopped:!0}):"status"===e.type&&k("화면 조회: ".concat(e.status)))},e=>{a.closed||((0,m.cY)("pwa.terminal.stream-fallback",{id:l.id,reason:e}),P=!0,N("poll"),z())}))},U=()=>{if(n&&clearTimeout(n),n=void 0,!P)return void(document.hidden?(null==M||M(),M=null):M||f.current.stopped||D());document.hidden||a.closed||f.current.stopped||z()};return document.addEventListener("visibilitychange",U),P?(N("poll"),z()):D(),()=>{var e,t;a.closed=!0,a.accepting=!1,n&&clearTimeout(n),null==M||M(),document.removeEventListener("visibilitychange",U),x.dispose(),null==(e=y.removeEventListener)||e.call(y,"mousedown",R,{capture:!0}),null==(t=y.removeEventListener)||t.call(y,"wheel",A,{capture:!0}),(async()=>{if(await a.takeover,a.release&&await a.release,a.owned){await a.queue;try{let e=await o.controlTerminal(l.id,"release",d);"success"===e.status&&(a.owned=!1)}catch(e){}}})(),h.current===a&&(h.current=null),p.current=null,b.dispose()}},[o,l.id,null==(t=l.sourceRoot)?void 0:t.dbPath]),(0,n.jsxs)("section",{className:"flex h-full min-h-0 flex-col bg-[#0d0c08]","aria-label":"PTY 라이브 화면",children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-3 border-b border-zinc-700 px-3 py-2 text-sm text-zinc-100",children:[(0,n.jsx)("span",{className:"font-mono",children:l.id}),(0,n.jsx)("span",{children:null!=(r=l.kind)?r:"PTY"}),(0,n.jsx)("span",{children:b?"입력 가능":"읽기 전용"}),(0,n.jsx)("span",{className:"rounded bg-zinc-800 px-1.5 py-0.5 font-mono text-[10px] text-zinc-300","data-pty-feed":j,title:"화면을 받는 방식",children:"stream-bytes"===j?"● 실시간":"stream-screen"===j?"● 실시간(화면)":"poll"===j?"폴링 0.8s":"연결 중"}),(0,n.jsx)("button",{type:"button",disabled:x,onClick:()=>{(e=>{var t;let r=h.current;if(!r||r.closed||w.current)return;w.current=!0,v(!0);let n={sourceRoot:null==(t=l.sourceRoot)?void 0:t.dbPath};"release"===e&&(r.accepting=!1,p.current&&(p.current.options.disableStdin=!0));let a=(async()=>{try{"release"===e&&await r.queue;let t=await o.controlTerminal(l.id,e,n);if("success"===t.status&&(r.owned="takeover"===e),r.closed)return;"success"===t.status?(r.accepting="takeover"===e,g(r.accepting),p.current&&(p.current.options.disableStdin=!r.accepting),k(null)):("release"===e&&(r.accepting=r.owned,p.current&&(p.current.options.disableStdin=!r.accepting)),k(t.reason||("denied"===t.status?"제어 거부: 권한이 없습니다":"제어 실패: ".concat(t.status))))}catch(t){r.closed||("release"===e&&(r.accepting=r.owned,p.current&&(p.current.options.disableStdin=!r.accepting)),k("제어 요청 실패: ".concat(String(t))))}finally{r.closed||(w.current=!1,v(!1))}})();"takeover"===e?r.takeover=a:r.release=a})(b?"release":"takeover")},children:b?"release":"takeover"}),(0,n.jsx)("button",{type:"button",onClick:d,"aria-label":"PTY 라이브 닫기",children:"닫기"})]}),y&&(0,n.jsx)("p",{role:"status",className:"px-3 py-1 text-amber-300",children:y}),(0,n.jsx)("div",{ref:u,className:"min-h-0 flex-1 overflow-auto","aria-label":"".concat(l.id," 화면")})]})}var R=r(27668);let A=e=>"string"==typeof e&&e.trim()?e:null,z={codex:"codex",claude:"claude",gemini:"gemini",grok:"grok",self:"elanous",mission:"elanous 미션",shell:"셸",pty:"PTY"},P={PLAN:"text-sky-400",ROUTE:"text-violet-400",VERIFY:"text-amber-400",HEAL:"text-emerald-400",ESCALATE:"text-rose-400",SHIP:"text-green-400"};function M(e){let{rows:t,client:r,initial:l,onClose:s,stage:o=!1}=e,[i,c]=(0,a.useState)(l);(0,a.useEffect)(()=>{0===i.length&&t.length&&c(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,r=e.filter(e=>e.alive),n=r.filter(e=>e.kind&&["codex","claude","self","mission","gemini","grok"].includes(e.kind)),a=r.filter(e=>!n.includes(e));return[...n,...a].slice(0,t).map(e=>e.id)}(t))},[t,i.length]),(0,a.useEffect)(()=>{let e=new URLSearchParams(window.location.search);i.length?e.set("wall",i.join(",")):e.delete("wall"),window.history.replaceState(null,"","".concat(window.location.pathname,"?").concat(e.toString()))},[i]);let[d,u]=(0,a.useState)([]);(0,a.useEffect)(()=>{let e=!0,t=async()=>{try{var t;let n=await r.fetchJson("/v1/logs?category=harness.decision&store=@active&since=6h&limit=300");e&&u(null!=(t=n.logs)?t:[])}catch(e){}};t();let n=window.setInterval(()=>{document.hidden||t()},5e3);return()=>{e=!1,window.clearInterval(n)}},[r]);let[m,p]=(0,a.useState)(!1);(0,a.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&p(!0)},[]);let h=(0,a.useMemo)(()=>m?(0,R.yR)(d.map(e=>{var t;return{ts:e.ts,category:"harness.decision",event:"decision",data:null!=(t=e.data)?t:null}})):d,[d,m]),f=(0,a.useMemo)(()=>i.map(e=>t.find(t=>t.id===e)).filter(e=>!!e),[i,t]),b=e=>c(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e].slice(-3));return(0,n.jsxs)("section",{className:"flex h-full min-h-0 flex-col bg-[#0b0a07]","aria-label":"터미널 나란히","data-pty-wall":!0,children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-2 border-b border-zinc-700 px-3 py-2 text-xs text-zinc-200",children:[(0,n.jsxs)("span",{className:"font-medium",children:["나란히 \xb7 ",f.length,"/3"]}),t.filter(e=>e.alive).slice(0,14).map(e=>{var t,r,a;return(0,n.jsxs)("button",{type:"button",onClick:()=>b(e.id),"aria-pressed":i.includes(e.id),className:"rounded-full border px-2 py-0.5 font-mono ".concat(i.includes(e.id)?"border-emerald-500 bg-emerald-900/40 text-emerald-200":"border-zinc-700 text-zinc-400 hover:bg-zinc-800"),"data-pty-wall-chip":e.id,children:[null!=(r=e.kind)?r:"pty"," \xb7 ",e.nickname||e.id]},"".concat(null!=(a=null==(t=e.sourceRoot)?void 0:t.dbPath)?a:"",":").concat(e.id))}),(0,n.jsx)("button",{type:"button",onClick:s,className:"ml-auto rounded px-2 py-1 text-zinc-400 hover:bg-zinc-800","aria-label":"나란히 닫기",children:"닫기"})]}),0===f.length?(0,n.jsx)("p",{className:"p-6 text-sm text-zinc-400",children:"위에서 PTY 를 1~3개 고르세요 — 살아 있는 에이전트 PTY 가 없으면 비어 있습니다."}):(0,n.jsx)("div",{className:"grid min-h-0 flex-1 gap-1 p-1 ".concat(1===f.length?"grid-cols-1":2===f.length?"grid-cols-2":"grid-cols-3"),children:f.map(e=>{var t,a;let l=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3;return t.filter(t=>{var r;let n=null!=(r=t.data)?r:{};return!!e.runId&&n.runId===e.runId||n.target===e.id||n.shard===e.id}).sort((e,t)=>e.ts<t.ts?1:-1).slice(0,r).map(e=>{var t,r,n,a,l;let s=null!=(t=e.data)?t:{};return{ts:e.ts,kind:(null!=(r=A(s.kind))?r:"PLAN").toUpperCase(),what:null!=(n=A(s.what))?n:"(판단)",why:null!=(l=null!=(a=A(s.reason))?a:A(s.why))?l:A(s.purpose),target:A(s.target)}})}(e,h,2);return(0,n.jsxs)("div",{className:"flex min-h-0 flex-col overflow-hidden rounded border border-zinc-800","data-pty-wall-pane":e.id,children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 bg-zinc-900 px-2 py-1 text-[11px]",children:[(0,n.jsx)("span",{className:"rounded bg-violet-900/50 px-1.5 py-0.5 text-violet-200","data-pty-agent":!0,children:function(e){let t=e.externalToolName&&z[e.externalToolName]||e.kind&&z[e.kind]||e.externalToolName||e.kind||"PTY";return"에이전트: ".concat(t).concat(e.runId?" \xb7 런 ".concat(e.runId.replace(/^run-/,"").slice(0,8)):"")}(e)}),(0,n.jsx)("span",{className:"truncate font-mono text-zinc-500",children:e.id})]}),(0,n.jsx)("div",{className:"min-h-[38px] border-b border-zinc-800 bg-zinc-950/80 px-2 py-1 ".concat(o?"text-sm":"text-[11px]"),"aria-label":"의도 띠","data-pty-intent":!0,children:0===l.length?(0,n.jsx)("span",{className:"text-zinc-500",children:"이 PTY 를 모는 판단 신호 없음(사람이 모는 PTY 거나 MAX 계측 꺼짐)"}):l.map(e=>{var t;return(0,n.jsxs)("div",{className:"truncate",children:[(0,n.jsx)("span",{className:"font-mono ".concat(null!=(t=P[e.kind])?t:"text-zinc-300"),children:e.kind})," ",(0,n.jsx)("span",{className:"text-zinc-100",children:e.what}),e.why&&(0,n.jsxs)("span",{className:"text-zinc-400",children:[" \xb7 왜: ",e.why]}),e.target&&(0,n.jsxs)("span",{className:"text-zinc-500",children:[" → ",e.target]})]},"".concat(e.ts,"-").concat(e.what))})}),(0,n.jsx)("div",{className:"min-h-0 flex-1",children:(0,n.jsx)(E,{terminal:e,client:r,onClose:()=>b(e.id)})})]},"".concat(null!=(a=null==(t=e.sourceRoot)?void 0:t.dbPath)?a:"",":").concat(e.id))})})]})}var D=r(24253);let U=/\x1b(?:\][^\x07\x1b]*(?:\x07|\x1b\\)|\[[0-?]*[ -/]*[@-~]|[@-Z\\-_])/g,L=new Map;function $(e){let{sessionId:t}=e,{client:r,setSessionId:l}=(0,u.Q)(),[s,o]=(0,a.useState)(L),[i,c]=(0,a.useState)(null);(0,a.useEffect)(()=>{let e=r.connectAcp({...t?{sessionId:t}:{},onSession:e=>{e&&e!==t&&l(e)}});(0,m.cY)("tui-mirror.attach",{sessionId:t});let n=e.on("sessionUpdate",e=>{var t,r;let n=(null!=(r=e.params)?r:{}).update;if(!n||"agent_thought_chunk"!==n.sessionUpdate)return;let a=(null==(t=n.content)?void 0:t.type)==="text"?n.content.text:null;a&&o(e=>{let t=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now(),n=p(t);if(!n||"terminalFrame"!==n.method)return e;let{terminalId:a,frame:l,instance:s,at:o}=n.payload,i="".concat(s).concat("\0").concat(a),c=e.get(i);if(c&&o<c.at)return e;let d=new Map(e);return d.set(i,{key:i,surfaceId:a,frame:l,instance:s,at:o,receivedAt:r}),d}(e,a);return t!==e&&(0,m.cY)("tui-mirror.frame",{bytes:a.length}),t})}),a=setInterval(()=>{o(e=>(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:15e3,n=!1;for(let a of e.values())if(t-a.receivedAt>r){n=!0;break}if(!n)return e;let a=new Map;for(let[n,l]of e)t-l.receivedAt<=r&&a.set(n,l);return a})(e))},5e3);return()=>{clearInterval(a);try{n()}catch(e){}try{e.close()}catch(e){}}},[r,t,l]);let d=(0,a.useMemo)(()=>[...s.values()].sort((e,t)=>t.receivedAt-e.receivedAt||e.key.localeCompare(t.key)),[s]);(0,a.useEffect)(()=>{var e,t;i&&s.has(i)||c(null!=(t=null==(e=d[0])?void 0:e.key)?t:null)},[d,i,s]);let h=i?s.get(i):void 0;return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col bg-zinc-950 text-zinc-100",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b border-zinc-800 px-3 py-2 text-xs text-zinc-400",children:[(0,n.jsx)("span",{className:"font-semibold text-zinc-200",children:"\uD83D\uDDA5 TUI 관측"}),(0,n.jsx)("span",{"aria-live":"polite",children:0===d.length?"자기신고 화면 대기 중…":"".concat(d.length,"개 화면 \xb7 라이브 미러")}),d.length>0&&(0,n.jsx)("select",{"aria-label":"관측할 TUI 화면 선택",className:"ml-auto rounded border border-zinc-700 bg-zinc-900 px-2 py-1 text-zinc-100",value:null!=i?i:"",onChange:e=>c(e.target.value),children:d.map(e=>(0,n.jsxs)("option",{value:e.key,children:[e.surfaceId," \xb7 ",e.instance]},e.key))})]}),(0,n.jsx)("pre",{className:"m-0 min-h-0 flex-1 overflow-auto whitespace-pre p-3 font-mono text-xs leading-snug text-zinc-100","aria-live":"polite","aria-label":"선택한 TUI 화면의 라이브 렌더 프레임",children:h?h.frame.replace(U,""):"자기신고하는 elanous 화면이 아직 없습니다. 대시보드(elanous)를 실행하면 여기 라이브로 미러링됩니다."})]})}var O=r(23309),F=r(25709),B=r(45505),Q=r(96030),q=r(11205),H=r(7077);function _(e){let{onFrameUploaded:t}=e,{config:r,client:l,sessionId:s}=(0,u.Q)(),o=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=o.current)||e.close()}catch(e){}o.current=null},[]);let i=(0,a.useCallback)(async e=>{if(t){try{t(e)}catch(e){}return}if(s){o.current||(o.current=l.connectAcp({sessionId:s}));try{var r;await o.current.send("terminal/camera/frame/notify",{sessionId:s,attachmentId:e.id,ts:null!=(r=e.createdAt)?r:Date.now()})}catch(e){(0,m.cY)("webterm.live-cam.notify-failed",{reason:e instanceof Error?e.message:String(e)})}}},[l,s,t]),c=function(e){var t,r,n;let l=null!=(t=e.intervalMs)?t:1e3,s=null!=(r=e.jpegQuality)?r:.85,o=null!=(n=e.maxDimension)?n:1280,[i,c]=(0,a.useState)({status:"idle",framesUploaded:0,lastAttachmentId:null,error:null}),d=(0,a.useRef)(null),u=(0,a.useRef)(null),p=(0,a.useRef)(null),h=(0,a.useRef)(null),f=(0,a.useRef)(!1),b=(0,a.useRef)(e.onFrameUploaded);b.current=e.onFrameUploaded;let g=(0,a.useRef)({baseUrl:e.baseUrl,token:e.token});g.current={baseUrl:e.baseUrl,token:e.token};let x=(0,a.useCallback)(()=>{null!==h.current&&(clearInterval(h.current),h.current=null);let e=d.current;if(e){for(let t of e.getTracks())try{t.stop()}catch(e){}d.current=null}if(u.current){try{u.current.pause()}catch(e){}u.current.srcObject=null,u.current=null}p.current=null,f.current=!1},[]),v=(0,a.useCallback)(async()=>{if(f.current)return void(0,m.cY)("webterm.live-cam.frame-dropped",{reason:"in-flight"});let e=u.current;if(!e||0===e.videoWidth||0===e.videoHeight)return void(0,m.cY)("webterm.live-cam.frame-skipped",{reason:"video-not-ready"});f.current=!0;try{let r=function(e,t,r){if(e<=r&&t<=r)return{width:e,height:t};let n=e/t;return e>=t?{width:r,height:Math.round(r/n)}:{width:Math.round(r*n),height:r}}(e.videoWidth,e.videoHeight,o),n=p.current;n&&n.width===r.width&&n.height===r.height||(p.current=n=function(e,t){let r=document.createElement("canvas");return r.width=e,r.height=t,r}(r.width,r.height));let a=n.getContext("2d");if(!a)return void(0,m.cY)("webterm.live-cam.no-ctx");a.drawImage(e,0,0,r.width,r.height);let l=await new Promise(e=>{n.toBlob(t=>e(t),"image/jpeg",s)});if(!l)return void(0,m.cY)("webterm.live-cam.toBlob-null");let i="live-frame-".concat(Date.now(),".jpg"),d=await (0,H.v)({baseUrl:g.current.baseUrl,token:g.current.token,file:l,filename:i});if(!d.ok){c(e=>({...e,error:d.reason})),(0,m.cY)("webterm.live-cam.upload-failed",{reason:d.reason});return}c(e=>({...e,framesUploaded:e.framesUploaded+1,lastAttachmentId:d.meta.id,error:null}));try{var t;null==(t=b.current)||t.call(b,d.meta)}catch(e){(0,m.cY)("webterm.live-cam.onFrameUploaded-throw",{reason:e instanceof Error?e.message:String(e)})}}catch(t){let e=t instanceof Error?t.message:String(t);c(t=>({...t,error:e})),(0,m.cY)("webterm.live-cam.capture-error",{reason:e})}finally{f.current=!1}},[s,o]),w=(0,a.useCallback)(async()=>{var e;let t;if("undefined"==typeof navigator||!(null==(e=navigator.mediaDevices)?void 0:e.getUserMedia))return void c(e=>({...e,status:"unsupported",error:"getUserMedia not available"}));if(!g.current.baseUrl)return void c(e=>({...e,status:"error",error:"daemon baseUrl not configured"}));if(d.current)return;c(e=>({...e,status:"requesting",error:null}));try{t=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:"environment"}}})}catch(r){let e=r instanceof Error?r.message:String(r),t=e.includes("Permission")||e.includes("NotAllowed");c(r=>({...r,status:t?"denied":"error",error:e})),(0,m.cY)("webterm.live-cam.getUserMedia-failed",{reason:e,denied:t});return}d.current=t;let r=document.createElement("video");r.srcObject=t,r.muted=!0,r.playsInline=!0,u.current=r;try{await r.play()}catch(e){(0,m.cY)("webterm.live-cam.video-play-failed",{reason:e instanceof Error?e.message:String(e)})}c(e=>({...e,status:"streaming",framesUploaded:0,error:null})),null!==h.current&&clearInterval(h.current),h.current=setInterval(()=>{v()},l),(0,m.cY)("webterm.live-cam.started",{intervalMs:l})},[v,l]),y=(0,a.useCallback)(()=>{x(),c({status:"idle",framesUploaded:0,lastAttachmentId:null,error:null}),(0,m.cY)("webterm.live-cam.stopped")},[x]);return(0,a.useEffect)(()=>()=>{x()},[x]),{...i,start:w,stop:y,isRunning:"streaming"===i.status}}({baseUrl:r.baseUrl,...r.token?{token:r.token}:{},onFrameUploaded:i});return"unsupported"!==c.status&&r.baseUrl?"denied"===c.status?(0,n.jsx)("button",{type:"button",disabled:!0,className:"rounded border border-rose-300 bg-rose-50 px-2 py-0.5 text-[11px] text-rose-700 dark:border-rose-800 dark:bg-rose-950 dark:text-rose-200",title:"Camera permission denied. Enable in iOS Settings → Safari → Camera, then reload.","data-testid":"live-camera-denied",children:"Camera denied"}):c.isRunning?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{type:"button",onClick:()=>c.stop(),className:"rounded border border-rose-300 bg-rose-50 px-2 py-0.5 text-rose-700 dark:border-rose-800 dark:bg-rose-950 dark:text-rose-200 hover:bg-rose-100 dark:hover:bg-rose-900",title:"Stop live camera","data-testid":"live-camera-stop",children:"■ Stop"}),(0,n.jsxs)("span",{className:"rounded border border-border bg-card px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground","data-testid":"live-camera-stats","aria-live":"polite",children:[c.framesUploaded,"f",c.error?(0,n.jsx)("span",{className:"ml-1 text-rose-500",children:"err"}):null]})]}):(0,n.jsx)("button",{type:"button",disabled:"requesting"===c.status,onClick:()=>{c.start()},className:"rounded border px-2 py-0.5 hover:bg-accent disabled:opacity-50",title:"Start live camera — uploads a 1Hz frame stream so the agent can see what you point at","data-testid":"live-camera-start",children:"requesting"===c.status?"Requesting…":"\uD83D\uDCF9 Live"}):null}function V(e){let{terminalId:t,onClear:r,onRecordingChange:l,onAttached:s,voice:o}=e,{client:i,sessionId:c,config:d}=(0,u.Q)(),[p,h]=(0,a.useState)(null),[f,b]=(0,a.useState)(null),[g,x]=(0,a.useState)(!1),[v,w]=(0,a.useState)(null);(0,a.useEffect)(()=>{null==l||l(null!==p)},[p,l]);let y=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=y.current)||e.close()}catch(e){}y.current=null},[]),(0,a.useEffect)(()=>{if(!c)return;y.current||(y.current=i.connectAcp({sessionId:c}));let e=y.current,r=!1;return(async()=>{try{var n;let a=await e.send("terminal/record/list",{sessionId:c});if(r)return;let l=null==a||null==(n=a.recordings)?void 0:n.find(e=>e.terminalId===t);l?h({recorderId:l.recorderId,startedAt:l.startedAt}):h(null),b(null),w(null)}catch(e){(0,m.cY)("webterm.controls.list-error",{reason:String(e)})}})(),()=>{r=!0}},[i,c,t]);let k=(0,a.useCallback)(async()=>{if(!c)return void w("session 미설정 — daemon 연결을 먼저 확인하세요");y.current||(y.current=i.connectAcp({sessionId:c}));let e=y.current;x(!0),w(null),b(null);try{var r,n;let a=await e.send("terminal/record/start",{sessionId:c,terminalId:t});(null==a?void 0:a.started)&&a.recorderId?((0,m.cY)("webterm.controls.record.started",{recorderId:a.recorderId,terminalId:t}),h({recorderId:a.recorderId,startedAt:null!=(r=a.startedAt)?r:Date.now()})):w(null!=(n=null==a?void 0:a.reason)?n:"start failed")}catch(e){w(String(e instanceof Error?e.message:e))}finally{x(!1)}},[i,c,t]),j=(0,a.useCallback)(async()=>{var e,r,n,a;if(!c||!p)return;let l=null!=(e=y.current)?e:i.connectAcp({sessionId:c});y.current=l,x(!0),w(null);try{let e=await l.send("terminal/record/stop",{sessionId:c,terminalId:t});(null==e?void 0:e.stopped)&&e.recorderId&&e.downloadUrl?((0,m.cY)("webterm.controls.record.stopped",{recorderId:e.recorderId,frameCount:e.frameCount,elapsedSec:e.elapsedSec}),b({recorderId:e.recorderId,downloadUrl:e.downloadUrl,frameCount:null!=(r=e.frameCount)?r:0,elapsedSec:null!=(n=e.elapsedSec)?n:0}),h(null)):w(null!=(a=null==e?void 0:e.reason)?a:"stop failed")}catch(e){w(String(e instanceof Error?e.message:e))}finally{x(!1)}},[p,i,c,t]);return(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b px-2 py-1 text-xs",children:[(0,n.jsx)("button",{type:"button",className:"rounded border px-2 py-0.5 hover:bg-accent",onClick:()=>{(0,m.cY)("webterm.controls.clear"),r()},children:"clear"}),(0,n.jsx)(Q.T,{onAttached:s?e=>s([e]):void 0}),(0,n.jsx)(q.u,{onAttached:s}),(0,n.jsx)(_,{}),o&&(0,n.jsxs)("button",{type:"button",onClick:o.onToggle,disabled:o.disabled,title:o.disabled?"마이크 사용 불가 (insecure context 등)":"".concat(o.phaseLabel," \xb7 xterm 으로 typing"),"data-elanous-action":"webterm-voice-toggle-controls","aria-pressed":o.active,className:(0,B.cn)("inline-flex items-center gap-1 rounded border px-2 py-0.5",o.active?"border-rose-300 bg-rose-100 text-rose-800 dark:border-rose-700 dark:bg-rose-950/40 dark:text-rose-100":"hover:bg-accent",o.disabled&&"cursor-not-allowed opacity-50"),children:[(0,n.jsx)("span",{className:(0,B.cn)("h-1.5 w-1.5 rounded-full",o.dotColor,("listening"===o.phase||"speaking"===o.phase)&&"animate-pulse"),"aria-hidden":"true"}),o.active?(0,n.jsx)(O.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(F.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{children:"voice→stdin"})]}),!p&&!f&&(0,n.jsx)("button",{type:"button",disabled:g,className:"rounded border px-2 py-0.5 ".concat(g?"opacity-50":"hover:bg-accent"," text-rose-600 dark:text-rose-400"),onClick:()=>void k(),title:"start asciicast recording",children:"● record"}),p&&(0,n.jsx)("button",{type:"button",disabled:g,className:"rounded border px-2 py-0.5 ".concat(g?"opacity-50":"hover:bg-accent"," bg-rose-600 text-white animate-pulse"),onClick:()=>void j(),title:"stop + save .cast",children:"■ stop"}),f&&(0,n.jsx)("a",{href:(e=>{var t;if(!e)return"";let r=null!=(t=d.baseUrl)?t:"",n=e.includes("?")?"&":"?",a=d.token?"".concat(n,"auth=").concat(encodeURIComponent(d.token)):"";return"".concat(r).concat(e).concat(a)})(f.downloadUrl),download:"".concat(f.recorderId,".cast"),className:"rounded border border-emerald-500 px-2 py-0.5 text-emerald-600 hover:bg-emerald-50 dark:hover:bg-emerald-950",onClick:()=>(0,m.cY)("webterm.controls.download.click",{recorderId:f.recorderId}),title:"".concat(f.frameCount," frames \xb7 ").concat(f.elapsedSec.toFixed(1),"s"),children:"⬇ download .cast"}),f&&(0,n.jsx)("button",{type:"button",className:"rounded border px-2 py-0.5 text-muted-foreground hover:bg-accent",onClick:()=>b(null),title:"dismiss","aria-label":"dismiss download",children:"\xd7"}),(p||f)&&(0,n.jsxs)("span",{className:"ml-auto text-[11px] text-muted-foreground",children:[p&&"● recording",f&&!p&&"✓ ".concat(f.recorderId)]}),v&&(0,n.jsx)("span",{className:"ml-2 max-w-[40%] truncate text-[11px] text-rose-500",title:v,children:v})]})}let G={ctrl:!1,alt:!1},J={up:"A",down:"B",right:"C",left:"D"},K=[{key:"esc",label:"Esc",width:"wide",title:"Escape (vim normal mode)"},{key:"tab",label:"Tab",width:"wide",title:"Tab (autocomplete)"},{key:"left",label:"←",width:"narrow",title:"Left arrow"},{key:"down",label:"↓",width:"narrow",title:"Down arrow"},{key:"up",label:"↑",width:"narrow",title:"Up arrow"},{key:"right",label:"→",width:"narrow",title:"Right arrow"}];function W(e){let{terminalId:t}=e,{sessionId:r}=(0,u.Q)(),[l,s]=(0,a.useState)(!1),[o,i]=(0,a.useState)(!1),c=(0,a.useRef)(!1),d=(0,a.useRef)(!1);c.current=l,d.current=o;let p=(0,a.useRef)(null),h=(0,a.useCallback)((e,t)=>{null!==p.current&&(clearTimeout(p.current),p.current=null),(e||t)&&(p.current=setTimeout(()=>{s(!1),i(!1),p.current=null,(0,m.cY)("webterm.modbar.auto-release",{})},5e3))},[]);(0,a.useEffect)(()=>()=>{null!==p.current&&(clearTimeout(p.current),p.current=null)},[]);let f=(0,a.useCallback)(e=>{if(!r)return void(0,m.cY)("webterm.modbar.no-session",{key:e});let n={ctrl:c.current,alt:d.current},a=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:G;switch(e){case"esc":return t.alt?"\x1b\x1b":"\x1b";case"tab":return t.alt?"\x1b ":" ";case"up":case"down":case"left":case"right":{let r=J[e],n=function(e){if(!e.ctrl&&!e.alt)return null;let t=0;return e.alt&&(t+=2),e.ctrl&&(t+=4),1+t}(t);return null===n?"\x1b[".concat(r):"\x1b[1;".concat(n).concat(r)}}}(e,n);(0,m.cY)("webterm.modbar.send",{key:e,ctrl:n.ctrl,alt:n.alt,bytes:a.length});try{N(t,a)}catch(e){(0,m.cY)("webterm.modbar.send-error",{reason:String(e)})}(n.ctrl||n.alt)&&(s(!1),i(!1),h(!1,!1))},[r,t,h]),b=(0,a.useCallback)(()=>{let e=!c.current;s(e),h(e,d.current)},[h]),g=(0,a.useCallback)(()=>{let e=!d.current;i(e),h(c.current,e)},[h]),x=e=>["flex h-7 items-center justify-center rounded border font-mono text-[11px] px-2 min-w-[36px] active:translate-y-px disabled:opacity-50 transition-colors",e?"border-amber-400 bg-amber-100 text-amber-900 dark:border-amber-500 dark:bg-amber-900 dark:text-amber-100":"border-border bg-card text-muted-foreground hover:bg-muted hover:border-primary hover:text-foreground"].join(" ");return(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-1 border-b border-border bg-background/60 px-2 py-1","data-testid":"modifier-bar",role:"toolbar","aria-label":"Mobile keyboard modifiers",children:[K.map(e=>(0,n.jsx)("button",{type:"button",className:["flex h-7 items-center justify-center rounded border border-border bg-card font-mono text-[11px] text-muted-foreground hover:bg-muted hover:border-primary hover:text-foreground active:translate-y-px disabled:opacity-50","wide"===e.width?"px-2 min-w-[36px]":"w-8"].join(" "),onClick:()=>{f(e.key)},disabled:!r,"aria-label":e.title,title:e.title,"data-testid":"modbar-".concat(e.key),children:e.label},e.key)),(0,n.jsx)("span",{className:"mx-1 text-[10px] text-muted-foreground/60","aria-hidden":!0,children:"\xb7"}),(0,n.jsx)("button",{type:"button",className:x(l),onClick:b,disabled:!r,"aria-label":"Ctrl modifier ".concat(l?"active":"idle"),"aria-pressed":l,title:"Ctrl modifier — toggles. Combines with arrow keys (e.g. Ctrl+→ = next word). Auto-releases after 5s or one keystroke.","data-testid":"modbar-ctrl",children:"Ctrl"}),(0,n.jsx)("button",{type:"button",className:x(o),onClick:g,disabled:!r,"aria-label":"Alt modifier ".concat(o?"active":"idle"),"aria-pressed":o,title:"Alt modifier — toggles. Combines with Esc/Tab/arrows. Auto-releases after 5s or one keystroke.","data-testid":"modbar-alt",children:"Alt"})]})}var Z=r(7548);function X(e){let{foreignActivityTick:t,onPeerCountChange:r}=e,{client:l,sessionId:s}=(0,u.Q)(),[o,i]=(0,a.useState)(0),[c,d]=(0,a.useState)(!1);(0,a.useEffect)(()=>{null==r||r(o)},[o,r]);let p=(0,a.useRef)(null),h=(0,a.useRef)(null),f=(0,a.useCallback)(async()=>{if(!s)return;p.current||(p.current=l.connectAcp({sessionId:s}));let e=p.current;try{let t=await e.send("terminal/peers/count",{sessionId:s});"number"==typeof(null==t?void 0:t.count)&&(i(t.count),(0,m.cY)("webterm.peers.count",{count:t.count}))}catch(e){(0,m.cY)("webterm.peers.count.error",{reason:String(e)})}},[l,s]);return((0,a.useEffect)(()=>{f();let e=()=>{"visible"===document.visibilityState&&f()};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[f]),(0,a.useEffect)(()=>()=>{try{var e;null==(e=p.current)||e.close()}catch(e){}p.current=null,h.current&&clearTimeout(h.current)},[]),(0,a.useEffect)(()=>{t&&(d(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{d(!1),h.current=null,f()},1800))},[t,f]),o<=1&&!c)?null:(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border bg-amber-500/10 px-2 py-0.5 text-[11px]",children:[(0,n.jsx)(Z.A,{className:"h-3 w-3 text-amber-600","aria-hidden":!0}),o>1&&(0,n.jsxs)("span",{className:"font-mono text-amber-700 dark:text-amber-400",children:[o," devices"]}),c&&(0,n.jsx)("span",{className:"ml-auto rounded bg-amber-500 px-1.5 py-0.5 font-medium text-white animate-pulse",children:"\uD83D\uDC64 typing"})]})}var ee=r(70341);function et(e){let{onAttached:t,pageWide:r=!0}=e,{config:s}=(0,u.Q)(),[o,i]=(0,a.useState)(!1),[c,d]=(0,a.useState)(!1),p=(0,a.useRef)(0),h=(0,a.useCallback)(async e=>{if(0!==e.length){if(!s.baseUrl)return void l.oR.error("Daemon URL 미설정 — Settings 에서 입력");d(!0),(0,m.cY)("webterm.dropzone.drop",{count:e.length,totalBytes:e.reduce((e,t)=>e+t.size,0)});try{let r=await (0,H.K)(e.map(e=>({file:e,filename:e.name})),{baseUrl:s.baseUrl,...s.token?{token:s.token}:{}}),n=r.filter(e=>e.ok),a=r.filter(e=>!e.ok);n.length>0&&(l.oR.success(1===n.length?"\uD83D\uDCCE ".concat(n[0].meta.filename):"\uD83D\uDCCE ".concat(n.length," files dropped")),null==t||t(n.map(e=>e.meta))),a.length>0&&l.oR.error(1===a.length?"드롭 실패: ".concat(a[0].reason.slice(0,80)):"".concat(a.length," 파일 드롭 실패"))}finally{d(!1)}}},[s.baseUrl,s.token,t]);return((0,a.useEffect)(()=>{if(!r)return;let e=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&(e.preventDefault(),p.current+=1,i(!0))},t=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&e.preventDefault()},n=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&(e.preventDefault(),p.current=Math.max(0,p.current-1),0===p.current&&i(!1))},a=e=>{if(!e.dataTransfer)return;let t=e.dataTransfer.files;t&&0!==t.length&&(e.preventDefault(),p.current=0,i(!1),h(Array.from(t)))};return document.addEventListener("dragenter",e),document.addEventListener("dragover",t),document.addEventListener("dragleave",n),document.addEventListener("drop",a),()=>{document.removeEventListener("dragenter",e),document.removeEventListener("dragover",t),document.removeEventListener("dragleave",n),document.removeEventListener("drop",a)}},[h,r]),o||c)?(0,n.jsx)("div",{className:"pointer-events-none fixed inset-0 z-50 flex items-center justify-center bg-primary/20 backdrop-blur-sm",children:(0,n.jsxs)("div",{className:"rounded-xl border-2 border-dashed border-primary bg-card px-6 py-4 text-center shadow-lg",children:[(0,n.jsx)(ee.A,{className:"mx-auto h-10 w-10 text-primary","aria-hidden":!0}),(0,n.jsx)("div",{className:"mt-2 text-sm font-medium text-foreground",children:c?"업로드 중…":"Drop files to attach"}),(0,n.jsx)("div",{className:"mt-1 text-xs text-muted-foreground",children:c?"":"iCloud \xb7 Files.app \xb7 폴더 모두 지원"})]})}):null}var er=r(7664),en=r(90668),ea=r(78215),el=r(77933),es=r(18635),eo=r(97663),ei=r(31778),ec=r(84762),ed=r(12863),eu=r(52066),em=r(39199),ep=r(68422),eh=r(7090),ef=r(85165),eb=r(664);async function eg(e,t){if(!t||0===t.length)return null;try{let r=await e.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(t),"?ifExists=1"));if(!r||!Array.isArray(r.messages))return null;let n=function(e){let t=[];return e.forEach((e,r)=>{let n=function(e,t){let r=e.role;if("tool"===r)return{...(0,eb.$Q)("\uD83D\uDEE0️ ".concat(e.toolName||"tool")),id:"hydrate-t-".concat(t)};let n=function(e){if("string"==typeof e)return e;if(!Array.isArray(e))return"";let t=[];for(let n of e)if(n&&"object"==typeof n){let e=n.type;if("text"===e&&"string"==typeof n.text)t.push(n.text);else if("image"===e)t.push("\uD83D\uDCCE image");else if("audio"===e)t.push("\uD83D\uDCCE audio");else if("tool_use"===e){var r;let e=null!=(r=n.name)?r:"tool";t.push("\uD83D\uDEE0️ ".concat(e))}else"tool_result"===e&&t.push("\uD83D\uDEE0️ result")}return t.join("\n").trim()}(e.content);return 0===n.length?null:"user"===r?{...(0,eb.tw)(n),id:"hydrate-u-".concat(t)}:"assistant"===r?{id:"hydrate-a-".concat(t),role:"assistant",text:n,timestamp:Date.now(),meta:{provider:"history"}}:"system"===r?null:{...(0,eb.$Q)(n),id:"hydrate-m-".concat(t)}}(e,r);n&&t.push(n)}),t.slice(-200)}(r.messages);return(0,m.cY)("webterm.terminal-chat.hydrate.ok",{sessionId:t,serverCount:r.messages.length,mappedCount:n.length}),n}catch(e){return(0,m.cY)("webterm.terminal-chat.hydrate.skip",{sessionId:t,reason:e instanceof Error?e.message:String(e)}),null}}let ex=[":cwd",":capture",":peers",":tab next",":tab prev"];function ev(e){let t=(null!=e?e:"").replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,"").replace(/\r/g,"").trim();return t.length>0?t:"(no output)"}let ew=(0,a.forwardRef)(function(e,t){let{terminalId:r,open:s,onTabIntent:o,height:i,voice:c}=e,d="number"==typeof i&&Number.isFinite(i)&&i>0?i:void 0,{client:p,config:h,sessionId:f,setSessionId:b}=(0,u.Q)(),g=(0,a.useRef)(f),x=(0,a.useRef)(null),[v,w]=(0,a.useState)([]),[y,k]=(0,a.useState)(!1),[j,N]=(0,a.useState)(null),[S,I]=(0,a.useState)([]),[C,T]=(0,a.useState)(!1),Y=(0,a.useRef)(async()=>{}),E=(0,a.useRef)(!1);E.current=y;let R=(0,a.useRef)(null),[A,z]=(0,a.useState)(!1),P=(0,ef.$)({enabled:!!(null==c?void 0:c.active)&&!A,language:"ko-KR"}),M=(0,a.useRef)(P);M.current=P,(0,a.useEffect)(()=>{g.current=f},[f]),(0,a.useEffect)(()=>{try{var e;null==(e=x.current)||e.close()}catch(e){}if(x.current=null,s&&f)return x.current=p.connectAcp({sessionId:f}),()=>{try{var e;null==(e=x.current)||e.close()}catch(e){}x.current=null}},[p,s,f]),(0,a.useEffect)(()=>{let e=x.current;if(e&&s&&f)return e.on("sessionUpdate",e=>{var t;let r=R.current;if(!r)return;let n=e.params;if(!n||n.sessionId!==f)return;let a=n.update;if(a&&"agent_message_chunk"===a.sessionUpdate&&(null==(t=a.content)?void 0:t.type)==="text"&&"string"==typeof a.content.text){let e=a.content.text;if(0===e.length)return;w(t=>t.map(t=>{var n;return t.id===r?{...t,text:(null!=(n=t.text)?n:"")+e}:t})),M.current.pushText(e)}})},[s,f]);let D=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(!s||!f||D.current===f)return;D.current=f;let e=!1;return(async()=>{let t=await eg(p,f);e||null===t||w(t)})(),()=>{e=!0}},[p,s,f]);let U=(0,a.useCallback)(e=>{w(t=>[...t,e].slice(-200))},[]);(0,a.useImperativeHandle)(t,()=>({submitVoiceTranscript:e=>{let t=e.trim();if(t){if(E.current)return void(0,m.cY)("webterm.terminal-chat.voice.skip-pending",{len:t.length});(0,m.cY)("webterm.terminal-chat.voice.auto-send",{len:t.length}),Y.current(t)}}}),[]);let L=(0,a.useCallback)(()=>{let e=g.current;return e?(x.current||(x.current=p.connectAcp({sessionId:e})),x.current):null},[p]),$=(0,a.useMemo)(()=>({client:p,sessionId:f,provider:h.provider,setSessionId:b,daemon:{baseUrl:h.baseUrl,...h.token?{token:h.token}:{}},messages:v}),[p,h.baseUrl,h.provider,h.token,v,f,b]),Q=(0,a.useCallback)(e=>{I(t=>[...t,...e]),(0,m.cY)("webterm.terminal-chat.attach.queue",{terminalId:r,added:e.length,filenames:e.map(e=>e.filename)})},[r]),q=(0,a.useCallback)(e=>{I(t=>t.filter(t=>t.id!==e))},[]),H=(0,a.useCallback)(async e=>{let t=e.startsWith(":")?null:await (0,eb.yN)(e,$);if(t){"__CLEAR__"===t.text?w([]):U((0,eb.$Q)(t.text,r)),t.newSessionId&&b(t.newSessionId);return}if(!f)return void U((0,eb.$Q)("session 미설정",r));let n=L();if(!n)return void U((0,eb.$Q)("session 미설정",r));let a=await n.send("terminal/repl/exec",{sessionId:f,terminalId:r,line:e});U((0,eb.$Q)(ev(null==a?void 0:a.output),r)),(null==a?void 0:a.sessionIdChange)&&b(a.sessionIdChange),(null==a?void 0:a.tabIntent)!==void 0&&(null==o||o(a.tabIntent),U((0,eb.$Q)("tab intent → ".concat(String(a.tabIntent)),r))),(null==a?void 0:a.injectPath)&&U((0,eb.$Q)("captured → ".concat(a.injectPath),r)),(null==a?void 0:a.agentChatModeEnter)&&U((0,eb.$Q)("agent chat mode hint — terminal dock already runs plain text as agent turns",r))},[U,$,L,o,f,b,r]),_=(0,a.useCallback)(async()=>{let e=g.current;if(e&&j)try{var t;let n=L();if(!n)return;let a=await n.send("terminal/repl/agent/abort",{sessionId:e,terminalId:r});(0,m.cY)("webterm.terminal-chat.abort",{terminalId:r,aborted:null!=(t=null==a?void 0:a.aborted)&&t}),U((0,eb.$Q)((null==a?void 0:a.aborted)?"agent turn aborted":"no active agent turn to abort",r))}catch(t){let e=t instanceof Error?t.message:String(t);U((0,eb.$Q)("abort failed: ".concat(e),r))}finally{k(!1),N(null)}},[U,L,j,r]),V=(0,a.useCallback)(async e=>{I([]);let t=S.filter(e=>!("string"==typeof e.path&&e.path.length>0)).length;if(t>0){let e=1===t?"첨부 1건이 path 누락으로 누락됐습니다":"첨부 ".concat(t,"건이 path 누락으로 누락됐습니다");l.oR.warning(e),U((0,eb.$Q)("⚠ ".concat(e),r)),(0,m.cY)("webterm.terminal-chat.attach.dropped",{terminalId:r,droppedCount:t,totalCount:S.length})}e.length>0&&U((0,eb.tw)(e,r)),S.length>0&&U((0,eb.$Q)("\uD83D\uDCCE attached: ".concat(S.map(e=>e.filename).join(", ")),r));let n=e.trim();if(n||0!==S.length){k(!0);try{if((0,eb.FM)(n))return void await H(n);if(!f)return void U((0,eb.$Q)("session 미설정",r));let e=L();if(!e)return void U((0,eb.$Q)("session 미설정",r));N(n);let t="assistant-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6));R.current=t,U({id:t,role:"assistant",text:"",timestamp:Date.now(),terminalId:r}),(0,m.cY)("webterm.terminal-chat.turn.start",{terminalId:r,sessionId:f,len:n.length,attachCount:S.length,placeholderId:t});let a=S.filter(e=>e.path).map(e=>"[attached] ".concat(e.path)),l=a.length>0?"".concat(a.join("\n"),"\n\n").concat(n).trimEnd():n,s=await e.send("terminal/repl/exec",{sessionId:f,terminalId:r,line:":agent ".concat(l)});(null==s?void 0:s.agent)?(w(e=>e.map(e=>e.id===t?{...e,text:e.text&&e.text.length>=s.agent.markdown.length?e.text:s.agent.markdown,meta:{provider:s.agent.modelLabel,stopReason:s.agent.stopReason}}:e)),M.current.flush()):(w(e=>e.filter(e=>e.id!==t)),U((0,eb.$Q)(ev(null==s?void 0:s.output),r))),(0,m.cY)("webterm.terminal-chat.turn.end",{terminalId:r,hasAgent:!!(null==s?void 0:s.agent)})}catch(n){let e=n instanceof Error?n.message:String(n),t=R.current;t&&w(e=>e.filter(e=>e.id!==t)),M.current.cancel(),U((0,eb.$Q)("error: ".concat(e),r)),l.oR.error("terminal chat failed: ".concat(e))}finally{R.current=null,k(!1),N(null)}}},[U,L,H,S,f,r]);return((0,a.useEffect)(()=>{Y.current=V},[V]),s)?(0,n.jsxs)("div",{className:"shrink-0 border-t border-border bg-background/95","data-terminal-chat-dock":!0,children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/80 px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[(0,n.jsx)("span",{className:"inline-flex h-7 w-7 items-center justify-center rounded-md border border-primary/30 bg-primary/10 text-primary",children:(0,n.jsx)(en.A,{className:"h-4 w-4"})}),(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"truncate text-sm font-medium",children:"Terminal Chat Dock"}),(0,n.jsxs)("div",{className:"truncate text-[11px] text-muted-foreground",children:[r," \xb7 plain text = contextual agent turn \xb7 ",(0,n.jsx)("code",{className:"rounded bg-muted px-1",children:":commands"})," stay local"]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[c&&(0,n.jsxs)("button",{type:"button",onClick:c.onToggle,disabled:c.disabled,title:c.disabled?"마이크 사용 불가 (insecure context 등)":c.phaseLabel,"data-elanous-action":"webterm-voice-toggle-dock","aria-pressed":c.active,className:(0,B.cn)("inline-flex h-7 items-center gap-1.5 rounded-md border px-2 text-[11px]",c.active?"border-rose-300 bg-rose-100 text-rose-800 dark:border-rose-700 dark:bg-rose-950/40 dark:text-rose-100":"border-border hover:bg-accent",c.disabled&&"cursor-not-allowed opacity-50"),children:[(0,n.jsx)("span",{className:(0,B.cn)("h-1.5 w-1.5 rounded-full",c.dotColor,("listening"===c.phase||"speaking"===c.phase)&&"animate-pulse"),"aria-hidden":"true"}),c.active?(0,n.jsx)(O.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(F.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{className:"hidden sm:inline",children:c.phaseLabel})]}),c&&c.active&&P.supported&&(0,n.jsx)("button",{type:"button",onClick:()=>{A||M.current.cancel(),z(e=>!e)},title:A?"음성 응답 켜기":"음성 응답 끄기","data-elanous-action":"webterm-tts-mute-toggle","aria-pressed":A,className:(0,B.cn)("inline-flex h-7 items-center justify-center rounded-md border px-2 text-[11px]",A?"border-border bg-muted text-muted-foreground":"border-fuchsia-300 bg-fuchsia-50 text-fuchsia-800 dark:border-fuchsia-700 dark:bg-fuchsia-950/40 dark:text-fuchsia-100"),children:A?(0,n.jsx)(ea.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(el.A,{className:"h-3.5 w-3.5"})}),(0,n.jsx)(em.Qh,{}),(0,n.jsx)(er.vG,{children:(0,n.jsx)(eu.rm,{})}),(0,n.jsx)(er.vG,{children:(0,n.jsx)(ep.D,{})}),j&&(0,n.jsxs)(eh.$,{variant:"destructive",size:"sm",onClick:()=>void _(),title:"abort active terminal-context agent turn",children:[(0,n.jsx)(es.A,{className:"h-3.5 w-3.5"}),"Stop"]}),(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)(eh.$,{variant:"outline",size:"icon-sm",onClick:()=>T(e=>!e),"aria-label":"terminal quick commands",title:"terminal quick commands",children:(0,n.jsx)(eo.A,{className:"h-3.5 w-3.5"})}),C&&(0,n.jsx)("div",{className:"absolute right-0 top-full z-40 mt-1 w-44 rounded-md border border-border bg-popover p-1 shadow-md",children:ex.map(e=>(0,n.jsx)("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left font-mono text-[11px] hover:bg-accent",onClick:()=>{T(!1),V(e)},children:e},e))})]})]})]}),j&&(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/70 px-3 py-2 text-[11px] text-muted-foreground",children:[(0,n.jsx)(ei.A,{className:"h-3.5 w-3.5 animate-spin"}),(0,n.jsxs)("span",{className:"truncate",children:["terminal-context agent turn in progress",j.length>0?" \xb7 ".concat(j.slice(0,120)).concat(j.length>120?"…":""):""]})]}),(0,n.jsxs)("div",{className:(0,B.cn)("grid grid-rows-[1fr_auto]",void 0===d?"h-[clamp(160px,30vh,360px)] min-h-[200px]":void 0),...void 0===d?{}:{style:{height:d}},children:[(0,n.jsx)(ec.D,{messages:v,pending:y,tabId:"dock-".concat(r)}),(0,n.jsx)(ed.V,{onSubmit:V,disabled:y,attachments:S,onAttached:Q,onRemoveAttachment:q,tabId:"dock-".concat(r),...c?{voice:c}:{}})]})]}):null});var ey=r(80571),ek=r(10708);let ej=/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./;function eN(){if(!window.location)return{isSecure:!1,reason:"unknown",hostname:"",protocol:""};let e=function(e,t){let r="https:"===e,n="http:"===e;return"localhost"===t||"127.0.0.1"===t||"[::1]"===t||"::1"===t?{isSecure:!0,reason:"localhost",hostname:t,protocol:e}:r&&/\.ts\.net$/i.test(t)?{isSecure:!0,reason:"https-tsnet",hostname:t,protocol:e}:r?{isSecure:!0,reason:"https-other",hostname:t,protocol:e}:n&&ej.test(t)?{isSecure:!1,reason:"http-tailscale",hostname:t,protocol:e,guidance:"Tailscale 100.x 주소는 HTTP라 마이크 권한이 차단됩니다. `tailscale serve` 또는 funnel 로 ts.net HTTPS 호스트를 노출하면 마이크가 동작합니다."}:n?{isSecure:!1,reason:"http-other",hostname:t,protocol:e,guidance:"브라우저는 HTTP origin 에서 마이크 접근을 차단합니다. HTTPS 로 접속하거나 localhost 로 옮기세요."}:{isSecure:!1,reason:"unknown",hostname:t,protocol:e}}(window.location.protocol,window.location.hostname);return e.isSecure&&!1===window.isSecureContext?{...e,isSecure:!1,reason:"unknown",guidance:"현재 origin 이 secure context 가 아닙니다 (브라우저 판정). HTTPS 로 접속하세요."}:e}let eS="elanous.webterm.voiceBanner.dismissed",eI={isSecure:!1,reason:"unknown",hostname:"",protocol:""};function eC(){var e;let{statusOverride:t}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[r,l]=(0,a.useState)(!1),[s,o]=(0,a.useState)(null!=t?t:eI);if((0,a.useEffect)(()=>{l(function(){try{return"1"===window.sessionStorage.getItem(eS)}catch(e){return!1}}()),o(null!=t?t:eN())},[t]),s.isSecure||r)return null;let i="http-tailscale"===s.reason?"\uD83C\uDF99 Tailscale HTTP 에서 마이크가 차단됩니다":"\uD83C\uDF99 마이크 사용을 위해 HTTPS 가 필요합니다";return(0,n.jsxs)("div",{role:"alert","aria-live":"polite","data-testid":"webterm-voice-banner","data-reason":s.reason,className:"flex items-start gap-2 border-b border-amber-300 bg-amber-50 px-3 py-2 text-[12px] text-amber-900 dark:border-amber-700 dark:bg-amber-950/40 dark:text-amber-100",children:[(0,n.jsx)(ey.A,{className:"mt-[1px] h-3.5 w-3.5 shrink-0","aria-hidden":"true"}),(0,n.jsxs)("div",{className:"flex-1",children:[(0,n.jsx)("div",{className:"font-medium",children:i}),(0,n.jsx)("div",{className:"mt-0.5 text-amber-800/90 dark:text-amber-200/80",children:null!=(e=s.guidance)?e:"브라우저는 secure context (HTTPS \xb7 localhost) 에서만 마이크를 허용합니다."}),"http-tailscale"===s.reason&&(0,n.jsxs)("div",{className:"mt-1 font-mono text-[11px] text-amber-700 dark:text-amber-200/90",children:[(0,n.jsx)("code",{children:"tailscale serve --bg --https=443 31415"})," ","or"," ",(0,n.jsx)("a",{href:"https://tailscale.com/kb/1242/tailscale-serve",target:"_blank",rel:"noopener noreferrer",className:"underline hover:text-amber-900 dark:hover:text-amber-50",children:"ts.net HTTPS 가이드"})]})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{try{window.sessionStorage.setItem(eS,"1")}catch(e){}l(!0)},"aria-label":"dismiss banner",title:"이 세션 동안 숨기기",className:"rounded p-0.5 text-amber-700 hover:bg-amber-100 dark:text-amber-200 dark:hover:bg-amber-900/40",children:(0,n.jsx)(ek.A,{className:"h-3.5 w-3.5"})})]})}async function eT(e){var t;let{terminalId:r,paths:n}=e,a=null==(t=e.alsoCopyToClipboard)||t,l=n.filter(e=>"string"==typeof e&&e.length>0).map(e=>"'".concat(e.replace(/'/g,"'\\''"),"'")).join(" ");if(!l)return{injected:!1,copied:!1};let s="".concat(l," "),o=!1;try{(o=N(r,s))?(0,m.cY)("webterm.attach.inject.ok",{terminalId:r,pathCount:n.length,bytes:s.length}):(0,m.cY)("webterm.attach.inject.error",{terminalId:r,reason:"no-sender"})}catch(e){(0,m.cY)("webterm.attach.inject.error",{terminalId:r,reason:String(e)})}let i=!1;if(a&&"undefined"!=typeof navigator&&navigator.clipboard)try{await navigator.clipboard.writeText(l),i=!0,(0,m.cY)("webterm.attach.clipboard.ok",{pathCount:n.length})}catch(e){(0,m.cY)("webterm.attach.clipboard.skip",{reason:String(e)})}return{injected:o,copied:i}}var eY=r(72106),eE=r(45186),eR=r(67007),eA=r(96648);function ez(e){return e.length<=32?e:"…".concat(e.slice(-32))}function eP(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();if("number"!=typeof e||!Number.isFinite(e)||!Number.isFinite(t)||e>t)return null;let r=new Date(e);return Number.isFinite(r.getTime())?(0,eA.KW)(r.toISOString(),t):null}function eM(e){let t=new Map,r=new Set,n=new Set,a=[];for(let r of e){var l,s;if(n.has(r.id))continue;n.add(r.id),a.push(r);let e=null==(l=r.runId)?void 0:l.trim();if(!e)continue;let o=null!=(s=t.get(e))?s:[];o.push(r),t.set(e,o)}let o=[];for(let[e,n]of t){let t=function(e){let t=e.filter(e=>e.alive&&Number.isFinite(e.startedAt));if(0===t.length)return;let r=Math.max(...t.map(e=>{let{startedAt:t}=e;return t})),n=t.filter(e=>{let{startedAt:t}=e;return t===r});return 1===n.length?n[0]:void 0}(n);if(!t){for(let e of n)r.add(e.id);continue}o.push({runId:e,split:t.id,tabs:n.filter(e=>e.id!==t.id).map(e=>{let{id:t}=e;return t})})}let i=new Set(o.flatMap(e=>{let{split:t,tabs:r}=e;return[t,...r]}));return{layouts:o,unknown:a.filter(e=>{let{id:t}=e;return r.has(t)&&!i.has(t)}).map(e=>{let{id:t}=e;return{id:t,reason:"relationship-unavailable"}})}}function eD(e){return{layouts:e.layouts.map(e=>{let{runId:t,split:r,tabs:n}=e;return{runId:t,slots:[{terminalId:r,position:"split"},...n.map(e=>({terminalId:e,position:"tab"}))]}}),unknown:e.unknown.map(e=>({...e}))}}let eU=["terminal","observe","pty-list"],eL="elanous.webterm.activeId",e$="elanous.webterm.panelsMinimized",eO="elanous.webterm.chatDockOpen";function eF(e){return e.sourceRoot?{sourceRoot:e.sourceRoot.dbPath}:{}}function eB(e){let{layout:t,sessionId:r,onForeignInputActivity:a,terminalIds:l,activeId:s=null,visible:o=!0,clearRequests:i}=e,c=t.layouts.flatMap(e=>e.slots),d=new Map(c.map(e=>[e.terminalId,e])),u=new Set(t.layouts.map(e=>{var t;return null==(t=e.slots[0])?void 0:t.terminalId}).filter(e=>!!e)),m=void 0===l?c.map(e=>e.terminalId):[...new Set([...l,...s?[s]:[],...c.map(e=>e.terminalId)])],p=new Set(c.length>0?c.map(e=>e.terminalId):s?[s]:[]);return(0,n.jsxs)("div",{className:o?"grid h-full min-h-0 grid-cols-2 gap-2 p-2":"hidden","aria-label":"런별 터미널 배치",children:[t.layouts.map(e=>{let{runId:t}=e;return(0,n.jsx)("section",{className:"sr-only","aria-label":"런 ".concat(t," 터미널")},t)}),m.map(e=>{var t,l;let c=d.get(e),m=o&&p.has(e),h=null!=(t=null==c?void 0:c.position)?t:e===s?"single":"inactive-tab";return(0,n.jsxs)("div",{className:m?"".concat(u.has(e)?"col-start-1 ":"").concat((null==c?void 0:c.position)==="split"?"min-h-0 border border-emerald-600":(null==c?void 0:c.position)==="tab"?"min-h-0 border border-zinc-700":"col-span-2 h-full min-h-0"):"hidden","data-pane-position":h,"data-terminal-id":e,children:[c&&(0,n.jsxs)("p",{className:"sr-only",children:["split"===c.position?"분할 터미널":"탭 터미널",": ",e]}),(0,n.jsx)(S,{sessionId:r,terminalId:e,clearRequest:null!=(l=null==i?void 0:i[e])?l:0,onForeignInputActivity:a},e)]},e)}),t.unknown.map(e=>{let{id:t,reason:r}=e;return(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-terminal-id":t,"data-pane-relationship":r,children:["터미널 ",t,": 관계를 알 수 없어 배치하지 않았습니다."]},t)})]})}function eQ(){var e,t,r;let{initialPtyId:s=null,onPtySelection:o}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{client:i,config:c,sessionId:d}=(0,u.Q)(),{isCoarsePointer:p}=function(){let[e,t]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia("(pointer: coarse)");t(e.matches);let r=e=>{t(e.matches)};return"function"==typeof e.addEventListener?(e.addEventListener("change",r),()=>e.removeEventListener("change",r)):"function"==typeof e.addListener?(e.addListener(r),()=>e.removeListener(r)):void 0},[]),{isCoarsePointer:e}}(),[h,f]=(0,a.useState)(null),[b,g]=(0,a.useState)({}),[x,v]=(0,a.useState)([]),[w,y]=(0,a.useState)(!1),[k,j]=(0,a.useState)(null),[S,I]=(0,a.useState)(null),[C,T]=(0,a.useState)(!1);(0,a.useEffect)(()=>{var e,t;let r=null!=(t=null==(e=window.location)?void 0:e.search)?t:"",n=function(e){let t=new URLSearchParams(e).get("wall");return t?t.split(",").map(e=>e.trim()).filter(Boolean).slice(0,3):[]}(r);n.length&&I(n),"1"===new URLSearchParams(r).get("stage")&&T(!0)},[]);let[Y,R]=(0,a.useState)({status:"pending"}),A=function(e,t){let r="ready"===e.status&&"local"===e.issuedBy&&"restored-tab"!==e.fallbackReason,n="ready"===e.status&&e.fallbackReason?e.fallbackReason:"사유 미상";return{placeholder:t?null:"pending"===e.status?e.slow?"데몬이 느립니다 — 터미널을 만드는 중… (기다리는 중)":"터미널 이름을 준비하는 중…":"터미널 이름을 로컬에서 정했습니다 (".concat(n,")."),fallbackBanner:r?"터미널 이름을 로컬에서 정했습니다 (".concat(n,"). 데몬 발급을 확인하지 못했습니다."):null}}(Y,null!==h),z=(0,a.useCallback)(e=>{R(e),"pending"===e.status&&f(null)},[]),P=(0,a.useRef)(!1),U=(0,a.useRef)(!1),[L,O]=(0,a.useState)("terminal"),F={view:L,buttons:eU.map(e=>({view:e,selected:e===L}))},B=(0,a.useCallback)(e=>{O(t=>"observe"===e&&"observe"===t?"terminal":e)},[]),[Q,q]=(0,a.useState)(!!s),[H,_]=(0,a.useState)([]),[G,J]=(0,a.useState)(),[K,Z]=(0,a.useState)(new Map),[ee,er]=(0,a.useState)("loading"),[en,ea]=(0,a.useState)(null),[el,es]=(0,a.useState)(null),eo=(0,a.useRef)(!1),ei=null!=(r=null==en?void 0:en.id)?r:null,ec=en?(0,eR.x3)(en):null,[ed,eu]=(0,a.useState)("raw"),[em,ep]=(0,a.useState)(new Map),[eh,ef]=(0,a.useState)(new Map),[eb,eg]=(0,a.useState)({status:"unrequested"}),ex=(0,a.useRef)(0),ev=(0,a.useRef)(0);(0,a.useEffect)(()=>{if("terminal"!==L&&"pty-list"!==L)return;let e=!1;return er("loading"),(async()=>{try{let[t,r]=await Promise.all([i.listTerminals((0,eR.tC)(Q)),i.listProgressFrames().catch(e=>((0,m.cY)("webterm.pty-list.progress.error",{reason:String(e)}),null))]);if(e)return;_((0,eR.xu)(t.terminals)),J(t.scope),Z(r?(0,eR.gA)(r.logs):new Map),er("idle")}catch(t){if(e)return;_([]),J(void 0),Z(new Map),er("error"),(0,m.cY)("webterm.pty-list.error",{reason:String(t)})}})(),()=>{e=!0}},[i,Q,L]),(0,a.useEffect)(()=>{null===ec||H.some(e=>(0,eR.x3)(e)===ec)||(ex.current+=1,ev.current+=1,ea(null),eg({status:"unrequested"}))},[H,ec]);let ey=(0,a.useCallback)((e,t)=>{let{id:r}=e,n=(0,eR.x3)(e),a=++ex.current;if("raw"===t){ep(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalScrollback(e.id,100,eF(e)).then(e=>{ex.current===a&&e.id===r&&ep(t=>new Map(t).set(n,{status:"ready",scrollback:e.scrollback}))}).catch(e=>{ex.current===a&&(ep(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.scrollback.error",{id:r,reason:String(e)}))});return}ef(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalFrame(e.id,eF(e)).then(e=>{ex.current===a&&e.id===r&&ef(t=>new Map(t).set(n,{status:"ready",frame:e.frame,frameAt:e.frameAt,frameSource:e.frameSource}))}).catch(e=>{ex.current===a&&(ef(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.frame.error",{id:r,reason:String(e)}))})},[i]),ek=(0,a.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],{id:r}=e;if(t&&(y(!1),j(e),null==o||o(e)),ec===(0,eR.x3)(e))return;let n=++ev.current;ea(e),eg({status:"loading"}),ey(e,ed),i.fetchTerminalLineage(r).then(e=>{ev.current===n&&e.key===r&&eg({status:"ready",lineage:e})}).catch(e=>{ev.current===n&&(eg({status:"error"}),(0,m.cY)("webterm.pty-list.lineage.error",{id:r,reason:String(e)}))})},[i,o,ed,ey,ec]);(0,a.useEffect)(()=>{if(eo.current||"loading"===ee||(eo.current=!0,!s))return;if("error"===ee){es({kind:"list-unavailable"}),O("pty-list"),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:"list-unavailable",reason:"pty-list-error"});return}let e=(0,eR.hH)(s,H);es(e),"selected"!==e.kind&&O("pty-list"),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:e.kind,reason:e.reason}),"selected"===e.kind&&(ek(e.terminal),j(e.terminal))},[ek,s,ee,H]);let ej=(0,a.useCallback)(e=>{e!==ed&&(eu(e),en&&ey(en,e))},[ed,ey,en]),eS=(0,a.useCallback)(async e=>{var t;let r=window.prompt("새 PTY 이름을 입력하세요.",null!=(t=e.nickname)?t:"");if(null!==r)try{let t=await i.renameTerminal(e.id,r),n=function(e){switch(e.status){case"success":return"PTY 이름을 '".concat(e.name,"'(으)로 바꿨습니다.");case"invalid-name":return"이 이름은 사용할 수 없습니다. 다른 이름을 입력해 주세요.";case"unknown-pty":return"이 PTY를 찾을 수 없습니다. 목록을 새로고침한 뒤 다시 시도해 주세요.";case"denied":return"이 PTY의 이름을 바꿀 권한이 없습니다.";case"failed":return"PTY 이름 변경에 실패했습니다. 잠시 후 다시 시도해 주세요.";case"owner-unreachable":return"PTY 소유 프로세스에 연결할 수 없어 이름을 바꾸지 못했습니다.";default:return e}}(t);"success"===t.status?l.oR.success(n):l.oR.error(n)}catch(e){l.oR.error("PTY 이름 변경 요청에 실패했습니다: ".concat(String(e)))}},[i]),eI=(0,a.useMemo)(()=>(0,eR.lH)(Q,H,G,ec,em,ed,eh),[eh,Q,H,G,ed,em,ec]),eA=(0,a.useMemo)(()=>(0,eR.Kh)(ei,eb),[eb,ei]),eQ=(0,a.useMemo)(()=>(function(e,t){let r=t.trim();return r?{layouts:e.layouts.filter(e=>{let{slots:t}=e;return t.some(e=>e.terminalId===r)}).map(e=>({runId:e.runId,slots:e.slots.map(e=>({...e}))})),unknown:e.unknown.map(e=>({...e}))}:{layouts:[],unknown:e.unknown.map(e=>({...e}))}})(null===k&&(null===s||w)?eD(eM(H)):eD(eM(H.filter(e=>{var t;return e.id!==(null!=(t=null==k?void 0:k.id)?t:s)&&x.includes(e.id)}))),null!=h?h:""),[H,x,k,w,s,h]);(0,a.useEffect)(()=>{if(P.current||s||"loading"===ee)return;if(0===H.length){U.current||(U.current=!0,(0,m.cY)("webterm.initial-selection",{skipped:!0,reason:"no-terminals",listState:ee}));return}P.current=!0;let e=(0,eR.Dw)({storedId:null,fallbackId:h,terminals:H});(0,m.cY)("webterm.initial-selection",{terminalId:e.terminalId,reason:e.reason,rowCount:H.length}),e.terminalId!==h&&f(e.terminalId)},[H,ee]);let[eq,eH]=(0,a.useState)(0),[e_,eV]=(0,a.useState)(!1),[eG,eJ]=(0,a.useState)(!0),[eK,eW]=(0,a.useState)(!1),[eZ,eX]=(0,a.useState)(0),[e0,e1]=(0,a.useState)(null),e2=(0,a.useCallback)(e=>{e1({intent:e,nonce:Date.now()})},[]),e3=(0,a.useRef)(null),[e5,e7]=(0,a.useState)("none"),e8=(0,a.useRef)(e5);e8.current=e5;let e4=(0,a.useRef)(h);e4.current=h;let e9=(0,a.useCallback)(e=>{let t=e.trim();if(!t)return;let r=e8.current;if("controls"===r){let e=e4.current;if(!e)return;if(!N(e,t+" ")){(0,m.cY)("webterm.voice.stdin-inject-failed",{len:t.length,terminalId:e,reason:"no-sender"}),l.oR.error("터미널 입력 전송 실패 — 터미널 연결을 확인하고 다시 말해 주세요.");return}(0,m.cY)("webterm.voice.stdin-inject",{len:t.length,terminalId:e})}else if("dock"===r){var n;null==(n=e3.current)||n.submitVoiceTranscript(t)}else(0,m.cY)("webterm.voice.transcript-no-source",{len:t.length})},[]),e6=i.voiceWsUrl(),te=(0,eY.sS)({wsUrl:e6,...c.token?{token:c.token}:{},onTranscript:e9}),tt=(0,a.useMemo)(()=>eN(),[]),tr=!c.baseUrl||!tt.isSecure,tn=(0,a.useCallback)(()=>{te.active&&"dock"===e5?(e7("none"),te.toggle()):(e7("dock"),te.active||te.toggle())},[te,e5]),ta=(0,a.useCallback)(()=>{te.active&&"controls"===e5?(e7("none"),te.toggle()):(e7("controls"),te.active||te.toggle())},[te,e5]),tl=(0,a.useMemo)(()=>({active:te.active&&"dock"===e5,phase:te.phase,dotColor:eE.x[te.phase],phaseLabel:eE.g[te.phase],disabled:tr,onToggle:tn}),[te.active,te.phase,e5,tr,tn]),ts=(0,a.useMemo)(()=>({active:te.active&&"controls"===e5,phase:te.phase,dotColor:eE.x[te.phase],phaseLabel:eE.g[te.phase],disabled:tr,onToggle:ta}),[te.active,te.phase,e5,tr,ta]),to=(0,a.useRef)(tn);to.current=tn,(0,a.useEffect)(()=>{let e=e=>{"m"===e.key.toLowerCase()&&e.shiftKey&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),(0,m.cY)("webterm.voice.shortcut.toggle"),eJ(!0),to.current())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,a.useEffect)(()=>{let e=window.localStorage.getItem(eL);e&&e.length>0&&(!s||e!==s)&&(f(e),P.current=!0),"1"===window.localStorage.getItem(e$)&&eV(!0),"0"===window.localStorage.getItem(eO)&&eJ(!1)},[]);let ti=(0,a.useCallback)(async e=>{if(!d||!h||0===e.length)return;let t=e.map(e=>e.path).filter(e=>"string"==typeof e&&e.length>0);if(0===t.length)return void(0,m.cY)("webterm.attach.no-path",{count:e.length});let r=await eT({terminalId:h,paths:t});if(r.injected){let e=1===t.length?"터미널에 path 첨부됨":"".concat(t.length," paths 터미널에 첨부됨"),n=r.copied?" \xb7 clipboard 도 복사":"";l.oR.success(e+n)}else l.oR.error("터미널 inject 실패 — 직접 paste 해주세요")},[i,d,h]);return(0,n.jsxs)("div",{className:"flex h-full flex-col",children:[(0,n.jsx)(D.ZO,{activeId:h,onActiveChange:e=>{f(e),window.localStorage.setItem(eL,e),j(null),y(!0),O("terminal")},onInitialTerminalState:z,minimized:e_,onToggleMinimize:()=>{eV(e=>{let t=!e;return window.localStorage.setItem(e$,t?"1":"0"),t})},recording:eK,peerCount:eZ,chatDockOpen:eG,onToggleChatDock:()=>{if(e_){eV(!1),window.localStorage.setItem(e$,"0"),eJ(!0),window.localStorage.setItem(eO,"1");return}eJ(e=>{let t=!e;return window.localStorage.setItem(eO,t?"1":"0"),requestAnimationFrame(()=>{window.dispatchEvent(new Event("resize"))}),t})},tabIntent:e0,onTabsChange:v,suspendInitialSpawn:!!s&&!w}),A.fallbackBanner&&(0,n.jsx)("p",{className:"border-b border-amber-700/50 bg-amber-950/30 px-3 py-1 text-xs text-amber-200",role:"status",children:A.fallbackBanner}),(0,n.jsx)(eC,{}),(0,n.jsxs)("div",{className:e_?"hidden":"flex items-center gap-2 border-b border-zinc-800 px-3 py-1",children:[(0,n.jsx)("button",{type:"button","aria-pressed":F.buttons[0].selected,onClick:()=>{j(null),y(!0),B("terminal")},className:"rounded px-2 py-1 text-xs ".concat(F.buttons[0].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:"터미널"}),(0,n.jsxs)("button",{type:"button","aria-pressed":F.buttons[1].selected,onClick:()=>{j(null),y(!0),B("observe")},className:"rounded px-2 py-1 text-xs ".concat(F.buttons[1].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),title:"자기신고하는 elanous 대시보드 TUI 를 라이브로 관측(읽기 전용)",children:["\uD83D\uDDA5 TUI 관측 ",F.buttons[1].selected?"ON":"OFF"]}),(0,n.jsx)("button",{type:"button","aria-pressed":F.buttons[2].selected,onClick:()=>{j(null),y(!0),B("pty-list")},className:"rounded px-2 py-1 text-xs ".concat(F.buttons[2].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:"PTY 목록"}),(0,n.jsx)("button",{type:"button","aria-pressed":null!==S,onClick:()=>I(e=>null===e?[]:null),className:"rounded px-2 py-1 text-xs ".concat(null!==S?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),"data-elanous-action":"pty-wall",children:"▦ 나란히"})]}),h?(0,n.jsxs)("div",{className:e_||"terminal"!==L||null!==k||s&&!w?"hidden":"contents",children:[(0,n.jsx)(X,{foreignActivityTick:eq,onPeerCountChange:eX}),(0,n.jsx)(V,{terminalId:h,onClear:()=>g(e=>{var t;return{...e,[h]:(null!=(t=e[h])?t:0)+1}}),onRecordingChange:eW,onAttached:ti,voice:ts}),p&&(0,n.jsx)(W,{terminalId:h}),(0,n.jsx)(et,{onAttached:ti})]}):null,(0,n.jsxs)("div",{className:"relative flex-1 min-h-0",children:[null!==S&&(0,n.jsx)("div",{className:C?"fixed inset-0 z-50":"absolute inset-0 z-20","data-pty-wall-stage":C?"1":void 0,children:(0,n.jsx)(M,{rows:H,client:i,initial:S,stage:C,onClose:()=>{I(null);let e=new URLSearchParams(window.location.search);e.delete("wall"),window.history.replaceState(null,"","".concat(window.location.pathname).concat(e.toString()?"?".concat(e):""))}})}),(0,n.jsx)(eB,{layout:eQ,sessionId:d,terminalIds:x.filter(e=>e!==(null==k?void 0:k.id)&&(w||e!==s)),activeId:h&&(h===(null==k?void 0:k.id)||!w&&h===s)?null:h,clearRequests:b,visible:null!==h&&"terminal"===L&&null===k&&(!s||w),onForeignInputActivity:()=>eH(e=>e+1)}),k&&(0,n.jsx)(E,{terminal:k,client:i,onClose:()=>{y(!0),j(null),B("terminal")}},(0,eR.x3)(k)),k||"terminal"!==L||h&&(!s||w)?k?null:"pty-list"===L?(0,n.jsxs)("div",{className:"h-full overflow-auto p-3","aria-label":"데몬 PTY 목록",children:[(0,n.jsxs)("label",{className:"mb-3 flex items-center gap-2 text-sm",children:[(0,n.jsx)("input",{type:"checkbox",checked:eI.includeAll,onChange:e=>q(e.target.checked)}),"다른 인스턴스도 보기"]}),eI.scopeSummary&&(0,n.jsx)("p",{className:"mb-3 text-xs text-muted-foreground","aria-label":"PTY 목록 범위 요약",children:eI.scopeSummary}),(null==el?void 0:el.kind)==="ambiguous"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-amber-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"가 ",el.candidates.length,"개 행과 맞아 선택하지 않았습니다."]}),(null==el?void 0:el.kind)==="list-unavailable"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-rose-500",role:"status","aria-label":"URL PTY 선택 상태",children:["PTY 목록을 읽지 못해 주소의 PTY ",s,"를 확인할 수 없습니다. 목록이 비었다는 뜻이 \xab아닙니다\xbb."]}),(null==el?void 0:el.kind)==="not-found"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-rose-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"를 찾지 못했습니다 (",el.reason,")."]}),(null==(t=eI.rows.find(e=>e.view))||null==(e=t.view)?void 0:e.visible)&&(0,n.jsx)("div",{className:"mb-3 flex gap-2","aria-label":"PTY 화면 보기",children:eI.rows.find(e=>e.view).view.modes.map(e=>(0,n.jsx)("button",{type:"button","aria-pressed":e.selected,onClick:()=>ej(e.mode),className:"rounded px-2 py-1 text-xs ".concat(e.selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:e.label},e.mode))}),"loading"===ee?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"PTY 목록을 불러오는 중…"}):"error"===ee?(0,n.jsx)("p",{className:"text-sm text-rose-500",children:"PTY 목록을 불러오지 못했습니다."}):0===H.length?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"데몬이 아는 PTY가 없습니다."}):(0,n.jsx)("ul",{className:"space-y-2",children:eI.rows.map(e=>{let{terminal:t}=e,r=function(e){var t,r,n;let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),l=e.name||e.id,s=function(e,t,r){let n=[e,t].filter(Boolean).join("/")||r;if(!n||!e||n.length<=32)return n&&ez(n);if(!t)return e.length<=32?e:"…".concat(e.slice(-31));let a=32-e.length-2;return a<=0?e.length<=32?e:"…".concat(e.slice(-31)):"".concat(e,"/…").concat(t.slice(-a))}(e.treeName,e.worktreeName,e.workdir),o=function(e){var t;if(!(null==e?void 0:e.name)&&!(null==e?void 0:e.dbPath))return null;let r=[e.name&&ez(e.name),e.dbPath&&((t=e.dbPath).length<=32?t:"".concat(t.slice(0,31),"…"))].filter(e=>!!e);return"세션: ".concat(r.join(" \xb7 "))}(e.sourceRoot),i=eP(e.startedAt,a),c=void 0===e.lastControlAt?null:eP(e.lastControlAt,a);return{title:l,details:[...l===e.id?[]:[e.id],...e.status?["상태: ".concat(e.status)]:[],...e.kind?["종류: ".concat(e.kind)]:[],...e.nickname?["별명: ".concat(ez(e.nickname))]:[],...s?["위치: ".concat(s)]:[],e.alive?"생존: 실행 중":0===e.exitCode?"종료: 정상 종료 (exit 0)":"number"==typeof e.exitCode?"종료: 비정상 종료 (exit ".concat(e.exitCode,")"):"종료: 종료 코드 미상",function(e){if("direct-human"===e.terminalOriginCategory)return"출처: 사람";if("elanous"===e.terminalOriginCategory)return"출처: elanous";if("external-tool"===e.terminalOriginCategory)return e.externalToolName?"출처: 외부 도구 \xb7 ".concat(ez(e.externalToolName)):"출처: 외부 도구";let t=e.terminalOriginReason?" \xb7 ".concat(ez(e.terminalOriginReason)):"";return"출처: 이 행에서는 알 수 없음".concat(t)}(e),...e.controller?["통제: ".concat(ez(e.controller))]:[],"write"===(t=e.accessMode)?"접근: 쓰기":"read"===t?"접근: 읽기":"auto"===t?"접근: 자동":"접근: 이 행에서는 알 수 없음","running"===(r=e.ownerRunUsage)?"소유 런: 실행 중":"terminated-live-owner"===r?"소유 런: 종료됐지만 터미널 유지":"no-run-id"===r?"소유 런: 소유 런 정보 없음":"소유 런: 이 행에서는 알 수 없음",...e.instance?["우주: ".concat(ez(e.instance))]:[],...e.runId?["런: ".concat((n=e.runId).length<=8?n:"".concat(n.slice(0,8),"…"))]:[],...o?[o]:[],...i?["시작: ".concat(i)]:[],"마지막 제어: ".concat(null!=c?c:"이 행에서는 알 수 없음")]}}(t),a=K.get(t.id);return(0,n.jsxs)("li",{className:"rounded border p-2 text-sm ".concat(e.selected?"border-emerald-500":"border-border"),children:[(0,n.jsxs)("button",{type:"button",className:"w-full text-left","aria-pressed":e.selected,onClick:()=>ek(t,!0),children:[(0,n.jsx)("p",{className:"font-medium",children:r.title}),r.details.map((e,r)=>(0,n.jsx)("p",{className:0===r?"font-mono text-xs text-muted-foreground":"text-xs text-muted-foreground",children:e},"".concat(t.id,"-").concat(e))),a&&(0,n.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground","aria-label":"현재 활동: ".concat("complete"===a.status?"완료":"진행 중"),children:["complete"===a.status?"완료":"진행 중",": ",a.line,a.hasMissingFrames?" \xb7 일부 진행 프레임 누락":""]})]}),(0,n.jsx)("button",{type:"button",className:"mt-2 rounded bg-zinc-800 px-2 py-1 text-xs text-zinc-100 hover:bg-zinc-700",onClick:()=>{eS(t)},children:"이름 바꾸기"}),e.selected&&eA&&(0,n.jsxs)("section",{className:"mt-2 rounded bg-zinc-900 p-2 text-xs","aria-label":"선택 PTY 계보",children:[(0,n.jsx)("p",{className:"font-medium",children:"계보"}),"loading"===eA.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"계보를 불러오는 중…"}),"error"===eA.kind&&(0,n.jsx)("p",{className:"text-rose-400",children:"계보를 불러오지 못했습니다."}),"empty"===eA.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"연결된 다른 화면이 없습니다."}),eA.unreadablePayloadsSummary&&(0,n.jsx)("p",{className:"text-muted-foreground",children:eA.unreadablePayloadsSummary}),eA.groups.map(e=>(0,n.jsxs)("div",{className:"mt-2",children:[(0,n.jsxs)("p",{className:"font-mono",children:["묶음: ",e.joinedBy," \xb7 ",e.key]}),(0,n.jsx)("ul",{className:"mt-1 space-y-1",children:e.rows.map(e=>(0,n.jsxs)("li",{className:e.selected?"rounded bg-emerald-900 px-1 text-emerald-100":"",children:[e.selected?"현재 선택 \xb7 ":"",e.ptyId," \xb7 ",e.kind," \xb7 ",e.instance," \xb7 ",(0,eR.cl)(e.alive,e.closed)," \xb7 시작 ",(0,eR.OZ)(e.startedAt)]},e.ptyId))})]},"".concat(e.joinedBy,"-").concat(e.key)))]}),e.view&&(0,n.jsxs)("div",{className:"mt-2",children:[e.view.display.frameInfo&&(0,n.jsx)("p",{className:"mb-1 font-mono text-xs text-muted-foreground","aria-label":"렌더 화면 정보",children:e.view.display.frameInfo}),e.view.display.frameMetadata&&(0,n.jsxs)("p",{className:"mb-1 text-xs text-muted-foreground","aria-label":"렌더 프레임 메타데이터",children:["관측: ",e.view.display.frameMetadata.frameAt," \xb7 출처: ",e.view.display.frameMetadata.frameSource]}),(0,n.jsx)("pre",{className:"whitespace-pre-wrap rounded bg-zinc-950 p-2 text-xs ".concat("error"===e.view.display.kind?"text-rose-400":"text-zinc-100"),children:e.view.display.text})]})]},(0,eR.x3)(t))})})]}):"observe"===L?(0,n.jsx)($,{sessionId:d},d):null:(0,n.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 text-sm text-muted-foreground",role:"status","aria-live":"polite",children:[(null==el?void 0:el.kind)==="list-unavailable"&&(0,n.jsxs)("p",{className:"text-xs text-rose-500","aria-label":"URL PTY 선택 상태",children:["PTY 목록을 읽지 못해 주소의 PTY ",s,"를 확인할 수 없습니다. 목록이 비었다는 뜻이 \xab아닙니다\xbb."]}),(0,n.jsx)("span",{children:A.placeholder})]})]}),h&&!e_&&"terminal"===L&&!k&&(!s||w)&&(0,n.jsx)(ew,{ref:e3,terminalId:h,open:eG,onTabIntent:e2,voice:tl})]})}}}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3787,6815,9492],{29905:()=>{}},_=>{_.O(0,[3042,4259,7358],()=>_(_.s=29905)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6605],{5031:(e,t,r)=>{"use strict";r.d(t,{GM:()=>i,J3:()=>l,WF:()=>a,bR:()=>n,m:()=>c,r5:()=>s});let a="/v1/devices",s="/v1/approvals/merges",n="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",i="/v1/morning-digest/showroom",c="/v1/next-fluent/dispatch"},22621:(e,t,r)=>{Promise.resolve().then(r.bind(r,94888))},31778:(e,t,r)=>{"use strict";r.d(t,{A:()=>a});let a=(0,r(42735).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},42735:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var a=r(19707);let s=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim()},n=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,a.createContext)({}),c=(0,a.forwardRef)((e,t)=>{var r,n,c;let{color:o,size:d,strokeWidth:u,absoluteStrokeWidth:m,className:h="",children:p,iconNode:x,...b}=e,{size:f=24,strokeWidth:g=2,absoluteStrokeWidth:N=!1,color:w="currentColor",className:j=""}=null!=(r=(0,a.useContext)(i))?r:{},y=(null!=m?m:N)?24*Number(null!=u?u:g)/Number(null!=d?d:f):null!=u?u:g;return(0,a.createElement)("svg",{ref:t,...l,width:null!=(n=null!=d?d:f)?n:l.width,height:null!=(c=null!=d?d:f)?c:l.height,stroke:null!=o?o:w,strokeWidth:y,className:s("lucide",j,h),...!p&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(b)&&{"aria-hidden":"true"},...b},[...x.map(e=>{let[t,r]=e;return(0,a.createElement)(t,r)}),...Array.isArray(p)?p:[p]])}),o=(e,t)=>{let r=(0,a.forwardRef)((r,l)=>{let{className:i,...o}=r;return(0,a.createElement)(c,{ref:l,iconNode:t,className:s("lucide-".concat(n(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...o})});return r.displayName=n(e),r}},49544:(e,t,r)=>{"use strict";r.d(t,{V5:()=>n,tV:()=>l});var a=r(5031);class s extends Error{constructor(e,t,r){super(r||t),this.status=e,this.error=t,this.reason=r,this.name="MergeApprovalsApiError"}}function n(e,t){return e instanceof s?401===e.status||"unauthorized"===e.error?{text:"이 기기에 소유자 토큰이 없어 승인 목록을 못 읽었습니다 — 이미 연결된 기기의 설정 › Connect token 에서 토큰을 만들어, 이 기기의 설정 › Daemon › Bearer token 칸에 붙이면 바로 보입니다.",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,r;let n=null!=(t=e.fetchImpl)?t:fetch,l=(null!=(r=e.baseUrl)?r:"").replace(/\/+$/,"");async function i(t,r){let a={...r,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},i=e.client?await e.client.fetchResponse(t,a):await n("".concat(l).concat(t),a),c=await i.json().catch(()=>null);if(!i.ok){var o;let e=c&&"object"==typeof c?c:{};throw new s(i.status,null!=(o=e.error)?o:"request-failed",e.reason)}return c}return{list:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"open";return i("merged"===e?"".concat(a.r5,"?state=merged"):a.r5)},get:e=>i("".concat(a.r5,"/").concat(e)),check:(e,t)=>i("".concat(a.r5,"/").concat(e,"/check"),{method:"POST",body:JSON.stringify({headSha:t})}),merge:(e,t)=>i("".concat(a.r5,"/").concat(e,"/merge"),{method:"POST",body:JSON.stringify({headSha:t})})}}},94888:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>v});var a=r(35563),s=r(19707),n=r(52440),l=r(97731),i=r(45787),c=r(49544);function o(e,t){return"UNKNOWN"===t&&e<3?3e3:null}async function d(e,t){let r,a=0,s=o(0,"UNKNOWN");for(;null!==s;){var n,l,i;if(await t.sleep(s),t.isActive&&!t.isActive())break;a++;try{r=await e(),null==(l=t.onDetail)||l.call(t,r)}catch(e){}null==(n=t.onAttempt)||n.call(t),s=o(a,null!=(i=null==r?void 0:r.mergeable)?i:"UNKNOWN")}return{attempts:a,...r?{last:r}:{}}}var u=r(31778);function m(e){let{view:t,target:r}=e,[n]=(0,s.useState)(()=>Date.now()),[l,i]=(0,s.useState)(n);(0,s.useEffect)(()=>{let e=window.setInterval(()=>i(Date.now()),100);return()=>window.clearInterval(e)},[]);let c=function(e,t,r){let a="".concat((Math.max(0,e)/1e3).toFixed(1),"초");return{title:"merged"===t?"GitHub 에서 승인해 머지된 PR 을 읽고 있습니다":r?"GitHub 에서 승인 대기 PR 과 #".concat(r," 카드를 읽고 있습니다"):"GitHub 에서 승인 대기 PR 을 읽고 있습니다",clock:a,hint:e>=8e3?"평소(2~5초)보다 오래 걸립니다 — GitHub 응답을 기다리는 중이며 멈추지 않았습니다.":null}}(l-n,t,r);return(0,a.jsxs)("section",{role:"status","aria-live":"polite","aria-busy":"true",className:"space-y-3","data-approvals-loading":!0,children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 rounded-xl border border-blue-500/40 bg-blue-500/5 p-4",children:[(0,a.jsx)(u.A,{className:"h-6 w-6 shrink-0 text-blue-500 motion-safe:animate-spin","aria-hidden":!0}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("p",{className:"font-medium",children:c.title}),c.hint&&(0,a.jsx)("p",{className:"mt-1 text-sm text-amber-600 dark:text-amber-400",children:c.hint})]}),(0,a.jsx)("span",{className:"font-mono text-lg tabular-nums text-blue-600 dark:text-blue-300","aria-label":"경과 시간",children:c.clock})]}),(0,a.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted","aria-hidden":!0,children:(0,a.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,a.jsx)("style",{children:"@keyframes approvals-slide{0%{transform:translateX(-100%)}100%{transform:translateX(300%)}}"}),[0,1].map(e=>(0,a.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-card p-5 motion-safe:animate-pulse","aria-hidden":!0,children:[(0,a.jsx)("div",{className:"h-4 w-2/3 rounded bg-muted"}),(0,a.jsx)("div",{className:"h-3 w-full rounded bg-muted"}),(0,a.jsx)("div",{className:"h-3 w-5/6 rounded bg-muted"})]},e))]})}function h(e){let{view:t,onChange:r}=e,s=(e,s)=>(0,a.jsx)("button",{type:"button",role:"tab","aria-selected":t===e,onClick:()=>r(e),className:"rounded-md px-3 py-1 text-sm ".concat(t===e?"bg-foreground text-background":"bg-muted text-foreground"),children:s});return(0,a.jsxs)("div",{role:"tablist","aria-label":"승인 목록 보기",className:"flex gap-2",children:[s("open","승인 대기"),s("merged","완료")]})}function p(e){let{brief:t,lineage:r,summary:s}=e;return(0,a.jsxs)(a.Fragment,{children:[null!==t?(0,a.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,a.jsx)(n.oz,{remarkPlugins:[l.A],components:{a:e=>{let{href:t,children:r}=e;return(0,a.jsx)("a",{href:t,target:"_blank",rel:"noreferrer",children:r})}},children:t})}):(0,a.jsxs)(a.Fragment,{children:[(0,a.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,a.jsx)("p",{className:"mt-3 whitespace-pre-wrap text-sm",children:s})]}),r&&(0,a.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["아이디어 원장: ",r]})]})}function x(e){var t;let{gate:r,busy:s,blocked:n,mergeLabel:l,onCheck:i,onMerge:c}=e;return(0,a.jsxs)("div",{className:"mt-3 space-y-2","aria-label":"머지 전 검사",children:["none"===r.status&&(0,a.jsx)("button",{type:"button",onClick:i,disabled:s,className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:"머지 전 검사 시작"}),"running"===r.status&&(0,a.jsx)("p",{role:"status",className:"text-sm",children:"검사 중…"}),"passed"===r.status&&(0,a.jsxs)("p",{className:"text-sm text-green-700 dark:text-green-400",children:["검사 통과 (",null!=(t=r.os)?t:"unknown",")",r.baseDrifted?" \xb7 검사 뒤 main 이 움직였다 — 머지 때 겹치는 파일이 있으면 다시 검사를 요구한다":""]}),("failed"===r.status||"unmeasured"===r.status)&&(0,a.jsxs)("div",{role:"alert",className:"text-sm text-red-600",children:[(0,a.jsx)("p",{children:"failed"===r.status?"검사 실패":"검사 측정 불가"}),(0,a.jsx)("ul",{className:"list-inside list-disc",children:r.failures.map((e,t)=>(0,a.jsx)("li",{children:e},t))}),(0,a.jsx)("button",{type:"button",onClick:i,disabled:s,className:"mt-2 rounded-lg border px-3 py-2 disabled:opacity-50",children:"머지 전 검사 다시 시작"})]}),(0,a.jsx)("button",{type:"button",onClick:c,disabled:s||n||"passed"!==r.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 b(e){let{card:t,api:r,attempt:a,onAttempt:n,onUpdate:l}=e,i="UNKNOWN"===t.mergeable&&!t.merged&&"OPEN"===t.state;return(0,s.useEffect)(()=>{if(!i||a>0)return;let e=!0,s=[];return d(()=>r.get(t.number),{sleep:e=>new Promise(t=>{s.push(window.setTimeout(t,e))}),isActive:()=>e,onDetail:r=>{e&&l(r,t.headSha)},onAttempt:()=>{e&&n(t.number)}}),()=>{for(let t of(e=!1,s))window.clearTimeout(t)}},[r,t.number,i,a,n,l]),null}function f(){let{client:e}=(0,i.Q)(),t=(0,s.useMemo)(()=>(0,c.tV)({client:e}),[e]),[r,n]=(0,s.useState)([]),[l,d]=(0,s.useState)(!0),[u,f]=(0,s.useState)(null),[g,N]=(0,s.useState)(null),[w,j]=(0,s.useState)({}),[y,v]=(0,s.useState)({}),[k,S]=(0,s.useState)(null),[E,C]=(0,s.useState)("open"),I=(0,s.useCallback)(e=>{v(t=>{var r;return{...t,[e]:(null!=(r=t[e])?r:0)+1}})},[]),A=(0,s.useCallback)((e,t)=>{n(r=>r.map(r=>r.number!==e.number||r.headSha!==t?r:{...e,gate:e.headSha===t?e.gate:{status:"none",failures:[]},merged:r.merged}))},[]);async function _(e){N(e.number),j(t=>({...t,[e.number]:""}));try{let{gate:r}=await t.check(e.number,e.headSha);n(t=>t.map(t=>t.number===e.number&&t.headSha===e.headSha?{...t,gate:r}:t))}catch(t){j(r=>({...r,[e.number]:(0,c.V5)(t,"검사를 시작하지 못했습니다.").text}))}finally{N(null)}}async function O(e){if(window.confirm("#".concat(e.number," ").concat(e.title,"\n현재 확인한 변경을 승인하고 머지할까요?"))){N(e.number),j(t=>({...t,[e.number]:""}));try{await t.merge(e.number,e.headSha),n(t=>t.map(t=>t.number===e.number?{...t,merged:!0,state:"MERGED"}:t))}catch(t){j(r=>({...r,[e.number]:(0,c.V5)(t,"머지하지 못했습니다.").text}))}finally{N(null)}}}return(0,s.useEffect)(()=>{let e=r.filter(e=>"OPEN"===e.state&&("running"===e.gate.status||"passed"===e.gate.status));if("open"!==E||!e.length)return;let a=!0,s=window.setInterval(()=>{for(let r of e)t.get(r.number).then(e=>{a&&A(e,r.headSha)}).catch(e=>{a&&j(t=>({...t,[r.number]:(0,c.V5)(e,"검사 상태를 불러오지 못했습니다.").text}))})},1e4);return()=>{a=!1,window.clearInterval(s)}},[t,r,A,E]),(0,s.useEffect)(()=>{let e=!0,r=Number(new URLSearchParams(window.location.search).get("pr")),a=Number.isSafeInteger(r)&&r>0?r:null;return(d(!0),f(null),S(a),"merged"===E)?(t.list("merged").then(t=>{let{items:r}=t;e&&n(r)}).catch(t=>{e&&f((0,c.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&d(!1)}),()=>{e=!1}):(t.list().then(async r=>{let{items:s}=r;if(!e)return;let l=s.find(e=>e.number===a);if(a&&!l)try{let r=await t.get(a);e&&n([r,...s])}catch(t){e&&f((0,c.V5)(t,"PR 을 불러오지 못했습니다.")),e&&n(s)}else n(a?[...s].sort((e,t)=>Number(t.number===a)-Number(e.number===a)):s)}).catch(t=>{e&&f((0,c.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&d(!1)}),()=>{e=!1})},[t,E]),(0,a.jsxs)("main",{className:"mx-auto max-w-3xl space-y-5 p-4 pb-20 text-foreground sm:p-8",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h1",{className:"text-2xl font-semibold",children:"Approvals"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:"아이디어 PR 변경 사항을 확인하고 승인합니다."})]}),(0,a.jsx)(h,{view:E,onChange:e=>{n([]),C(e)}}),l&&(0,a.jsx)(m,{view:E,target:k}),u&&(0,a.jsxs)("p",{role:"alert",className:"text-red-600","data-approvals-error":!0,children:[u.text,u.href&&(0,a.jsxs)(a.Fragment,{children:[" ",(0,a.jsx)("a",{href:u.href,className:"font-semibold underline underline-offset-2","data-approvals-settings":!0,children:"설정 열기 →"})]})]}),!l&&!r.length&&!u&&(0,a.jsx)("p",{children:"merged"===E?"승인해 머지된 아이디어 PR 이 아직 없습니다.":"승인을 기다리는 PR 이 없습니다."}),r.map(e=>{var r,s;let n=e.merged||"MERGED"===e.state,l="OPEN"!==e.state&&!n,i=e.draft?"초안 PR 은 머지할 수 없습니다. GitHub에서 초안을 해제한 뒤 다시 확인하세요.":e.checks.failure>0?"실패한 검사가 있습니다.":e.checks.pending>0?"검사가 아직 끝나지 않았습니다.":"CONFLICTING"===e.mergeable?"머지 충돌이 있습니다.":"MERGEABLE"!==e.mergeable?"머지 가능 여부가 아직 확인되지 않았습니다.":"main"!==e.base?"대상 브랜치가 main 이 아닙니다.":"",c=k===e.number,d=null!=(r=y[e.number])?r:0;return(0,a.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,a.jsx)(b,{card:e,api:t,attempt:d,onAttempt:I,onUpdate:A}),(0,a.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,a.jsxs)("h2",{className:"font-semibold",children:["#",e.number," \xb7 ",e.title]}),(0,a.jsx)("span",{className:"rounded bg-muted px-2 py-1 text-xs",children:n?function(e){if(!e)return"머지됨";let t=new Date(e);if(Number.isNaN(t.getTime()))return"머지됨";let r=new Date(t.getTime()+324e5).toISOString();return"머지됨 ".concat(r.slice(5,10)," ").concat(r.slice(11,16)," KST")}(e.mergedAt):l?"닫힘":e.draft?"초안":"열림"})]}),(0,a.jsx)(p,{brief:e.brief,lineage:e.lineage,summary:e.summary}),(0,a.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["+",e.additions," 추가 / −",e.deletions," 삭제 \xb7 파일 ",e.changedFiles]}),(0,a.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 text-xs","aria-label":"검사 상태",children:[(0,a.jsxs)("span",{className:"rounded bg-green-500/15 px-2 py-1",children:["성공 ",e.checks.success]}),(0,a.jsxs)("span",{className:"rounded bg-red-500/15 px-2 py-1",children:["실패 ",e.checks.failure]}),(0,a.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,a.jsx)("span",{className:"rounded bg-slate-500/15 px-2 py-1",children:"GitHub 검사 없음 — 머지 전 검사는 아래에서 별도로 실행"})]}),(0,a.jsxs)("details",{open:c,className:"mt-3 text-sm",children:[(0,a.jsx)("summary",{className:"cursor-pointer",children:"바뀐 파일 보기"}),(0,a.jsx)("ul",{className:"mt-2 list-inside list-disc break-all",children:e.files.map(e=>(0,a.jsx)("li",{children:e},e))})]}),(0,a.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-4",children:[(0,a.jsx)("a",{className:"text-sm text-blue-600 underline",href:e.url,target:"_blank",rel:"noopener noreferrer",children:"GitHub 에서 보기"}),!n&&!l&&(0,a.jsx)(x,{gate:e.gate,busy:null!==g,blocked:!!i,mergeLabel:g===e.number?"머지 중…":"UNKNOWN"!==(s=e.mergeable)?"승인하고 머지":null===o(d,s)?"확인 종료":"확인 중…",onCheck:()=>_(e),onMerge:()=>O(e)})]}),i&&!n&&!l&&(0,a.jsxs)("p",{className:"mt-2 text-sm text-amber-600",children:[i,"UNKNOWN"===e.mergeable&&d>=3?" 자동 확인이 끝났습니다. 최신 상태는 페이지를 새로고침하세요.":""]}),w[e.number]&&(0,a.jsx)("p",{role:"alert",className:"mt-2 text-sm text-red-600",children:w[e.number]})]},e.number)})]})}class g extends Error{constructor(e,t){super(t),this.status=e,this.name="GraphApprovalsApiError"}}function N(e){return e instanceof g?401===e.status?"소유자 인증이 필요합니다. 설정에서 연결 토큰을 확인해 주세요.":403===e.status?"이 기기에서 승인하려면 페어링이 필요합니다. 설정에서 연결 토큰을 넣어 주세요.":404===e.status?"이 실행을 찾지 못했습니다. 목록을 다시 확인해 주세요.":409===e.status?"이미 결정된 실행입니다. 목록을 다시 확인해 주세요.":400===e.status?"결정 내용을 확인한 뒤 다시 시도해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요.":e instanceof TypeError?"서버에 연결하지 못했습니다. 연결 상태를 확인해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요."}let w="/v1/graph-approvals";function j(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r="release-loop"===e.graphId?"릴리스 발행":"announce-loop"===e.graphId?"공지":e.graphId,a=Date.parse(e.since),s=Number.isNaN(a)?0:Math.max(0,Math.floor((t-a)/6e4)),n=s<1?"방금 전":s<60?"".concat(s,"분 전"):s<1440?"".concat(Math.floor(s/60),"시간 전"):"".concat(Math.floor(s/1440),"일 전");return{title:r,nodeId:e.nodeId,waiting:n,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 y(){let e,{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>(function(e){var t,r;let a=(null!=(t=e.baseUrl)?t:"").replace(/\/+$/,""),s=null!=(r=e.fetchImpl)?r:fetch;async function n(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(a).concat(t),n),i=await l.json().catch(()=>null);if(!l.ok){let e=i&&"object"==typeof i&&"error"in i&&"string"==typeof i.error?i.error:"request-failed";throw new g(l.status,e)}return i}return{list:()=>n(w),decide:(e,t,r)=>n("".concat(w,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t)),{method:"POST",body:JSON.stringify({decision:r})})}})({client:t}),[t]),[n,l]=(0,s.useState)([]),[c,o]=(0,s.useState)(""),[d,u]=(0,s.useState)(!1),m=(0,s.useRef)((e=0,{begin:()=>e+=1,isLatest:t=>t===e})).current,h=(0,s.useCallback)(async()=>{let e=m.begin();try{let t=await r.list();if(!m.isLatest(e))return;l(t.items),o("")}catch(t){m.isLatest(e)&&o(N(t))}},[r,m]);async function p(e,t){if("rejected"!==t||window.confirm("".concat(j(e).title," 실행을 거절할까요?"))){u(!0),o(""),m.begin();try{await r.decide(e.graphId,e.runId,t),await h()}catch(e){o(N(e))}finally{u(!1)}}}return((0,s.useEffect)(()=>{h();let e=window.setInterval(()=>{h()},3e4);return()=>window.clearInterval(e)},[h]),n.length||c)?(0,a.jsxs)("section",{"aria-label":"실행 승인",className:"mx-auto max-w-3xl space-y-4 px-4 pt-6 text-foreground sm:px-8",children:[(0,a.jsx)("h2",{className:"text-xl font-semibold",children:"실행 승인"}),c&&(0,a.jsx)("p",{role:"alert",className:"text-sm text-red-600",children:c}),n.map(e=>{let t=j(e);return(0,a.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,a.jsx)("h3",{className:"font-semibold",children:t.title}),(0,a.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["멈춘 단계: ",t.nodeId," \xb7 ",t.waiting,"부터 대기 중"]}),(0,a.jsx)("p",{className:"mt-3 whitespace-pre-wrap break-words text-sm",children:t.message}),t.recent.length>0&&(0,a.jsxs)("div",{className:"mt-3 text-sm",children:[(0,a.jsx)("p",{className:"font-medium",children:"최근 단계"}),(0,a.jsx)("ul",{className:"mt-1 space-y-1",children:t.recent.map((e,t)=>(0,a.jsx)("li",{className:"break-words",children:e},t))})]}),(0,a.jsxs)("div",{className:"mt-4 flex gap-2",children:[(0,a.jsx)("button",{type:"button",disabled:d,onClick:()=>{p(e,"approved")},className:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white disabled:opacity-50",children:"승인"}),(0,a.jsx)("button",{type:"button",disabled:d,onClick:()=>{p(e,"rejected")},className:"rounded-lg border px-4 py-2 text-sm disabled:opacity-50",children:"거절"})]})]},"".concat(e.graphId,"/").concat(e.runId))})]}):null}function v(){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(y,{}),(0,a.jsx)(f,{})]})}}},e=>{e.O(0,[9262,5787,3042,4259,7358],()=>e(e.s=22621)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2922],{4866:(e,t,s)=>{"use strict";function r(e){let t=e.filter(e=>"cron"===e.kind&&e.id).map(e=>e.id);return t.length?"/scheduler?ids=".concat(t.map(encodeURIComponent).join(",")):null}s.d(t,{NE:()=>o,Yt:()=>i,on:()=>r});let a=["task","goal-loop","single-shot"],n=["scheduler","monitor-trigger"];function l(e){var t,s,r,l,i,o,d;let c=e.autopilot,u=null!=(t=null==c?void 0:c.executionModel)?t:null;return{id:e.id,goal:e.title||e.description||e.id,source:null!=(s=null==c?void 0:c.origin)?s:"human",status:null!=(r=null==c?void 0:c.apmStatus)?r:e.status,model:u,tier:null!=(l=null==c?void 0:c.tier)?l:null,engine:null!=(i=null==c?void 0:c.engine)?i:null,kind:(d=null!=(o=null==c?void 0:c.executionModel)?o:null)&&a.includes(d)?"finite":d&&n.includes(d)?"continuous":"other",reviewDue:!1,createdAt:new Date(e.createdAt).toISOString(),isAutopilot:null!=c,toxStatus:e.status,taskCount:e.taskCount,taskCounts:e.taskStatusCounts}}class i{async triagePreview(e,t){return this.client.fetchJson("/v1/autopilot/triage-preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({goal:e,...t?{category:t}:{}})})}async commitMission(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"intake",s=arguments.length>2?arguments[2]:void 0;return this.client.fetchJson("/v1/autopilot/triage-preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({goal:e,commit:!0,source:t,...s?{category:s}:{}})})}async missions(e,t){let s=new URLSearchParams({...e?{status:e}:{},...t?{source:t}:{}}).toString();return this.client.fetchJson("/v1/autopilot/missions".concat(s?"?".concat(s):""))}async missionsUnified(e){var t,s;let r=new URLSearchParams({...e?{status:e}:{}}).toString(),a=await this.client.fetchJson("/v1/missions".concat(r?"?".concat(r):"")),n=null!=(t=a.missions)?t:[];return{ok:!0,total:null!=(s=a.total)?s:n.length,missions:n.map(l)}}async trace(e){return this.client.fetchJson("/v1/autopilot/trace?id=".concat(encodeURIComponent(e)))}async missionArcMap(){var e,t,s;let r=await this.client.fetchJson("/v1/missions"),a=new Map;for(let n of null!=(e=r.missions)?e:[]){let e=null==(t=n.autopilot)?void 0:t.arcs;e&&e.length>0&&a.set(n.id,{apmStatus:null==(s=n.autopilot)?void 0:s.apmStatus,arcs:e})}return a}async missionAction(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.client.fetchJson("/v1/autopilot/mission-action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:e,action:t,...s})})}async repoWatch(){return this.client.fetchJson("/v1/autopilot/repo-watch")}async autonomy(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50,t=arguments.length>1?arguments[1]:void 0,s=new URLSearchParams({limit:String(e),...t?{loop:t}:{}});return this.client.fetchJson("/v1/autopilot/autonomy?".concat(s.toString()))}async arming(){return this.client.fetchJson("/v1/autopilot/arming")}constructor(e){this.client=e}}let o={task:{label:"작업 분해",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30"},"goal-loop":{label:"목표 루프",tone:"bg-violet-500/15 text-violet-200 ring-violet-500/30"},scheduler:{label:"스케줄러",tone:"bg-emerald-500/15 text-emerald-200 ring-emerald-500/30"},"monitor-trigger":{label:"감시 트리거",tone:"bg-amber-500/15 text-amber-200 ring-amber-500/30"},hybrid:{label:"하이브리드",tone:"bg-fuchsia-500/15 text-fuchsia-200 ring-fuchsia-500/30"},fanout:{label:"병렬 팬아웃",tone:"bg-cyan-500/15 text-cyan-200 ring-cyan-500/30"},"single-shot":{label:"즉답",tone:"bg-muted text-muted-foreground ring-border"},"hitl-delegate":{label:"HITL 위임",tone:"bg-rose-500/15 text-rose-200 ring-rose-500/30"}}},7090:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var r=s(35563),a=s(82198),n=s(13773),l=s(45505);let i=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:s="default",size:n="default",...o}=e;return(0,r.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(i({variant:s,size:n,className:t})),...o})}},18208:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>O});var r=s(35563),a=s(19707),n=s(45787),l=s(7090),i=s(84240);let o=["dig","backtest","trade","retro","replay"],d=[["replay","dig"],["dig","backtest"],["backtest","trade"],["trade","retro"],["retro","replay"]];function c(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let s=Math.max(0,Math.floor((Date.now()-t)/1e3));if(s<60)return"".concat(s,"s ago");let r=Math.floor(s/60);if(r<60)return"".concat(r,"m ago");let a=Math.floor(r/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}function u(e){var t;let s=(null==(t=e.last)?void 0:t.at)?Date.parse(e.last.at):NaN;return!Number.isNaN(s)&&Date.now()-s<36e5}function x(){var e;let{client:t}=(0,n.Q)(),[s,x]=(0,a.useState)([]),[m,p]=(0,a.useState)(!1),[g,h]=(0,a.useState)(null),f=(0,a.useCallback)(async()=>{p(!0);try{var e,s;let r=await t.fetchJson("/v1/dashboard/loops");x(null!=(s=null==(e=r.loops)?void 0:e.loops)?s:[])}catch(e){i.oR.error("loops load failed: ".concat(e instanceof Error?e.message:e))}finally{p(!1)}},[t]);(0,a.useEffect)(()=>{f();let e=window.setInterval(()=>void f(),3e4);return()=>window.clearInterval(e)},[f]);let b=(0,a.useMemo)(()=>{let e=new Map;for(let t of s)e.set(t.name,t);return e},[s]),v=(0,a.useMemo)(()=>{let e=new Map;return o.forEach((t,s)=>e.set(t,function(e){let t=Math.PI/180*(-90+72*e);return{x:200+128*Math.cos(t),y:190+128*Math.sin(t)}}(s))),e},[]),j=g&&null!=(e=b.get(g))?e:null;return(0,r.jsxs)("div",{className:"mx-auto max-w-[1100px] space-y-4 p-4",children:[(0,r.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"투자 루프 오케스트라"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"5개 자율 루프의 순환(분석→백테→매매→회고→재생). 원 클릭 = 활동 기록 \xb7 펄스 = 최근 활동 \xb7 채움 = armed."})]}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void f(),disabled:m,children:"Refresh"})]}),(0,r.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start",children:[(0,r.jsxs)("section",{className:"min-w-0 flex-1",children:[(0,r.jsxs)("svg",{viewBox:"0 0 400 380",className:"w-full",role:"img","aria-label":"loop orchestra graph",children:[(0,r.jsx)("defs",{children:(0,r.jsx)("marker",{id:"loop-arrow",viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:(0,r.jsx)("path",{d:"M 0 0 L 10 5 L 0 10 z",className:"fill-muted-foreground/50"})})}),d.map(e=>{let[t,s]=e,a=v.get(t),n=v.get(s);if(!a||!n)return null;let l=n.x-a.x,i=n.y-a.y,o=Math.hypot(l,i)||1,d=l/o,c=i/o,u=a.x+42*d,x=a.y+42*c,m=n.x-48*d,p=n.y-48*c;return(0,r.jsx)("line",{x1:u,y1:x,x2:m,y2:p,className:"stroke-muted-foreground/30",strokeWidth:1.5,markerEnd:"url(#loop-arrow)"},"".concat(t,"-").concat(s))}),o.map(e=>{var t,s,a,n;let l=b.get(e),i=v.get(e),o=!!l&&u(l),d=(null==l?void 0:l.armed)===!0,x=(null==l?void 0:l.category)!=="reflect",m=g===e;return(0,r.jsxs)("g",{className:"cursor-pointer",onClick:()=>h(t=>t===e?null:e),children:[o&&(0,r.jsxs)("circle",{cx:i.x,cy:i.y,r:40,className:x?"fill-sky-400/20":"fill-violet-400/20",children:[(0,r.jsx)("animate",{attributeName:"r",values:"".concat(40,";").concat(52),dur:"1.6s",repeatCount:"indefinite"}),(0,r.jsx)("animate",{attributeName:"opacity",values:"0.5;0",dur:"1.6s",repeatCount:"indefinite"})]}),(0,r.jsx)("circle",{cx:i.x,cy:i.y,r:40,className:"".concat(d?x?"fill-sky-500/25":"fill-violet-500/25":"fill-card"," ").concat(x?"stroke-sky-400":"stroke-violet-400"),strokeWidth:m?3.5:1.8}),(0,r.jsx)("text",{x:i.x,y:i.y-4,textAnchor:"middle",className:"fill-foreground text-[11px] font-medium",children:null!=(n=null==l||null==(s=l.label)||null==(t=s.split("(")[0])?void 0:t.trim())?n:e}),(0,r.jsx)("text",{x:i.x,y:i.y+10,textAnchor:"middle",className:"fill-muted-foreground text-[9px]",children:l?"".concat(c(null==(a=l.last)?void 0:a.at)):"—"}),(0,r.jsx)("text",{x:i.x,y:i.y+21,textAnchor:"middle",className:"fill-muted-foreground/70 text-[8px]",children:l?"today ".concat(l.today).concat(o?" \xb7 active":""):""})]},e)})]}),(0,r.jsxs)("div",{className:"flex flex-wrap justify-center gap-3 text-[11px] text-muted-foreground",children:[(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsx)("span",{className:"inline-block h-2 w-2 rounded-full bg-sky-400"})," 실행축"]}),(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsx)("span",{className:"inline-block h-2 w-2 rounded-full bg-violet-400"})," 사색축"]}),(0,r.jsx)("span",{children:"채움=armed \xb7 펄스=최근 활동"})]})]}),j&&(0,r.jsxs)("aside",{className:"w-full shrink-0 space-y-3 rounded-2xl border border-border bg-card p-4 lg:w-[360px]",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("h2",{className:"text-base font-semibold",children:j.label}),(0,r.jsx)("button",{type:"button",onClick:()=>h(null),className:"rounded-md px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-accent/40 hover:text-foreground","aria-label":"close",children:"✕"})]}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-1.5 text-[11px]",children:[(0,r.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("reflect"===j.category?"text-violet-300 ring-violet-500/30":"text-sky-300 ring-sky-500/30"),children:"reflect"===j.category?"사색축":"실행축"}),(0,r.jsxs)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:["armed ",null===j.armed?"—":j.armed?"ON":"off"]}),(0,r.jsxs)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:["today ",j.today]}),u(j)&&(0,r.jsx)("span",{className:"rounded-full bg-emerald-500/15 px-2 py-0.5 text-emerald-300 ring-1 ring-emerald-500/30",children:"active"})]}),(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("div",{className:"text-sm font-semibold",children:"활동 기록"}),j.recent&&j.recent.length>0?(0,r.jsx)("div",{className:"space-y-1.5",children:j.recent.map((e,t)=>(0,r.jsxs)("div",{className:"rounded-lg bg-muted/40 px-3 py-2 text-[11px]",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("span",{className:"font-medium text-foreground",children:e.status}),(0,r.jsx)("span",{className:"text-muted-foreground",title:e.at,children:c(e.at)})]}),e.detail&&(0,r.jsx)("div",{className:"mt-0.5 truncate text-muted-foreground",title:e.detail,children:e.detail})]},"".concat(e.at,"-").concat(t)))}):(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:"활동 기록 없음."})]})]})]})]})}function m(e){let{api:t}=e,[s,n]=(0,a.useState)([]),[i,o]=(0,a.useState)(!0),d=(0,a.useCallback)(async()=>{try{var e;let s=await t.repoWatch();n(null!=(e=s.repos)?e:[])}catch(e){}finally{o(!1)}},[t]);return((0,a.useEffect)(()=>{d()},[d]),i)?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"불러오는 중…"}):(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"참조 에이전트 repo 감시 — 새 커밋을 흡수 후보로 분석(제안은 텔레그램 report\xb7크론 08:40\xb720:40)."}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void d(),children:"새로고침"})]}),(0,r.jsx)("div",{className:"grid gap-3 sm:grid-cols-3",children:s.map(e=>(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card/50 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("span",{className:"font-medium",children:e.key}),e.lastNew>0&&(0,r.jsxs)("span",{className:"rounded bg-amber-500/15 px-2 py-0.5 text-xs text-amber-300 ring-1 ring-amber-500/30",children:["새 ",e.lastNew]})]}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:e.repo}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:e.note}),(0,r.jsxs)("div",{className:"mt-2 flex items-center justify-between text-xs",children:[(0,r.jsx)("span",{className:"font-mono text-muted-foreground",children:e.lastSha?e.lastSha.slice(0,7):"—"}),(0,r.jsx)("span",{className:"text-muted-foreground",children:function(e){if(!e)return"미감지";let t=Date.now()-Date.parse(e);if(Number.isNaN(t))return"—";let s=Math.round(t/6e4);if(s<60)return"".concat(s,"분 전");let r=Math.round(s/60);return r<24?"".concat(r,"시간 전"):"".concat(Math.round(r/24),"일 전")}(e.lastSeen)})]})]},e.repo))}),(0,r.jsx)("p",{className:"text-[11px] text-muted-foreground",children:"흡수 채택 → PR 초안 + 빌드/테스트 증거는 P2(disarmed) \xb7 merge/재부팅은 대표 HITL."})]})}let p=["dig","backtest","trade","retro","replay","delegate","autopilot"],g={trade:"bg-rose-500/15 text-rose-300 ring-rose-500/30",dig:"bg-sky-500/15 text-sky-200 ring-sky-500/30",backtest:"bg-violet-500/15 text-violet-200 ring-violet-500/30",retro:"bg-amber-500/15 text-amber-200 ring-amber-500/30",replay:"bg-indigo-500/15 text-indigo-200 ring-indigo-500/30",delegate:"bg-emerald-500/15 text-emerald-200 ring-emerald-500/30",autopilot:"bg-fuchsia-500/15 text-fuchsia-200 ring-fuchsia-500/30"};function h(e){let{api:t}=e,[s,n]=(0,a.useState)([]),[i,o]=(0,a.useState)(null),[d,c]=(0,a.useState)(!0),u=(0,a.useCallback)(async()=>{c(!0);try{var e;let s=await t.autonomy(80,null!=i?i:void 0);n(null!=(e=s.actions)?e:[])}catch(e){}finally{c(!1)}},[t,i]);return(0,a.useEffect)(()=>{u()},[u]),(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("button",{type:"button",onClick:()=>o(null),className:["rounded px-2 py-0.5 text-xs ring-1",null===i?"bg-primary/20 text-foreground ring-primary/40":"bg-muted text-muted-foreground ring-border"].join(" "),children:"전체"}),p.map(e=>{var t;return(0,r.jsx)("button",{type:"button",onClick:()=>o(e),className:["rounded px-2 py-0.5 text-xs ring-1",i===e?null!=(t=g[e])?t:"bg-primary/20 ring-primary/40":"bg-muted text-muted-foreground ring-border"].join(" "),children:e},e)}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",className:"ml-auto",onClick:()=>void u(),children:"새로고침"})]}),d?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"불러오는 중…"}):0===s.length?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"아직 기록된 자율행동이 없습니다. 자율루프가 돌면 여기에 “무엇을 왜 했나”가 쌓입니다."}):(0,r.jsx)("ul",{className:"space-y-2",children:s.map((e,t)=>{var s;return(0,r.jsxs)("li",{className:"rounded-lg border border-border bg-card/50 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:["rounded px-2 py-0.5 text-xs ring-1",null!=(s=g[e.loop])?s:"bg-muted text-muted-foreground ring-border"].join(" "),children:e.loop}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:function(e){try{return new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(new Date(e))}catch(t){return e.slice(5,16)}}(e.ts)}),e.importance>=8&&(0,r.jsx)("span",{className:"rounded bg-rose-500/15 px-1.5 text-[10px] text-rose-300 ring-1 ring-rose-500/30",children:"중요"})]}),(0,r.jsx)("pre",{className:"mt-1.5 whitespace-pre-wrap font-sans text-sm text-foreground/90",children:e.text})]},"".concat(e.ts,"-").concat(t))})})]})}var f=s(75423),b=s.n(f),v=s(4866);let j={ok:{icon:"✅",tone:"text-emerald-300",label:"정상"},done:{icon:"✅",tone:"text-emerald-300",label:"완료"},stale:{icon:"⏰",tone:"text-amber-300",label:"밀림"},error:{icon:"❌",tone:"text-rose-400",label:"실패"},active:{icon:"\uD83D\uDD35",tone:"text-sky-300",label:"실행중"},pending:{icon:"⏳",tone:"text-muted-foreground",label:"대기"}},y={cron:"크론",task:"태스크",action:"자율행동"};function N(e){var t;let{counts:s,total:a}=e,n=Object.entries(null!=s?s:{}).filter(e=>{let[,t]=e;return t>0});if(!a||0===a)return(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:"태스크 0"});let l=null!=(t=null==s?void 0:s.done)?t:0;return(0,r.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,r.jsxs)("span",{className:"text-xs text-muted-foreground",children:["태스크 ",l,"/",a]}),n.map(e=>{let[t,s]=e;return(0,r.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[t,":",s]},t)})]})}function k(e){let{r:t}=e;if(!t||0===t.total)return(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:"파생 0"});let s=(e,t)=>e>0?(0,r.jsxs)("span",{className:["text-xs",j[t].tone].join(" "),children:[j[t].icon,e]},t):null;return(0,r.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,r.jsxs)("span",{className:"text-xs text-muted-foreground",children:["파생 ",t.total]}),s(t.ok,"ok"),s(t.stale,"stale"),s(t.error,"error"),s(t.active,"active"),s(t.pending,"pending")]})}function w(e){let{api:t,m:s,onDone:n}=e,i="scheduler"===s.model,o="task"===s.model,[d,c]=(0,a.useState)(""),[u,x]=(0,a.useState)(""),[m,p]=(0,a.useState)(""),[g,h]=(0,a.useState)(null),[f,b]=(0,a.useState)(null);if(!i&&!o)return(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["이 실행모델(",s.model,")은 지속 잡을 만들지 않아 구체화 대상이 아닙니다."]});let v=async e=>{h(e),b(null);let r=i?{command:d.trim(),...u.trim()?{cron:u.trim()}:{}}:{...m.trim()?{prompt:m.trim()}:{}};try{let l=await t.missionAction(s.id,e,r);if(l.error)b("오류: ".concat(l.error));else{var a;b("arm"===e?"승인\xb7arming ON 시 자동 실행":"구체화 완료(".concat(null!=(a=l.engine)?a:"",")")),n()}}catch(e){b(e instanceof Error?e.message:String(e))}finally{h(null)}};return(0,r.jsxs)("div",{className:"mt-3 space-y-2 rounded-md border border-border bg-background/50 p-2.5",children:[i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("input",{value:d,onChange:e=>c(e.target.value),placeholder:"실행할 명령 (예: scripts/foo.ts) — 필수",className:"w-full rounded border border-border bg-background px-2 py-1 text-xs"}),(0,r.jsx)("input",{value:u,onChange:e=>x(e.target.value),placeholder:"cron (선택 \xb7 비우면 골에서 추론)",className:"w-full rounded border border-border bg-background px-2 py-1 font-mono text-xs"})]}),o&&(0,r.jsx)("input",{value:m,onChange:e=>p(e.target.value),placeholder:"태스크 내용 (선택 \xb7 비우면 골 사용)",className:"w-full rounded border border-border bg-background px-2 py-1 text-xs"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(l.$,{size:"sm",disabled:!!g||i&&!d.trim(),onClick:()=>void v("materialize"),children:"materialize"===g?"…":"지금 구체화"}),(0,r.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!g||i&&!d.trim(),onClick:()=>void v("arm"),children:"arm"===g?"…":"승인(arm)"}),f&&(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:f})]})]})}function S(e){let{api:t,m:s}=e,n=!1===s.isAutopilot,[i,o]=(0,a.useState)(!1),[d,c]=(0,a.useState)(null),[u,x]=(0,a.useState)(!1),m=s.model?v.NE[s.model]:null,p=(0,a.useCallback)(async()=>{x(!0);try{c(await t.trace(s.id))}catch(e){}finally{x(!1)}},[t,s.id]),[g,h]=(0,a.useState)(!1),[f,S]=(0,a.useState)(!1),[C,z]=(0,a.useState)(null),M=!n&&"proposed"===s.status,E=(0,a.useCallback)(async()=>{let e=!i;o(e),!e||d||n||await p()},[i,d,p,n]),A=(0,a.useCallback)(async()=>{h(!0),z(null);try{await t.missionAction(s.id,"cancel"),await p()}catch(e){}finally{h(!1)}},[t,s.id,p]),J=(0,a.useCallback)(async()=>{S(!0),z(null);try{var e;let r=await t.missionAction(s.id,"approve");r.error?z("오류: ".concat(r.error)):z("✅ 승인 — 태스크 ".concat(null!=(e=r.activated)?e:0,"건 실행 시작(ready). 미션 running.")),await p()}catch(e){z(e instanceof Error?e.message:String(e))}finally{S(!1)}},[t,s.id,p]);return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>void E(),className:"flex w-full items-start gap-3 p-3 text-left",children:[(0,r.jsx)("span",{className:"mt-0.5 text-muted-foreground",children:i?"▾":"▸"}),(0,r.jsxs)("div",{className:"min-w-0 flex-1 space-y-1.5",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[n?(0,r.jsx)("span",{className:"rounded bg-slate-500/15 px-2 py-0.5 text-xs font-medium text-slate-300 ring-1 ring-slate-500/30",children:"사람 \xb7 intake"}):m&&(0,r.jsx)("span",{className:["rounded px-2 py-0.5 text-xs font-medium ring-1",m.tone].join(" "),children:m.label}),!n&&"continuous"===s.kind&&(0,r.jsx)("span",{className:"rounded bg-sky-500/15 px-1.5 py-0.5 text-[11px] text-sky-300 ring-1 ring-sky-500/30",children:"상시"}),!n&&"finite"===s.kind&&(0,r.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"유한"}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground ring-1 ring-border",children:s.source}),M?(0,r.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[11px] font-medium text-amber-300 ring-1 ring-amber-500/40",children:"승인 대기"}):(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground ring-1 ring-border",children:s.status}),s.reviewDue&&(0,r.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[11px] text-amber-300 ring-1 ring-amber-500/30",children:"⚠ 30일+ 리뷰"}),n?(0,r.jsx)(N,{counts:s.taskCounts,total:s.taskCount}):(0,r.jsx)(k,{r:s.derived})]}),(0,r.jsx)("p",{className:"truncate text-sm text-foreground/90",children:s.goal}),(0,r.jsx)("p",{className:"font-mono text-[10px] text-muted-foreground",children:s.id})]})]}),i&&n&&(0,r.jsxs)("div",{className:"border-t border-border px-4 py-3 space-y-2",children:[(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"사람이 Intake 로 만든 미션입니다. 실행은 Task 보드에서 진행됩니다."}),(0,r.jsx)(N,{counts:s.taskCounts,total:s.taskCount}),(0,r.jsx)(b(),{href:"/tasks",className:"inline-block text-xs text-primary hover:underline",children:"② 작업 보드에서 보기 →"})]}),i&&!n&&(0,r.jsxs)("div",{className:"border-t border-border px-4 py-3",children:[M&&(0,r.jsxs)("div",{className:"mb-3 space-y-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-3",children:[(0,r.jsx)("p",{className:"text-sm font-medium text-amber-200",children:"자동 분해 완료 \xb7 승인 대기"}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["골을 태스크로 자동 구체화했습니다(아직 ",(0,r.jsx)("b",{children:"실행 안 함"}),"). 승인하면 실행이 시작됩니다.","scheduler"===s.model&&" 반복 스케줄은 승인 후 배선됩니다."]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(l.$,{size:"sm",disabled:f||g,onClick:()=>void J(),children:f?"승인 중…":"✅ 승인(실행 시작)"}),(0,r.jsx)(l.$,{size:"sm",variant:"ghost",disabled:f||g,onClick:()=>void A(),className:"text-rose-400 hover:text-rose-300",children:g?"거절 중…":"거절"}),C&&(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:C})]})]}),u&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"계보 조회 중…"}),d&&0===d.derived.length&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:d.note}),d&&(0,v.on)(d.derived)&&(0,r.jsxs)(b(),{href:(0,v.on)(d.derived),className:"mb-2 inline-block text-xs text-primary hover:underline","data-mission-schedules":!0,children:["이 미션을 부르는 스케줄 ",d.derived.filter(e=>"cron"===e.kind&&e.id).length," →"]}),d&&d.derived.length>0&&(0,r.jsx)("ul",{className:"space-y-1.5",children:d.derived.map((e,t)=>{let s=j[e.status];return(0,r.jsxs)("li",{className:"flex items-start gap-2 text-sm",children:[(0,r.jsx)("span",{className:s.tone,children:s.icon}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground ring-1 ring-border",children:y[e.kind]}),(0,r.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,r.jsx)("span",{className:"text-foreground/90",children:e.name}),e.detail&&(0,r.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:e.detail})]})]},t)})}),d&&"done"!==s.status&&"proposed"!==s.status&&(0,r.jsxs)("div",{className:"mt-2 flex items-center gap-2",children:[(0,r.jsx)(l.$,{size:"sm",variant:"ghost",disabled:g,onClick:()=>void A(),className:"text-rose-400 hover:text-rose-300",children:g?"종료 중…":"미션 종료(파생 잡 release)"}),"continuous"===s.kind&&(0,r.jsx)("span",{className:"text-[11px] text-muted-foreground",children:"상시 미션 — 종료 전까지 계속 실행"})]}),d&&!M&&(0,r.jsx)(w,{api:t,m:s,onDone:()=>void p()})]})]})}function C(e){let{api:t,onCommitted:s}=e,[n,i]=(0,a.useState)(""),[o,d]=(0,a.useState)(null),[c,u]=(0,a.useState)(!1),[x,m]=(0,a.useState)(!1),[p,g]=(0,a.useState)(null),h=(0,a.useCallback)(async()=>{let e=n.trim();if(e){u(!0),g(null);try{d((await t.triagePreview(e)).triage)}catch(e){g(e instanceof Error?e.message:String(e))}finally{u(!1)}}},[t,n]),f=(0,a.useCallback)(async()=>{let e=n.trim();if(e){m(!0),g(null);try{(await t.commitMission(e,"intake")).missionId?(i(""),d(null),s()):g("미션 생성 실패")}catch(e){g(e instanceof Error?e.message:String(e))}finally{m(!1)}}},[t,n,s]),b=o?v.NE[o.executionModel]:null;return(0,r.jsxs)("div",{className:"space-y-2 rounded-lg border border-border bg-card/40 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("span",{className:"text-sm font-medium",children:["골 던지기 ",(0,r.jsx)("span",{className:"text-xs font-normal text-muted-foreground",children:"— 소망을 말하면 미션이 됩니다"})]}),(0,r.jsx)("span",{className:"text-[11px] text-muted-foreground",children:"텔레그램에선 “미션:” 마커로"})]}),(0,r.jsx)("textarea",{value:n,onChange:e=>i(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&h()},placeholder:"예: 삼성전자 급락하면 매매 검토 / 이 주제 끝까지 파봐 / 매일 아침 반도체 뉴스 정리",className:"min-h-[60px] w-full resize-y rounded-md border border-border bg-background px-3 py-2 text-sm"}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)(l.$,{onClick:()=>void h(),disabled:c||!n.trim(),size:"sm",variant:"outline",children:c?"분류 중…":"Triage (⌘↵)"}),(0,r.jsx)(l.$,{onClick:()=>void f(),disabled:x||!n.trim(),size:"sm",children:x?"커밋 중…":"미션 커밋 →"}),o&&b&&(0,r.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5 text-xs",children:[(0,r.jsx)("span",{className:["rounded px-2 py-0.5 ring-1",b.tone].join(" "),children:b.label}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-muted-foreground ring-1 ring-border",children:"heavy"===o.tier?"무거움":"가벼움"}),(0,r.jsx)("span",{className:"text-muted-foreground",children:o.rationale})]}),p&&(0,r.jsx)("span",{className:"text-xs text-rose-400",children:p})]})]})}function z(e){var t,s;let{api:n}=e,[i,o]=(0,a.useState)(null),[d,c]=(0,a.useState)(null),[u,x]=(0,a.useState)(!1),m=(0,a.useCallback)(async()=>{x(!0),c(null);try{let e=[...(await n.missionsUnified()).missions].sort((e,t)=>e.createdAt<t.createdAt?1:-1);o(e)}catch(e){c(e instanceof Error?e.message:String(e))}finally{x(!1)}},[n]);(0,a.useEffect)(()=>{m()},[m]);let p=null!=(t=null==i?void 0:i.filter(e=>e.isAutopilot).length)?t:0,g=(null!=(s=null==i?void 0:i.length)?s:0)-p;return(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["모든 미션(사람 intake + 자율)의 계보\xb7실행 상태.",i&&(0,r.jsxs)("span",{className:"ml-1 text-[11px]",children:["자율 ",p," \xb7 사람 ",g]})]}),(0,r.jsx)(l.$,{onClick:()=>void m(),disabled:u,size:"sm",variant:"outline",children:u?"…":"새로고침"})]}),(0,r.jsx)(C,{api:n,onCommitted:()=>void m()}),d&&(0,r.jsx)("p",{className:"text-xs text-rose-400",children:d}),i&&0===i.length&&(0,r.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"아직 미션이 없습니다. 아래 “골 던지기”로 자율 미션을 만들거나, Intake 에서 메모를 포착하세요."}),i&&i.length>0&&(0,r.jsx)("div",{className:"space-y-2",children:i.map(e=>(0,r.jsx)(S,{api:n,m:e},e.id))})]})}var M=s(92772);let E=[{id:"missions",label:"Missions"},{id:"repo",label:"Repo Watch"},{id:"autonomy",label:"자율행동"},{id:"loops",label:"루프 오케스트라"}];function A(e){var t;let{arming:s}=e;if(!s)return null;let a=(e,t)=>(0,r.jsxs)("span",{className:["rounded px-2 py-0.5 text-xs ring-1",e?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:[t," ",e?"ON":"OFF"]});return(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,r.jsx)("span",{children:"자율 경계:"}),a(s.absorb,"흡수 PR초안(".concat(s.absorbBackend,")")),a(s.merge,"mandate merge"),a(s.reboot,"재부팅"),a(null!=(t=s.materialize)&&t,"자율 구체화"),(0,r.jsx)("span",{className:"text-[11px]",children:"\xb7 재부팅은 항상 HITL \xb7 기본 disarmed(fail-closed)"})]})}function J(){let{client:e}=(0,n.Q)(),t=(0,a.useMemo)(()=>new v.Yt(e),[e]),[s,l]=(0,a.useState)("missions"),[i,o]=(0,a.useState)(null);return(0,a.useEffect)(()=>{let e=!0;return t.arming().then(t=>{e&&o(t.arming)}).catch(()=>{}),()=>{e=!1}},[t]),(0,r.jsxs)("div",{className:"mx-auto max-w-[1400px] px-4 pt-4",children:[(0,r.jsx)("div",{className:"mb-3",children:(0,r.jsx)(M.r,{active:"autopilot"})}),(0,r.jsxs)("div",{className:"mb-3 space-y-2",children:[(0,r.jsxs)("h1",{className:"text-lg font-semibold",children:["Missions ",(0,r.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"미션 지휘 센터 \xb7 Autopilot"})]}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"미션(사람 + 자율)의 계보\xb7상태\xb7자율행동. 아래 “골 던지기” 또는 텔레그램 “미션:” 마커로 소망을 던지면 미션이 됩니다."}),(0,r.jsx)(A,{arming:i})]}),(0,r.jsx)("div",{className:"flex gap-1 border-b border-border",children:E.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>l(e.id),className:["-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors",s===e.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"].join(" "),children:e.label},e.id))}),(0,r.jsxs)("div",{className:"py-4",children:["missions"===s&&(0,r.jsx)(z,{api:t}),"repo"===s&&(0,r.jsx)(m,{api:t}),"autonomy"===s&&(0,r.jsx)(h,{api:t}),"loops"===s&&(0,r.jsx)(x,{})]})]})}function O(){return(0,r.jsx)(J,{})}},45505:(e,t,s)=>{"use strict";s.d(t,{cn:()=>n});var r=s(36757),a=s(78049);function n(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,a.QP)((0,r.$)(t))}},57352:(e,t,s)=>{Promise.resolve().then(s.bind(s,18208))},92772:(e,t,s)=>{"use strict";s.d(t,{r:()=>i});var r=s(35563),a=s(75423),n=s.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function i(e){let{active:t}=e;return(0,r.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,r.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,s)=>(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsxs)(n(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,r.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,r.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),s<l.length-1&&(0,r.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}}},e=>{e.O(0,[3165,2808,4240,5423,5787,3042,4259,7358],()=>e(e.s=57352)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7081],{27668:(e,t,a)=>{"use strict";a.d(t,{Er:()=>r,cj:()=>c,yR:()=>o});let n=/^(oauth\.|harness\.decision|llm\.router)/;function r(e){let t=[],a=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var r;let e=null!=(r=t.data)?r:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])a(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)a(null==t?void 0:t.name);continue}if(n.test(t.category))for(let t of(a(e.account),["what","why","reason"])){let n=e[t];if("string"==typeof n)for(let e of n.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))a(e[1])}}return t}function s(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function l(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),a=e.length?RegExp("(^|[^\\w-])(".concat(e.map(s).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,n=new Map;return(e,r)=>{let s=e.replace(/\b[a-z0-9-]+\.tail[0-9a-f]+\.ts\.net\b/gi,"tailnet-host").replace(/\bmsb\d+\b/gi,e=>(e=>{let t=e.toLowerCase();n.has(t)||n.set(t,"remote-".concat(n.size+1));let a=n.get(t);return e===e.toUpperCase()?a.toUpperCase():a})(e)).replace(/\bmbp\b/gi,e=>e===e.toUpperCase()?"LOCAL":"local").replace(/\/Users\/[^/\s"']+/g,"~").replace(/(크레딧|credits?|💳)(\s*[:=]?\s*)[\d][\d,.]*/gi,"$1$2•••").replace(/[\d][\d,.]*(\s*)(크레딧|credits?)/gi,"•••$1$2").replace(/\$\s?[\d][\d,.]*/g,"$•••").replace(/(잔량?|remaining|left)(\s*[:=]?\s*)(?:[A-Za-z0-9][\w.-]*\s+)?\d+(?:\.\d+)?\s?%/gi,"$1$2•••");return r&&a&&(s=s.replace(a,(e,a,n)=>{var r;return"".concat(a).concat(null!=(r=t.get(n))?r:"account")})),s}}function i(e,t){if("string"==typeof e)return t(e);if(Array.isArray(e))return e.map(e=>i(e,t));if(e&&"object"==typeof e){let a={};for(let[n,r]of Object.entries(e))"apiEquivalentUsd"===n||"usd"===n||/credit(s|Balance)?$/i.test(n)||(a[n]=i(r,t));return a}return e}function o(e){let t=l(r(e));return e.map(e=>{let a=n.test(e.category);return{...e,event:t(e.event,!1),data:e.data?i(e.data,e=>t(e,a)):e.data}})}function c(e,t){let a=l(t);return i(e,e=>a(e,!0))}},40333:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>y});var n=a(35563),r=a(27668),s=a(19707),l=a(45787);function i(e){var t;for(let t of[e.sections.triage,e.sections.intake]){let e=null==t?void 0:t.data.title;if("string"==typeof e&&e.trim())return e.trim()}return(null==(t=e.apiTitle)?void 0:t.trim())||e.taskId}var o=a(23995);let c=["intake","triage","gates","relations","memory","workspace","run","landing","release"];function d(e){return null==e?"—":"string"==typeof e?e:JSON.stringify(e)}function u(e){let{entry:t}=e;return(0,n.jsxs)("details",{className:"mt-2 text-xs",children:[(0,n.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"JSON"}),(0,n.jsx)("pre",{className:"mt-2 max-h-64 overflow-auto rounded-lg bg-muted p-2 text-xs whitespace-pre-wrap break-all",children:JSON.stringify(t.data,null,2)})]})}function m(e){let{entry:t}=e,a=new Date(t.ts).toISOString();return(0,n.jsxs)("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[(0,n.jsxs)("span",{children:["Owner: ",t.owner]}),(0,n.jsx)("time",{dateTime:a,children:a})]})}function f(e){var t;let{card:a}=e,r=null==(t=a.sections.gates)?void 0:t.data;return(0,n.jsxs)("section",{"aria-label":"Task card detail",className:"min-w-0 space-y-4 rounded-2xl border border-border bg-card p-4",children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold",children:i(a)}),(0,n.jsx)("p",{className:"break-all text-xs text-muted-foreground",children:a.taskId})]}),r&&(0,n.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Gate decisions",children:["Gate \xb7 budget: ",d(r.budget)," \xb7 location: ",d(r.location)]}),c.map(e=>{let t=a.sections[e];return t?(0,n.jsxs)("section",{"aria-label":"".concat(e," section"),className:"rounded-xl border border-border p-3",children:[(0,n.jsx)("h3",{className:"mb-1 text-sm font-semibold capitalize",children:e}),(0,n.jsx)(m,{entry:t}),(0,n.jsx)(u,{entry:t})]},e):null}),(0,n.jsxs)("section",{"aria-label":"Incidents",className:"space-y-2",children:[(0,n.jsxs)("h3",{className:"text-sm font-semibold",children:["Incidents (",a.incidents.length,")"]}),a.incidents.length?(0,n.jsx)("ol",{className:"space-y-2",children:a.incidents.map(e=>(0,n.jsxs)("li",{className:"rounded-xl border border-border p-3",children:[(0,n.jsx)(m,{entry:e}),(0,n.jsx)(u,{entry:e})]},e.key))}):(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"No incidents."})]})]})}let p=["steward","execution","landing","release","done"],g=new Set(["intake","triage","gates","relations","memory","workspace","run","landing","release","incidents"]);function x(e){let t=[],a=Date.parse(e.createdAt);for(let n of e.sections){let r;if(!g.has(n.key))continue;try{let e=JSON.parse(n.content);r=e&&"object"==typeof e&&!Array.isArray(e)?e:{content:n.content}}catch(e){r={content:n.content}}let s=Date.parse(n.createdAt);t.push({taskId:e.id,section:n.key,key:"".concat(n.key,":").concat(n.createdAt,":").concat(t.length),owner:n.owner,ts:Number.isFinite(s)?s:a,data:r,..."string"==typeof r.runId?{runId:r.runId}:{}})}if(0===t.length&&t.push({taskId:e.id,section:"triage",key:"api:title",owner:"task-card API",ts:a,data:{title:e.title}}),"closed"===e.status){let n=t.filter(e=>"release"===e.section).sort((e,t)=>t.ts-e.ts)[0];t.push({taskId:e.id,section:"release",key:"api:closed",owner:"task-card API",ts:Math.max(a,...t.map(e=>e.ts)),data:{...null==n?void 0:n.data,status:"done"}})}return{...function(e){let t,a=e[0];if(!a)return null;let n={},r=[],s=new Set,l=a.ts,i=-1/0;for(let o of e)if(!(o.taskId!==a.taskId||s.has(o.key)))if(s.add(o.key),l=Math.max(l,o.ts),o.runId&&o.ts>=i&&(t=o.runId,i=o.ts),"incidents"===o.section)r.push(o);else{let e=n[o.section];(!e||o.ts>=e.ts)&&(n[o.section]=o)}return{taskId:a.taskId,sections:n,incidents:r,updatedAt:l,...t?{runId:t}:{}}}(t),apiTitle:e.title}}function h(e){let{cards:t,selectedId:a,onSelect:r,selectedCard:s,detailError:l}=e,o=(null==s?void 0:s.taskId)===a?s:null;return(0,n.jsxs)("div",{className:"space-y-4 p-4",children:[(0,n.jsx)("h1",{className:"text-xl font-semibold",children:"보드"}),(0,n.jsx)("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-5",children:p.map(e=>(0,n.jsxs)("section",{"aria-label":"".concat(e," column"),className:"min-w-0 space-y-2 rounded-xl border border-border p-3",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold capitalize",children:e}),t.filter(t=>(function(e){var t;let a=null==(t=e.sections.release)?void 0:t.data;return(null==a?void 0:a.status)==="done"||(null==a?void 0:a.status)==="completed"?"done":a?"release":e.sections.landing?"landing":e.sections.run||e.sections.workspace||e.sections.gates||e.sections.relations||e.sections.memory?"execution":"steward"})(t)===e).map(e=>{var t,s;return(0,n.jsxs)("button",{type:"button",onClick:()=>r(e.taskId),"aria-pressed":a===e.taskId,className:"w-full rounded-lg border border-border bg-card p-3 text-left text-sm hover:bg-accent/40",children:[(0,n.jsx)("span",{className:"block font-medium",children:i(e)}),(0,n.jsx)("span",{className:"block text-xs text-muted-foreground",children:(0,n.jsx)("time",{dateTime:new Date(e.updatedAt).toISOString(),title:new Date(e.updatedAt).toLocaleString(),children:(t=function(e){let t=new Map;for(let n of e.incidents){var a;let e=null!=(a=n.data.incidentId)?a:n.data.id,r="string"==typeof e&&e.trim()?e:n.key,s=t.get(r);(!s||n.ts>=s.ts)&&t.set(r,n)}return Array.from(t.values()).filter(e=>"closed"!==e.data.status&&"resolved"!==e.data.status).length}(e),s=Date.now(),[...t>0?["사고 ".concat(t)]:[],...e.runId?["런 ".concat(e.runId.replace(/^run-/,"").slice(0,8))]:[],function(e,t,a){let n=Math.floor((t-e)/6e4);if(!Number.isFinite(n)||n<1)return"방금";if(n<60)return"".concat(n,"분 전");if(n<1440)return"".concat(Math.floor(n/60),"시간 전");let r=new Intl.DateTimeFormat("ko-KR",{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,...a?{timeZone:a}:{}}).formatToParts(new Date(e)),s=e=>{var t,a;return null!=(a=null==(t=r.find(t=>t.type===e))?void 0:t.value)?a:""};return"".concat(s("month"),"/").concat(s("day")," ").concat(s("hour"),":").concat(s("minute"))}(e.updatedAt,s,void 0)]).join(" \xb7 ")})})]},e.taskId)})]},e))}),a&&(0,n.jsxs)("aside",{className:"max-w-3xl space-y-2","aria-label":"Selected card",children:[(0,n.jsx)("button",{type:"button",onClick:()=>r(null),"aria-label":"Close card detail",className:"text-sm text-muted-foreground",children:"Close"}),o?(0,n.jsx)(f,{card:o}):(0,n.jsx)("p",{role:"status",children:null!=l?l:"Loading card detail…"})]})]})}function b(){let{config:e}=(0,l.Q)(),t=(0,s.useMemo)(()=>e.baseUrl?(0,o.xX)({baseUrl:e.baseUrl,...e.token?{token:e.token}:{}}):null,[e.baseUrl,e.token]),[a,i]=(0,s.useState)([]),[c,d]=(0,s.useState)(null),[u,m]=(0,s.useState)(null),[f,p]=(0,s.useState)(null),[g,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(!1);(0,s.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&k(!0)},[]);let j=(0,s.useMemo)(()=>y?a.map(e=>({...(0,r.cj)(e,[]),taskId:e.taskId})):a,[a,y]);return(0,s.useEffect)(()=>{let e=!1;if(i([]),d(null),m(null),p(null),!t)return void b("Connect to NEXUS to load task cards.");b(null);let a=()=>t.getTaskCards().then(t=>{let{cards:a}=t;e||(i(a.map(x)),b(null))}).catch(t=>{e||b(t instanceof o.Iu&&404===t.status?"Task cards are not available yet (pre-E1).":t instanceof Error?t.message:String(t))});a();let n=setInterval(()=>{a()},1e4);return()=>{e=!0,clearInterval(n)}},[t]),(0,s.useEffect)(()=>{if(!t||!c)return;let e=!1;return m(null),p(null),t.getTaskCard(c).then(t=>{let{card:a}=t;e||m(x(a))}).catch(t=>{e||p(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[t,c]),(0,n.jsxs)(n.Fragment,{children:[g&&(0,n.jsx)("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:g}),(0,n.jsx)(h,{cards:j,selectedId:c,selectedCard:u,detailError:f,onSelect:e=>{(null===e||c!==e)&&(m(null),p(null),d(e))}})]})}function y(){return(0,n.jsx)(b,{})}},74081:(e,t,a)=>{Promise.resolve().then(a.bind(a,40333))}},e=>{e.O(0,[5787,3995,3042,4259,7358],()=>e(e.s=74081)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7955],{10233:(e,t,s)=>{"use strict";s.d(t,{BotlabPageContent:()=>h});var r,l=s(35563),a=s(19707);let o=(null!=(r=s(16396).env.NEXT_PUBLIC_ELANOUS_BOTLAB_HOST)?r:"").trim(),n="elanous.botlab.wallHost",d=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;function i(e){return e.length>0&&e.length<=253&&d.test(e)}function c(e){var t;let{search:s,remembered:r=null}=e,d=(0,a.useMemo)(()=>(function(e){var t,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=null;try{l=new URLSearchParams(e).get("host")}catch(e){l=null}let a=null!=(t=null==l?void 0:l.trim())?t:"";if(""!==a&&i(a))return{host:a,source:"query",rejected:null};let n=""===a?null:a,d=null!=(s=null==r?void 0:r.trim())?s:"";return""!==d&&i(d)?{host:d,source:"remembered",rejected:n}:""!==o&&i(o)?{host:o,source:"default",rejected:n}:{host:"",source:"unset",rejected:n}})(s,r),[s,r]),c="unset"===d.source?null:(t=d.host,"https://".concat(t).concat("/bot3/bot-wall.html"));return(0,a.useEffect)(()=>{if("query"===d.source)try{window.localStorage.setItem(n,d.host)}catch(e){}},[d.source,d.host]),(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-6xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"botlab-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot screens"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Botlab"}),(0,l.jsxs)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:["Live noVNC screens for the bots, served through Tailscale. One document holds all four sessions, so the VNC password is asked ",(0,l.jsx)("strong",{children:"once"}),", not four times."]}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"View-only by default. This surface cannot send commands or control the bots."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-4","aria-label":"Wall address",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Wall address"}),(0,l.jsx)("p",{className:"mt-1 break-all font-mono text-xs text-muted-foreground","data-testid":"botlab-wall-url",children:null!=c?c:"(no host configured)"}),(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground","data-testid":"botlab-host-source",children:"query"===d.source?"Host came from the ?host= query parameter (remembered on this device).":"remembered"===d.source?"Host is the one remembered on this device; override it with ?host=<tailnet-name>.":"default"===d.source?"Host is the build default (NEXT_PUBLIC_ELANOUS_BOTLAB_HOST); override it with ?host=<tailnet-name>.":"No wall host is configured. Open this page once with ?host=<the VM tailnet name> — it is remembered on this device."}),null!==d.rejected&&(0,l.jsxs)("p",{role:"alert",className:"mt-2 text-xs text-destructive","data-testid":"botlab-host-rejected",children:["Ignored ?host=",d.rejected," — not a valid hostname."]}),null!==c&&(0,l.jsxs)("p",{className:"mt-3 text-xs text-muted-foreground",children:[(0,l.jsx)("a",{className:"underline",href:c,target:"_blank",rel:"noreferrer","data-testid":"botlab-open-tab",children:"Open the wall in a new tab"})," — ","use this if the embedded frame stays blank."]})]}),null!==c&&(0,l.jsx)("section",{"aria-label":"Bot screen wall",children:(0,l.jsx)("iframe",{src:c,title:"Bot screen wall","data-testid":"botlab-wall-frame",className:"h-[70vh] w-full rounded-xl border border-border bg-background"})}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-5","aria-label":"If the wall is blank",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"If the wall stays blank"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"A blank frame is not necessarily a broken bot. There are three separate reasons, with different fixes:"}),(0,l.jsxs)("ol",{className:"mt-3 list-decimal space-y-2 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"This device is outside the tailnet."})," The address simply does not exist here. Join the tailnet, or view the screens from a device that is on it."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Tailscale serve is not published."})," Re-run"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"bash scripts/botlab/deploy-bot-wall.sh"}),", which re-publishes the paths and then verifies each one returns 200."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"The wall loaded but did not connect."})," That is a VNC-level failure, not a page failure — the wall itself reports connected/failed counts once you enter the password."]})]}),(0,l.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"The VNC password is deliberately not carried in this page or in the URL: any page a bot browser opens could otherwise reach the local websocket, and websockets have no CORS."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-dashed border-border p-5","aria-label":"Not wired yet",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Not wired yet"}),(0,l.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:["Per-bot cell headers (name \xb7 last round verdict \xb7 whether CDP is alive) need"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"browserPort"})," and round results on the daemon's persona route. That route is owned by another track and is not published today."]}),(0,l.jsx)("li",{children:"Running a command from this surface needs a POST route that does not exist yet."})]})]})]})}function h(){let e=window.location.search,t=null;try{t=window.localStorage.getItem(n)}catch(e){t=null}return(0,l.jsx)(c,{search:e,remembered:t})}},13153:(e,t,s)=>{Promise.resolve().then(s.bind(s,10233))}},e=>{e.O(0,[3042,4259,7358],()=>e(e.s=13153)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2885],{16812:(e,t,n)=>{"use strict";n.d(t,{v:()=>a});var l=n(19707),r=n(53403);let s=null;function a(e){let[t,n]=(0,l.useState)(()=>s&&Date.now()-s.at<6e4?s.data:[]),[a,o]=(0,l.useState)(!1),[i,d]=(0,l.useState)(null),u=(0,l.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,l.useEffect)(()=>{if(s&&Date.now()-s.at<6e4)return void n(s.data);u()},[u]);let c=(0,l.useCallback)(async()=>{s=null,await u()},[u]);return(0,l.useEffect)(()=>{let t=e.personasEventsUrl();if(!t)return;let n=null;try{n=new EventSource(t)}catch(e){(0,r.cY)("showroom.personas.sse.construct-error",{error:String(e)});return}let l=e=>()=>{"hello"!==e&&((0,r.cY)("showroom.personas.sse.event",{kind:e}),s=null,u())};return n.addEventListener("hello",l("hello")),n.addEventListener("load-dir",l("load-dir")),n.addEventListener("reload-all",l("reload-all")),n.addEventListener("upsert",l("upsert")),n.addEventListener("remove",l("remove")),n.onerror=e=>{(0,r.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}}},33864:(e,t,n)=>{"use strict";n.d(t,{BotsPageContent:()=>S});var l=n(35563),r=n(19707),s=n(45787),a=n(16812);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,l,r,s;let a=[],c=[];for(let t of null!=(n=e.artifacts)?n:[]){let e=null!=(l=i(null==t?void 0:t.name))?l:"(이름 없음)",n=i(null==t?void 0:t.text);if(null===n){c.push(e);continue}a.push(function(e,t){var n;let l=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")),n=t.slice(0,3).join(" / ").slice(0,160),l=t.slice(0,3).join("\n");return/^Traceback \(most recent call last\):/m.test(l)?{kindOf:"파이썬 예외(Traceback)",head:n}:/^⛔\s*.*(실패|failed|error)/mi.test(l)?{kindOf:"스킬이 \xab실패\xbb라고 말했다",head:n}:/^(Error|error):/m.test(l)?{kindOf:"오류",head:n}:/^\s*command not found|No such file or directory/m.test(l)?{kindOf:"명령\xb7파일이 \xab없다\xbb",head:n}:null}(t);if(null!==l)return{kind:"failure",name:e,kindOf:l.kindOf,head:l.head};let r=function(e){var t,n,l,r;let s=null!=(r=null!=(l=null==(t=/^대상:\s*(\S+)/m.exec(e))?void 0:t[1])?l:null==(n=/^##\s+(\S+)\s+Real-Time Quote/m.exec(e))?void 0:n[1])?r:null;if(null===s)return null;let a=t=>{var n,l;return null!=(l=null==(n=RegExp("\\*\\*".concat(t,":\\*\\*\\s*([-+0-9.,]+)"),"i").exec(e))?void 0:n[1])?l: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!==r)return{kind:"quote",name:e,quote:r};let s=null!=(n=function(e){var t,n,l,r,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 l=(null!=(r=n[h])?r:"").trim();""!==l&&j.push({key:l,foreign:o(n[g]),institution:o(n[p]),individual:o(n[b])})}if(0===j.length)return null;let N="";for(let e=c;e>=0;e-=1){let t=/^#{2,3}\s+(.+)$/.exec((null!=(s=u[e])?s:"").trim());if(t){N=t[1];break}}return""===N&&(N=null!=(a=null==(t=u.find(e=>""!==e.trim()&&!e.includes("━")))?void 0:t.trim())?a:"(제목 없음)"),{title:N,unit:null!=(d=null==(n=/\((백만|천|억)\)/.exec(x.join(" ")))?void 0:n[1])?d:null!=(i=null==(l=/\(([^)]*원[^)]*)\)/.exec(x.join(" ")))?void 0:l[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 l=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),l=1;l<t;l++)n[l-1]=arguments[l];for(let t of n){let n=e[t];if("number"==typeof n&&Number.isFinite(n))return n}return null},r=[],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&&r.push({key:e,foreign:l(t,"frgn_net_shares","frgn_net_amount_million"),institution:l(t,"inst_net_shares","inst_net_amount_million"),individual:l(t,"prsn_net_shares","prsn_net_amount_million")});if(0===r.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&&r.push({key:t,foreign:l(e,"frgn_net_shares","frgn_net_amount_million"),institution:l(e,"inst_net_shares","inst_net_amount_million"),individual:l(e,"prsn_net_shares","prsn_net_amount_million")})}if(0===r.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:r}}(t);if(null!==s)return{kind:"flow",name:e,flow:s};let a=function(e){let t,n=e.split("\n"),l=n.findIndex(e=>"---BEGIN_OMNI_CRAWL_JSON---"===e);if(l<0)return{news:null,why:null,fenced:!1};let r=n.findIndex((e,t)=>t>l&&"---END_OMNI_CRAWL_JSON---"===e);if(r<0)return{news:null,why:"Omni crawl JSON 끝 울타리를 \xab못 찾았다\xbb",fenced:!0};try{t=JSON.parse(n.slice(l+1,r).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 l=t[1].trim(),r=t[2].trim();""===l||""===r||l.includes("//")||n.push({label:l,value:r,num:o(r)})}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!=(r=i(e.personaId))?r:"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 l,r,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[,l]=t;return e+(null!=(n=d(l))?n:0)},0);return{kind:"ready",rounds:s.rounds.map(c),unreadable:null!=(l=d(s.unreadable))?l:0,unreadableNow:null!=o?o:null!=(r=d(s.unreadable))?r: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,r=null!==n.changePct&&n.changePct>0,s=null!==n.changePct&&n.changePct<0;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"quote-".concat(n.symbol),children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:n.symbol}),(0,l.jsx)("span",{className:"text-lg font-bold tabular-nums",children:m(n.close)}),(0,l.jsxs)("span",{className:"text-sm font-semibold tabular-nums ".concat(r?"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,l.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,l.jsxs)("div",{className:"flex justify-between gap-2",children:[(0,l.jsx)("dt",{children:t}),(0,l.jsx)("dd",{className:"tabular-nums text-foreground",children:m(n)})]},t)})})]})}function h(e){let{a:t}=e,n=t.flow;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"flow-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),null!==n.unit&&(0,l.jsxs)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:["단위: ",n.unit]}),(0,l.jsx)("div",{className:"mt-2 overflow-x-auto",children:(0,l.jsxs)("table",{className:"w-full min-w-[22rem] text-xs",children:[(0,l.jsx)("thead",{children:(0,l.jsxs)("tr",{className:"text-muted-foreground",children:[(0,l.jsx)("th",{className:"py-1 text-left font-medium",children:"기간"}),["외국인","기관","개인"].map(e=>(0,l.jsx)("th",{className:"py-1 text-right font-medium",children:e},e))]})}),(0,l.jsx)("tbody",{children:n.rows.slice(0,6).map(e=>(0,l.jsxs)("tr",{className:"border-t border-border/60",children:[(0,l.jsx)("td",{className:"py-1 font-mono",children:e.key}),[e.foreign,e.institution,e.individual].map((e,t)=>(0,l.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,l.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,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"keyed-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),(0,l.jsx)("dl",{className:"mt-2 grid gap-1 sm:grid-cols-2",children:n.entries.map(e=>(0,l.jsxs)("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[(0,l.jsx)("dt",{className:"text-muted-foreground",children:e.label}),(0,l.jsx)("dd",{className:"font-semibold tabular-nums",children:e.value})]},e.label))})]})}function p(e){let{a:t}=e;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"news-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:null===t.news.query?"뉴스":"뉴스: ".concat(t.news.query)}),0===t.news.items.length?(0,l.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"수집된 기사가 0건이다."}):(0,l.jsx)("ul",{className:"mt-2 space-y-2",children:t.news.items.map((e,t)=>{var n,r,s,a;return(0,l.jsxs)("li",{className:"text-sm",children:[null===e.url?null!=(n=e.title)?n:"(제목 없음)":(0,l.jsx)("a",{className:"font-medium underline underline-offset-2",href:e.url,children:null!=(r=e.title)?r:e.url}),null!==e.date&&(0,l.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,l.jsxs)("div",{className:"rounded-lg border border-rose-500/40 bg-rose-500/5 p-3","data-testid":"failure-block",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline gap-2",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:t.name}),(0,l.jsx)("span",{className:"rounded bg-rose-500/15 px-2 py-0.5 text-xs font-medium text-rose-700",children:"이 단계가 \xab실패\xbb했다"})]}),(0,l.jsx)("p",{className:"mt-1 text-xs text-rose-700",children:t.kindOf}),(0,l.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,l.jsxs)("div",{className:"rounded-lg border border-dashed border-border bg-background/40 p-3","data-testid":"unparsed-block",children:[(0,l.jsx)("h4",{className:"font-mono text-sm",children:t.name}),(0,l.jsxs)("p",{className:"mt-1 text-xs text-amber-600",children:["⚠️ 이 산출을 \xab못 읽었다\xbb — ",t.why]}),(0,l.jsx)("p",{className:"mt-1 truncate text-xs text-muted-foreground",children:t.head})]})}function N(e){var t;let{round:n}=e,r=null!==n.failed&&n.failed>0;return(0,l.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"round-".concat(null!=(t=n.runId)?t:"unknown"),children:[(0,l.jsxs)("header",{className:"flex flex-wrap items-baseline justify-between gap-2",children:[(0,l.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 l=new Intl.DateTimeFormat("ko-KR",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1});return"".concat(l.format(n)," KST")}(n.atUtc)}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,l.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,l.jsxs)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(r?"bg-rose-500/15 text-rose-700":"bg-muted text-muted-foreground"),children:[null===n.steps?"단계 \xab모름\xbb":"".concat(n.steps,"단계"),r&&" \xb7 실패 ".concat(n.failed)]}),(0,l.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,l.jsxs)("div",{className:"mt-4 space-y-3",children:[n.artifacts.map((e,t)=>"quote"===e.kind?(0,l.jsx)(f,{a:e},t):"flow"===e.kind?(0,l.jsx)(h,{a:e},t):"news"===e.kind?(0,l.jsx)(p,{a:e},t):"keyed"===e.kind?(0,l.jsx)(g,{a:e},t):"failure"===e.kind?(0,l.jsx)(b,{a:e},t):(0,l.jsx)(j,{a:e},t)),0===n.artifacts.length&&0===n.textless.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 회차에 산출이 \xab없다\xbb."}),n.textless.length>0&&(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["본문을 \xab안 받은\xbb 산출 ",n.textless.length,"건: ",n.textless.join(" \xb7 ")]})]})]})}function y(e){let{client:t,persona:n,title:s,subtitle:a,limit:o=3}=e,[i,d]=(0,r.useState)({kind:"loading"});return(0,r.useEffect)(()=>{let e=!0;return d({kind:"loading"}),x(t,n,o).then(t=>{e&&d(t)}),()=>{e=!1}},[t,n,o]),(0,l.jsxs)("section",{className:"flex flex-col gap-4","aria-label":"".concat(n," rounds"),"data-testid":"rounds-".concat(n),children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h2",{className:"text-xl font-bold",children:s}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:a})]}),"loading"===i.kind&&(0,l.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"투자 회차를 불러오는 중…"}),"error"===i.kind&&(0,l.jsxs)("div",{role:"alert",className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-sm",children:[(0,l.jsx)("p",{className:"font-medium text-destructive",children:"회차를 \xab못 받았다\xbb."}),(0,l.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:i.reason}),(0,l.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["⚠️ 라우트 ",(0,l.jsx)("code",{className:"font-mono",children:"/v1/bots/rounds"})," 가 아직 \xab없을 수\xbb 있다(\uD83C\uDD63 축). 그때는 이 자리가 비는 것이 \xab맞다\xbb — 화면이 그것을 말하고 있다."]})]}),"ready"===i.kind&&0===i.rounds.length&&(0,l.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,l.jsxs)(l.Fragment,{children:[i.unreadableNow>0?(0,l.jsxs)("p",{role:"alert",className:"text-xs text-amber-600",children:["⚠️ ***지금 못 읽는 자리 ",i.unreadableNow,"곳*** — 아래 수는 \xab과소\xbb다."]}):i.unreadable>0?(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["못 읽은 자리 ",i.unreadable,"곳(옛 회차) — 「지금 깨진 것」은 \xab없다\xbb."]}):null,(0,l.jsx)("div",{className:"flex flex-col gap-4",children:i.rounds.map(e=>{var t,n;return(0,l.jsx)(N,{round:e},null!=(n=null!=(t=e.runId)?t:e.atUtc)?n:Math.random())})})]})]})}function v(e){let{client:t,limit:n=3}=e;return(0,l.jsx)(y,{client:t,persona:"investor",limit:n,title:"\uD83D\uDCC8 투자 회차",subtitle:"봇이 \xab실제로 낸\xbb 산출이다. ⛔ 차트는 \xab일부러\xbb 안 그린다 — 글만 낸다."})}function w(e){let{client:t,limit:n=2}=e;return(0,l.jsx)(y,{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,l.jsx)(y,{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 O(e){let{client:t}=e,n=(0,a.v)(t),[s,o]=(0,r.useState)({kind:"loading"});(0,r.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,l.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,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot directory"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Bots"}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"Commands are global: every bot exposes the same catalog."}),(0,l.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,l.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"Loading bot identities and command catalog…"}),i&&(0,l.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot identities: ",i]}),d&&(0,l.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot catalog: ",d]}),x&&0===n.personas.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bots are configured."}),x&&n.personas.length>0&&0===m.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bot commands are available."}),(0,l.jsx)(v,{client:t}),(0,l.jsx)(w,{client:t}),(0,l.jsx)(k,{client:t}),x&&n.personas.length>0&&m.length>0&&(0,l.jsx)("section",{className:"grid gap-4 md:grid-cols-2","aria-label":"Bot identities",children:n.personas.map(e=>{var t;return(0,l.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"bot-card-".concat(e.personaId),children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:e.displayName}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:null!=(t=e.description)?t:"No description provided."}),(0,l.jsx)("h3",{className:"mt-5 text-sm font-semibold",children:"Available commands"}),(0,l.jsx)("ul",{className:"mt-3 space-y-3","aria-label":"Available bot commands",children:m.map(e=>(0,l.jsxs)("li",{className:"rounded-lg border border-border bg-background/60 p-3",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:e.name}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:e.description}),e.arguments.length>0?(0,l.jsx)("ul",{className:"mt-2 space-y-1","aria-label":"".concat(e.name," arguments"),children:e.arguments.map(e=>(0,l.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,l.jsx)("code",{className:"font-semibold text-foreground",children:e.name}),e.required?" (required)":" (optional)"," — ",e.description]},e.name))}):(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"No arguments."})]},e.name))})]},e.personaId)})})]})}function S(){let{client:e}=(0,s.Q)();return(0,l.jsx)(O,{client:e})}},71219:(e,t,n)=>{Promise.resolve().then(n.bind(n,33864))}},e=>{e.O(0,[5787,3042,4259,7358],()=>e(e.s=71219)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8457],{15890:(e,r,t)=>{"use strict";t.d(r,{p:()=>a});var i=t(35563);t(19707);var l=t(28296),n=t(45505);function a(e){let{className:r,type:t,...a}=e;return(0,i.jsx)(l.p,{type:t,"data-slot":"input",className:(0,n.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",r),...a})}},19341:(e,r,t)=>{Promise.resolve().then(t.bind(t,54801))},42735:(e,r,t)=>{"use strict";t.d(r,{A:()=>d});var i=t(19707);let l=function(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];return r.filter((e,r,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===r).join(" ").trim()},n=e=>{let r=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,t)=>t?t.toUpperCase():r.toLowerCase());return r.charAt(0).toUpperCase()+r.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 o=(0,i.createContext)({}),s=(0,i.forwardRef)((e,r)=>{var t,n,s;let{color:d,size:u,strokeWidth:c,absoluteStrokeWidth:f,className:p="",children:b,iconNode:h,...g}=e,{size:m=24,strokeWidth:v=2,absoluteStrokeWidth:k=!1,color:w="currentColor",className:x=""}=null!=(t=(0,i.useContext)(o))?t:{},y=(null!=f?f:k)?24*Number(null!=c?c:v)/Number(null!=u?u:m):null!=c?c:v;return(0,i.createElement)("svg",{ref:r,...a,width:null!=(n=null!=u?u:m)?n:a.width,height:null!=(s=null!=u?u:m)?s:a.height,stroke:null!=d?d:w,strokeWidth:y,className:l("lucide",x,p),...!b&&!(e=>{for(let r in e)if(r.startsWith("aria-")||"role"===r||"title"===r)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...h.map(e=>{let[r,t]=e;return(0,i.createElement)(r,t)}),...Array.isArray(b)?b:[b]])}),d=(e,r)=>{let t=(0,i.forwardRef)((t,a)=>{let{className:o,...d}=t;return(0,i.createElement)(s,{ref:a,iconNode:r,className:l("lucide-".concat(n(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...d})});return t.displayName=n(e),t}},56519:(e,r,t)=>{"use strict";t.d(r,{A:()=>i});let i=(0,t(42735).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])}},e=>{e.O(0,[3165,2808,4240,8296,9262,6969,5787,9181,8198,6522,1947,4801,3042,4259,7358],()=>e(e.s=19341)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2580],{7090:(e,r,a)=>{"use strict";a.d(r,{$:()=>l});var t=a(35563),n=a(82198),s=a(13773),i=a(45505);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:r,variant:a="default",size:s="default",...l}=e;return(0,t.jsx)(n.$,{"data-slot":"button",className:(0,i.cn)(o({variant:a,size:s,className:r})),...l})}},15890:(e,r,a)=>{"use strict";a.d(r,{p:()=>i});var t=a(35563);a(19707);var n=a(28296),s=a(45505);function i(e){let{className:r,type:a,...i}=e;return(0,t.jsx)(n.p,{type:a,"data-slot":"input",className:(0,s.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",r),...i})}},45505:(e,r,a)=>{"use strict";a.d(r,{cn:()=>s});var t=a(36757),n=a(78049);function s(){for(var e=arguments.length,r=Array(e),a=0;a<e;a++)r[a]=arguments[a];return(0,n.QP)((0,t.$)(r))}},62521:(e,r,a)=>{"use strict";a.d(r,{U:()=>g});var t=a(35563),n=a(19707),s=a(45787),i=a(7090),o=a(15890);function l(e){let{items:r}=e;return 0===r.length?(0,t.jsx)("div",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"No control signals matched the current filter."}):(0,t.jsx)("ul",{className:"space-y-2",children:r.map((e,r)=>{var a,n,s,i,o;let l=[(null==(a=e.scope)?void 0:a.surface)&&"surface=".concat(e.scope.surface),(null==(n=e.scope)?void 0:n.channel)&&"channel=".concat(e.scope.channel),(null==(s=e.scope)?void 0:s.sessionId)&&"session=".concat(e.scope.sessionId)].filter(Boolean).join(" \xb7 ")||"unscoped";return(0,t.jsxs)("li",{className:"rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsxs)("div",{className:"text-sm font-medium",children:[e.kind," \xb7 ",e.urgency]}),(0,t.jsxs)("div",{className:"mt-0.5 font-mono text-[10px] text-muted-foreground",children:[function(e){let r=Date.now()-new Date(e).getTime();return r<6e4?"just now":r<36e5?"".concat(Math.floor(r/6e4),"m ago"):r<864e5?"".concat(Math.floor(r/36e5),"h ago"):"".concat(Math.floor(r/864e5),"d ago")}(e.createdAt)," \xb7 ",null!=(i=e.source)?i:"unknown"," \xb7 ",l]}),(0,t.jsx)("pre",{className:"mt-2 overflow-x-auto rounded-md bg-muted p-2 text-[11px]",children:JSON.stringify(null!=(o=e.payload)?o:{},null,2)})]},r)})})}let d=["background","quick-pass","normal","priority","critical"];class c{async list(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=new URLSearchParams;Object.entries(e).forEach(e=>{let[a,t]=e;t&&r.set(a,t)});let a=r.toString();return this.client.fetchJson("/v1/control-signals".concat(a?"?".concat(a):""))}emit(e){return this.client.fetchJson("/v1/control-signals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}constructor(e){this.client=e}}var u=a(84240),p=a(53403);function g(){var e,r,a,g;let{client:m}=(0,s.Q)(),x=(0,n.useMemo)(()=>new c(m),[m]),[v,h]=(0,n.useState)({items:[]}),[b,f]=(0,n.useState)(!1),[y,j]=(0,n.useState)(""),[N,k]=(0,n.useState)(""),[w,S]=(0,n.useState)(""),[z,C]=(0,n.useState)(""),[_,O]=(0,n.useState)(""),[E,J]=(0,n.useState)(""),[P,R]=(0,n.useState)("normal"),[$,D]=(0,n.useState)("operator"),[I,M]=(0,n.useState)(""),[U,q]=(0,n.useState)(""),[A,B]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[T,Y]=(0,n.useState)(!1),K=(0,n.useCallback)(async()=>{(0,p.cY)("webterm.control.list.refresh",{kind:y,surface:N,minUrgency:w,sessionId:z,limit:_}),f(!0);try{let e=await x.list({kind:y||void 0,surface:N||void 0,minUrgency:w||void 0,sessionId:z||void 0,limit:_||void 0});h(e)}catch(e){u.oR.error("signals list failed: ".concat(e instanceof Error?e.message:e))}finally{f(!1)}},[x,y,N,w,z,_]);(0,n.useEffect)(()=>{K()},[K]);let L=async e=>{if(e.preventDefault(),!E.trim())return void u.oR.error("kind required");let r={};if(F.trim())try{r=JSON.parse(F)}catch(e){u.oR.error("payload must be valid JSON");return}let a={kind:E.trim(),urgency:P,source:$.trim()||"operator",mayPreempt:T,payload:r,scope:{...I?{surface:I}:{},...U?{channel:U}:{},...A?{sessionId:A}:{}}};(0,p.cY)("webterm.control.emit",{kind:a.kind,urgency:a.urgency});try{f(!0),await x.emit(a),u.oR.success("signal emitted"),Q(""),await K()}catch(e){u.oR.error("emit failed: ".concat(e instanceof Error?e.message:e))}finally{f(!1)}},V=null!=(e=v.countsByKind)?e:{};return(0,t.jsxs)("div",{className:"mx-auto max-w-5xl space-y-4 p-4",children:[(0,t.jsxs)("header",{className:"space-y-2",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Control signals"}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 text-[11px] text-muted-foreground",children:[(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["total ",null!=(r=v.total)?r:0]}),(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["latest ",null!=(a=v.latest)?a:"-"]}),Object.entries(V).map(e=>{let[r,a]=e;return(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:[r," ",a]},r)})]})]}),(0,t.jsxs)("form",{onSubmit:e=>{e.preventDefault(),K()},className:"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsx)(o.p,{value:y,onChange:e=>j(e.target.value),placeholder:"kind",className:"flex-1 min-w-[140px]"}),(0,t.jsx)(o.p,{value:N,onChange:e=>k(e.target.value),placeholder:"surface",className:"flex-1 min-w-[140px]"}),(0,t.jsxs)("select",{value:w,onChange:e=>S(e.target.value),className:"h-9 flex-1 min-w-[170px] rounded-md border border-input bg-background px-2 text-sm",children:[(0,t.jsx)("option",{value:"",children:"min urgency (any)"}),d.map(e=>(0,t.jsx)("option",{value:e,children:e},e))]}),(0,t.jsx)(o.p,{value:z,onChange:e=>C(e.target.value),placeholder:"session id",className:"flex-1 min-w-[140px]"}),(0,t.jsx)(o.p,{value:_,onChange:e=>O(e.target.value),placeholder:"limit",type:"number",className:"w-[100px]"}),(0,t.jsx)(i.$,{type:"submit",size:"sm",disabled:b,children:"Filter"})]}),(0,t.jsxs)("form",{onSubmit:L,className:"space-y-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold",children:"Emit a signal"}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)(o.p,{value:E,onChange:e=>J(e.target.value),placeholder:"kind (required)",className:"flex-1 min-w-[140px]"}),(0,t.jsx)("select",{value:P,onChange:e=>{let r=e.target.value;"string"==typeof r&&d.includes(r)&&R(r)},className:"h-9 rounded-md border border-input bg-background px-2 text-sm",children:d.map(e=>(0,t.jsx)("option",{value:e,children:e},e))}),(0,t.jsx)(o.p,{value:$,onChange:e=>D(e.target.value),placeholder:"source",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:I,onChange:e=>M(e.target.value),placeholder:"scope.surface",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:U,onChange:e=>q(e.target.value),placeholder:"scope.channel",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:A,onChange:e=>B(e.target.value),placeholder:"scope.session",className:"flex-1 min-w-[120px]"}),(0,t.jsxs)("label",{className:"flex items-center gap-1.5 text-xs",children:[(0,t.jsx)("input",{type:"checkbox",checked:T,onChange:e=>Y(e.target.checked)}),"mayPreempt"]})]}),(0,t.jsx)("textarea",{value:F,onChange:e=>Q(e.target.value),placeholder:'payload JSON (optional, e.g. {"reason":"manual"})',rows:3,className:"w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs"}),(0,t.jsx)(i.$,{type:"submit",size:"sm",disabled:b,children:"Emit"})]}),(0,t.jsx)(l,{items:null!=(g=v.items)?g:[]})]})}},62621:(e,r,a)=>{"use strict";a.r(r),a.d(r,{default:()=>s});var t=a(35563),n=a(62521);function s(){return(0,t.jsx)(n.U,{})}},96702:(e,r,a)=>{Promise.resolve().then(a.bind(a,62621))}},e=>{e.O(0,[3165,2808,4240,8296,5787,3042,4259,7358],()=>e(e.s=96702)),_N_E=e.O()}]);