cli-jaw 1.5.0 → 1.6.0

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 (225) hide show
  1. package/README.ko.md +2 -2
  2. package/README.md +21 -2
  3. package/README.zh-CN.md +2 -2
  4. package/dist/bin/cli-jaw.js +5 -1
  5. package/dist/bin/cli-jaw.js.map +1 -1
  6. package/dist/bin/commands/dispatch.js +50 -0
  7. package/dist/bin/commands/dispatch.js.map +1 -0
  8. package/dist/lib/mcp-sync.js +1 -1
  9. package/dist/lib/mcp-sync.js.map +1 -1
  10. package/dist/lib/upload.js +14 -1
  11. package/dist/lib/upload.js.map +1 -1
  12. package/dist/server.js +53 -40
  13. package/dist/server.js.map +1 -1
  14. package/dist/src/agent/events.js +72 -13
  15. package/dist/src/agent/events.js.map +1 -1
  16. package/dist/src/agent/spawn.js +65 -24
  17. package/dist/src/agent/spawn.js.map +1 -1
  18. package/dist/src/cli/commands.js +6 -6
  19. package/dist/src/cli/commands.js.map +1 -1
  20. package/dist/src/cli/handlers.js +11 -9
  21. package/dist/src/cli/handlers.js.map +1 -1
  22. package/dist/src/cli/registry.js +7 -1
  23. package/dist/src/cli/registry.js.map +1 -1
  24. package/dist/src/core/config.js +15 -8
  25. package/dist/src/core/config.js.map +1 -1
  26. package/dist/src/core/db.js +18 -3
  27. package/dist/src/core/db.js.map +1 -1
  28. package/dist/src/core/employees.js +34 -0
  29. package/dist/src/core/employees.js.map +1 -0
  30. package/dist/src/discord/bot.js +72 -9
  31. package/dist/src/discord/bot.js.map +1 -1
  32. package/dist/src/discord/commands.js +12 -8
  33. package/dist/src/discord/commands.js.map +1 -1
  34. package/dist/src/orchestrator/distribute.js +41 -24
  35. package/dist/src/orchestrator/distribute.js.map +1 -1
  36. package/dist/src/orchestrator/gateway.js +3 -1
  37. package/dist/src/orchestrator/gateway.js.map +1 -1
  38. package/dist/src/orchestrator/pipeline.js +93 -27
  39. package/dist/src/orchestrator/pipeline.js.map +1 -1
  40. package/dist/src/orchestrator/research.js +5 -5
  41. package/dist/src/orchestrator/research.js.map +1 -1
  42. package/dist/src/orchestrator/scope.js +55 -0
  43. package/dist/src/orchestrator/scope.js.map +1 -0
  44. package/dist/src/orchestrator/state-machine.js +23 -21
  45. package/dist/src/orchestrator/state-machine.js.map +1 -1
  46. package/dist/src/orchestrator/worker-registry.js +9 -2
  47. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  48. package/dist/src/prompt/builder.js +78 -37
  49. package/dist/src/prompt/builder.js.map +1 -1
  50. package/dist/src/prompt/templates/a1-system.md +40 -0
  51. package/dist/src/prompt/templates/employee.md +10 -1
  52. package/dist/src/prompt/templates/orchestration.md +17 -1
  53. package/dist/src/telegram/bot.js +7 -1
  54. package/dist/src/telegram/bot.js.map +1 -1
  55. package/package.json +4 -2
  56. package/public/assets/fonts/GeistVF.woff2 +0 -0
  57. package/public/assets/fonts/JetBrainsMono-Variable.woff2 +0 -0
  58. package/public/assets/providers/claude-color.svg +1 -0
  59. package/public/assets/providers/claude.svg +1 -0
  60. package/public/assets/providers/copilot-color.svg +1 -0
  61. package/public/assets/providers/copilot.svg +1 -0
  62. package/public/assets/providers/discord.svg +1 -0
  63. package/public/assets/providers/gemini-color.svg +1 -0
  64. package/public/assets/providers/gemini.svg +1 -0
  65. package/public/assets/providers/openai.svg +1 -0
  66. package/public/assets/providers/opencode.svg +1 -0
  67. package/public/assets/providers/telegram.svg +1 -0
  68. package/public/css/chat.css +79 -51
  69. package/public/css/diagram.css +348 -0
  70. package/public/css/layout.css +33 -10
  71. package/public/css/markdown.css +64 -18
  72. package/public/css/modals.css +3 -3
  73. package/public/css/orc-state.css +9 -9
  74. package/public/css/sidebar.css +37 -3
  75. package/public/css/tool-ui.css +46 -11
  76. package/public/css/variables.css +63 -63
  77. package/public/dist/assets/api-Bbmmo0o1.js +1 -0
  78. package/public/dist/assets/architecture-YZFGNWBL-BxiHqtOH.js +1 -0
  79. package/public/dist/assets/architectureDiagram-Q4EWVU46-CJTGDw5p.js +1 -0
  80. package/public/dist/assets/blockDiagram-DXYQGD6D-Btl5Y-Er.js +1 -0
  81. package/public/dist/assets/c4Diagram-AHTNJAMY-sDfjW4ZF.js +1 -0
  82. package/public/dist/assets/classDiagram-6PBFFD2Q-ByCgggL2.js +1 -0
  83. package/public/dist/assets/classDiagram-v2-HSJHXN6E-t1amaXkU.js +1 -0
  84. package/public/dist/assets/constants-C8_0OtK2.js +1 -0
  85. package/public/dist/assets/cose-bilkent-S5V4N54A-eOSFGdaE.js +1 -0
  86. package/public/dist/assets/dagre-KV5264BT-OCB5j8Q6.js +1 -0
  87. package/public/dist/assets/diagram-5BDNPKRD-C-4fgK5P.js +1 -0
  88. package/public/dist/assets/diagram-G4DWMVQ6-C6vmHKDV.js +1 -0
  89. package/public/dist/assets/diagram-MMDJMWI5-BMCo_wmt.js +1 -0
  90. package/public/dist/assets/diagram-TYMM5635-DaCLdttJ.js +1 -0
  91. package/public/dist/assets/employees-D5n7mX5v.js +39 -0
  92. package/public/dist/assets/erDiagram-SMLLAGMA-BiTRdm5s.js +1 -0
  93. package/public/dist/assets/flowDiagram-DWJPFMVM-sv6jVi0d.js +1 -0
  94. package/public/dist/assets/ganttDiagram-T4ZO3ILL-jCP3OW23.js +1 -0
  95. package/public/dist/assets/gitGraph-7Q5UKJZL-BIeKLxpm.js +1 -0
  96. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CokylnbW.js +1 -0
  97. package/public/dist/assets/index-Br2UdKlR.css +1 -0
  98. package/public/dist/assets/index-CmAU0d96.js +49 -0
  99. package/public/dist/assets/info-OMHHGYJF-CIEl5dWF.js +1 -0
  100. package/public/dist/assets/infoDiagram-42DDH7IO-BBnK1Bh2.js +1 -0
  101. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-qXIz0VhS.js +1 -0
  102. package/public/dist/assets/journeyDiagram-VCZTEJTY-BdrOLof3.js +1 -0
  103. package/public/dist/assets/kanban-definition-6JOO6SKY-CcX7CE04.js +1 -0
  104. package/public/dist/assets/mermaid.core-BoxIvw7E.js +1 -0
  105. package/public/dist/assets/mindmap-definition-QFDTVHPH-CdXARskX.js +1 -0
  106. package/public/dist/assets/packet-4T2RLAQJ-Bz4ZwYZ3.js +1 -0
  107. package/public/dist/assets/pie-ZZUOXDRM-AtGL3wZ2.js +1 -0
  108. package/public/dist/assets/pieDiagram-DEJITSTG-B5SOq9Yr.js +1 -0
  109. package/public/dist/assets/quadrantDiagram-34T5L4WZ-D0uNWgpI.js +1 -0
  110. package/public/dist/assets/radar-PYXPWWZC-AbJSfeqB.js +1 -0
  111. package/public/dist/assets/render-C8N0rp4L.js +25 -0
  112. package/public/dist/assets/requirementDiagram-MS252O5E-62td6IQ-.js +1 -0
  113. package/public/dist/assets/sankeyDiagram-XADWPNL6-Crg_02iC.js +1 -0
  114. package/public/dist/assets/sequenceDiagram-FGHM5R23-fbCocZHj.js +1 -0
  115. package/public/dist/assets/settings-BJR-IGM5.js +41 -0
  116. package/public/dist/assets/settings-Dm6OnPmY.js +1 -0
  117. package/public/dist/assets/skills-D6jv9AIs.js +1 -0
  118. package/public/dist/assets/skills-uywskdFh.js +12 -0
  119. package/public/dist/assets/slash-commands-CCDonT40.js +1 -0
  120. package/public/dist/assets/{slash-commands-DMsE88bu.js → slash-commands-DWvL-VDU.js} +1 -1
  121. package/public/dist/assets/stateDiagram-FHFEXIEX-Gy3DhXxQ.js +1 -0
  122. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DJc-FW9O.js +1 -0
  123. package/public/dist/assets/timeline-definition-GMOUNBTQ-B3cA9DgY.js +1 -0
  124. package/public/dist/assets/treeView-SZITEDCU-Cn58DIbB.js +1 -0
  125. package/public/dist/assets/treemap-W4RFUUIX-DPcYjDzH.js +1 -0
  126. package/public/dist/assets/ui-C1daR00l.js +1 -0
  127. package/public/dist/assets/ui-D-oFkXed.js +131 -0
  128. package/public/dist/assets/vendor-icons-1Ec7ZWcT.js +1 -0
  129. package/public/dist/assets/{vendor-mermaid-COidH9HB.js → vendor-mermaid-lvHqQdfg.js} +4 -4
  130. package/public/dist/assets/vennDiagram-DHZGUBPP-DkBfxilo.js +1 -0
  131. package/public/dist/assets/wardley-RL74JXVD-6Dg0PJ4H.js +1 -0
  132. package/public/dist/assets/wardleyDiagram-NUSXRM2D-Dsntl_vy.js +1 -0
  133. package/public/dist/assets/ws-Dnn8HG8B.js +2 -0
  134. package/public/dist/assets/xychartDiagram-5P7HB3ND-B_McB5GE.js +1 -0
  135. package/public/dist/index.html +63 -55
  136. package/public/index.html +62 -53
  137. package/public/js/constants.ts +8 -2
  138. package/public/js/diagram/iframe-renderer.ts +559 -0
  139. package/public/js/diagram/types.ts +129 -0
  140. package/public/js/diagram/widget-validator.ts +82 -0
  141. package/public/js/features/chat.ts +24 -12
  142. package/public/js/features/employees.ts +3 -2
  143. package/public/js/features/heartbeat.ts +4 -3
  144. package/public/js/features/memory.ts +4 -3
  145. package/public/js/features/process-block.ts +12 -11
  146. package/public/js/features/settings-cli-status.ts +10 -7
  147. package/public/js/features/settings-core.ts +13 -3
  148. package/public/js/features/settings-discord.ts +9 -0
  149. package/public/js/features/settings-mcp.ts +8 -7
  150. package/public/js/features/settings-stt.ts +4 -4
  151. package/public/js/features/settings-templates.ts +10 -8
  152. package/public/js/features/settings-types.ts +1 -1
  153. package/public/js/features/settings.ts +1 -1
  154. package/public/js/features/sidebar.ts +4 -2
  155. package/public/js/features/skills.ts +4 -3
  156. package/public/js/features/theme.ts +4 -0
  157. package/public/js/features/tool-ui.ts +6 -5
  158. package/public/js/features/voice-recorder.ts +2 -1
  159. package/public/js/icons.ts +257 -0
  160. package/public/js/main.ts +9 -3
  161. package/public/js/provider-icons.ts +88 -0
  162. package/public/js/render.ts +493 -30
  163. package/public/js/streaming-render.ts +3 -3
  164. package/public/js/ui.ts +38 -18
  165. package/public/js/ws.ts +17 -10
  166. package/public/locales/en.json +89 -88
  167. package/public/locales/ko.json +89 -88
  168. package/scripts/release-preview.sh +1 -1
  169. package/public/dist/assets/api-BlPw3bUI.js +0 -1
  170. package/public/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +0 -1
  171. package/public/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +0 -1
  172. package/public/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +0 -1
  173. package/public/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +0 -1
  174. package/public/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +0 -1
  175. package/public/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +0 -1
  176. package/public/dist/assets/constants-DshMUJbo.js +0 -1
  177. package/public/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +0 -1
  178. package/public/dist/assets/dagre-KV5264BT-BVwNaSwC.js +0 -1
  179. package/public/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +0 -1
  180. package/public/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +0 -1
  181. package/public/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +0 -1
  182. package/public/dist/assets/diagram-TYMM5635-C9xMWPQn.js +0 -1
  183. package/public/dist/assets/employees-CFRlsbHm.js +0 -39
  184. package/public/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +0 -1
  185. package/public/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +0 -1
  186. package/public/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +0 -1
  187. package/public/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +0 -1
  188. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +0 -1
  189. package/public/dist/assets/index-1Gg-6jeC.css +0 -1
  190. package/public/dist/assets/index-CQHqXjrK.js +0 -49
  191. package/public/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +0 -1
  192. package/public/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +0 -1
  193. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +0 -1
  194. package/public/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +0 -1
  195. package/public/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +0 -1
  196. package/public/dist/assets/mermaid.core-CHuluSlD.js +0 -1
  197. package/public/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +0 -1
  198. package/public/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +0 -1
  199. package/public/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +0 -1
  200. package/public/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +0 -1
  201. package/public/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +0 -1
  202. package/public/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +0 -1
  203. package/public/dist/assets/render-YHvL5VM_.js +0 -6
  204. package/public/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +0 -1
  205. package/public/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +0 -1
  206. package/public/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +0 -1
  207. package/public/dist/assets/settings-BQF_u5px.js +0 -37
  208. package/public/dist/assets/settings-C5Q9IPjJ.js +0 -1
  209. package/public/dist/assets/skills-9Pd2rOw-.js +0 -1
  210. package/public/dist/assets/skills-BI7sQAdk.js +0 -12
  211. package/public/dist/assets/slash-commands-FMpJzlDB.js +0 -1
  212. package/public/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +0 -1
  213. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +0 -1
  214. package/public/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +0 -1
  215. package/public/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +0 -1
  216. package/public/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +0 -1
  217. package/public/dist/assets/ui-BukgLHuh.js +0 -29
  218. package/public/dist/assets/ui-Bvz1JfTE.js +0 -1
  219. package/public/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +0 -1
  220. package/public/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +0 -1
  221. package/public/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +0 -1
  222. package/public/dist/assets/ws-S_AZgx7L.js +0 -2
  223. package/public/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +0 -1
  224. /package/public/dist/assets/{api-B8XKQ4OT.js → api-Ci-lgwRp.js} +0 -0
  225. /package/public/dist/assets/{locale-BjoAcbis.js → locale-DIXc-_34.js} +0 -0
@@ -1,49 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
- import{n as e,t}from"./vendor-render-D2YP6GiF.js";import{t as n}from"./state-O6NVkWcL.js";import{Z as r}from"./vendor-mermaid-COidH9HB.js";import{a as i,c as a,o,s,t as c}from"./render-YHvL5VM_.js";import{_ as l,g as ee,h as u,n as d,o as te,p as ne,s as re,t as f}from"./ui-BukgLHuh.js";import{n as ie,r as p,t as m}from"./api-B8XKQ4OT.js";import{t as ae}from"./ws-S_AZgx7L.js";import{t as oe}from"./locale-BjoAcbis.js";import{a as se,i as ce,n as le,o as ue,r as de,t as fe}from"./slash-commands-DMsE88bu.js";import{i as pe,t as me}from"./skills-BI7sQAdk.js";import{a as he,r as ge}from"./constants-DshMUJbo.js";import{A as _e,C as ve,D as ye,E as be,O as xe,T as h,a as Se,c as Ce,f as we,g,h as Te,i as Ee,j as De,k as Oe,l as ke,m as Ae,n as je,o as Me,p as Ne,r as Pe,s as Fe,t as _,u as Ie,w as Le,x as Re,y as ze}from"./settings-BQF_u5px.js";var v=[];async function y(){let e=document.getElementById(`chatInput`),t=document.getElementById(`btnSend`);if(!e||!t)return;let i=document.activeElement===t;if(t.classList.contains(`stop-mode`)&&i&&!e.value.trim()&&!n.attachedFiles.length){ie(`/api/stop`,`POST`);return}let o=e.value.trim();if(!o&&!n.attachedFiles.length)return;let s=o.slice(1).trim().split(/\s+/)[0]||``,c=s.includes(`/`)||s.includes(`\\`);if(o.startsWith(`/`)&&!n.attachedFiles.length&&!c){e.value=``,C(),fe();try{let e,t;if(typeof AbortSignal?.timeout==`function`)e=AbortSignal.timeout(1e4);else{let n=new AbortController;e=n.signal,t=setTimeout(()=>n.abort(),1e4)}let n=oe(),r=await fetch(`/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":n},body:JSON.stringify({text:o,locale:n}),signal:e});t&&clearTimeout(t);let i=await r.json().catch(()=>({}));if(i?.code===`not_command`){f(`user`,o),await p(`/api/message`,`POST`,{prompt:o});return}if(!r.ok&&!i?.text)throw Error(`HTTP ${r.status}`);if(i?.code===`clear_screen`){u().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}i?.text&&d(i.text,``,i.type)}catch(e){d(a(`chat.cmd.fail`,{msg:e.message}),``,`error`)}return}if(n.attachedFiles.length){f(`user`,`[📎 ${n.attachedFiles.map(e=>e.name).join(`, `)}] ${o}`),e.value=``,C();try{let e=(await Promise.all(n.attachedFiles.map(e=>Ve(e)))).map(e=>a(`chat.file.sent`,{path:e})).join(`
3
- `);o&&(e+=a(`chat.file.sentWithMsg`,{text:o})),x(),await p(`/api/message`,`POST`,{prompt:e})}catch(e){d(a(`chat.file.uploadFail`,{msg:e.message})),x()}}else{f(`user`,o),e.value=``,C();let t=await fetch(`/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:o})}),n=await t.json().catch(()=>({}));if(!t.ok){d(`❌ ${n.error||a(`chat.requestFail`,{status:t.status})}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await r(async()=>{let{updateQueueBadge:e}=await import(`./ui-Bvz1JfTE.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(n.pending||1)}else n.continued&&d(a(`chat.continue`))}}function Be(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),y())}async function Ve(e){let t=await fetch(`/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function b(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);S(),document.getElementById(`chatInput`)?.focus()}function He(e){n.attachedFiles.splice(e,1),S()}function x(){v.forEach(e=>URL.revokeObjectURL(e)),v=[],n.attachedFiles=[],S();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function S(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(v.forEach(e=>URL.revokeObjectURL(e)),v=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);v.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
4
- ${i}
5
- <span class="file-chip-name">📎 ${c(e.name)} (${n}KB)</span>
6
- <button class="file-chip-remove" data-file-idx="${t}" title="Remove">✕</button>
7
- </div>`}).join(``))}}async function Ue(){ie(`/api/clear`,`POST`),u().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await r(async()=>{let{cleanupToolActivity:e}=await import(`./ui-Bvz1JfTE.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),ee().catch(()=>{})}function We(e){e.style.height=`auto`,e.style.height=e.scrollHeight+`px`}function Ge(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>We(e))}function C(){let e=document.getElementById(`chatInput`);e&&(e.style.height=`auto`)}function Ke(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&b(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&b(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t)if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}n.length&&(e.preventDefault(),b(n))})}async function qe(e,t,r){let i=document.getElementById(`chatInput`),o=i?.value.trim()||``,s=[...n.attachedFiles],c=[`🎤 [음성 메시지]`];s.length&&c.push(`[📎 ${s.map(e=>e.name).join(`, `)}]`),o&&c.push(o),f(`user`,c.join(` `)),i&&o&&(i.value=``,C()),s.length&&x();try{let n=await fetch(`/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let i=await n.json().catch(()=>null);if(!i?.text)throw Error(`Empty STT result`);d(`🎤 STT (${i.engine}, ${i.elapsed?.toFixed(1)}s): "${i.text.slice(0,100)}"`,``,`info`);let c=[];s.length&&(c=await Promise.all(s.map(e=>Ve(e))));let l=[];for(let e of c)l.push(a(`chat.file.sent`,{path:e}));l.push(`🎤 ${i.text}`),o&&l.push(o),await p(`/api/message`,`POST`,{prompt:l.join(`
8
- `)})}catch(e){d(a(`voice.sttFail`,{msg:e.message}),``,`error`)}}var Je={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},Ye={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function Xe(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function Ze(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=Xe(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=Qe(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function Qe(e){try{let[t,n,r,i,a]=$e(e);return w(t,{min:0,max:59}),w(n,{min:0,max:23}),w(r,{min:1,max:31}),w(i,{min:1,max:12,aliases:Ye}),w(a,{min:0,max:7,aliases:Je,normalize:nt}),null}catch(e){return e.message}}function $e(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function w(e,t){for(let n of e.split(`,`))et(n.trim(),t)}function et(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,tt(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||T(e,t)>T(r,t))throw Error(`invalid cron range "${n}"`);return}T(n,t)}}function T(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!rt(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function tt(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function nt(e){return e===7?0:e}function rt(e,t,n){return e>=t&&e<=n}async function it(){n.heartbeatJobs=((await m(`/api/heartbeat`))?.jobs||[]).map(O),n.heartbeatErrors=A(n.heartbeatJobs),E(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function at(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function E(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(O);n.heartbeatJobs=t,n.heartbeatErrors=A(t),t.length===0?e.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">${a(`hb.empty`)}</p>`:e.innerHTML=t.map((e,t)=>{let r=ut(e.schedule),i=r.kind===`cron`,o=n.heartbeatErrors[e.id],s=o||gt(r),l=o?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,ee=i?`<input type="text" value="${c(r.cron)}" placeholder="${c(a(`hb.cronPlaceholder`))}"
9
- data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,u=i?`<span class="hb-chip">${c(a(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${c(a(`hb.minutesLabel`))}</span>`;return`
10
- <div class="hb-job-card">
11
- <div class="hb-job-header">
12
- <input type="text" value="${c(String(e.name||``))}" placeholder="${c(a(`hb.name`))}"
13
- data-hb-name="${t}">
14
- <button class="hb-toggle ${e.enabled?`on`:`off`}"
15
- data-hb-toggle="${t}" aria-label="${c(String(e.name||`job`)+` toggle`)}"></button>
16
- <button class="hb-del" data-hb-remove="${t}">✕</button>
17
- </div>
18
- <div class="hb-job-schedule">
19
- <select data-hb-kind="${t}">
20
- <option value="every"${i?``:` selected`}>${c(a(`hb.kindEvery`))}</option>
21
- <option value="cron"${i?` selected`:``}>${c(a(`hb.kindCron`))}</option>
22
- </select>
23
- ${ee}
24
- ${u}
25
- <input type="text" value="${c(r.timeZone||``)}" placeholder="${c(pt())}"
26
- data-hb-timezone="${t}">
27
- </div>
28
- <p class="${l}">${c(s)}</p>
29
- <textarea class="hb-prompt" rows="2" placeholder="${c(a(`hb.prompt`))}"
30
- data-hb-prompt="${t}">${c(String(e.prompt||``))}</textarea>
31
- </div>
32
- `}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.textContent=`💓 Heartbeat (${r})`)}function ot(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:ft({kind:`every`,minutes:5}),prompt:``}),E(),D()}function st(e){n.heartbeatJobs.splice(e,1),E(),D()}function ct(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,E(),D())}async function D(){let e=n.heartbeatJobs.map(O);if(n.heartbeatJobs=e,n.heartbeatErrors=A(e),Object.keys(n.heartbeatErrors).length>0){E();return}let t=await p(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(O),n.heartbeatErrors=A(n.heartbeatJobs),E())}async function lt(){try{let e=((await m(`/api/heartbeat`))?.jobs||[]).map(O).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.textContent=`💓 Heartbeat (${e})`)}catch{}}function O(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:ut(e.schedule),prompt:String(e.prompt||``)}}function ut(e){let t=dt(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function dt(e){return(typeof e==`string`?e.trim():``)||void 0}function ft(e){let t=k();return t?{...e,timeZone:t}:e}function k(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function pt(){let e=k();return e?`${a(`hb.timezoneAuto`)} ${e}`:a(`hb.timezoneAuto`)}function A(e){let t={};for(let n of e){let e=mt(n);e&&(t[n.id]=e)}return t}function mt(e){let t=Ze(e.schedule);return t.ok?null:ht(t.code,t.error)}function ht(e,t){switch(e){case`invalid_cron`:return a(`hb.invalidCron`);case`invalid_timezone`:return a(`hb.invalidTimeZone`);case`invalid_minutes`:return a(`hb.invalidMinutes`);default:return t||a(`hb.invalidSchedule`)}}function gt(e){let t=e.timeZone||k()||`Asia/Seoul`;return e.kind===`cron`?a(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):a(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}function j(e){return document.getElementById(e)}function M(e,t){let n=j(e);n&&(n.textContent=t==null?``:String(t))}function N(e,t){let n=j(e);n&&(n.value=t==null?``:String(t))}function _t(e,t){let n=j(`memorySidebarBtn`);n&&(n.textContent=`🧠 Memory · ${e?.indexState===`ready`?`Ready`:e?.state===`not_initialized`?`Indexing`:e?.state||`(${t})`}`)}function vt(e){let t=j(`advStatusBanner`);if(t){if(!e?.enabled){t.style.display=`none`,t.textContent=``;return}if(t.style.display=``,e.state===`not_initialized`){t.textContent=`Integrated memory is preparing its index. Temporary fallback memory context is active until initialization completes.`;return}if(e.indexState===`not_indexed`){t.textContent=`Integrated memory is configured. Indexed search/read will activate after indexing becomes available.`;return}t.textContent=`Memory active. search/read=${e.routing?.searchRead||`basic`} / save=${e.routing?.save||`basic`}`}}function yt(e,t=!0){let n=j(`advStatusBanner`);n&&(n.style.display=t?``:`none`,n.textContent=e)}function P(e){for(let t of[`advBootstrapBtn`,`advReindexBtn`,`advReimportBtn`,`advOpenCorruptedBtn`]){let n=j(t);n&&(n.disabled=e)}}function bt(e){j(`memOn`)?.classList.toggle(`active`,e.enabled),j(`memOff`)?.classList.toggle(`active`,!e.enabled),N(`memFlushEvery`,e.flushEvery),N(`memCli`,e.cli||``),N(`memModel`,e.model||``),N(`memRetention`,e.retentionDays),M(`memPath`,e.path),M(`memCounter`,e.counter),M(`memThreshold`,e.flushEvery)}function xt(e){let t=j(`memTabBtnSettings`),n=j(`memTabSettings`);!t||!n||(t.style.display=``,n.style.display||(n.style.display=``))}function St(e){M(`advIndexState`,e?.indexState||e?.state||`-`),M(`advStorageRoot`,e?.storageRoot||`-`),M(`advIndexedFiles`,e?.indexedFiles||0),M(`advIndexedChunks`,e?.indexedChunks||0),M(`advLastIndexedAt`,e?.lastIndexedAt||`-`),M(`advImportStatus`,e?.importStatus||`-`),M(`advCorruptedCount`,e?.corruptedCount||0),M(`advLastExpansion`,(e?.lastExpansion||[]).join(`, `)||`-`),M(`advLastError`,e?.lastError||`-`);let t=e?.importedCounts||{};M(`advImportStatus`,`${e?.importStatus||`-`} (core:${t.core||0} md:${t.markdown||0} kv:${t.kv||0} claude:${t.claude||0})`)}function Ct(e){let t=j(`basicMemoryFiles`);if(t){if(!e?.length){t.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">No memory files yet</p>`;return}t.innerHTML=e.map(e=>`
33
- <div style="display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border:1px solid var(--border);border-radius:4px;margin-bottom:4px;cursor:pointer"
34
- data-mem-view="${c(e.name)}">
35
- <div>
36
- <span style="font-size:12px;font-family:monospace">${c(e.name)}</span>
37
- <span style="font-size:10px;color:var(--accent);margin-left:6px">${e.entries} entries</span>
38
- </div>
39
- <button data-mem-delete="${c(e.name)}" style="background:none;border:none;color:#f55;cursor:pointer;font-size:14px">🗑️</button>
40
- </div>
41
- `).join(``)}}function F(e,t){let n=j(e);if(n){if(!t?.length){n.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">No files</p>`;return}n.innerHTML=t.map(e=>`<div style="padding:6px 8px;border:1px solid var(--border);border-radius:4px;margin-bottom:4px">
42
- <span style="font-size:12px;font-family:monospace">${c(e)}</span>
43
- </div>`).join(``)}}function wt(e){F(`advancedMemoryFiles`,[...e?.sections?.profile||[],...e?.sections?.shared||[],...e?.sections?.episodes||[],...e?.sections?.semantic||[],...e?.sections?.procedures||[],...e?.sections?.sessions||[]]),F(`corruptedMemoryFiles`,e?.sections?.corrupted||[]),F(`legacyUnmappedFiles`,e?.sections?.legacyUnmapped||[])}function Tt(){return{importCore:j(`advImportCore`)?.checked!==!1,importMarkdown:j(`advImportMarkdown`)?.checked!==!1,importKv:j(`advImportKv`)?.checked!==!1,importClaudeSession:j(`advImportClaudeSession`)?.checked!==!1}}async function Et(){let[e,t,n]=await Promise.all([m(`/api/memory-files`),m(`/api/memory/status`),m(`/api/memory/files`)]);return{basic:e,status:t,files:n}}async function I(){let{basic:e,status:t,files:n}=await Et();e&&(bt(e),xt(t),vt(t),St(t),Ct(e.files),wt(n),_t(t,e.files.length),j(`memoryModal`)?.classList.add(`open`),L(`status`))}function Dt(e){e&&e.target!==e.currentTarget||j(`memoryModal`)?.classList.remove(`open`)}function L(e){let t={settings:`memTabSettings`,status:`memTabAdvOps`,files:`memTabFiles`};for(let n of Object.values(t)){let r=j(n);r&&(r.style.display=n===t[e]?``:`none`)}j(`memTabBtnSettings`)?.classList.toggle(`active`,e===`settings`),j(`memTabBtnAdvOps`)?.classList.toggle(`active`,e===`status`),j(`memTabBtnFiles`)?.classList.toggle(`active`,e===`files`),j(`memTabBtnSettings`)?.setAttribute(`aria-selected`,String(e===`settings`)),j(`memTabBtnAdvOps`)?.setAttribute(`aria-selected`,String(e===`status`)),j(`memTabBtnFiles`)?.setAttribute(`aria-selected`,String(e===`files`))}async function Ot(e){j(`memOn`)?.classList.toggle(`active`,e),j(`memOff`)?.classList.toggle(`active`,!e),await p(`/api/memory-files/settings`,`PUT`,{enabled:e})}async function R(){let e=j(`memFlushEvery`),t=j(`memCli`),n=j(`memModel`),r=j(`memRetention`);await p(`/api/memory-files/settings`,`PUT`,{flushEvery:+(e?.value||10),cli:t?.value||``,model:n?.value||``,retentionDays:+(r?.value||30)});let i=j(`memThreshold`);i&&e&&(i.textContent=e.value)}async function kt(){P(!0),yt(`메모리 bootstrap을 다시 실행하는 중...`,!0);let e=await p(`/api/memory/bootstrap`,`POST`,Tt());P(!1),e?.message&&alert(e.message),await I(),L(`status`)}async function At(){P(!0),yt(`메모리 인덱스를 재생성하는 중...`,!0);let e=await p(`/api/memory/reindex`,`POST`,{});P(!1),e?.message&&alert(e.message),await I(),L(`status`)}function jt(){let e=j(`advStorageRoot`)?.textContent||``,t=e?`${e}/corrupted`:`JAW_HOME/memory/structured/corrupted`;navigator.clipboard?.writeText&&navigator.clipboard.writeText(t).catch(()=>{}),alert(`Corrupted folder path copied/shown:\n${t}`)}async function Mt(e){confirm(`Delete `+e+`?`)&&(await p(`/api/memory-file?path=`+encodeURIComponent(e),`DELETE`,{}),I())}async function Nt(e){let t=await m(`/api/memory-file?path=`+encodeURIComponent(e));if(!t)return;let n=j(`basicMemoryFiles`);n&&(n.innerHTML=`
44
- <div style="margin-bottom:8px;display:flex;justify-content:space-between;align-items:center">
45
- <span style="font-size:12px;font-weight:600">${c(t.name)}</span>
46
- <button data-mem-back style="background:none;border:none;color:var(--accent);cursor:pointer;font-size:11px">← back</button>
47
- </div>
48
- <pre style="background:var(--bg);padding:8px;border-radius:4px;font-size:11px;white-space:pre-wrap;max-height:50vh;overflow-y:auto;color:var(--text)">${c(t.content)}</pre>
49
- `)}var z=`sidebarState`,B=900;function Pt(){let e={};try{e=JSON.parse(localStorage.getItem(z)||`{}`)}catch{}e.left&&document.body.classList.add(`left-collapsed`),e.right&&document.body.classList.add(`right-collapsed`),document.getElementById(`toggleLeft`)?.addEventListener(`click`,H),document.getElementById(`toggleRight`)?.addEventListener(`click`,U),window.addEventListener(`resize`,()=>{if(window.innerWidth>B){document.body.classList.remove(`left-expanded`,`right-expanded`);let e={};try{e=JSON.parse(localStorage.getItem(z)||`{}`)}catch{}document.body.classList.toggle(`left-collapsed`,!!e.left),document.body.classList.toggle(`right-collapsed`,!!e.right)}else document.body.classList.remove(`left-collapsed`,`right-collapsed`);W()}),window.innerWidth<=B&&document.body.classList.remove(`left-collapsed`,`right-collapsed`),W()}function V(){return window.innerWidth<=B}function H(){V()?document.body.classList.toggle(`left-expanded`):document.body.classList.toggle(`left-collapsed`),Lt(),W()}function U(){V()?document.body.classList.toggle(`right-expanded`):document.body.classList.toggle(`right-collapsed`),Lt(),W()}function Ft(){return V()?document.body.classList.contains(`left-expanded`):!document.body.classList.contains(`left-collapsed`)}function It(){return V()?document.body.classList.contains(`right-expanded`):!document.body.classList.contains(`right-collapsed`)}function W(){let e=document.getElementById(`toggleLeft`),t=document.getElementById(`toggleRight`);e&&(e.textContent=Ft()?`◀`:`▶`),t&&(t.textContent=It()?`▶`:`◀`)}function Lt(){localStorage.setItem(z,JSON.stringify({left:document.body.classList.contains(`left-collapsed`),right:document.body.classList.contains(`right-collapsed`)}))}var Rt=`theme`,G=null;function zt(n){let r=n===`light`?t:e;G||(G=document.createElement(`style`),G.id=`hljsTheme`,document.head.appendChild(G)),G.textContent=r}function Bt(){let e=localStorage.getItem(Rt),t=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;Ht(e||t),document.getElementById(`toggleTheme`)?.addEventListener(`click`,Vt)}function Vt(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;Ht(e),localStorage.setItem(Rt,e)}function Ht(e){document.documentElement.setAttribute(`data-theme`,e);let t=document.getElementById(`toggleTheme`);t&&t.classList.toggle(`is-light`,e===`light`),zt(e)}var Ut=50,Wt=30,Gt=80,Kt=500,K=null,qt=!1;function Jt(){if(qt||!(`ontouchstart`in window))return;qt=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,Yt,{passive:!0}),e.addEventListener(`touchend`,Xt,{passive:!0}))}function Yt(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<Wt?r=`left`:t.clientX>n-Wt&&(r=`right`),K={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function Xt(e){if(!K)return;let t=e.changedTouches[0],n=t.clientX-K.startX,r=Math.abs(t.clientY-K.startY),i=Date.now()-K.startTime,a=K;K=null,!(r>Gt||i>Kt||Math.abs(n)<Ut)&&(n>0&&a.isEdge===`left`&&H(),n<0&&a.isEdge===`right`&&U())}var q=!1,J=null,Y=[],X=null,Zt=null,Qt=0;function $t(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function en(e){let t=e;switch(t.name){case`NotAllowedError`:return a(`voice.micDenied`);case`NotFoundError`:return a(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return a(`voice.micBusy`);default:return t instanceof TypeError||!navigator.mediaDevices?a(`voice.httpsRequired`):a(`voice.micDenied`)}}async function tn(){if(n.isRecording)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){d(a(`voice.unsupported`),``,`error`);return}try{X=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(e){d(en(e),``,`error`);return}let e=$t();J=new MediaRecorder(X,e?{mimeType:e}:{}),Y=[],J.ondataavailable=e=>{e.data.size>0&&Y.push(e.data)},J.onerror=()=>{nn(),d(a(`voice.interrupted`),``,`error`)},J.onstop=async()=>{if(q){Y=[],on(),q=!1;return}let t=J?.mimeType||e||`audio/webm`,n=t.includes(`mp4`)?`.m4a`:t.includes(`ogg`)?`.ogg`:`.webm`,r=new Blob(Y,{type:t});if(Y=[],on(),r.size>20*1024*1024){d(a(`voice.tooLarge`),``,`error`);return}if(r.size<1e3){d(a(`voice.tooShort`),``,`error`);return}await qe(r,n,t)},J.start(),n.isRecording=!0,Qt=Date.now(),ln(!0),sn()}function nn(){!n.isRecording||!J||(J.state===`recording`&&J.stop(),n.isRecording=!1,cn(),ln(!1))}function rn(){!n.isRecording||!J||(q=!0,J.state===`recording`&&J.stop(),n.isRecording=!1,cn(),ln(!1))}function an(){n.isRecording?nn():tn()}function on(){X?.getTracks().forEach(e=>e.stop()),X=null}function sn(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Zt=setInterval(()=>{let t=Math.floor((Date.now()-Qt)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function cn(){Zt&&=(clearInterval(Zt),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function ln(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`);t&&(t.classList.toggle(`recording`,e),t.textContent=e?`⏹`:`🎤`,t.title=a(e?`voice.stop`:`voice.start`)),n&&(n.style.display=e?`inline-block`:`none`)}window.addEventListener(`unhandledrejection`,e=>{console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:un,addEmployee:dn,deleteEmployee:fn,updateEmployee:Z,onEmpCliChange:pn,onEmpRoleChange:mn}=await r(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-CFRlsbHm.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));document.getElementById(`btnSend`)?.addEventListener(`click`,y);var Q=document.getElementById(`chatInput`);Q?.addEventListener(`keydown`,e=>{de(e)||Be(e)});var $=0;Q?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{ue(e.target?.value||``),$=0}))}),Q?.addEventListener(`cmd-execute`,()=>{y()}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,le),document.addEventListener(`click`,ce),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,x),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&He(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>an()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>rn()),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,I),document.getElementById(`btnClearChat`)?.addEventListener(`click`,Ue),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,it),document.getElementById(`langToggle`)?.addEventListener(`click`,async()=>{let e=i()===`ko`?`en`:`ko`;await s(e);let t=document.getElementById(`langToggle`);t&&(t.textContent=`🌐 ${a(`lang.`+e)}`),n.ws&&n.ws.close()}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`,`settings`];r[n]&&ne(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,te),document.getElementById(`selCli`)?.addEventListener(`change`,()=>Ae()),document.getElementById(`selModel`)?.addEventListener(`change`,()=>Te()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>Te()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,dn),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){fn(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Z(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){pn(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(a(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Z(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Z(i.dataset.empModel||``,{model:t.value});return}let o=t.closest(`[data-emp-role]`);if(o){mn(o.dataset.empRole||``,t.value);return}let s=t.closest(`[data-emp-custom]`);if(s){Z(s.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&pe(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&me(t.dataset.filter||`all`,t)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,Pe),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>De(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>De(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>_e(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>_e(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,Oe),document.getElementById(`tgChatIds`)?.addEventListener(`change`,Oe),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>Le(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>Le(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>be(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>be(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>xe(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>xe(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>ye(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>ye(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,h),document.getElementById(`dcGuildId`)?.addEventListener(`change`,h),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,h),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,ve);function hn(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),g()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>hn(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>hn(!1));function gn(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),g()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>gn(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>gn(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,g),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,g);function _n(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),g()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>_n(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>_n(!1));function vn(){for(let e of ge()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){we(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){Ie(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,g)}}document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Re),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,ze),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>ke(!0)),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){localStorage.setItem(`cliStatusInterval`,this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>_(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,Se),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&_()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,Ee),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,Me),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>je()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>je(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,Fe),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,Ce),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>at(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>at()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,ot),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){ct(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){st(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,D();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},E(),D();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},E(),D();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},E(),D();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},E(),D();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,D();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>Dt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>Dt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>L(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>L(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>L(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>Ot(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>Ot(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,R),document.getElementById(`memCli`)?.addEventListener(`change`,R),document.getElementById(`memModel`)?.addEventListener(`change`,R),document.getElementById(`memRetention`)?.addEventListener(`change`,R),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,kt),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,At),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,kt),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,jt),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),Mt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){Nt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){I();return}});async function yn(){await o();let e=document.getElementById(`langToggle`);e&&(e.textContent=`🌐 ${a(`lang.`+i())}`),await he(),vn(),ae(),Ke(),Ge(),await se(),await Ne(),ke(),un(),lt(),l(),Pt(),Bt(),re(),Jt(),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}yn().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(n.isRecording){e.preventDefault(),rn();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`&&(e.preventDefault(),an())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,H),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,U);
@@ -1 +0,0 @@
1
- import{K as e}from"./vendor-mermaid-COidH9HB.js";export{e as createInfoServices};
@@ -1 +0,0 @@
1
- import{_ as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{g as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{h as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{m as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{t as e}from"./vendor-mermaid-COidH9HB.js";export{e as default};
@@ -1 +0,0 @@
1
- import{p as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{W as e}from"./vendor-mermaid-COidH9HB.js";export{e as createPacketServices};
@@ -1 +0,0 @@
1
- import{H as e}from"./vendor-mermaid-COidH9HB.js";export{e as createPieServices};
@@ -1 +0,0 @@
1
- import{f as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{d as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{B as e}from"./vendor-mermaid-COidH9HB.js";export{e as createRadarServices};
@@ -1,6 +0,0 @@
1
- import{A as e,C as t,D as n,E as r,F as i,I as a,M as o,N as s,O as c,P as l,S as u,T as d,_ as f,b as p,j as m,k as h,u as g,v as _,w as v,x as y,y as b}from"./vendor-render-D2YP6GiF.js";import{Q as x,Z as S}from"./vendor-mermaid-COidH9HB.js";var C=`ko`,w={},T={};async function E(){let e=null;try{e=localStorage.getItem(`claw_locale`)}catch{}if(!e){let t=(navigator.language||`ko`).split(/[-_]/)[0].toLowerCase();e=[`en`,`ko`].includes(t)?t:`ko`}T=await D(`ko`),w=e===`ko`?T:await D(e),C=e,k()}async function D(e){try{let{api:t}=await S(async()=>{let{api:e}=await import(`./api-BlPw3bUI.js`);return{api:e}},[]);return await t(`/api/i18n/${e}`)||{}}catch{return{}}}function O(e,t={}){let n=w[e]??T[e]??e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{${e}}`,String(r));return n}function k(){document.querySelectorAll(`[data-i18n]`).forEach(e=>{let t=e.getAttribute(`data-i18n`);t&&(e.textContent=O(t))}),document.querySelectorAll(`[data-i18n-placeholder]`).forEach(e=>{let t=e.getAttribute(`data-i18n-placeholder`);t&&(e.placeholder=O(t))}),document.querySelectorAll(`[data-i18n-title]`).forEach(e=>{let t=e.getAttribute(`data-i18n-title`);t&&(e.title=O(t))}),document.querySelectorAll(`[data-i18n-aria]`).forEach(e=>{let t=e.getAttribute(`data-i18n-aria`);t&&e.setAttribute(`aria-label`,O(t))})}async function A(e){if(e!==C){w=e===`ko`?T:await D(e),C=e;try{localStorage.setItem(`claw_locale`,e)}catch{}k();try{let{loadEmployees:e}=await S(async()=>{let{loadEmployees:e}=await import(`./employees-CFRlsbHm.js`);return{loadEmployees:e}},[]);e()}catch{}try{let{loadSkills:e}=await S(async()=>{let{loadSkills:e}=await import(`./skills-9Pd2rOw-.js`);return{loadSkills:e}},[]);e()}catch{}try{let{loadCommands:e}=await S(async()=>{let{loadCommands:e}=await import(`./slash-commands-FMpJzlDB.js`);return{loadCommands:e}},[]);e()}catch{}try{let{loadSettings:e}=await S(async()=>{let{loadSettings:e}=await import(`./settings-C5Q9IPjJ.js`);return{loadSettings:e}},[]);e()}catch{}}}function j(){return C}function M(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has(`locale`)||n.searchParams.set(`locale`,C),fetch(n.toString(),t)}function N(e){let t=[],n=e.replace(/```[\s\S]*?```/g,e=>(t.push(e),`\x00P${t.length-1}\x00`)).replace(/`[^`]+`/g,e=>(t.push(e),`\x00P${t.length-1}\x00`));return n=n.replace(/([\p{P}])\*\*(?=[^\s\p{P}])/gu,(e,t)=>t===`*`?e:t+`​**`),n=n.replace(/\x00P(\d+)\x00/g,(e,n)=>t[Number(n)]),n}l.registerLanguage(`javascript`,s),l.registerLanguage(`js`,s),l.registerLanguage(`typescript`,o),l.registerLanguage(`ts`,o),l.registerLanguage(`python`,m),l.registerLanguage(`py`,m),l.registerLanguage(`bash`,e),l.registerLanguage(`shell`,h),l.registerLanguage(`sh`,h),l.registerLanguage(`json`,c),l.registerLanguage(`css`,n),l.registerLanguage(`xml`,r),l.registerLanguage(`html`,r),l.registerLanguage(`markdown`,d),l.registerLanguage(`md`,d),l.registerLanguage(`yaml`,v),l.registerLanguage(`yml`,v),l.registerLanguage(`sql`,t),l.registerLanguage(`rust`,u),l.registerLanguage(`rs`,u),l.registerLanguage(`go`,y),l.registerLanguage(`java`,p),l.registerLanguage(`cpp`,b),l.registerLanguage(`c`,b),l.registerLanguage(`diff`,_),l.registerLanguage(`plaintext`,f),l.registerLanguage(`text`,f);var P=null;async function F(){return P||(P=await S(()=>import(`./mermaid.core-CHuluSlD.js`),[]),P.default.initialize({startOnLoad:!1,theme:document.documentElement.getAttribute(`data-theme`)===`light`?`default`:`dark`,securityLevel:`strict`})),P.default}function I(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function L(e){return x.sanitize(e,{USE_PROFILES:{html:!0,svg:!0,svgFilters:!0},FORBID_TAGS:[`script`,`style`,`iframe`,`object`,`embed`,`form`],FORBID_ATTR:[`onerror`,`onclick`,`onload`,`onmouseover`,`onfocus`,`onblur`],ADD_TAGS:[`use`],ADD_ATTR:[`aria-hidden`,`xmlns`,`viewBox`]})}var R=/["'](?:subtasks|employee_config|agent_phases|orchestration_plan)["']\s*:/;function z(e){let t=e.replace(/```json\n([\s\S]*?)\n```/g,(e,t)=>R.test(t)?``:e);return t=t.replace(/\{[^{}]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,``).trim(),t}function B(e){let t=[],n=[],r=e.replace(/```[\s\S]*?```/g,e=>(n.push(e),`\x00C${n.length-1}\x00`)).replace(/`[^`]+`/g,e=>(n.push(e),`\x00C${n.length-1}\x00`));return r=r.replace(/\$\$([\s\S]+?)\$\$/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!0}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\\\[([\s\S]+?)\\\]/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!0}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/(?<!\$)\$(?!\$)([^\n$]+?)\$(?!\$)/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!1}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\\\((.+?)\\\)/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!1}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\x00C(\d+)\x00/g,(e,t)=>n[Number(t)]),{text:r,blocks:t}}function V(e,t){return e.replace(/\x00MATH-(\d+)\x00/g,(e,n)=>{let r=t[Number(n)];if(!r)return`<code title="math placeholder error">[math error]</code>`;try{return g.renderToString(r.tex,{displayMode:r.displayMode,throwOnError:!1})}catch{return r.displayMode?`<pre><code>${I(r.tex)}</code></pre>`:`<code>${I(r.tex)}</code>`}})}var H=0;function U(){let e=document.querySelectorAll(`.mermaid-pending`);e.length&&e.forEach(async e=>{e.classList.remove(`mermaid-pending`);let t=e.textContent||``,n=`mermaid-${++H}`;try{let{svg:r}=await(await F()).render(n,t);e.innerHTML=L(r),e.classList.add(`mermaid-rendered`)}catch(n){let r=n?.message||n?.str||`Unknown error`;e.innerHTML=`
2
- <div class="mermaid-error">
3
- <div class="mermaid-error-title">⚠️ ${I(O(`mermaid.renderFail`)||`Mermaid render failed`)}</div>
4
- <div class="mermaid-error-msg">${I(r.slice(0,200))}</div>
5
- <pre class="mermaid-error-code"><code>${I(t)}</code></pre>
6
- </div>`}})}var W=!1;function G(){if(W)return!0;let e=new a;return e.code=function({text:e,lang:t}){if(t===`mermaid`)return`<div class="mermaid-container mermaid-pending">${I(e)}</div>`;let n=I(e);if(t&&l.getLanguage(t))try{n=l.highlight(e,{language:t}).value}catch{}else try{n=l.highlightAuto(e).value}catch{}let r=t?I(t):``,i=O(`code.copy`)||`Copy`;return`<div class="code-block"><div class="code-header"><span class="code-lang">${r}</span><button class="code-copy-btn" type="button" aria-label="${I(i)}">${I(i)}</button></div><pre><code class="hljs${t?` language-${I(t)}`:``}">${n}</code></pre></div>`},i.setOptions({renderer:e,gfm:!0,breaks:!0}),W=!0,!0}function K(){document.querySelectorAll(`.code-block pre code, .code-block-wrapper pre code`).forEach(e=>{if(e.dataset.highlighted===`yes`)return;let t=[...e.classList].find(e=>e.startsWith(`language-`))?.replace(`language-`,``),n=e.textContent||``;try{t&&l.getLanguage(t)?e.innerHTML=l.highlight(n,{language:t}).value:e.innerHTML=l.highlightAuto(n).value,e.dataset.highlighted=`yes`}catch{}})}var q=!1;function J(){q||(q=!0,document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`.code-copy-btn`);if(n){let e=n.closest(`.code-block`);if(!e)return;let t=e.querySelector(`pre code`);if(!t)return;navigator.clipboard.writeText(t.textContent||``).then(()=>{let e=n.textContent||``;n.textContent=O(`code.copied`),n.classList.add(`copied`),setTimeout(()=>{n.textContent=e,n.classList.remove(`copied`)},1500)}).catch(()=>{});return}let r=t?.closest(`.code-lang-label`);if(!r)return;let i=r.closest(`.code-block-wrapper`);if(!i)return;let a=i.querySelector(`pre code`);a&&navigator.clipboard.writeText(a.textContent||``).then(()=>{let e=r.textContent||``;r.textContent=O(`code.copied`),r.classList.add(`copied`),setTimeout(()=>{r.textContent=e,r.classList.remove(`copied`)},1500)}).catch(()=>{})}))}function Y(e){let t=z(e);if(!t)return`<em class="text-dim orchestrate-placeholder">${I(O(`orchestrator.dispatching`))}</em>`;let{text:n,blocks:r}=B(t);G();let a=N(n),o=i.parse(a);return o=o.replace(/<table/g,`<div class="table-wrapper"><table`).replace(/<\/table>/g,`</table></div>`),o=V(o,r),o=L(o),requestAnimationFrame(()=>{U(),K()}),J(),o}export{j as a,O as c,M as i,Y as n,E as o,z as r,A as s,I as t};
@@ -1 +0,0 @@
1
- import{u as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{l as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{c as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1,37 +0,0 @@
1
- import{t as e}from"./state-O6NVkWcL.js";import{c as t,t as n}from"./render-YHvL5VM_.js";import{n as r,r as i,t as a}from"./api-B8XKQ4OT.js";import{n as o}from"./locale-BjoAcbis.js";import{a as s,i as c,r as l,t as u}from"./constants-DshMUJbo.js";function d(e){let t=document.getElementById(`sttEngine`),n=document.getElementById(`sttGeminiKey`),r=document.getElementById(`sttGeminiModel`),a=document.getElementById(`sttGeminiModelCustom`),o=document.getElementById(`sttWhisperModel`),s=document.getElementById(`sttOpenaiBaseUrl`),c=document.getElementById(`sttOpenaiKey`),l=document.getElementById(`sttOpenaiModel`),u=document.getElementById(`sttVertexJson`);if(t&&(t.value=e.engine||`auto`),n&&(n.placeholder=e.geminiKeySet?`✅ 입력됨 ····${e.geminiKeyLast4||``}`:`AIza...`),r){let t=e.geminiModel||`gemini-2.5-flash-lite`;Array.from(r.options).some(e=>e.value===t)?r.value=t:(r.value=`__custom__`,a&&(a.value=t,a.style.display=``))}o&&(o.value=e.whisperModel||`mlx-community/whisper-large-v3-turbo`),s&&(s.value=e.openaiBaseUrl||``),c&&(c.placeholder=e.openaiKeySet?`✅ 입력됨 ····${e.openaiKeyLast4||``}`:`sk-...`),l&&(l.value=e.openaiModel||``),u&&(u.value=e.vertexConfig||``);function d(){let e=t?.value||`auto`,n=e===`auto`||e===`gemini`,r=e===`openai`,i=e===`vertex`,a=e===`auto`||e===`whisper`;document.querySelectorAll(`.stt-gemini`).forEach(e=>e.style.display=n?``:`none`),document.querySelectorAll(`.stt-openai`).forEach(e=>e.style.display=r?``:`none`),document.querySelectorAll(`.stt-vertex`).forEach(e=>e.style.display=i?``:`none`),document.querySelectorAll(`.stt-whisper`).forEach(e=>e.style.display=a?``:`none`)}d();async function f(){let e={stt:{engine:t?.value||`auto`,geminiModel:(r?.value===`__custom__`?a?.value:r?.value)||`gemini-2.5-flash-lite`,whisperModel:o?.value||``,openaiBaseUrl:s?.value||``,openaiModel:l?.value||``,vertexConfig:u?.value||``}};n?.value&&(e.stt.geminiApiKey=n.value),c?.value&&(e.stt.openaiApiKey=c.value),console.log(`[stt] saving:`,{engine:e.stt.engine,hasGeminiKey:!!e.stt.geminiApiKey,hasOpenaiKey:!!e.stt.openaiApiKey});try{if(await i(`/api/settings`,`PUT`,e),n?.value){let e=n.value.slice(-4);n.value=``,n.placeholder=`✅ 입력됨 ····${e}`}if(c?.value){let e=c.value.slice(-4);c.value=``,c.placeholder=`✅ 입력됨 ····${e}`}}catch(e){console.error(`[stt] save failed:`,e)}}t?.addEventListener(`change`,()=>{d(),f()}),r?.addEventListener(`change`,()=>{a&&(a.style.display=r.value===`__custom__`?``:`none`),r.value!==`__custom__`&&f()}),a?.addEventListener(`blur`,f),n?.addEventListener(`blur`,()=>{n.value&&f()}),c?.addEventListener(`blur`,()=>{c.value&&f()}),s?.addEventListener(`blur`,f),l?.addEventListener(`blur`,f),o?.addEventListener(`blur`,f),u?.addEventListener(`blur`,f)}async function f(){let e=document.getElementById(`tgToken`)?.value.trim()||``,t=document.getElementById(`tgChatIds`)?.value.trim()||``;await i(`/api/settings`,`PUT`,{telegram:{token:e,allowedChatIds:t?t.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>!isNaN(e)):[]}})}async function p(e){document.getElementById(`tgOn`)?.classList.toggle(`active`,e),document.getElementById(`tgOff`)?.classList.toggle(`active`,!e),await i(`/api/settings`,`PUT`,{telegram:{enabled:e}})}async function m(e){document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,e),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!e),await i(`/api/settings`,`PUT`,{telegram:{forwardAll:e}})}function h(e){if(!e.telegram)return;let t=e.telegram;document.getElementById(`tgOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`tgToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`tgChatIds`);t.allowedChatIds?.length&&r&&(r.value=t.allowedChatIds.join(`, `));let i=t.forwardAll!==!1;document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,i),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!i)}async function g(){let e=document.getElementById(`dcToken`)?.value.trim()||``,t=document.getElementById(`dcGuildId`)?.value.trim()||``,n=document.getElementById(`dcChannelIds`)?.value.trim()||``;await i(`/api/settings`,`PUT`,{discord:{token:e,guildId:t,channelIds:n?n.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function ee(e){document.getElementById(`dcOn`)?.classList.toggle(`active`,e),document.getElementById(`dcOff`)?.classList.toggle(`active`,!e),await i(`/api/settings`,`PUT`,{discord:{enabled:e}})}async function _(e){document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,e),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!e),await i(`/api/settings`,`PUT`,{discord:{forwardAll:e}})}async function v(e){document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,e),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!e),await i(`/api/settings`,`PUT`,{discord:{allowBots:e}})}function y(e){if(!e.discord)return;let t=e.discord;document.getElementById(`dcOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`dcToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`dcGuildId`);t.guildId&&r&&(r.value=t.guildId);let i=document.getElementById(`dcChannelIds`);t.channelIds?.length&&i&&(i.value=t.channelIds.join(`, `));let a=t.forwardAll!==!1;document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,a),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!a);let o=!!t.allowBots;document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,o),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!o)}async function b(e){document.getElementById(`chTelegram`)?.classList.toggle(`active`,e===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,e===`discord`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,e===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,e===`discord`?``:`none`),await i(`/api/settings`,`PUT`,{channel:e})}function x(e){let t=e.channel||`telegram`;document.getElementById(`chTelegram`)?.classList.toggle(`active`,t===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,t===`discord`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,t===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,t===`discord`?``:`none`)}function S(e){let r=document.getElementById(`fallbackOrderList`);if(!r)return;let i=Object.keys(e.perCli||{}),a=e.fallbackOrder||[],o=Math.min(i.length-1,3),s=``;for(let e=0;e<o;e++){let r=a[e]||``,o=i.map(e=>`<option value="${n(e)}" ${e===r?`selected`:``}>${n(e)}</option>`).join(``);s+=`
2
- <div class="settings-row sub-row">
3
- <label style="min-width:60px">Fallback ${e+1}</label>
4
- <select id="fallback${e}"
5
- style="font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1">
6
- <option value="">${t(`settings.none`)}</option>
7
- ${o}
8
- </select>
9
- </div>`}r.innerHTML=s}async function C(){await i(`/api/settings`,`PUT`,{fallbackOrder:[...document.querySelectorAll(`#fallbackOrderList select`)].map(e=>e.value).filter(Boolean)})}async function w(){try{let e=await a(`/api/mcp`);if(!e)return;let r=document.getElementById(`mcpServerList`);if(!r)return;let i=Object.entries(e.servers||{});if(!i.length){r.textContent=t(`mcp.noServers`);return}r.innerHTML=i.map(([e,t])=>`<div style="padding:2px 0">• <b>${n(e)}</b> <span style="opacity:.6">${n(t.command)} ${(t.args||[]).slice(0,2).map(e=>n(e)).join(` `)}</span></div>`).join(``)}catch{}}async function T(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=t(`mcp.syncing`);try{let t=await i(`/api/mcp/sync`,`POST`,{});if(!t){e.textContent=`❌ sync failed`;return}let r=t.results||{};e.innerHTML=Object.entries(r).map(([e,t])=>`${t?`✅`:`⏭️`} ${n(e)}`).join(` &nbsp; `)}catch(t){e.textContent=`❌ `+t.message}}}async function E(){let e=document.getElementById(`mcpSyncResult`);if(e){e.style.display=`block`,e.textContent=t(`mcp.installing`);try{let t=await i(`/api/mcp/install`,`POST`,{});if(!t){e.textContent=`❌ install failed`;return}e.innerHTML=Object.entries(t.results||{}).map(([e,t])=>`${t.status===`installed`?`✅`:t.status===`skip`?`⏭️`:`❌`} <b>${n(e)}</b>: ${n(t.status)}${t.bin?` → `+n(t.bin):``}`).join(`<br>`),w()}catch(t){e.textContent=`❌ `+t.message}}}function D(e){return e.charAt(0).toUpperCase()+e.slice(1)}function O(e){return document.getElementById(`model`+D(e))}function k(e){return document.getElementById(`customModel`+D(e))}function A(e){return document.getElementById(`effort`+D(e))}function j(e,r,{includeCustom:i=!1,includeDefault:a=!1,selected:o=``}={}){if(!e)return;let s=a?`<option value="default">default</option>`:``,c=i?`<option value="__custom__">${t(`model.customOption`)}</option>`:``;e.innerHTML=s+(r||[]).map(e=>`<option value="${n(e)}">${n(e)}</option>`).join(``)+c,o&&Array.from(e.options).some(e=>e.value===o)&&(e.value=o)}function M(e,t){if(!e||!t||Array.from(e.options).some(e=>e.value===t))return;let n=document.createElement(`option`);n.value=t,n.textContent=t;let r=e.querySelector(`option[value="__custom__"]`);r?e.insertBefore(n,r):e.appendChild(n)}function N(e=null){let t=l(),r=document.getElementById(`selCli`);if(r){let i=e?.cli||r.value||t[0]||`claude`;r.innerHTML=t.map(e=>{let t=c(e)?.label||e;return`<option value="${n(e)}">${n(t)}</option>`}).join(``),Array.from(r.options).some(e=>e.value===i)&&(r.value=i)}let i=document.getElementById(`memCli`);if(i){let r=e?.memory?.cli||i.value||``;i.innerHTML=`<option value="">(active CLI)</option>`+t.map(e=>`<option value="${n(e)}">${n(e)}</option>`).join(``),Array.from(i.options).some(e=>e.value===r)&&(i.value=r)}}function P(e,t){if(e!==`claude`)return t;switch((t||``).trim()){case`claude-sonnet-4-6`:return`sonnet`;case`claude-opus-4-6`:return`opus`;case`claude-sonnet-4-6[1m]`:return`sonnet[1m]`;case`claude-opus-4-6[1m]`:return`opus[1m]`;default:return t}}function te(e=null){for(let t of l()){let r=O(t);if(r){let n=P(t,e?.perCli?.[t]?.model||r.value||``);j(r,u[t]||[],{includeCustom:!0,selected:n}),n&&!Array.from(r.options).some(e=>e.value===n)&&(M(r,n),r.value=n)}let i=A(t);if(i){let r=c(t),a=[``].concat(r?.efforts||[]),o=e?.perCli?.[t]?.effort||i.value||``,s=[...new Set(a)],l=r?.efforts?.length===0&&r?.effortNote?r.effortNote:`— none`;i.innerHTML=s.map(e=>e?`<option value="${n(e)}">${n(e)}</option>`:`<option value="">${n(l)}</option>`).join(``),r?.effortNote&&(i.title=r.effortNote),i.disabled=r?.efforts?.length===0&&!!r?.effortNote,Array.from(i.options).some(e=>e.value===o)&&(i.value=o)}}}function F(e,t=``){let r=document.getElementById(`selEffort`);if(!r)return;let i=c(e);if(i?.effortNote){r.innerHTML=`<option value="">${n(i.effortNote)}</option>`,r.title=i.effortNote,r.disabled=!0;return}let a=[``].concat(i?.efforts||[]);r.innerHTML=[...new Set(a)].map(e=>e?`<option value="${n(e)}">${n(e)}</option>`:`<option value="">— none</option>`).join(``),r.disabled=!1,r.title=``,Array.from(r.options).some(e=>e.value===t)&&(r.value=t)}async function I(){await s();let e=await a(`/api/settings`);if(!e)return;o(e.locale??``),N(e),te(e);let t=document.getElementById(`selCli`);t&&Array.from(t.options).some(t=>t.value===e.cli)&&(t.value=e.cli);let n=document.getElementById(`inpCwd`);n&&(n.textContent=e.workingDir);let r=document.getElementById(`headerCli`);if(r&&(r.textContent=e.cli),R(e.permissions,!1),e.perCli)for(let[t,n]of Object.entries(e.perCli)){let e=O(t),r=A(t);if(e&&n.model){let r=P(t,n.model);M(e,r),e.value=r}if(r&&(r.value=n.effort||``),t===`codex`&&n.fastMode!==void 0&&(document.getElementById(`codexFastOn`)?.classList.toggle(`active`,n.fastMode),document.getElementById(`codexFastOff`)?.classList.toggle(`active`,!n.fastMode)),t===`codex`){let e=!!n.contextWindow;document.getElementById(`codexCtxOn`)?.classList.toggle(`active`,e),document.getElementById(`codexCtxOff`)?.classList.toggle(`active`,!e);let t=document.getElementById(`codexCtxValues`);t&&(t.style.display=e?``:`none`);let r=document.getElementById(`codexCtxWindow`),i=document.getElementById(`codexCtxCompact`);r&&n.contextWindowSize&&(r.value=String(n.contextWindowSize)),i&&n.contextCompactLimit&&(i.value=String(n.contextCompactLimit))}if(t===`claude`){let e=!!(n.model&&String(n.model).endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,e),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!e)}}W(!1);let i=e.activeOverrides?.[e.cli]||{},c=e.perCli?.[e.cli]||{},l=i.model||c.model,u=i.effort||c.effort||``,f=document.getElementById(`selModel`);if(l&&f){let t=P(e.cli,l);t&&!Array.from(f.options).some(e=>e.value===t)&&M(f,t),f.value=t}F(e.cli,u),h(e),y(e),x(e),S(e),w(),d(e.stt||{})}async function L(){let e={cli:document.getElementById(`selCli`)?.value||`claude`},t=document.getElementById(`headerCli`);t&&(t.textContent=e.cli),await i(`/api/settings`,`PUT`,e)}function R(e,t=!0){t&&r(`/api/settings`,`PUT`,{permissions:`auto`})}function z(e){let t=O(e);return t?t.value===`__custom__`?k(e)?.value?.trim()||t.options[0]?.value||`default`:t.value:`default`}function B(e,t){let n=k(e);n&&(t.value===`__custom__`?(n.style.display=`block`,n.focus()):(n.style.display=`none`,e===`claude`&&V(t.value),U()))}function V(e){let t=!!(e&&e.endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,t),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!t)}function H(e,t){let n=t.value.trim();if(!n)return;let r=O(e);r&&(M(r,n),r.value=n,t.style.display=`none`,e===`claude`&&V(n),U())}async function U(){let e={};for(let t of l()){if(!O(t))continue;let n=A(t),r={model:z(t),effort:n?n.value:``};if(t===`codex`){r.fastMode=document.getElementById(`codexFastOn`)?.classList.contains(`active`)??!1,r.contextWindow=document.getElementById(`codexCtxOn`)?.classList.contains(`active`)??!1;let e=document.getElementById(`codexCtxWindow`),t=document.getElementById(`codexCtxCompact`);r.contextWindowSize=parseInt(e?.value||`1000000`,10),r.contextCompactLimit=parseInt(t?.value||`900000`,10)}e[t]=r}await i(`/api/settings`,`PUT`,{perCli:e})}function W(e=!0){let n=document.getElementById(`selCli`)?.value||`claude`,r=u[n]||[],i=document.getElementById(`selModel`);j(i,r,{includeCustom:!0,includeDefault:!0});let o=document.getElementById(`headerCli`);o&&(o.textContent=n),F(n);let s=document.getElementById(`selModelCustom`);s&&s.remove();let c=document.createElement(`input`);if(c.type=`text`,c.id=`selModelCustom`,c.className=`custom-model-input`,c.placeholder=t(`model.placeholder`),c.style.display=`none`,c.onchange=function(){let e=this.value.trim();!e||!i||(M(i,e),i.value=e,this.style.display=`none`,G())},!i){e&&L();return}i.parentElement?.appendChild(c),i.onchange=function(){this.value===`__custom__`?(c.style.display=`block`,c.focus()):(c.style.display=`none`,G())},a(`/api/settings`).then(e=>{if(!e)return;let t=e.activeOverrides?.[n]||{},r=e.perCli?.[n]||{},a=t.model||r.model,o=t.effort||r.effort||``;if(a&&i){let e=P(n,a);M(i,e),i.value=e}F(n,o)}),e&&L()}async function G(){let e=document.getElementById(`selCli`)?.value||`claude`,t=document.getElementById(`selModel`)?.value||`default`;t===`__custom__`&&(t=document.getElementById(`selModelCustom`)?.value?.trim()||`default`);let n=document.getElementById(`selEffort`),r={};r[e]={model:t},n&&!n.disabled&&(r[e].effort=n.value||``),await i(`/api/settings`,`PUT`,{activeOverrides:r})}async function K(t=!1){let n=Number(localStorage.getItem(`cliStatusInterval`)||300);if(!t&&e.cliStatusCache&&n>0&&Date.now()-e.cliStatusTs<n*1e3){q({cliStatus:e.cliStatusCache?.cliStatus,quota:e.cliStatusCache?.quota});return}let r=document.getElementById(`cliStatusList`);r&&(r.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Loading...</div>`);let[i,o]=await Promise.all([a(`/api/cli-status`),a(`/api/quota`)]);e.cliStatusCache={cliStatus:i,quota:o},e.cliStatusTs=Date.now(),q({cliStatus:i,quota:o})}function q(e){let{cliStatus:r,quota:i}=e,o=document.getElementById(`cliStatusList`),s={claude:{install:`npm i -g @anthropic-ai/claude-code`,auth:`claude auth`},codex:{install:`npm i -g @openai/codex`,auth:`codex login`},gemini:{install:`npm i -g @google/gemini-cli`,auth:`gemini (${t(`cli.gemini.auth`)})`},opencode:{install:`npm i -g opencode-ai`,auth:`opencode auth`},copilot:{install:`npm i -g copilot`,auth:`copilot login 또는 gh auth login`}},c=``;if(!r||typeof r!=`object`){o&&(o.innerHTML=`<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>`);return}for(let[e,a]of Object.entries(r)){let r=i?.[e],o;o=a.available?!r||r.error?`ok`:r.authenticated===!1?`warn`:`ok`:`missing`;let l=``;if(r?.account){let e=[];r.account.email&&e.push(r.account.email),r.account.type&&e.push(r.account.type),r.account.plan&&e.push(r.account.plan),r.account.tier&&e.push(r.account.tier),e.length&&(l=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${n(e.join(` · `))}</div>`)}let u=``;if(!a.available||o===`warn`){let r=s[e];if(r){let e=!a.available,i=t(e?`cli.authRequired`:`cli.notAuthenticated`),o=e?`#ef4444`:`#fbbf24`;u=`
10
- <div style="font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--bg-dim, #1e1e2e);border-radius:4px;border-left:2px solid ${o}">
11
- <div style="color:${o};margin-bottom:3px">${i}</div>
12
- ${e?`<div style="color:var(--text-dim)"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${n(r.install)}</code></div>`:``}
13
- <div style="color:var(--text-dim)${e?`;margin-top:2px`:``}"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${n(r.auth)}</code></div>
14
- </div>
15
- `}}let d=``;r?.windows?.length?d=r.windows.map(e=>{let t=Math.round(e.percent),r=t>80?`#ef4444`:t>50?`#fbbf24`:`#38bdf8`,i=e.label.replace(`-hour`,`h`).replace(`-day`,`d`).replace(` Sonnet`,``).replace(` Opus`,``).replace(`plus monthly subscriber quota`,`plus`).replace(`Premium`,`Prem`),a=``;if(e.resetsAt){let t=new Date(typeof e.resetsAt==`number`?e.resetsAt*1e3:e.resetsAt),n=new Date;a=t.toDateString()===n.toDateString()?`${t.getHours()}:${String(t.getMinutes()).padStart(2,`0`)}`:`${t.getMonth()+1}/${t.getDate()}`}return`
16
- <div style="display:flex;align-items:center;gap:4px;margin-left:16px;font-size:10px;color:var(--text-dim)">
17
- <span style="min-width:18px;max-width:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">${n(i)}</span>
18
- <div style="flex:1;height:4px;background:var(--border);border-radius:2px;overflow:hidden">
19
- <div style="width:${t}%;height:100%;background:${r};border-radius:2px"></div>
20
- </div>
21
- <span style="width:24px;text-align:right">${t}%</span>
22
- ${a?`<span style="width:30px;text-align:right;opacity:0.6">${a}</span>`:``}
23
- </div>
24
- `}).join(``):r?.error&&a.available&&(d=`<div style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px;opacity:0.7">⚠ ${r.reason===`rate_limited`?`Rate limited — retry in a moment`:`Usage data unavailable`}</div>`),c+=`
25
- <div class="settings-group" style="margin-bottom:6px;padding:8px 10px">
26
- <div class="cli-status-row">
27
- <span class="cli-dot ${o}"></span>
28
- <span class="cli-name" style="font-weight:600">${n(e)}</span>${e===`copilot`?`<button id="copilotKeychainBtn" style="font-size:9px;margin-left:6px;padding:1px 5px;background:var(--border);color:var(--text-dim);border:1px solid var(--text-dim);border-radius:3px;cursor:pointer;vertical-align:middle;line-height:1" title="${t(`copilot.keychainHint`)}">🔑</button>`:``}
29
- </div>
30
- ${l}
31
- ${u}
32
- ${d}
33
- </div>
34
- `}o&&(o.innerHTML=c);let l=Object.entries(r);!l.some(([e,t])=>{if(!t.available)return!1;let n=i?.[e];return!n||n.authenticated!==!1})&&l.length>0&&o&&o.insertAdjacentHTML(`afterbegin`,`<div style="padding:8px 10px;margin-bottom:8px;background:#fbbf2422;border:1px solid #fbbf24;border-radius:6px;font-size:11px;color:#fbbf24">
35
- ⚠ ${t(`cli.noReadyCli`)}
36
- </div>`);let u=document.getElementById(`copilotKeychainBtn`);u&&u.addEventListener(`click`,async()=>{let e=u;e.disabled=!0,e.textContent=`⏳`;try{let t=await a(`/api/copilot/refresh`,{method:`POST`});e.textContent=t?.ok?`✅`:`❌`,t?.ok&&await K(!0)}catch{e.textContent=`❌`}setTimeout(()=>{e.textContent=`🔑`,e.disabled=!1},2e3)})}function J(){a(`/api/prompt`).then(e=>{if(!e)return;let t=document.getElementById(`modalPromptEditor`);t&&(t.value=e.content||``),document.getElementById(`promptModal`)?.classList.add(`open`)})}function Y(e){e&&e.target!==e.currentTarget||document.getElementById(`promptModal`)?.classList.remove(`open`)}async function X(){await i(`/api/prompt`,`PUT`,{content:document.getElementById(`modalPromptEditor`)?.value||``}),document.getElementById(`promptModal`)?.classList.remove(`open`)}var Z=[],Q=!1;async function ne(){let e=await a(`/api/prompt-templates`);e&&(Z=e.templates,Q=!1,re(e.tree),$(`tree`),document.getElementById(`templateModal`)?.classList.add(`open`))}function re(e){let t=document.getElementById(`templateTree`);if(t){t.innerHTML=``;for(let n of e){let e=document.createElement(`div`);e.style.cssText=`background:var(--bg);border:1px solid var(--accent);border-radius:6px;padding:8px 10px;margin:8px 0 4px;font-size:12px;color:var(--accent);font-weight:600`,e.textContent=`${n.emoji} ${n.label}`,t.appendChild(e);for(let e of n.children){let n=Z.find(t=>t.id===e);if(!n)continue;let r=document.createElement(`div`);r.style.cssText=`background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:6px 10px;margin:2px 0 2px 24px;font-size:12px;cursor:pointer;transition:border-color .15s`,r.textContent=`📄 ${n.filename}`,r.addEventListener(`mouseenter`,()=>{r.style.borderColor=`var(--accent2)`}),r.addEventListener(`mouseleave`,()=>{r.style.borderColor=`var(--border)`}),r.addEventListener(`click`,()=>{ie(n)}),t.appendChild(r)}}}}function ie(e){let t=document.getElementById(`templateEditor`);t.value=e.content,t.dataset.templateId=e.id,t.readOnly=!0,Q=!1;let n=document.getElementById(`templateEditorLabel`);n&&(n.textContent=`📄 ${e.filename}`);let r=e.content.match(/\{\{[A-Z_]+\}\}/g),i=document.getElementById(`templateVars`);i&&(i.textContent=r?`vars: ${[...new Set(r)].join(`, `)}`:`no variables`);let a=document.getElementById(`templateSaveBtn`);a&&(a.style.display=`none`);let o=document.getElementById(`templateDevToggle`);o&&(o.style.color=`var(--text-dim)`,o.style.borderColor=`var(--border)`,o.textContent=`🔧 개발자 모드`);let s=document.getElementById(`templateModalTitle`);s&&(s.textContent=`📄 ${e.filename}`),$(`editor`)}function ae(){if(!Q&&!confirm(`⚠️ 프롬프트를 직접 수정하면 예상치 못한 동작이 발생할 수 있습니다.
37
- 계속하시겠습니까?`))return;Q=!Q;let e=document.getElementById(`templateEditor`);e.readOnly=!Q;let t=document.getElementById(`templateSaveBtn`);t&&(t.style.display=Q?``:`none`);let n=document.getElementById(`templateDevToggle`);n&&(n.style.color=Q?`var(--stop-btn)`:`var(--text-dim)`,n.style.borderColor=Q?`var(--stop-btn)`:`var(--border)`,n.textContent=Q?`🔓 개발자 모드 ON`:`🔧 개발자 모드`)}async function oe(){let e=document.getElementById(`templateEditor`),t=e.dataset.templateId;if(!t)return;await i(`/api/prompt-templates/${t}`,`PUT`,{content:e.value});let n=document.getElementById(`templateEditorLabel`);n&&(n.textContent=`✅ 저장 + 핫리로드 완료!`,setTimeout(()=>{n.textContent=`📄 ${t}.md`},2e3));let r=Z.find(e=>e.id===t);r&&(r.content=e.value)}function $(e){let t=document.getElementById(`templateTreeView`),n=document.getElementById(`templateEditorView`);t&&(t.style.display=e===`tree`?``:`none`),n&&(n.style.display=e===`editor`?`flex`:`none`);let r=document.getElementById(`templateModalTitle`);r&&e===`tree`&&(r.textContent=`📝 프롬프트 구조`)}function se(){$(`tree`)}function ce(e){e&&e.target!==e.currentTarget||document.getElementById(`templateModal`)?.classList.remove(`open`)}export{m as A,C,v as D,ee as E,d as M,_ as O,S,g as T,R as _,X as a,w as b,ae as c,z as d,B as f,U as g,G as h,ne as i,p as j,f as k,K as l,W as m,ce as n,oe as o,I as p,J as r,se as s,Y as t,H as u,L as v,b as w,T as x,E as y};
@@ -1 +0,0 @@
1
- import{g as e,p as t,v as n}from"./settings-BQF_u5px.js";export{t as loadSettings,e as savePerCli,n as updateSettings};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-BI7sQAdk.js";export{e as loadSkills};
@@ -1,12 +0,0 @@
1
- import{t as e}from"./state-O6NVkWcL.js";import{c as t,i as n,t as r}from"./render-YHvL5VM_.js";import{r as i}from"./api-B8XKQ4OT.js";var a=[`productivity`,`communication`,`devtools`,`ai-media`,`utility`,`smarthome`,`automation`];async function o(){try{e.allSkills=await(await n(`/api/skills`)).json(),s()}catch{let e=document.getElementById(`skillsList`);e&&(e.innerHTML=`<div style="color:var(--text-dim);font-size:11px">${t(`skill.loadFail`)}</div>`)}}function s(){let n=document.getElementById(`skillsList`),i=document.getElementById(`skillsCount`);if(!n||!i)return;let o=e.allSkills,s=o;e.currentSkillFilter===`installed`?s=o.filter(e=>e.enabled):e.currentSkillFilter===`other`?s=o.filter(e=>!a.includes(e.category||``)):e.currentSkillFilter!==`all`&&(s=o.filter(t=>t.category===e.currentSkillFilter));let c=o.filter(e=>e.enabled).length;i.textContent=t(`skill.count`,{active:c,total:o.length}),n.innerHTML=s.map(e=>{let t=[];return e.requires?.env&&t.push(`🔑 `+e.requires.env.map(e=>r(e)).join(`, `)),e.requires?.bins&&t.push(`⚙️ `+e.requires.bins.map(e=>r(e)).join(`, `)),e.install&&t.push(r(e.install)),`
2
- <div class="skill-card ${e.enabled?`enabled`:``}">
3
- <div class="skill-card-header">
4
- <span class="skill-emoji">${r(e.emoji||`🔧`)}</span>
5
- <span class="skill-name">${r(e.name||e.id)}</span>
6
- <button class="skill-toggle ${e.enabled?`on`:`off`}"
7
- data-skill-id="${r(e.id)}" data-skill-enabled="${e.enabled}"
8
- aria-label="${r((e.name||e.id)+` toggle`)}"></button>
9
- </div>
10
- <div class="skill-desc">${r(e.description||``)}</div>
11
- ${t.length?`<div class="skill-req">${t.join(` · `)}</div>`:``}
12
- </div>`}).join(``)}async function c(e,t){let n=t?`/api/skills/disable`:`/api/skills/enable`;try{await i(n,`POST`,{id:e}),await o()}catch(e){console.error(`toggleSkill error:`,e)}}function l(t,n){e.currentSkillFilter=t,document.querySelectorAll(`.skill-filter`).forEach(e=>e.classList.remove(`active`)),n&&n.classList.add(`active`),s()}export{c as i,o as n,s as r,l as t};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-DMsE88bu.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{s as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{o as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{a as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{R as e}from"./vendor-mermaid-COidH9HB.js";export{e as createTreeViewServices};
@@ -1 +0,0 @@
1
- import{I as e}from"./vendor-mermaid-COidH9HB.js";export{e as createTreemapServices};
@@ -1,29 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./state-O6NVkWcL.js";import{Z as t}from"./vendor-mermaid-COidH9HB.js";import{c as n,n as r,r as i,t as a}from"./render-YHvL5VM_.js";import{t as o}from"./api-B8XKQ4OT.js";var s=`agentName`,c=`CLI-JAW`,l=c;function u(){return l}function d(e){l=(e||``).trim()||c,localStorage.setItem(s,l);let t=document.getElementById(`appNameInput`);t&&(t.value=l)}function f(){l=localStorage.getItem(s)||c;let e=document.getElementById(`appNameInput`);e&&(e.value=l),document.getElementById(`appNameSave`)?.addEventListener(`click`,()=>{let e=document.getElementById(`appNameInput`);e&&d(e.value)}),document.getElementById(`appNameInput`)?.addEventListener(`keydown`,e=>{let t=e;t.key===`Enter`&&(t.preventDefault(),d(t.target.value),t.target.blur())})}var ee=`clijaw`,te=1,p=`messages`,m=null;function h(){return m||(m=new Promise((e,t)=>{let n=indexedDB.open(ee,te);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(p)||e.createObjectStore(p,{keyPath:`id`,autoIncrement:!0}).createIndex(`timestamp`,`timestamp`)},n.onsuccess=()=>e(n.result),n.onerror=()=>{m=null,t(n.error)}}),m)}async function ne(e){try{let t=(await h()).transaction(p,`readwrite`),n=t.objectStore(p);n.clear();for(let t of e)n.add({role:t.role,content:t.content,timestamp:t.timestamp||Date.now()});await new Promise((e,n)=>{t.oncomplete=()=>e(),t.onerror=()=>n(t.error)})}catch(e){console.warn(`[idb-cache] cacheMessages failed:`,e)}}async function g(){try{let e=await h();return new Promise((t,n)=>{let r=e.transaction(p,`readonly`).objectStore(p).getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch(e){return console.warn(`[idb-cache] getCachedMessages failed:`,e),[]}}async function _(e,t){try{(await h()).transaction(p,`readwrite`).objectStore(p).add({role:e,content:t,timestamp:Date.now()})}catch(e){console.warn(`[idb-cache] appendCachedMessage failed:`,e)}}async function re(){try{(await h()).transaction(p,`readwrite`).objectStore(p).clear()}catch(e){console.warn(`[idb-cache] clearCache failed:`,e)}}var v=5,ie=80,ae=class{items=[];container;spacerTop;spacerBottom;viewport;_active=!1;rafId=null;firstVisible=0;lastVisible=0;constructor(e){this.container=document.getElementById(e),this.spacerTop=document.createElement(`div`),this.spacerTop.className=`vs-spacer-top`,this.spacerBottom=document.createElement(`div`),this.spacerBottom.className=`vs-spacer-bottom`,this.viewport=document.createElement(`div`),this.viewport.className=`vs-viewport`}get active(){return this._active}get count(){return this.items.length}flushToDOM(){this._active&&(this.container.removeEventListener(`scroll`,this.scrollHandler),this.rafId&&=(cancelAnimationFrame(this.rafId),null),this.container.innerHTML=this.items.map(e=>e.html).join(``),this._active=!1,this.firstVisible=0,this.lastVisible=0,this.items=[])}addItem(e,t){this.items.push({id:e,html:t,height:ie}),!this._active&&this.items.length>=200&&this.activate(),this._active&&this.scheduleRender()}scrollHandler=()=>this.scheduleRender();activate(){this._active=!0,this.container.querySelectorAll(`.msg`).forEach((e,t)=>{this.items[t]&&(this.items[t].height=e.getBoundingClientRect().height)}),this.container.innerHTML=``,this.container.append(this.spacerTop,this.viewport,this.spacerBottom),this.container.addEventListener(`scroll`,this.scrollHandler,{passive:!0}),this.render()}scheduleRender(){this.rafId||=requestAnimationFrame(()=>{this.rafId=null,this.render()})}render(){let e=this.container.scrollTop,t=this.container.clientHeight,n=0,r=0;for(let t=0;t<this.items.length;t++){if(n+this.items[t].height>e){r=t;break}n+=this.items[t].height}let i=Math.max(0,r-v),a=n,o=r;for(let n=r;n<this.items.length&&(a+=this.items[n].height,o=n,!(a>e+t));n++);let s=Math.min(this.items.length-1,o+v);if(i===this.firstVisible&&s===this.lastVisible)return;this.firstVisible=i,this.lastVisible=s;let c=0;for(let e=0;e<i;e++)c+=this.items[e].height;let l=0;for(let e=s+1;e<this.items.length;e++)l+=this.items[e].height;this.spacerTop.style.height=`${c}px`,this.spacerBottom.style.height=`${l}px`;let u=document.createDocumentFragment();for(let e=i;e<=s;e++){let t=this.items[e],n=document.createElement(`div`);n.innerHTML=t.html;let r=n.firstElementChild;r&&(r.dataset.vsIdx=String(e),u.appendChild(r))}this.viewport.innerHTML=``,this.viewport.appendChild(u),this.viewport.querySelectorAll(`[data-vs-idx]`).forEach(e=>{let t=Number(e.dataset.vsIdx);this.items[t]&&(this.items[t].height=e.getBoundingClientRect().height)})}scrollToBottom(){let e=this.items.reduce((e,t)=>e+t.height,0);this.container.scrollTop=e,this.scheduleRender()}clear(){this.items=[],this._active&&(this.container.removeEventListener(`scroll`,this.scrollHandler),this.viewport.innerHTML=``,this.spacerTop.style.height=`0`,this.spacerBottom.style.height=`0`,this.container.innerHTML=``),this._active=!1,this.firstVisible=0,this.lastVisible=0,this.rafId&&=(cancelAnimationFrame(this.rafId),null)}},y=null;function b(){return y||=new ae(`chatMessages`),y}var x=2e3,S=32;function C(e){return{fullText:``,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function w(e,t){e.fullText+=t,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now();e.fullText.length<x||t-e.lastRenderTime>S?(e.element.innerHTML=r(e.fullText)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=r(e.fullText)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function T(e){return e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null),e.element.innerHTML=r(e.fullText),e.fullText}function E(e){e.dataset.toolItemBound!==`1`&&(e.addEventListener(`click`,e=>{let t=e.target;if(!t)return;let n=t.closest(`.tool-item-toggle`);if(!n)return;let r=n.closest(`.tool-item`),i=r?.querySelector(`.tool-item-details`),a=n.querySelector(`.tool-item-chevron`);if(!r||!i)return;let o=i.classList.contains(`collapsed`);i.classList.toggle(`collapsed`,!o),r.classList.toggle(`expanded`,o),n.setAttribute(`aria-expanded`,o?`true`:`false`),a&&(a.textContent=o?`▾`:`▸`)}),e.dataset.toolItemBound=`1`)}function D(){document.querySelectorAll(`.tool-activity-live`).forEach(e=>e.remove()),document.querySelectorAll(`.msg-system.tool-activity`).forEach(e=>e.remove())}function O(e){let t={};for(let n of e){let e=n.type===`thinking`?`💭 Thinking`:n.type===`search`?`🔍 Search`:`🔧 Tool`;t[e]=(t[e]||0)+1}return Object.entries(t).map(([e,t])=>t>1?`${e}×${t}`:e).join(` + `)}function oe(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n?n.length>t?`${n.slice(0,t-1)}…`:n:``}function k(e){let t=(e.detail||``).trim();return t?t!==(e.label||``).trim():!1}function A(e){let t=`process-step-dot ${e.status}`,n=`process-step-badge ${e.type}`,r=e.type.toUpperCase(),i=a(e.label||e.icon||``),o=e.detail||``,s=`process-detail-${e.id}`,c=k(e)?oe(o,e.type===`thinking`?120:100):``,l=c?`<span class="process-step-snippet">${a(c)}</span>`:``;return k(e)?`<div class="process-step process-step-expandable" data-step-id="${e.id}" data-type="${e.type}">
3
- <button class="process-step-toggle" aria-expanded="false" aria-controls="${s}">
4
- <span class="${t}"></span>
5
- <span class="${n}">${r}</span>
6
- <span class="process-step-main">
7
- <span class="process-step-label">${i}</span>
8
- ${l}
9
- </span>
10
- <span class="process-step-chevron">▸</span>
11
- </button>
12
- <div class="process-step-details collapsed" id="${s}">
13
- <pre class="process-step-full">${a(o)}</pre>
14
- </div>
15
- </div>`:`<div class="process-step" data-step-id="${e.id}" data-type="${e.type}">
16
- <span class="${t}"></span>
17
- <span class="${n}">${r}</span>
18
- <span class="process-step-label">${i}</span>
19
- </div>`}function j(e=``,t=!1){return`<div class="process-block${t?` collapsed`:``}">
20
- <button class="process-summary" aria-expanded="${t?`false`:`true`}">
21
- <span class="process-dot ${t?`done`:`running`}"></span>
22
- <span class="process-summary-text">${a(e)}</span>
23
- <span class="process-duration"></span>
24
- <span class="process-chevron">${t?`▸`:`▾`}</span>
25
- </button>
26
- <div class="process-details">
27
- <div class="process-steps-inner"></div>
28
- </div>
29
- </div>`}function se(e){let t=e.closest(`.process-step`),n=t?.querySelector(`.process-step-details`),r=e.querySelector(`.process-step-chevron`);if(!t||!n)return;let i=n.classList.contains(`collapsed`);n.classList.toggle(`collapsed`,!i),t.classList.toggle(`expanded`,i),e.setAttribute(`aria-expanded`,i?`true`:`false`),r&&(r.textContent=i?`▾`:`▸`)}function ce(e){e.dataset.processBlockBound!==`1`&&(e.addEventListener(`click`,e=>{let t=e.target;if(!t)return;let n=t.closest(`.process-step-toggle`);if(n){se(n);return}let r=t.closest(`.process-summary`);if(r){let e=r.closest(`.process-block`);if(!e)return;let t=e.classList.contains(`collapsed`);e.classList.toggle(`collapsed`,!t),r.setAttribute(`aria-expanded`,t?`true`:`false`);let n=r.querySelector(`.process-chevron`);n&&(n.textContent=t?`▾`:`▸`)}}),e.dataset.processBlockBound=`1`)}function M(e,t=!0){let n=j(O(e),t),r=document.createElement(`div`);r.innerHTML=n;let i=r.querySelector(`.process-steps-inner`);i&&(i.innerHTML=e.map(A).join(``));let a=r.querySelector(`.process-dot`);if(a){let n=e.some(e=>e.status===`running`);a.classList.toggle(`running`,n&&!t),a.classList.toggle(`done`,!n||t)}return r.innerHTML}function N(e){let t=e.element.querySelector(`.process-summary-text`);t&&(t.textContent=O(e.steps));let n=e.steps.some(e=>e.status===`running`),r=e.element.querySelector(`.process-dot`);r&&(r.classList.toggle(`running`,n&&!e.collapsed),r.classList.toggle(`done`,!n||e.collapsed));let i=e.steps.length>0?Math.round((Date.now()-e.steps[0].startTime)/1e3):0,a=e.element.querySelector(`.process-duration`);a&&(a.textContent=i>0?`${i}s`:``)}function P(e){let t=document.createElement(`div`);t.innerHTML=j(``,!1);let n=t.firstElementChild,r=e.querySelector(`.msg-content`);return r?r.before(n):e.appendChild(n),{element:n,steps:[],collapsed:!1}}function F(e,t){e.steps.push(t);let n=e.element.querySelector(`.process-steps-inner`);n&&n.insertAdjacentHTML(`beforeend`,A(t)),N(e)}function I(e,t,n){let r=e.steps.findIndex(e=>e.id===t);if(r===-1)return;e.steps[r]=n;let i=e.element.querySelector(`[data-step-id="${t}"]`);if(i){let e=document.createElement(`div`);e.innerHTML=A(n);let t=e.firstElementChild;t&&i.replaceWith(t)}N(e)}function L(e,t,n){let r=e.steps.find(e=>e.id===t);if(!r)return;r.status=n;let i=e.element.querySelector(`[data-step-id="${t}"]`);if(i){let e=i.querySelector(`.process-step-dot`);e&&(e.classList.remove(`running`,`done`,`error`),e.classList.add(n))}N(e)}function R(e){e.collapsed=!0,e.element.classList.add(`collapsed`);let t=e.element.querySelector(`.process-summary`);t&&t.setAttribute(`aria-expanded`,`false`);let n=e.element.querySelector(`.process-chevron`);n&&(n.textContent=`▸`);for(let t of e.steps)t.status===`running`&&(t.status=`done`);e.element.querySelectorAll(`.process-step-dot.running`).forEach(e=>{e.classList.remove(`running`),e.classList.add(`done`)}),N(e)}function z(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function B(e){return e.map(e=>({id:crypto.randomUUID(),icon:e.icon||`🔧`,label:e.label||e.name||`tool`,type:e.toolType||`tool`,detail:e.detail||``,status:e.status||`done`,startTime:Date.now()}))}function V(t){let r=document.getElementById(`statusBadge`),i=document.getElementById(`btnSend`);e.agentBusy=t===`running`,document.getElementById(`typingIndicator`)?.classList.toggle(`active`,e.agentBusy),t===`running`?(r&&(r.className=`status-badge status-running`,r.textContent=`running`),i&&(i.textContent=`■`,i.title=n(`btn.stop`),i.classList.add(`stop-mode`)),U()):(r&&(r.className=`status-badge status-idle`,r.textContent=`idle`),i&&(i.textContent=`➤`,i.title=`Send`,i.classList.remove(`stop-mode`)),W(),H(0))}function H(e){let t=document.getElementById(`queueBadge`);if(!t){t=document.createElement(`span`),t.id=`queueBadge`,t.className=`queue-badge`;let e=document.getElementById(`btnSend`);e?.parentElement&&(e.parentElement.style.position=`relative`),e&&(e.style.position=`relative`,e.appendChild(t))}t.textContent=e>0?String(e):``,t.style.display=e>0?`flex`:`none`}function U(){let e=document.getElementById(`chatMessages`);if(!e||e.querySelector(`.skeleton-msg`))return;let t=b();t.active&&t.flushToDOM(),G();let n=document.createElement(`div`);n.className=`skeleton-msg`,n.innerHTML=`<div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line"></div>`,e.appendChild(n),Q()}function W(){document.querySelectorAll(`.skeleton-msg`).forEach(e=>e.remove())}function G(){document.getElementById(`emptyState`)?.classList.remove(`visible`)}function K(){let e=document.getElementById(`chatMessages`);e&&e.children.length===0&&document.getElementById(`emptyState`)?.classList.add(`visible`)}function le(e,t,n){let r=document.getElementById(`chatMessages`);if(!r)return;let i=b();i.active&&i.flushToDOM(),G();let a=document.createElement(`div`);a.className=`msg msg-system`+(n?` msg-type-${n}`:``)+(t?` `+t:``),a.textContent=e,r.appendChild(a),r.scrollTop=r.scrollHeight}function ue(){D(),e.currentAgentDiv=null,e.currentProcessBlock=null}function de(t){if(W(),(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``),e.currentProcessBlock=null),!e.currentProcessBlock){let t=e.currentAgentDiv.querySelector(`.agent-body`);t&&(e.currentProcessBlock=P(t))}if(e.currentProcessBlock){if(t.icon===`✅`||t.icon===`❌`){let n=t.icon===`✅`?`done`:`error`,r=t.stepRef,i=r?[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.stepRef===r):[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label);if(i){L(e.currentProcessBlock,i.id,n),Q();return}let a=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`);if(a){L(e.currentProcessBlock,a.id,n),Q();return}}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!e.detail);if(n){I(e.currentProcessBlock,n.id,t),Q();return}}F(e.currentProcessBlock,t)}Q()}var q=null;function J(t){if(!t)return;W(),(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=C(n),w(q,t)),Q()}var Y=0;function fe(t,n){let a=Date.now();if(!e.currentAgentDiv&&a-Y<500)return;D(),W();let o=!!e.currentProcessBlock;e.currentProcessBlock&&=(R(e.currentProcessBlock),null);let s=n&&n.length>0;if(t||s){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``));let a=e.currentAgentDiv?.querySelector(`.msg-content`),c=q&&T(q)||t;q=null;let l=s&&!o?M(B(n),!0):``;a&&(a.innerHTML=l+r(c)),a&&a.setAttribute(`data-raw`,i(c))}q=null,e.currentAgentDiv=null,Y=Date.now(),V(`idle`),$(),t&&_(`assistant`,t).catch(()=>{})}function X(e,t){let o=document.getElementById(`chatMessages`),s=b();s.active&&s.flushToDOM(),G(),W();let c=r(t),l=a(e===`user`?n(`msg.you`):u()),d=document.createElement(`div`);e===`agent`?(d.className=`msg msg-agent`,d.innerHTML=`<div class="agent-icon" aria-hidden="true">🦈</div><div class="agent-body"><div class="msg-content">${c}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div>`):(d.className=`msg msg-${e}`,d.innerHTML=`<div class="msg-label">${l}</div><div class="msg-content">${c}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button>`);let f=d.querySelector(`.msg-content`);return f&&f.setAttribute(`data-raw`,i(t)),o?.appendChild(d),Q(),d}var Z=null;function Q(){Z||=requestAnimationFrame(()=>{Z=null;let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight)})}function pe(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`settings`&&t(()=>import(`./settings-C5Q9IPjJ.js`).then(e=>e.loadSettings()),__vite__mapDeps([0])),e===`agents`&&t(()=>import(`./employees-CFRlsbHm.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-9Pd2rOw-.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function me(){document.getElementById(`tabSettings`)?.classList.contains(`active`)?t(()=>import(`./settings-C5Q9IPjJ.js`).then(e=>e.savePerCli()),__vite__mapDeps([0])):t(()=>import(`./settings-C5Q9IPjJ.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}async function $(){let e=await o(`/api/messages`);if(!e)return;let t=document.getElementById(`statMsgs`);t&&(t.textContent=n(`stat.messages`,{count:e.length}))}async function he(){let e=await o(`/api/messages`);if(e!==null){let t=b();t.clear();let o=document.getElementById(`chatMessages`);if(o&&(o.innerHTML=``),e.length>=200){for(let o of e){let e=o.role===`assistant`?`agent`:o.role,s=r(o.content),c=a(e===`user`?n(`msg.you`):u()),l=o.role===`assistant`?z(o.tool_log):[],d=l.length>0?M(B(l),!0):``,f=e===`agent`?`<div class="msg msg-agent"><div class="agent-icon" aria-hidden="true">🦈</div><div class="agent-body">${d}<div class="msg-content" data-raw="${a(i(o.content))}">${s}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div></div>`:`<div class="msg msg-${e}"><div class="msg-label">${c}</div><div class="msg-content" data-raw="${a(i(o.content))}">${s}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div>`;t.addItem(crypto.randomUUID(),f)}t.scrollToBottom()}else e.forEach(e=>{let t=X(e.role===`assistant`?`agent`:e.role,e.content);if(e.role===`assistant`){let n=z(e.tool_log);if(n.length>0){let e=t.querySelector(`.agent-body`);if(e){let t=P(e);for(let e of B(n))F(t,e);R(t)}}}});ne(e.map(e=>({role:e.role,content:e.content,timestamp:Date.now()}))).catch(()=>{}),K();return}let t=document.getElementById(`chatMessages`);if(t&&t.children.length>0){K();return}let s=await g();s.length>0&&(s.forEach(e=>X(e.role===`assistant`?`agent`:e.role,e.content)),X(`system`,`📴 오프라인 모드 — 캐시된 메시지 표시 중`)),K()}function ge(){let e=document.getElementById(`chatMessages`);e&&(ce(e),E(e),e.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`.tool-group-summary`);if(n){let e=n.closest(`.tool-group`),t=n.nextElementSibling;if(e&&t){let r=!e.classList.contains(`expanded`);e.classList.toggle(`expanded`),t.classList.toggle(`collapsed`),n.setAttribute(`aria-expanded`,r?`true`:`false`)}return}let r=t.closest(`.msg-copy`);if(!r)return;let i=r.closest(`.msg`)?.querySelector(`.msg-content`);if(!i)return;let a=i.getAttribute(`data-raw`)||i.innerText||i.textContent||``;navigator.clipboard.writeText(a).then(()=>{r.classList.add(`copied`),r.textContent=`✓`,setTimeout(()=>{r.classList.remove(`copied`),r.textContent=``},600)}).catch(()=>{})}))}export{f as _,fe as a,he as c,V as d,de as f,re as g,b as h,ue as i,$ as l,H as m,le as n,me as o,pe as p,J as r,ge as s,X as t,Q as u};
@@ -1 +0,0 @@
1
- import{c as e,d as t,i as n,m as r}from"./ui-BukgLHuh.js";export{n as cleanupToolActivity,e as loadMessages,t as setStatus,r as updateQueueBadge};
@@ -1 +0,0 @@
1
- import{i as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1 +0,0 @@
1
- import{P as e}from"./vendor-mermaid-COidH9HB.js";export{e as createWardleyServices};
@@ -1 +0,0 @@
1
- import{r as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./state-O6NVkWcL.js";import{Z as t}from"./vendor-mermaid-COidH9HB.js";import{a as n,c as r}from"./render-YHvL5VM_.js";import{a as i,d as a,f as o,h as s,i as c,m as l,n as u,r as d,t as f}from"./ui-BukgLHuh.js";var p=[`P`,`A`,`B`,`C`],m=null;function h(e,t,n){let r=p.indexOf(n);if(r<0)return;let i=e.getBoundingClientRect(),a=t.offsetWidth||36,o=document.getElementById(`dot-${n}`);if(!o)return;let s=p[r+1],c=s?document.getElementById(`dot-${s}`):null;if(c){let e=o.getBoundingClientRect(),n=c.getBoundingClientRect(),r=(e.right+n.left)/2;t.style.left=r-i.left-a/2+`px`}else{let e=o.getBoundingClientRect();t.style.left=e.left-i.left+e.width/2-a/2+`px`}}var g={};function _(e){for(let e of Object.keys(g))delete g[e];for(let t of e)t.state===`running`&&t.phase&&(g[t.agentId]={phase:t.phase,phaseLabel:t.phaseLabel||``})}function v(t,n){let r=new Set([`IDLE`,`P`,`A`,`B`,`C`,`D`]).has(t)?t:`IDLE`;if(e.orcState=r,r===`IDLE`||r===`D`)document.body.removeAttribute(`data-orc-state`),document.body.style.removeProperty(`--orc-glow`);else{document.body.setAttribute(`data-orc-state`,r);let e=`--orc-glow-${r}`,t=getComputedStyle(document.documentElement).getPropertyValue(e).trim();document.body.style.setProperty(`--orc-glow`,t)}document.body.classList.add(`orc-pulse`),setTimeout(()=>document.body.classList.remove(`orc-pulse`),700);let i=document.getElementById(`orcStateBadge`);i&&(i.textContent={IDLE:``,P:`PLAN`,A:`AUDIT`,B:`BUILD`,C:`CHECK`,D:`DONE`}[r],i.style.display=r===`IDLE`?`none`:`inline-block`);let a=document.getElementById(`pabcRoadmap`),o=document.getElementById(`sharkRunner`),s=document.getElementById(`pabcBrand`);if(a&&o){if(!a.dataset.resizeObserved){a.dataset.resizeObserved=`1`,new ResizeObserver(()=>{m&&o.classList.contains(`running`)&&h(a,o,m)}).observe(a);let e=0;window.addEventListener(`resize`,()=>{cancelAnimationFrame(e),e=requestAnimationFrame(()=>{m&&o.classList.contains(`running`)&&h(a,o,m)})})}if(r===`IDLE`)a.classList.remove(`visible`,`shimmer-out`),o.classList.remove(`running`),m=null;else if(r===`D`){p.forEach(e=>{let t=document.getElementById(`dot-${e}`);t&&(t.className=`pabc-dot done`,t.setAttribute(`data-phase`,e))});for(let e=0;e<4;e++){let t=document.getElementById(`pabc-conn-${e}`);t&&(t.className=`pabc-connector done`)}o.classList.remove(`running`),m=null,a.classList.add(`shimmer-out`),setTimeout(()=>a.classList.remove(`visible`,`shimmer-out`),1e3)}else{a.classList.remove(`shimmer-out`),a.classList.add(`visible`),o.classList.add(`running`);let e=p.indexOf(r);p.forEach((t,n)=>{let r=document.getElementById(`dot-${t}`);r&&(r.className=`pabc-dot ${n<e?`done`:n===e?`active`:`future`}`,r.setAttribute(`data-phase`,t))});for(let t=0;t<4;t++){let n=document.getElementById(`pabc-conn-${t}`);n&&(n.className=`pabc-connector ${t<e?`done`:``}`)}m=r,requestAnimationFrame(()=>h(a,o,r))}s&&n&&(s.textContent=n)}}function y(){let p=`ws://${location.host}`;e.ws=new WebSocket(`${p}?lang=${n()}`),e.ws.onmessage=e=>{let n;try{n=JSON.parse(e.data)}catch{console.warn(`[ws] malformed message:`,e.data);return}if(!n||typeof n!=`object`||typeof n.type!=`string`){console.warn(`[ws] invalid message shape:`,n);return}if(n.type===`agent_status`)n.running===void 0?a(n.status||`idle`):a(n.running?`running`:`idle`),n.agentId&&n.phase&&(g[n.agentId]={phase:n.phase,phaseLabel:n.phaseLabel||``},t(()=>import(`./employees-CFRlsbHm.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])));else if(n.type===`queue_update`)l(n.pending||0);else if(n.type===`worklog_created`)u(`📋 Worklog: ${n.path||``}`);else if(n.type===`round_start`){let e=n.agentPhases||n.subtasks||[],t=e.map(e=>e.agent||e.name||``).join(`, `);u(r(`ws.roundStart`,{round:n.round||0,count:e.length,names:t}))}else if(n.type===`round_done`)n.action===`complete`?u(r(`ws.roundDone`,{round:n.round||0})):n.action===`next`?u(r(`ws.roundNext`,{round:n.round||0})):u(r(`ws.roundRetry`,{round:n.round||0}));else if(n.type===`agent_tool`){let e=n.toolType===`thinking`?`thinking`:n.toolType===`search`?`search`:`tool`;o({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,type:e,icon:n.icon||`🔧`,label:n.label||``,detail:n.detail||``,stepRef:n.stepRef||``,status:`running`,startTime:Date.now()})}else if(n.type===`agent_output`)d(n.text||``);else if(n.type===`agent_retry`)u(r(`ws.retry`,{cli:n.cli||``,delay:n.delay||10}),`tool-activity`);else if(n.type===`agent_fallback`)u(r(`ws.fallback`,{from:n.from||``,to:n.to||``}),`tool-activity`);else if(n.type===`agent_smoke`)u(`⚠️ ${n.cli||`agent`}: smoke response detected — auto-continuing`,`tool-activity`);else if(n.type===`agent_done`)i(n.text||``,n.toolLog);else if(n.type===`orchestrate_done`)i(n.text||``);else if(n.type===`clear`){c(),s().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}else n.type===`session_reset`?u(`🔄 Session reset — history preserved`,`tool-activity`):n.type===`agent_added`||n.type===`agent_updated`||n.type===`agent_deleted`?t(()=>import(`./employees-CFRlsbHm.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])):n.type===`orc_state`?v(typeof n.state==`string`?n.state:`IDLE`,n.title):n.type===`new_message`&&(n.source===`telegram`||n.source===`discord`)&&f(n.role===`assistant`?`agent`:n.role||`user`,n.content||``)},e.ws.onopen=()=>{console.log(`[ws] connected`),t(()=>import(`./ui-Bvz1JfTE.js`).then(e=>{e.cleanupToolActivity(),e.loadMessages(),e.setStatus(`idle`)}),__vite__mapDeps([0])),fetch(`/api/orchestrate/snapshot`).then(e=>e.json()).then(e=>{v(e.orc.state),_(e.workers),l(e.runtime.queuePending),a(e.runtime.busy?`running`:`idle`),t(()=>import(`./employees-CFRlsbHm.js`).then(e=>{typeof e.renderEmployees==`function`&&e.renderEmployees()}),__vite__mapDeps([0]))}).catch(()=>{})},e.ws.onclose=()=>{console.log(`[ws] disconnected, reconnecting in 2s...`),t(()=>import(`./ui-Bvz1JfTE.js`).then(e=>e.cleanupToolActivity()),__vite__mapDeps([0])),a(`idle`),u(`⚡ 연결 끊김 — 재연결 중...`,`tool-activity`),setTimeout(y,2e3)}}function b(e){return g[e]||null}export{b as n,y as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./vendor-mermaid-COidH9HB.js";export{e as diagram};