tide-commander 1.44.0 → 1.46.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 (53) hide show
  1. package/dist/assets/{BossLogsModal-CTo4Bbm7.js → BossLogsModal-BIFXXaaq.js} +1 -1
  2. package/dist/assets/BossSpawnModal-CL4eQrBS.js +1 -0
  3. package/dist/assets/ControlsModal-DX_FqPx7.js +1 -0
  4. package/dist/assets/{DockerLogsModal-CrHd6OZ3.js → DockerLogsModal-SoHgFfH1.js} +1 -1
  5. package/dist/assets/{EmbeddedEditor-h8IrAy4E.js → EmbeddedEditor-Dx6Y7JM3.js} +1 -1
  6. package/dist/assets/{GmailOAuthSetup-io57q0N8.js → GmailOAuthSetup-K-SZcqrr.js} +1 -1
  7. package/dist/assets/{GoogleOAuthSetup-YyNFVd9Y.js → GoogleOAuthSetup-BfpfXmbM.js} +1 -1
  8. package/dist/assets/{IframeModal-DqmSDXCT.js → IframeModal-BAgB3UQ3.js} +1 -1
  9. package/dist/assets/IntegrationsPanel-B1nXTZW8.js +2 -0
  10. package/dist/assets/{LogViewerModal-CGW8yajP.js → LogViewerModal-4do7lATm.js} +1 -1
  11. package/dist/assets/{MonitoringModal-BfsYrF1j.js → MonitoringModal-OAExiDTA.js} +1 -1
  12. package/dist/assets/{PM2LogsModal-BJytXxKY.js → PM2LogsModal-DnA2AsIM.js} +1 -1
  13. package/dist/assets/{RestoreArchivedAreaModal-CtRiwwzT.js → RestoreArchivedAreaModal-C0ADFzsM.js} +1 -1
  14. package/dist/assets/{SaveSnapshotModal-BHBdh1dK.js → SaveSnapshotModal-Ct4aW93y.js} +1 -1
  15. package/dist/assets/Scene2DCanvas-C5mj6yGY.js +1 -0
  16. package/dist/assets/{SceneManager-u4hiSYdk.js → SceneManager-CPtKPGZP.js} +1 -1
  17. package/dist/assets/SkillsPanel-B0XFw3Ae.js +28 -0
  18. package/dist/assets/SnapshotManager-0NaWlDXc.js +1 -0
  19. package/dist/assets/SpawnModal-BOJQ1pln.js +1 -0
  20. package/dist/assets/SubordinateAssignmentModal-BuzBY1CB.js +1 -0
  21. package/dist/assets/{SupervisorPanel-D0c7Kkzt.js → SupervisorPanel-B2_2QYL0.js} +1 -1
  22. package/dist/assets/{TriggerManagerPanel-RsbYDmIC.js → TriggerManagerPanel-CUD10Dg9.js} +2 -2
  23. package/dist/assets/{WorkflowEditorPanel-lpYmT8iN.js → WorkflowEditorPanel-qfjb7ozq.js} +2 -2
  24. package/dist/assets/{index-C6GdsxBK.js → index-BfXYjLRr.js} +4 -4
  25. package/dist/assets/{index-CpwhIgf8.js → index-BzvQBrQn.js} +3 -3
  26. package/dist/assets/{index-BOY5J4U4.js → index-CKitMIQJ.js} +1 -1
  27. package/dist/assets/{index-X9qZZBXG.js → index-CTdXoSNs.js} +2 -2
  28. package/dist/assets/{index-BexCA27h.js → index-D0e5Zn8j.js} +3 -3
  29. package/dist/assets/{index-BQdQ0iv_.js → index-DFTYc8O3.js} +1 -1
  30. package/dist/assets/index-K6Ld2Man.js +1 -0
  31. package/dist/assets/{index-BqPgrat9.js → index-RddWDRes.js} +1 -1
  32. package/dist/assets/{main-DjGrMNoB.css → main-Ch2CJGT4.css} +1 -1
  33. package/dist/assets/main-D3GShQ8B.js +153 -0
  34. package/dist/assets/{web-D94DaG2N.js → web-D0MII38C.js} +1 -1
  35. package/dist/assets/{web-XswRIovf.js → web-bLUMZcn-.js} +1 -1
  36. package/dist/index.html +2 -2
  37. package/dist/src/packages/server/data/index.js +28 -0
  38. package/dist/src/packages/server/routes/config.js +7 -0
  39. package/dist/src/packages/server/routes/custom-class-icons.js +138 -0
  40. package/dist/src/packages/server/routes/index.js +2 -0
  41. package/dist/src/packages/server/services/custom-class-service.js +7 -2
  42. package/dist/src/packages/server/websocket/handlers/agent-handler.js +3 -0
  43. package/package.json +1 -1
  44. package/dist/assets/BossSpawnModal-DOk9u7EW.js +0 -1
  45. package/dist/assets/ControlsModal-BzBzF0Cw.js +0 -1
  46. package/dist/assets/IntegrationsPanel-DiW8UeG5.js +0 -2
  47. package/dist/assets/Scene2DCanvas-BYUuUYur.js +0 -1
  48. package/dist/assets/SkillsPanel-D4IHFehE.js +0 -28
  49. package/dist/assets/SnapshotManager-Cys1dllC.js +0 -1
  50. package/dist/assets/SpawnModal-DUK7X8ql.js +0 -1
  51. package/dist/assets/SubordinateAssignmentModal-DeH34tA3.js +0 -1
  52. package/dist/assets/index-t5WzFf-W.js +0 -1
  53. package/dist/assets/main-CrRMpn-n.js +0 -153
@@ -0,0 +1,28 @@
1
+ import{u as Pe,bh as Qe,bi as Ze,r as i,h as Me,j as e,s as v,bj as eo,bk as oo,bl as so,ab as Re,l as D,k as Ae,M as ro,I as to,N as ao,bm as P,C as io,X as Ne,W as Oe}from"./main-D3GShQ8B.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const lo=[{value:"scout",labelKey:"tools:skills.classScout",descriptionKey:"tools:skills.classScoutDesc"},{value:"builder",labelKey:"tools:skills.classBuilder",descriptionKey:"tools:skills.classBuilderDesc"},{value:"debugger",labelKey:"tools:skills.classDebugger",descriptionKey:"tools:skills.classDebuggerDesc"},{value:"architect",labelKey:"tools:skills.classArchitect",descriptionKey:"tools:skills.classArchitectDesc"},{value:"warrior",labelKey:"tools:skills.classWarrior",descriptionKey:"tools:skills.classWarriorDesc"},{value:"support",labelKey:"tools:skills.classSupport",descriptionKey:"tools:skills.classSupportDesc"},{value:"boss",labelKey:"tools:skills.classBoss",descriptionKey:"tools:skills.classBossDesc"}],co=[{labelKey:"tools:skills.toolReadFiles",value:"Read"},{labelKey:"tools:skills.toolWriteFiles",value:"Write"},{labelKey:"tools:skills.toolEditFiles",value:"Edit"},{labelKey:"tools:skills.toolRunBash",value:"Bash"},{labelKey:"tools:skills.toolGitCommands",value:"Bash(git:*)"},{labelKey:"tools:skills.toolNpmCommands",value:"Bash(npm:*)"},{labelKey:"tools:skills.toolDockerCommands",value:"Bash(docker:*)"},{labelKey:"tools:skills.toolKubectlCommands",value:"Bash(kubectl:*)"},{labelKey:"tools:skills.toolSearchFiles",value:"Grep"},{labelKey:"tools:skills.toolGlobFiles",value:"Glob"},{labelKey:"tools:skills.toolWebFetch",value:"WebFetch"},{labelKey:"tools:skills.toolWebSearch",value:"WebSearch"}],no=`## Instructions
2
+
3
+ Describe step-by-step instructions for this skill here.
4
+
5
+ 1. First step
6
+ 2. Second step
7
+ 3. Third step
8
+
9
+ ## Examples
10
+
11
+ Show concrete examples of using this skill.
12
+
13
+ ### Example 1
14
+ \`\`\`bash
15
+ # Example command
16
+ \`\`\`
17
+
18
+ ## Safety Checks
19
+
20
+ - List important safety considerations
21
+ - Warn about destructive operations
22
+ `;function yo({isOpen:l,onClose:d,skillId:s}){const{t}=Pe(["tools","common"]),c=Qe(s??null),k=Ze(),n=!!c,y=(c==null?void 0:c.builtin)===!0,[b,g]=i.useState(""),[h,p]=i.useState(""),[S,A]=i.useState(""),[w,q]=i.useState(""),[j,B]=i.useState([]),[N,Q]=i.useState(""),[T,M]=i.useState([]),[O,z]=i.useState([]),[H,W]=i.useState(!0),[K,U]=i.useState(!1),L=i.useRef(null),$=i.useRef(null);i.useEffect(()=>{l&&(c?(g(c.name),p(c.slug),A(c.description),q(c.content||""),B(c.allowedTools||[]),M(c.assignedAgentIds||[]),z(c.assignedAgentClasses||[]),W(c.enabled)):(g(t("tools:skills.newSkillDefault")),p(""),A(""),q(no),B([]),M([]),z([]),W(!0)),Q(""),U(!1),setTimeout(()=>{var a;return(a=L.current)==null?void 0:a.focus()},100))},[l,c]),i.useEffect(()=>{if(!n&&b){const a=b.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").substring(0,64);p(a)}},[b,n]);const Z=a=>{if(a.preventDefault(),y&&s){v.updateSkill(s,{assignedAgentIds:T,assignedAgentClasses:O,enabled:H}),d();return}if(!b.trim()||!S.trim())return;const u={name:b.trim(),slug:h.trim()||b.toLowerCase().replace(/[^a-z0-9]+/g,"-"),description:S.trim(),content:w.trim(),allowedTools:j,assignedAgentIds:T,assignedAgentClasses:O,enabled:H};if(n&&s){if(c&&(c.name!==u.name||c.description!==u.description||c.content!==u.content||c.enabled!==u.enabled||JSON.stringify(c.allowedTools)!==JSON.stringify(u.allowedTools))&&!confirm(t("tools:skills.updateSkillConfirm")))return;v.updateSkill(s,u)}else v.createSkill(u);d()},ee=()=>{s&&confirm(t("tools:skills.deleteSkillConfirm"))&&(v.deleteSkill(s),d())},oe=a=>{j.includes(a)?B(j.filter(u=>u!==a)):B([...j,a])},_=()=>{N.trim()&&!j.includes(N.trim())&&(B([...j,N.trim()]),Q(""))},le=a=>{O.includes(a)?z(O.filter(u=>u!==a)):z([...O,a])},Y=a=>{T.includes(a)?M(T.filter(u=>u!==a)):M([...T,a])},f=k.filter(a=>a.class!=="boss"),{handleMouseDown:X,handleClick:C}=Me(d);return l?e.jsx("div",{className:"modal-overlay visible",onMouseDown:X,onClick:C,children:e.jsxs("div",{className:"modal skill-editor-modal",style:{maxWidth:"700px",maxHeight:"90vh"},children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("span",{children:[t(n?y?"tools:skills.viewBuiltInSkill":"tools:skills.editSkill":"tools:skills.createSkill"),y&&e.jsx("span",{style:{fontSize:"10px",background:"var(--accent-cyan)",color:"var(--bg-primary)",padding:"2px 6px",borderRadius:"3px",fontWeight:600,marginLeft:"8px"},children:t("tools:skills.builtIn")})]}),n&&!y&&e.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:ee,style:{marginLeft:"auto",marginRight:"12px"},children:t("common:buttons.delete")})]}),e.jsxs("form",{onSubmit:Z,children:[e.jsxs("div",{className:"modal-body",style:{maxHeight:"70vh",overflowY:"auto"},children:[y&&e.jsx("div",{style:{background:"rgba(139, 233, 253, 0.1)",border:"1px solid var(--accent-cyan)",borderRadius:"6px",padding:"10px 12px",marginBottom:"16px",fontSize:"12px",color:"var(--accent-cyan)"},children:t("tools:skills.builtInNotice")}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.nameRequired")}),e.jsx("input",{ref:L,type:"text",className:"form-input",value:b,onChange:a=>g(a.target.value),placeholder:t("tools:skills.skillNamePlaceholder"),required:!0,disabled:y,style:y?{opacity:.7,cursor:"not-allowed"}:void 0})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.slugLabel")}),e.jsx("input",{type:"text",className:"form-input",value:h,onChange:a=>p(a.target.value),placeholder:t("tools:skills.slugPlaceholder"),style:{fontFamily:"monospace",fontSize:"12px",...y?{opacity:.7,cursor:"not-allowed"}:{}},disabled:y}),e.jsx("small",{className:"form-hint",children:t("tools:skills.slugHint")})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.descriptionRequired")}),e.jsx("textarea",{className:"form-input",value:S,onChange:a=>A(a.target.value),placeholder:t("tools:skills.skillDescPlaceholder"),rows:3,required:!0,style:{resize:"vertical",...y?{opacity:.7,cursor:"not-allowed"}:{}},disabled:y}),e.jsx("small",{className:"form-hint",children:t("tools:skills.descriptionHint")})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.instructionsMarkdown")}),e.jsx("textarea",{ref:$,className:"form-input",value:w,onChange:a=>q(a.target.value),placeholder:t("tools:skills.skillContentPlaceholder"),rows:12,style:{fontFamily:"monospace",fontSize:"12px",resize:"vertical",minHeight:"200px",...y?{opacity:.7,cursor:"not-allowed"}:{}},disabled:y})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.allowedTools")}),y?e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"4px",opacity:.7},children:j.length>0?j.map(a=>e.jsx("span",{style:{background:"var(--bg-tertiary)",padding:"2px 8px",borderRadius:"4px",fontSize:"11px"},children:a},a)):e.jsx("span",{style:{fontSize:"12px",color:"var(--text-muted)"},children:t("tools:skills.noSpecificTools")})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"tool-presets",style:{display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"8px"},children:co.map(a=>e.jsx("button",{type:"button",className:`btn btn-sm ${j.includes(a.value)?"btn-primary":"btn-secondary"}`,onClick:()=>oe(a.value),style:{fontSize:"11px",padding:"4px 8px"},children:t(a.labelKey)},a.value))}),e.jsxs("div",{style:{display:"flex",gap:"8px"},children:[e.jsx("input",{type:"text",className:"form-input",value:N,onChange:a=>Q(a.target.value),placeholder:t("tools:skills.customToolPlaceholder"),style:{flex:1,fontSize:"12px"},onKeyDown:a=>{a.key==="Enter"&&(a.preventDefault(),_())}}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:_,children:t("common:buttons.add")})]}),j.length>0&&e.jsx("div",{style:{marginTop:"8px",display:"flex",flexWrap:"wrap",gap:"4px"},children:j.map(a=>e.jsxs("span",{className:"tag",style:{background:"var(--bg-tertiary)",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",cursor:"pointer"},onClick:()=>oe(a),title:t("tools:skills.clickToRemove"),children:[a," ×"]},a))})]})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.assignToClasses")}),e.jsx("small",{className:"form-hint",style:{display:"block",marginBottom:"8px"},children:t("tools:skills.allAgentsOfClasses")}),e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, 1fr)",gap:"6px"},children:lo.map(a=>e.jsxs("button",{type:"button",className:`btn btn-sm ${O.includes(a.value)?"btn-primary":"btn-secondary"}`,onClick:()=>le(a.value),style:{fontSize:"11px",padding:"6px 8px",textAlign:"left"},children:[e.jsx("strong",{children:t(a.labelKey)}),e.jsxs("span",{style:{opacity:.7,marginLeft:"4px"},children:["- ",t(a.descriptionKey)]})]},a.value))})]}),f.length>0&&e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:t("tools:skills.assignToAgents")}),e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:f.map(a=>e.jsxs("button",{type:"button",className:`btn btn-sm ${T.includes(a.id)?"btn-primary":"btn-secondary"}`,onClick:()=>Y(a.id),style:{fontSize:"11px",padding:"4px 8px"},children:[a.name,e.jsxs("span",{style:{opacity:.6,marginLeft:"4px"},children:["(",a.class,")"]})]},a.id))})]}),e.jsxs("div",{className:"form-section",children:[e.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>U(!K),style:{marginBottom:"8px"},children:[t(K?"common:buttons2.hide":"common:buttons2.show")," ",t("tools:skills.advancedOptions")]}),K&&e.jsxs("div",{style:{marginTop:"8px"},children:[e.jsxs("label",{className:"form-label",style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx("input",{type:"checkbox",checked:H,onChange:a=>W(a.target.checked)}),t("tools:skills.skillEnabled")]}),e.jsx("small",{className:"form-hint",children:t("tools:skills.disabledSkillsHint")})]})]})]}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{type:"button",className:"btn btn-secondary",onClick:d,children:t(y?"common:buttons.close":"common:buttons.cancel")}),!y&&e.jsx("button",{type:"submit",className:"btn btn-primary",children:t(n?"common:buttons2.saveChanges":"tools:skills.createSkill")}),y&&e.jsx("button",{type:"submit",className:"btn btn-primary",children:t("tools:skills.saveAssignments")})]})]})]})}):null}const Ie=[{emoji:"😀",keywords:["grin","happy","smile","face"],category:"Smileys"},{emoji:"😃",keywords:["happy","smile","joy","face"],category:"Smileys"},{emoji:"😄",keywords:["happy","smile","laugh","face"],category:"Smileys"},{emoji:"😁",keywords:["grin","happy","teeth","face"],category:"Smileys"},{emoji:"😅",keywords:["sweat","nervous","laugh","relief"],category:"Smileys"},{emoji:"😂",keywords:["laugh","cry","joy","tears","lol"],category:"Smileys"},{emoji:"🤣",keywords:["laugh","rolling","lol","rofl"],category:"Smileys"},{emoji:"😊",keywords:["blush","smile","happy","shy"],category:"Smileys"},{emoji:"😇",keywords:["angel","innocent","halo","saint"],category:"Smileys"},{emoji:"🙂",keywords:["smile","slight","face"],category:"Smileys"},{emoji:"😉",keywords:["wink","flirt","face"],category:"Smileys"},{emoji:"😌",keywords:["relieved","calm","peaceful"],category:"Smileys"},{emoji:"😍",keywords:["love","heart","eyes","crush"],category:"Smileys"},{emoji:"🥰",keywords:["love","hearts","adore","affection"],category:"Smileys"},{emoji:"😘",keywords:["kiss","love","heart","blow"],category:"Smileys"},{emoji:"😎",keywords:["cool","sunglasses","awesome"],category:"Smileys"},{emoji:"🤓",keywords:["nerd","geek","glasses","smart"],category:"Smileys"},{emoji:"🧐",keywords:["monocle","thinking","curious","inspect"],category:"Smileys"},{emoji:"🤔",keywords:["think","hmm","wonder","ponder"],category:"Smileys"},{emoji:"🤨",keywords:["raised","eyebrow","skeptic","suspicious"],category:"Smileys"},{emoji:"😐",keywords:["neutral","meh","blank","straight"],category:"Smileys"},{emoji:"😑",keywords:["expressionless","annoyed","unamused"],category:"Smileys"},{emoji:"😶",keywords:["silent","mute","speechless","quiet"],category:"Smileys"},{emoji:"🙄",keywords:["eyeroll","annoyed","whatever","bored"],category:"Smileys"},{emoji:"😏",keywords:["smirk","smug","sly","flirt"],category:"Smileys"},{emoji:"😣",keywords:["persevere","struggle","frustrated"],category:"Smileys"},{emoji:"😥",keywords:["sad","disappointed","relieved"],category:"Smileys"},{emoji:"😮",keywords:["surprised","wow","shock","gasp"],category:"Smileys"},{emoji:"🤯",keywords:["mind","blown","exploding","shock"],category:"Smileys"},{emoji:"😱",keywords:["scream","fear","scared","horror"],category:"Smileys"},{emoji:"😴",keywords:["sleep","tired","zzz","snore"],category:"Smileys"},{emoji:"🤤",keywords:["drool","hungry","yummy","want"],category:"Smileys"},{emoji:"😷",keywords:["mask","sick","ill","covid"],category:"Smileys"},{emoji:"🤒",keywords:["sick","fever","thermometer","ill"],category:"Smileys"},{emoji:"🤢",keywords:["nauseous","sick","green","ill"],category:"Smileys"},{emoji:"🤮",keywords:["vomit","sick","puke","gross"],category:"Smileys"},{emoji:"😈",keywords:["devil","evil","smiling","mischief","horns"],category:"Smileys"},{emoji:"👿",keywords:["devil","angry","evil","imp"],category:"Smileys"},{emoji:"💀",keywords:["skull","death","dead","skeleton"],category:"Smileys"},{emoji:"☠️",keywords:["skull","crossbones","death","pirate","danger"],category:"Smileys"},{emoji:"👻",keywords:["ghost","spirit","spooky","halloween"],category:"Smileys"},{emoji:"👽",keywords:["alien","ufo","extraterrestrial","space"],category:"Smileys"},{emoji:"🤖",keywords:["robot","bot","ai","android","machine"],category:"Smileys"},{emoji:"💩",keywords:["poop","poo","shit","crap"],category:"Smileys"},{emoji:"🎃",keywords:["pumpkin","halloween","jack","lantern"],category:"Smileys"},{emoji:"👑",keywords:["crown","king","queen","royal","boss","leader"],category:"People"},{emoji:"🎖️",keywords:["medal","military","honor","badge","award"],category:"People"},{emoji:"🦸",keywords:["hero","superhero","super","power"],category:"People"},{emoji:"🦸‍♂️",keywords:["hero","superhero","man","male"],category:"People"},{emoji:"🦸‍♀️",keywords:["hero","superhero","woman","female"],category:"People"},{emoji:"🦹",keywords:["villain","super","evil","hero"],category:"People"},{emoji:"🧙",keywords:["wizard","mage","magic","sorcerer"],category:"People"},{emoji:"🧙‍♂️",keywords:["wizard","mage","magic","man"],category:"People"},{emoji:"🧙‍♀️",keywords:["witch","mage","magic","woman"],category:"People"},{emoji:"🥷",keywords:["ninja","stealth","silent","assassin"],category:"People"},{emoji:"👨‍💻",keywords:["developer","programmer","coder","tech","man"],category:"People"},{emoji:"👩‍💻",keywords:["developer","programmer","coder","tech","woman"],category:"People"},{emoji:"🧑‍💻",keywords:["developer","programmer","coder","tech"],category:"People"},{emoji:"👨‍🔬",keywords:["scientist","research","lab","man"],category:"People"},{emoji:"👩‍🔬",keywords:["scientist","research","lab","woman"],category:"People"},{emoji:"👨‍🚀",keywords:["astronaut","space","rocket","man"],category:"People"},{emoji:"👩‍🚀",keywords:["astronaut","space","rocket","woman"],category:"People"},{emoji:"👨‍🎨",keywords:["artist","painter","creative","man"],category:"People"},{emoji:"👩‍🎨",keywords:["artist","painter","creative","woman"],category:"People"},{emoji:"👨‍🏫",keywords:["teacher","professor","instructor","man"],category:"People"},{emoji:"👩‍🏫",keywords:["teacher","professor","instructor","woman"],category:"People"},{emoji:"👨‍⚕️",keywords:["doctor","health","medical","man"],category:"People"},{emoji:"👩‍⚕️",keywords:["doctor","health","medical","woman"],category:"People"},{emoji:"👨‍🍳",keywords:["chef","cook","kitchen","man"],category:"People"},{emoji:"👩‍🍳",keywords:["chef","cook","kitchen","woman"],category:"People"},{emoji:"👨‍🔧",keywords:["mechanic","repair","fix","man"],category:"People"},{emoji:"👩‍🔧",keywords:["mechanic","repair","fix","woman"],category:"People"},{emoji:"👷",keywords:["construction","worker","builder","hard","hat"],category:"People"},{emoji:"💂",keywords:["guard","soldier","protect","security"],category:"People"},{emoji:"🕵️",keywords:["detective","spy","investigate","search","sleuth"],category:"People"},{emoji:"👮",keywords:["police","cop","officer","law"],category:"People"},{emoji:"🧝",keywords:["elf","fantasy","magic"],category:"People"},{emoji:"🧛",keywords:["vampire","dracula","dark","night"],category:"People"},{emoji:"🧟",keywords:["zombie","undead","dead"],category:"People"},{emoji:"🧞",keywords:["genie","magic","wish","lamp"],category:"People"},{emoji:"🧜",keywords:["mermaid","merman","sea","ocean"],category:"People"},{emoji:"🧚",keywords:["fairy","magic","fantasy","wings"],category:"People"},{emoji:"👼",keywords:["angel","baby","cherub","innocent"],category:"People"},{emoji:"🎅",keywords:["santa","christmas","claus","holiday"],category:"People"},{emoji:"🤴",keywords:["prince","royal","king","crown"],category:"People"},{emoji:"👸",keywords:["princess","royal","queen","crown"],category:"People"},{emoji:"🤵",keywords:["groom","tuxedo","suit","formal"],category:"People"},{emoji:"👰",keywords:["bride","wedding","veil","marriage"],category:"People"},{emoji:"🎭",keywords:["theater","mask","drama","acting","perform"],category:"People"},{emoji:"👾",keywords:["alien","monster","game","invader","space"],category:"People"},{emoji:"👤",keywords:["person","user","silhouette","profile"],category:"People"},{emoji:"👥",keywords:["people","users","group","team","silhouettes"],category:"People"},{emoji:"👋",keywords:["wave","hello","hi","bye","hand"],category:"Gestures"},{emoji:"🤚",keywords:["hand","raised","stop","back"],category:"Gestures"},{emoji:"✋",keywords:["hand","stop","high","five"],category:"Gestures"},{emoji:"🖐️",keywords:["hand","fingers","splayed","five"],category:"Gestures"},{emoji:"👌",keywords:["ok","perfect","good","nice"],category:"Gestures"},{emoji:"🤌",keywords:["pinched","italian","hand","chef"],category:"Gestures"},{emoji:"✌️",keywords:["peace","victory","two","fingers"],category:"Gestures"},{emoji:"🤞",keywords:["crossed","fingers","luck","hope"],category:"Gestures"},{emoji:"🤟",keywords:["love","you","rock","hand"],category:"Gestures"},{emoji:"🤘",keywords:["rock","metal","horns","hand"],category:"Gestures"},{emoji:"👍",keywords:["thumbs","up","good","like","yes","approve"],category:"Gestures"},{emoji:"👎",keywords:["thumbs","down","bad","dislike","no"],category:"Gestures"},{emoji:"👊",keywords:["fist","punch","bump","power"],category:"Gestures"},{emoji:"✊",keywords:["fist","raised","power","solidarity"],category:"Gestures"},{emoji:"🤛",keywords:["fist","left","bump"],category:"Gestures"},{emoji:"🤜",keywords:["fist","right","bump"],category:"Gestures"},{emoji:"👏",keywords:["clap","applause","bravo","hands"],category:"Gestures"},{emoji:"🙌",keywords:["hands","raised","celebration","hooray"],category:"Gestures"},{emoji:"🤝",keywords:["handshake","deal","agreement","shake"],category:"Gestures"},{emoji:"🙏",keywords:["pray","please","thanks","hope","namaste"],category:"Gestures"},{emoji:"💪",keywords:["muscle","strong","flex","bicep","arm"],category:"Gestures"},{emoji:"🦾",keywords:["robot","arm","prosthetic","mechanical"],category:"Gestures"},{emoji:"🖕",keywords:["middle","finger","rude","angry"],category:"Gestures"},{emoji:"☝️",keywords:["point","up","finger","one"],category:"Gestures"},{emoji:"👆",keywords:["point","up","finger","backhand"],category:"Gestures"},{emoji:"👇",keywords:["point","down","finger","backhand"],category:"Gestures"},{emoji:"👈",keywords:["point","left","finger","backhand"],category:"Gestures"},{emoji:"👉",keywords:["point","right","finger","backhand"],category:"Gestures"},{emoji:"👁️",keywords:["eye","see","look","watch","vision"],category:"Gestures"},{emoji:"👀",keywords:["eyes","look","see","watch","stare"],category:"Gestures"},{emoji:"👅",keywords:["tongue","taste","lick"],category:"Gestures"},{emoji:"👄",keywords:["lips","mouth","kiss"],category:"Gestures"},{emoji:"🧠",keywords:["brain","mind","think","smart","intelligence"],category:"Gestures"},{emoji:"🗣️",keywords:["speak","talk","head","voice","speech"],category:"Gestures"},{emoji:"❤️",keywords:["red","heart","love","like"],category:"Hearts"},{emoji:"🧡",keywords:["orange","heart","love","warm"],category:"Hearts"},{emoji:"💛",keywords:["yellow","heart","love","friendship"],category:"Hearts"},{emoji:"💚",keywords:["green","heart","love","support","health"],category:"Hearts"},{emoji:"💙",keywords:["blue","heart","love","trust"],category:"Hearts"},{emoji:"💜",keywords:["purple","heart","love"],category:"Hearts"},{emoji:"🖤",keywords:["black","heart","dark","love"],category:"Hearts"},{emoji:"🤍",keywords:["white","heart","pure","love"],category:"Hearts"},{emoji:"🤎",keywords:["brown","heart","love"],category:"Hearts"},{emoji:"💔",keywords:["broken","heart","sad","love"],category:"Hearts"},{emoji:"❤️‍🔥",keywords:["heart","fire","passion","love"],category:"Hearts"},{emoji:"❤️‍🩹",keywords:["heart","mending","healing","love"],category:"Hearts"},{emoji:"💕",keywords:["hearts","two","love","couple"],category:"Hearts"},{emoji:"💞",keywords:["hearts","revolving","love"],category:"Hearts"},{emoji:"💓",keywords:["heart","beating","love","alive"],category:"Hearts"},{emoji:"💗",keywords:["heart","growing","love","pink"],category:"Hearts"},{emoji:"💖",keywords:["heart","sparkle","love","pink"],category:"Hearts"},{emoji:"💝",keywords:["heart","ribbon","gift","love","valentine"],category:"Hearts"},{emoji:"💘",keywords:["heart","arrow","cupid","love"],category:"Hearts"},{emoji:"💌",keywords:["letter","love","envelope","mail"],category:"Hearts"},{emoji:"💋",keywords:["kiss","lips","love","lipstick"],category:"Hearts"},{emoji:"🫶",keywords:["heart","hands","love","care"],category:"Hearts"},{emoji:"🐶",keywords:["dog","puppy","pet","cute"],category:"Animals"},{emoji:"🐱",keywords:["cat","kitten","pet","cute"],category:"Animals"},{emoji:"🐭",keywords:["mouse","rat","rodent","cute"],category:"Animals"},{emoji:"🐹",keywords:["hamster","pet","rodent","cute"],category:"Animals"},{emoji:"🐰",keywords:["rabbit","bunny","pet","cute"],category:"Animals"},{emoji:"🦊",keywords:["fox","clever","cunning","red"],category:"Animals"},{emoji:"🐻",keywords:["bear","grizzly","brown","strong"],category:"Animals"},{emoji:"🐼",keywords:["panda","bear","bamboo","cute","china"],category:"Animals"},{emoji:"🐨",keywords:["koala","australia","cute","bear"],category:"Animals"},{emoji:"🐯",keywords:["tiger","cat","stripe","fierce"],category:"Animals"},{emoji:"🦁",keywords:["lion","king","roar","cat","pride"],category:"Animals"},{emoji:"🐮",keywords:["cow","moo","farm","milk"],category:"Animals"},{emoji:"🐷",keywords:["pig","oink","farm","pork"],category:"Animals"},{emoji:"🐸",keywords:["frog","toad","ribbit","green"],category:"Animals"},{emoji:"🐵",keywords:["monkey","ape","banana","primate"],category:"Animals"},{emoji:"🙈",keywords:["monkey","see","no","evil","cover"],category:"Animals"},{emoji:"🙉",keywords:["monkey","hear","no","evil","cover"],category:"Animals"},{emoji:"🙊",keywords:["monkey","speak","no","evil","cover"],category:"Animals"},{emoji:"🐔",keywords:["chicken","hen","bird","farm"],category:"Animals"},{emoji:"🐧",keywords:["penguin","bird","ice","cold","linux"],category:"Animals"},{emoji:"🐦",keywords:["bird","fly","tweet","chirp"],category:"Animals"},{emoji:"🐤",keywords:["chick","baby","bird","chicken"],category:"Animals"},{emoji:"🦆",keywords:["duck","bird","quack","water"],category:"Animals"},{emoji:"🦅",keywords:["eagle","bird","fly","america","soar"],category:"Animals"},{emoji:"🦉",keywords:["owl","bird","night","wise","hoot"],category:"Animals"},{emoji:"🦇",keywords:["bat","vampire","night","fly"],category:"Animals"},{emoji:"🐺",keywords:["wolf","howl","wild","pack"],category:"Animals"},{emoji:"🐗",keywords:["boar","pig","wild","tusk"],category:"Animals"},{emoji:"🐴",keywords:["horse","pony","ride","stable"],category:"Animals"},{emoji:"🦄",keywords:["unicorn","horse","magic","fantasy","rainbow"],category:"Animals"},{emoji:"🐝",keywords:["bee","honey","buzz","insect","busy"],category:"Animals"},{emoji:"🐛",keywords:["bug","caterpillar","insect","debug","worm"],category:"Animals"},{emoji:"🦋",keywords:["butterfly","insect","transform","beautiful"],category:"Animals"},{emoji:"🐌",keywords:["snail","slow","shell","slug"],category:"Animals"},{emoji:"🐞",keywords:["ladybug","beetle","insect","luck"],category:"Animals"},{emoji:"🐜",keywords:["ant","insect","small","work","colony"],category:"Animals"},{emoji:"🦗",keywords:["cricket","grasshopper","insect","jump"],category:"Animals"},{emoji:"🕷️",keywords:["spider","web","insect","creepy"],category:"Animals"},{emoji:"🦂",keywords:["scorpion","sting","desert","danger"],category:"Animals"},{emoji:"🐢",keywords:["turtle","tortoise","slow","shell"],category:"Animals"},{emoji:"🐍",keywords:["snake","serpent","slither","python"],category:"Animals"},{emoji:"🦎",keywords:["lizard","reptile","gecko"],category:"Animals"},{emoji:"🐉",keywords:["dragon","fire","fantasy","chinese"],category:"Animals"},{emoji:"🐲",keywords:["dragon","face","fantasy","chinese"],category:"Animals"},{emoji:"🦖",keywords:["trex","dinosaur","rex","prehistoric"],category:"Animals"},{emoji:"🦕",keywords:["dinosaur","sauropod","prehistoric","long"],category:"Animals"},{emoji:"🐙",keywords:["octopus","sea","tentacle","squid"],category:"Animals"},{emoji:"🦑",keywords:["squid","sea","tentacle","calamari"],category:"Animals"},{emoji:"🦐",keywords:["shrimp","sea","prawn","seafood"],category:"Animals"},{emoji:"🦀",keywords:["crab","sea","pinch","seafood"],category:"Animals"},{emoji:"🐡",keywords:["blowfish","puffer","fish","sea"],category:"Animals"},{emoji:"🐠",keywords:["fish","tropical","sea","aquarium"],category:"Animals"},{emoji:"🐟",keywords:["fish","sea","swimming","aquatic"],category:"Animals"},{emoji:"🐬",keywords:["dolphin","sea","smart","flipper"],category:"Animals"},{emoji:"🐳",keywords:["whale","sea","spout","ocean"],category:"Animals"},{emoji:"🦈",keywords:["shark","sea","jaws","danger"],category:"Animals"},{emoji:"🦭",keywords:["seal","sea","cute","ocean"],category:"Animals"},{emoji:"🐊",keywords:["crocodile","alligator","reptile","swamp"],category:"Animals"},{emoji:"🦧",keywords:["orangutan","ape","primate","monkey"],category:"Animals"},{emoji:"🦍",keywords:["gorilla","ape","primate","strong"],category:"Animals"},{emoji:"🐘",keywords:["elephant","big","trunk","africa"],category:"Animals"},{emoji:"🦏",keywords:["rhino","rhinoceros","horn","africa"],category:"Animals"},{emoji:"🦛",keywords:["hippo","hippopotamus","water","africa"],category:"Animals"},{emoji:"🐪",keywords:["camel","desert","hump","dromedary"],category:"Animals"},{emoji:"🦒",keywords:["giraffe","tall","neck","spots"],category:"Animals"},{emoji:"🦓",keywords:["zebra","stripes","horse","africa"],category:"Animals"},{emoji:"🦘",keywords:["kangaroo","australia","jump","pouch"],category:"Animals"},{emoji:"🦬",keywords:["bison","buffalo","america","wild"],category:"Animals"},{emoji:"🐃",keywords:["buffalo","water","ox","farm"],category:"Animals"},{emoji:"🦌",keywords:["deer","stag","antler","forest"],category:"Animals"},{emoji:"🦙",keywords:["llama","alpaca","wool","peru"],category:"Animals"},{emoji:"🦥",keywords:["sloth","slow","lazy","sleep"],category:"Animals"},{emoji:"🦦",keywords:["otter","sea","cute","swim"],category:"Animals"},{emoji:"🦨",keywords:["skunk","stink","smell","stripe"],category:"Animals"},{emoji:"🦡",keywords:["badger","honey","dig","stripe"],category:"Animals"},{emoji:"🐾",keywords:["paw","prints","pet","animal","dog","cat"],category:"Animals"},{emoji:"🦠",keywords:["microbe","virus","bacteria","bug","germ"],category:"Animals"},{emoji:"🌲",keywords:["tree","evergreen","pine","forest","christmas"],category:"Nature"},{emoji:"🌳",keywords:["tree","deciduous","forest","nature"],category:"Nature"},{emoji:"🌴",keywords:["palm","tree","beach","tropical"],category:"Nature"},{emoji:"🌵",keywords:["cactus","desert","plant","prickly"],category:"Nature"},{emoji:"🌱",keywords:["seedling","plant","grow","sprout"],category:"Nature"},{emoji:"🌿",keywords:["herb","plant","green","leaf"],category:"Nature"},{emoji:"☘️",keywords:["shamrock","clover","irish","luck"],category:"Nature"},{emoji:"🍀",keywords:["clover","four","leaf","luck"],category:"Nature"},{emoji:"🍁",keywords:["maple","leaf","fall","autumn","canada"],category:"Nature"},{emoji:"🍂",keywords:["fallen","leaf","fall","autumn"],category:"Nature"},{emoji:"🍃",keywords:["leaf","fluttering","wind","blow"],category:"Nature"},{emoji:"🌸",keywords:["cherry","blossom","flower","spring","japan"],category:"Nature"},{emoji:"💐",keywords:["bouquet","flowers","gift","arrangement"],category:"Nature"},{emoji:"🌷",keywords:["tulip","flower","spring","netherlands"],category:"Nature"},{emoji:"🌹",keywords:["rose","flower","love","romantic"],category:"Nature"},{emoji:"🥀",keywords:["wilted","flower","dead","sad"],category:"Nature"},{emoji:"🌺",keywords:["hibiscus","flower","tropical","hawaii"],category:"Nature"},{emoji:"🌻",keywords:["sunflower","flower","sun","yellow"],category:"Nature"},{emoji:"🌼",keywords:["blossom","flower","yellow","daisy"],category:"Nature"},{emoji:"☀️",keywords:["sun","sunny","bright","day","light"],category:"Weather"},{emoji:"🌤️",keywords:["sun","cloud","partly","cloudy"],category:"Weather"},{emoji:"⛅",keywords:["sun","cloud","partly","cloudy"],category:"Weather"},{emoji:"🌥️",keywords:["cloud","sun","behind","mostly"],category:"Weather"},{emoji:"☁️",keywords:["cloud","cloudy","weather","sky"],category:"Weather"},{emoji:"🌦️",keywords:["rain","sun","cloud","shower"],category:"Weather"},{emoji:"🌧️",keywords:["rain","cloud","rainy","weather"],category:"Weather"},{emoji:"⛈️",keywords:["thunder","storm","rain","lightning"],category:"Weather"},{emoji:"🌩️",keywords:["lightning","cloud","storm","thunder"],category:"Weather"},{emoji:"🌨️",keywords:["snow","cloud","snowy","winter"],category:"Weather"},{emoji:"❄️",keywords:["snow","ice","cold","freeze","winter","flake"],category:"Weather"},{emoji:"💨",keywords:["wind","blow","dash","fast","air"],category:"Weather"},{emoji:"🌪️",keywords:["tornado","cyclone","twister","storm"],category:"Weather"},{emoji:"🌫️",keywords:["fog","foggy","mist","hazy"],category:"Weather"},{emoji:"🌈",keywords:["rainbow","color","pride","spectrum"],category:"Weather"},{emoji:"⚡",keywords:["lightning","electric","power","energy","fast","bolt","thunder"],category:"Weather"},{emoji:"🔥",keywords:["fire","flame","hot","burn","lit"],category:"Weather"},{emoji:"💧",keywords:["water","drop","liquid","wet"],category:"Weather"},{emoji:"🌊",keywords:["wave","ocean","sea","water","surf"],category:"Weather"},{emoji:"🌙",keywords:["moon","night","crescent","dark","sleep"],category:"Weather"},{emoji:"🌛",keywords:["moon","first","quarter","face"],category:"Weather"},{emoji:"🌜",keywords:["moon","last","quarter","face"],category:"Weather"},{emoji:"🌝",keywords:["moon","full","face","bright"],category:"Weather"},{emoji:"🌞",keywords:["sun","face","bright","happy"],category:"Weather"},{emoji:"⭐",keywords:["star","yellow","favorite","best"],category:"Weather"},{emoji:"🌟",keywords:["star","glow","bright","shiny"],category:"Weather"},{emoji:"✨",keywords:["sparkle","star","shine","magic","new"],category:"Weather"},{emoji:"💫",keywords:["dizzy","star","circle","shooting"],category:"Weather"},{emoji:"☄️",keywords:["comet","meteor","space","shooting","star"],category:"Weather"},{emoji:"🍎",keywords:["apple","red","fruit","healthy"],category:"Food"},{emoji:"🍏",keywords:["apple","green","fruit","healthy"],category:"Food"},{emoji:"🍐",keywords:["pear","fruit","green"],category:"Food"},{emoji:"🍊",keywords:["orange","fruit","citrus","tangerine"],category:"Food"},{emoji:"🍋",keywords:["lemon","citrus","sour","yellow"],category:"Food"},{emoji:"🍌",keywords:["banana","fruit","yellow","monkey"],category:"Food"},{emoji:"🍉",keywords:["watermelon","fruit","summer","red"],category:"Food"},{emoji:"🍇",keywords:["grapes","fruit","wine","purple"],category:"Food"},{emoji:"🍓",keywords:["strawberry","fruit","berry","red"],category:"Food"},{emoji:"🫐",keywords:["blueberry","fruit","berry","blue"],category:"Food"},{emoji:"🍒",keywords:["cherry","cherries","fruit","red"],category:"Food"},{emoji:"🍑",keywords:["peach","fruit","butt","emoji"],category:"Food"},{emoji:"🥭",keywords:["mango","fruit","tropical","yellow"],category:"Food"},{emoji:"🍍",keywords:["pineapple","fruit","tropical"],category:"Food"},{emoji:"🥥",keywords:["coconut","tropical","brown"],category:"Food"},{emoji:"🥝",keywords:["kiwi","fruit","green"],category:"Food"},{emoji:"🍅",keywords:["tomato","vegetable","red"],category:"Food"},{emoji:"🥑",keywords:["avocado","green","guacamole"],category:"Food"},{emoji:"🥕",keywords:["carrot","vegetable","orange"],category:"Food"},{emoji:"🌽",keywords:["corn","maize","vegetable","yellow"],category:"Food"},{emoji:"🌶️",keywords:["pepper","hot","spicy","chili"],category:"Food"},{emoji:"🥒",keywords:["cucumber","pickle","vegetable"],category:"Food"},{emoji:"🥬",keywords:["lettuce","leafy","green","salad"],category:"Food"},{emoji:"🥦",keywords:["broccoli","vegetable","green"],category:"Food"},{emoji:"🧄",keywords:["garlic","spice","cooking"],category:"Food"},{emoji:"🧅",keywords:["onion","vegetable","cry"],category:"Food"},{emoji:"🥔",keywords:["potato","vegetable","fries"],category:"Food"},{emoji:"🍞",keywords:["bread","loaf","toast","carb"],category:"Food"},{emoji:"🥐",keywords:["croissant","bread","french","pastry"],category:"Food"},{emoji:"🥖",keywords:["baguette","bread","french"],category:"Food"},{emoji:"🥨",keywords:["pretzel","snack","twisted"],category:"Food"},{emoji:"🧀",keywords:["cheese","dairy","yellow"],category:"Food"},{emoji:"🥚",keywords:["egg","breakfast","chicken"],category:"Food"},{emoji:"🍳",keywords:["cooking","egg","frying","pan"],category:"Food"},{emoji:"🥞",keywords:["pancakes","breakfast","stack"],category:"Food"},{emoji:"🧇",keywords:["waffle","breakfast","belgian"],category:"Food"},{emoji:"🥓",keywords:["bacon","meat","breakfast","pork"],category:"Food"},{emoji:"🍔",keywords:["burger","hamburger","food","fast"],category:"Food"},{emoji:"🍟",keywords:["fries","french","food","fast"],category:"Food"},{emoji:"🍕",keywords:["pizza","food","italian","slice"],category:"Food"},{emoji:"🌭",keywords:["hotdog","food","fast","sausage"],category:"Food"},{emoji:"🥪",keywords:["sandwich","food","bread","lunch"],category:"Food"},{emoji:"🌮",keywords:["taco","mexican","food"],category:"Food"},{emoji:"🌯",keywords:["burrito","mexican","food","wrap"],category:"Food"},{emoji:"🥗",keywords:["salad","healthy","green","vegetable"],category:"Food"},{emoji:"🍜",keywords:["noodle","ramen","soup","bowl"],category:"Food"},{emoji:"🍝",keywords:["spaghetti","pasta","italian","noodle"],category:"Food"},{emoji:"🍣",keywords:["sushi","japanese","fish","rice"],category:"Food"},{emoji:"🍱",keywords:["bento","box","japanese","lunch"],category:"Food"},{emoji:"🍛",keywords:["curry","rice","indian","food"],category:"Food"},{emoji:"🍲",keywords:["pot","food","stew","soup"],category:"Food"},{emoji:"🥘",keywords:["paella","food","pan","spanish"],category:"Food"},{emoji:"🍿",keywords:["popcorn","movie","snack","cinema"],category:"Food"},{emoji:"🧂",keywords:["salt","spice","seasoning"],category:"Food"},{emoji:"🍦",keywords:["ice","cream","cone","dessert","cold"],category:"Food"},{emoji:"🍧",keywords:["shaved","ice","dessert","cold"],category:"Food"},{emoji:"🍨",keywords:["ice","cream","dessert","cold"],category:"Food"},{emoji:"🍩",keywords:["donut","doughnut","dessert","sweet"],category:"Food"},{emoji:"🍪",keywords:["cookie","dessert","sweet","chocolate"],category:"Food"},{emoji:"🎂",keywords:["cake","birthday","dessert","celebration"],category:"Food"},{emoji:"🍰",keywords:["cake","slice","shortcake","dessert"],category:"Food"},{emoji:"🧁",keywords:["cupcake","dessert","sweet","muffin"],category:"Food"},{emoji:"🥧",keywords:["pie","dessert","apple","thanksgiving"],category:"Food"},{emoji:"🍫",keywords:["chocolate","bar","sweet","candy"],category:"Food"},{emoji:"🍬",keywords:["candy","sweet","sugar"],category:"Food"},{emoji:"🍭",keywords:["lollipop","candy","sweet"],category:"Food"},{emoji:"☕",keywords:["coffee","hot","drink","cafe","java"],category:"Food"},{emoji:"🍵",keywords:["tea","hot","drink","green"],category:"Food"},{emoji:"🥤",keywords:["cup","straw","drink","soda"],category:"Food"},{emoji:"🧃",keywords:["juice","box","drink","kid"],category:"Food"},{emoji:"🧊",keywords:["ice","cube","cold","freeze"],category:"Food"},{emoji:"🍺",keywords:["beer","mug","drink","alcohol"],category:"Food"},{emoji:"🍻",keywords:["beer","cheers","drink","alcohol","mugs"],category:"Food"},{emoji:"🥂",keywords:["champagne","cheers","celebration","wine"],category:"Food"},{emoji:"🍷",keywords:["wine","glass","drink","alcohol","red"],category:"Food"},{emoji:"🥃",keywords:["whiskey","glass","drink","alcohol","tumbler"],category:"Food"},{emoji:"🍸",keywords:["cocktail","drink","martini","alcohol"],category:"Food"},{emoji:"🍹",keywords:["tropical","drink","cocktail","alcohol"],category:"Food"},{emoji:"🔍",keywords:["search","magnify","find","look","scout","explore","investigate"],category:"Tools"},{emoji:"🔎",keywords:["search","magnify","find","look","right"],category:"Tools"},{emoji:"🔨",keywords:["hammer","build","tool","construct","builder"],category:"Tools"},{emoji:"🪓",keywords:["axe","chop","wood","lumberjack"],category:"Tools"},{emoji:"⛏️",keywords:["pick","mining","dig","tool"],category:"Tools"},{emoji:"⚒️",keywords:["hammer","pick","mining","build"],category:"Tools"},{emoji:"🛠️",keywords:["tools","build","repair","fix","hammer","wrench"],category:"Tools"},{emoji:"🔧",keywords:["wrench","fix","repair","tool","mechanic"],category:"Tools"},{emoji:"🪛",keywords:["screwdriver","tool","fix","repair"],category:"Tools"},{emoji:"🔩",keywords:["bolt","nut","screw","hardware"],category:"Tools"},{emoji:"⚙️",keywords:["gear","settings","config","cog","machine"],category:"Tools"},{emoji:"🗜️",keywords:["clamp","compress","tool","vise"],category:"Tools"},{emoji:"⚖️",keywords:["scale","balance","justice","law","weigh"],category:"Tools"},{emoji:"🔗",keywords:["link","chain","connect","url"],category:"Tools"},{emoji:"⛓️",keywords:["chain","link","connect","locked"],category:"Tools"},{emoji:"🧰",keywords:["toolbox","tools","repair","box"],category:"Tools"},{emoji:"🧲",keywords:["magnet","attract","magnetic"],category:"Tools"},{emoji:"⚔️",keywords:["sword","battle","fight","warrior","combat","crossed"],category:"Tools"},{emoji:"🗡️",keywords:["dagger","knife","sword","blade","weapon"],category:"Tools"},{emoji:"🛡️",keywords:["shield","protect","defense","guard","security"],category:"Tools"},{emoji:"🏹",keywords:["bow","arrow","archer","hunt"],category:"Tools"},{emoji:"🔪",keywords:["knife","cut","blade","kitchen"],category:"Tools"},{emoji:"💣",keywords:["bomb","explode","danger","boom"],category:"Tools"},{emoji:"🧨",keywords:["dynamite","explosive","firecracker","boom"],category:"Tools"},{emoji:"🪃",keywords:["boomerang","throw","return","australia"],category:"Tools"},{emoji:"🔫",keywords:["gun","pistol","water","toy"],category:"Tools"},{emoji:"✂️",keywords:["scissors","cut","trim","snip"],category:"Tools"},{emoji:"📌",keywords:["pin","push","tack","mark","location"],category:"Tools"},{emoji:"📍",keywords:["pin","location","map","place"],category:"Tools"},{emoji:"📎",keywords:["paperclip","clip","attach","office"],category:"Tools"},{emoji:"🖊️",keywords:["pen","write","ink","sign"],category:"Tools"},{emoji:"✏️",keywords:["pencil","write","draw","edit"],category:"Tools"},{emoji:"✒️",keywords:["pen","nib","write","black"],category:"Tools"},{emoji:"🖍️",keywords:["crayon","draw","color","art"],category:"Tools"},{emoji:"📝",keywords:["memo","note","write","document","edit"],category:"Tools"},{emoji:"📋",keywords:["clipboard","list","task","checklist"],category:"Tools"},{emoji:"🔐",keywords:["lock","key","secure","closed"],category:"Tools"},{emoji:"🔒",keywords:["lock","closed","secure","padlock"],category:"Tools"},{emoji:"🔓",keywords:["unlock","open","padlock"],category:"Tools"},{emoji:"🔑",keywords:["key","lock","password","access"],category:"Tools"},{emoji:"🗝️",keywords:["key","old","vintage","lock"],category:"Tools"},{emoji:"💻",keywords:["laptop","computer","pc","mac","code","work"],category:"Tech"},{emoji:"🖥️",keywords:["desktop","computer","monitor","screen","pc"],category:"Tech"},{emoji:"🖨️",keywords:["printer","print","paper","office"],category:"Tech"},{emoji:"⌨️",keywords:["keyboard","type","input","computer"],category:"Tech"},{emoji:"🖱️",keywords:["mouse","click","computer","cursor"],category:"Tech"},{emoji:"🖲️",keywords:["trackball","mouse","computer","input"],category:"Tech"},{emoji:"💽",keywords:["disk","minidisk","computer","storage"],category:"Tech"},{emoji:"💾",keywords:["floppy","disk","save","storage","data"],category:"Tech"},{emoji:"💿",keywords:["cd","disk","music","data"],category:"Tech"},{emoji:"📀",keywords:["dvd","disk","movie","data"],category:"Tech"},{emoji:"📱",keywords:["phone","mobile","smartphone","cell","iphone"],category:"Tech"},{emoji:"📲",keywords:["phone","call","incoming","mobile"],category:"Tech"},{emoji:"☎️",keywords:["phone","telephone","call","old"],category:"Tech"},{emoji:"📞",keywords:["phone","receiver","call","talk"],category:"Tech"},{emoji:"📟",keywords:["pager","beeper","old","retro"],category:"Tech"},{emoji:"📠",keywords:["fax","machine","office","old"],category:"Tech"},{emoji:"🔋",keywords:["battery","power","charge","energy"],category:"Tech"},{emoji:"🔌",keywords:["plug","electric","power","connect"],category:"Tech"},{emoji:"💡",keywords:["bulb","light","idea","bright","lamp"],category:"Tech"},{emoji:"🔦",keywords:["flashlight","light","torch","bright"],category:"Tech"},{emoji:"🕯️",keywords:["candle","light","flame","wax"],category:"Tech"},{emoji:"📡",keywords:["satellite","antenna","signal","dish"],category:"Tech"},{emoji:"🛰️",keywords:["satellite","space","orbit","signal"],category:"Tech"},{emoji:"🧭",keywords:["compass","navigate","direction","north"],category:"Tech"},{emoji:"🗺️",keywords:["map","world","travel","navigate","explore"],category:"Tech"},{emoji:"🧪",keywords:["test","tube","science","lab","experiment","chemistry"],category:"Tech"},{emoji:"🔬",keywords:["microscope","science","lab","research","biology"],category:"Tech"},{emoji:"🔭",keywords:["telescope","space","astronomy","star","observe"],category:"Tech"},{emoji:"📐",keywords:["ruler","triangle","architect","design","measure","math"],category:"Tech"},{emoji:"📏",keywords:["ruler","measure","straight","length"],category:"Tech"},{emoji:"🧬",keywords:["dna","gene","biology","science","helix"],category:"Tech"},{emoji:"💉",keywords:["syringe","needle","medicine","vaccine","inject"],category:"Tech"},{emoji:"💊",keywords:["pill","medicine","drug","pharmacy","health"],category:"Tech"},{emoji:"🩹",keywords:["bandage","heal","fix","patch","medical"],category:"Tech"},{emoji:"🩺",keywords:["stethoscope","doctor","medical","health"],category:"Tech"},{emoji:"⚗️",keywords:["alembic","chemistry","science","distill"],category:"Tech"},{emoji:"🚗",keywords:["car","auto","vehicle","drive"],category:"Transport"},{emoji:"🚕",keywords:["taxi","cab","car","ride"],category:"Transport"},{emoji:"🚙",keywords:["suv","car","vehicle","sport"],category:"Transport"},{emoji:"🚌",keywords:["bus","vehicle","public","transit"],category:"Transport"},{emoji:"🚎",keywords:["trolley","bus","electric","transit"],category:"Transport"},{emoji:"🏎️",keywords:["racing","car","fast","formula"],category:"Transport"},{emoji:"🚓",keywords:["police","car","cop","patrol"],category:"Transport"},{emoji:"🚑",keywords:["ambulance","emergency","medical","hospital"],category:"Transport"},{emoji:"🚒",keywords:["fire","truck","engine","emergency"],category:"Transport"},{emoji:"🚐",keywords:["minibus","van","vehicle","transit"],category:"Transport"},{emoji:"🛻",keywords:["pickup","truck","vehicle"],category:"Transport"},{emoji:"🚚",keywords:["truck","delivery","vehicle","moving"],category:"Transport"},{emoji:"🚛",keywords:["truck","semi","trailer","haul"],category:"Transport"},{emoji:"🚜",keywords:["tractor","farm","vehicle","agriculture"],category:"Transport"},{emoji:"🏍️",keywords:["motorcycle","racing","bike","sport"],category:"Transport"},{emoji:"🛵",keywords:["scooter","motor","vespa","moped"],category:"Transport"},{emoji:"🚲",keywords:["bicycle","bike","cycle","pedal"],category:"Transport"},{emoji:"🛴",keywords:["scooter","kick","ride"],category:"Transport"},{emoji:"🚂",keywords:["train","locomotive","steam","rail"],category:"Transport"},{emoji:"🚃",keywords:["train","railway","car","wagon"],category:"Transport"},{emoji:"🚄",keywords:["train","high","speed","bullet","shinkansen"],category:"Transport"},{emoji:"🚅",keywords:["train","bullet","high","speed"],category:"Transport"},{emoji:"🚆",keywords:["train","railway","transit"],category:"Transport"},{emoji:"🚇",keywords:["metro","subway","underground","train"],category:"Transport"},{emoji:"🚈",keywords:["train","light","rail","transit"],category:"Transport"},{emoji:"✈️",keywords:["airplane","plane","fly","travel","flight"],category:"Transport"},{emoji:"🛫",keywords:["airplane","departure","takeoff","fly"],category:"Transport"},{emoji:"🛬",keywords:["airplane","arrival","landing","fly"],category:"Transport"},{emoji:"🛩️",keywords:["plane","small","airplane","fly"],category:"Transport"},{emoji:"🚁",keywords:["helicopter","chopper","fly","hover"],category:"Transport"},{emoji:"🛸",keywords:["ufo","alien","spaceship","flying","saucer"],category:"Transport"},{emoji:"🚀",keywords:["rocket","launch","space","fast","ship","startup"],category:"Transport"},{emoji:"🛶",keywords:["canoe","boat","paddle","kayak"],category:"Transport"},{emoji:"⛵",keywords:["sailboat","boat","sail","wind"],category:"Transport"},{emoji:"🚤",keywords:["speedboat","boat","fast","water"],category:"Transport"},{emoji:"🛥️",keywords:["motorboat","boat","yacht"],category:"Transport"},{emoji:"🛳️",keywords:["ship","cruise","passenger","boat"],category:"Transport"},{emoji:"⛴️",keywords:["ferry","boat","ship","transport"],category:"Transport"},{emoji:"🚢",keywords:["ship","boat","cruise","ocean"],category:"Transport"},{emoji:"⚓",keywords:["anchor","ship","boat","dock"],category:"Transport"},{emoji:"🚧",keywords:["construction","barrier","road","block"],category:"Transport"},{emoji:"🚦",keywords:["traffic","light","signal","stop","go"],category:"Transport"},{emoji:"🚥",keywords:["traffic","light","horizontal","signal"],category:"Transport"},{emoji:"🗼",keywords:["tower","tokyo","japan","landmark"],category:"Transport"},{emoji:"🗽",keywords:["statue","liberty","usa","new","york"],category:"Transport"},{emoji:"🗿",keywords:["moai","statue","easter","island"],category:"Transport"},{emoji:"📦",keywords:["box","package","delivery","ship","container"],category:"Objects"},{emoji:"🎁",keywords:["gift","present","wrap","birthday"],category:"Objects"},{emoji:"💎",keywords:["diamond","gem","jewel","precious","crystal"],category:"Objects"},{emoji:"🔮",keywords:["crystal","ball","magic","fortune","predict"],category:"Objects"},{emoji:"🏆",keywords:["trophy","win","champion","prize","gold","first"],category:"Objects"},{emoji:"🥇",keywords:["gold","medal","first","winner","best"],category:"Objects"},{emoji:"🥈",keywords:["silver","medal","second","winner"],category:"Objects"},{emoji:"🥉",keywords:["bronze","medal","third","winner"],category:"Objects"},{emoji:"🏅",keywords:["medal","sports","award","winner"],category:"Objects"},{emoji:"🎖️",keywords:["medal","military","honor","badge"],category:"Objects"},{emoji:"🎯",keywords:["target","bullseye","aim","goal","dart"],category:"Objects"},{emoji:"🎰",keywords:["slot","machine","casino","gamble","lucky"],category:"Objects"},{emoji:"🎲",keywords:["dice","game","roll","random","chance"],category:"Objects"},{emoji:"🎮",keywords:["game","controller","video","play","console"],category:"Objects"},{emoji:"🕹️",keywords:["joystick","game","arcade","control"],category:"Objects"},{emoji:"🎨",keywords:["art","palette","paint","color","creative"],category:"Objects"},{emoji:"🖼️",keywords:["picture","frame","art","painting"],category:"Objects"},{emoji:"🎬",keywords:["clapper","movie","film","action","cinema"],category:"Objects"},{emoji:"📷",keywords:["camera","photo","picture","photograph"],category:"Objects"},{emoji:"📸",keywords:["camera","flash","photo","selfie"],category:"Objects"},{emoji:"📹",keywords:["video","camera","record","film"],category:"Objects"},{emoji:"🎥",keywords:["movie","camera","film","cinema"],category:"Objects"},{emoji:"📺",keywords:["tv","television","screen","watch"],category:"Objects"},{emoji:"📻",keywords:["radio","music","broadcast","listen"],category:"Objects"},{emoji:"🎤",keywords:["microphone","mic","sing","karaoke","voice"],category:"Objects"},{emoji:"🎧",keywords:["headphones","music","listen","audio"],category:"Objects"},{emoji:"🎵",keywords:["music","note","song","melody"],category:"Objects"},{emoji:"🎶",keywords:["music","notes","song","melody"],category:"Objects"},{emoji:"🎹",keywords:["piano","keys","music","instrument"],category:"Objects"},{emoji:"🎸",keywords:["guitar","music","rock","instrument"],category:"Objects"},{emoji:"🎺",keywords:["trumpet","music","brass","instrument"],category:"Objects"},{emoji:"🥁",keywords:["drum","music","beat","percussion"],category:"Objects"},{emoji:"🎻",keywords:["violin","music","string","instrument"],category:"Objects"},{emoji:"📚",keywords:["books","library","read","study"],category:"Objects"},{emoji:"📖",keywords:["book","open","read","study"],category:"Objects"},{emoji:"📕",keywords:["book","closed","red","read"],category:"Objects"},{emoji:"📗",keywords:["book","green","read"],category:"Objects"},{emoji:"📘",keywords:["book","blue","read"],category:"Objects"},{emoji:"📙",keywords:["book","orange","read"],category:"Objects"},{emoji:"📓",keywords:["notebook","write","journal"],category:"Objects"},{emoji:"📒",keywords:["ledger","notebook","write"],category:"Objects"},{emoji:"📃",keywords:["page","document","curl","paper"],category:"Objects"},{emoji:"📄",keywords:["document","page","paper","file"],category:"Objects"},{emoji:"📰",keywords:["newspaper","news","press","paper"],category:"Objects"},{emoji:"🗞️",keywords:["newspaper","rolled","news","paper"],category:"Objects"},{emoji:"📑",keywords:["bookmark","tabs","page","marker"],category:"Objects"},{emoji:"🔖",keywords:["bookmark","mark","page","save"],category:"Objects"},{emoji:"🏷️",keywords:["label","tag","price","sale"],category:"Objects"},{emoji:"✉️",keywords:["envelope","letter","mail","email"],category:"Objects"},{emoji:"📧",keywords:["email","e-mail","mail","message"],category:"Objects"},{emoji:"📨",keywords:["envelope","incoming","mail","receive"],category:"Objects"},{emoji:"📩",keywords:["envelope","arrow","mail","outgoing"],category:"Objects"},{emoji:"📤",keywords:["outbox","sent","mail","tray"],category:"Objects"},{emoji:"📥",keywords:["inbox","receive","mail","tray"],category:"Objects"},{emoji:"📪",keywords:["mailbox","closed","mail","post"],category:"Objects"},{emoji:"📫",keywords:["mailbox","raised","mail","post"],category:"Objects"},{emoji:"📬",keywords:["mailbox","open","mail","post"],category:"Objects"},{emoji:"📭",keywords:["mailbox","lowered","mail","post"],category:"Objects"},{emoji:"📮",keywords:["postbox","mail","post","letter"],category:"Objects"},{emoji:"🗳️",keywords:["ballot","box","vote","election"],category:"Objects"},{emoji:"🛒",keywords:["cart","shopping","trolley","buy"],category:"Objects"},{emoji:"⏰",keywords:["alarm","clock","time","wake"],category:"Objects"},{emoji:"⏱️",keywords:["stopwatch","timer","time","race"],category:"Objects"},{emoji:"⏲️",keywords:["timer","clock","time","countdown"],category:"Objects"},{emoji:"🕰️",keywords:["clock","mantelpiece","time","antique"],category:"Objects"},{emoji:"⌛",keywords:["hourglass","done","time","sand"],category:"Objects"},{emoji:"⏳",keywords:["hourglass","flowing","time","sand"],category:"Objects"},{emoji:"🔔",keywords:["bell","notification","alert","ring"],category:"Objects"},{emoji:"🔕",keywords:["bell","mute","silent","notification"],category:"Objects"},{emoji:"📣",keywords:["megaphone","cheering","announcement"],category:"Objects"},{emoji:"📢",keywords:["loudspeaker","announcement","public"],category:"Objects"},{emoji:"🔊",keywords:["speaker","volume","loud","sound"],category:"Objects"},{emoji:"🔉",keywords:["speaker","volume","medium","sound"],category:"Objects"},{emoji:"🔈",keywords:["speaker","volume","low","sound"],category:"Objects"},{emoji:"🔇",keywords:["mute","speaker","silent","sound"],category:"Objects"},{emoji:"🗑️",keywords:["trash","bin","garbage","delete","waste"],category:"Objects"},{emoji:"❤️",keywords:["heart","red","love"],category:"Symbols"},{emoji:"✅",keywords:["check","yes","done","complete","success","green"],category:"Symbols"},{emoji:"❌",keywords:["cross","no","wrong","delete","red","x"],category:"Symbols"},{emoji:"❎",keywords:["cross","mark","no","square"],category:"Symbols"},{emoji:"➕",keywords:["plus","add","more","positive"],category:"Symbols"},{emoji:"➖",keywords:["minus","subtract","less","negative"],category:"Symbols"},{emoji:"➗",keywords:["divide","division","math"],category:"Symbols"},{emoji:"✖️",keywords:["multiply","x","cross","math"],category:"Symbols"},{emoji:"💯",keywords:["hundred","perfect","score","full"],category:"Symbols"},{emoji:"💢",keywords:["anger","angry","symbol","mad"],category:"Symbols"},{emoji:"💥",keywords:["boom","collision","explosion","crash"],category:"Symbols"},{emoji:"💫",keywords:["dizzy","star","circle","shooting"],category:"Symbols"},{emoji:"💦",keywords:["sweat","droplets","water","splash"],category:"Symbols"},{emoji:"💨",keywords:["dash","running","wind","fast"],category:"Symbols"},{emoji:"🕳️",keywords:["hole","black","empty","void"],category:"Symbols"},{emoji:"💬",keywords:["speech","bubble","talk","comment","chat"],category:"Symbols"},{emoji:"👁️‍🗨️",keywords:["eye","speech","witness","see"],category:"Symbols"},{emoji:"🗨️",keywords:["speech","bubble","left","talk"],category:"Symbols"},{emoji:"🗯️",keywords:["anger","bubble","right","mad"],category:"Symbols"},{emoji:"💭",keywords:["thought","bubble","think","idea"],category:"Symbols"},{emoji:"💤",keywords:["zzz","sleep","tired","snore"],category:"Symbols"},{emoji:"🔷",keywords:["diamond","blue","shape","rhombus"],category:"Symbols"},{emoji:"🔶",keywords:["diamond","orange","shape","rhombus"],category:"Symbols"},{emoji:"🔹",keywords:["diamond","blue","small","shape"],category:"Symbols"},{emoji:"🔸",keywords:["diamond","orange","small","shape"],category:"Symbols"},{emoji:"🔺",keywords:["triangle","red","up","shape"],category:"Symbols"},{emoji:"🔻",keywords:["triangle","red","down","shape"],category:"Symbols"},{emoji:"◾",keywords:["square","black","medium","shape"],category:"Symbols"},{emoji:"◽",keywords:["square","white","medium","shape"],category:"Symbols"},{emoji:"▪️",keywords:["square","black","small","shape"],category:"Symbols"},{emoji:"▫️",keywords:["square","white","small","shape"],category:"Symbols"},{emoji:"⬛",keywords:["square","black","large","shape"],category:"Symbols"},{emoji:"⬜",keywords:["square","white","large","shape"],category:"Symbols"},{emoji:"🟥",keywords:["square","red","shape","color"],category:"Symbols"},{emoji:"🟧",keywords:["square","orange","shape","color"],category:"Symbols"},{emoji:"🟨",keywords:["square","yellow","shape","color"],category:"Symbols"},{emoji:"🟩",keywords:["square","green","shape","color"],category:"Symbols"},{emoji:"🟦",keywords:["square","blue","shape","color"],category:"Symbols"},{emoji:"🟪",keywords:["square","purple","shape","color"],category:"Symbols"},{emoji:"🟫",keywords:["square","brown","shape","color"],category:"Symbols"},{emoji:"⭕",keywords:["circle","red","hollow","ring"],category:"Symbols"},{emoji:"🔘",keywords:["radio","button","circle","select"],category:"Symbols"},{emoji:"🔴",keywords:["circle","red","dot","round"],category:"Symbols"},{emoji:"🟠",keywords:["circle","orange","dot","round"],category:"Symbols"},{emoji:"🟡",keywords:["circle","yellow","dot","round"],category:"Symbols"},{emoji:"🟢",keywords:["circle","green","dot","round"],category:"Symbols"},{emoji:"🔵",keywords:["circle","blue","dot","round"],category:"Symbols"},{emoji:"🟣",keywords:["circle","purple","dot","round"],category:"Symbols"},{emoji:"🟤",keywords:["circle","brown","dot","round"],category:"Symbols"},{emoji:"⚫",keywords:["circle","black","dot","round"],category:"Symbols"},{emoji:"⚪",keywords:["circle","white","dot","round"],category:"Symbols"},{emoji:"💠",keywords:["diamond","dot","cute","flower","shape"],category:"Symbols"},{emoji:"🔳",keywords:["square","button","white","outline"],category:"Symbols"},{emoji:"🔲",keywords:["square","button","black","outline"],category:"Symbols"},{emoji:"⭐",keywords:["star","yellow","favorite","best"],category:"Symbols"},{emoji:"🌟",keywords:["star","glow","bright","shiny"],category:"Symbols"},{emoji:"✨",keywords:["sparkle","star","shine","magic","new"],category:"Symbols"},{emoji:"⁉️",keywords:["question","exclamation","interrobang","what"],category:"Symbols"},{emoji:"❓",keywords:["question","mark","red","what"],category:"Symbols"},{emoji:"❔",keywords:["question","mark","white","what"],category:"Symbols"},{emoji:"❗",keywords:["exclamation","mark","red","important"],category:"Symbols"},{emoji:"❕",keywords:["exclamation","mark","white","important"],category:"Symbols"},{emoji:"‼️",keywords:["exclamation","double","bang","important"],category:"Symbols"},{emoji:"⚠️",keywords:["warning","caution","alert","danger"],category:"Symbols"},{emoji:"🚫",keywords:["prohibited","no","forbidden","ban","stop"],category:"Symbols"},{emoji:"🔞",keywords:["eighteen","adult","nsfw","age"],category:"Symbols"},{emoji:"📵",keywords:["phone","no","prohibited","mobile"],category:"Symbols"},{emoji:"🔃",keywords:["arrows","clockwise","cycle","rotate"],category:"Symbols"},{emoji:"🔄",keywords:["arrows","counterclockwise","cycle","refresh","reload"],category:"Symbols"},{emoji:"🔙",keywords:["back","arrow","return","previous"],category:"Symbols"},{emoji:"🔚",keywords:["end","arrow","finish","last"],category:"Symbols"},{emoji:"🔛",keywords:["on","arrow","mark","top"],category:"Symbols"},{emoji:"🔜",keywords:["soon","arrow","coming","next"],category:"Symbols"},{emoji:"🔝",keywords:["top","arrow","up","first"],category:"Symbols"},{emoji:"⬆️",keywords:["arrow","up","north","direction"],category:"Symbols"},{emoji:"⬇️",keywords:["arrow","down","south","direction"],category:"Symbols"},{emoji:"⬅️",keywords:["arrow","left","west","direction"],category:"Symbols"},{emoji:"➡️",keywords:["arrow","right","east","direction"],category:"Symbols"},{emoji:"↗️",keywords:["arrow","northeast","up","right"],category:"Symbols"},{emoji:"↘️",keywords:["arrow","southeast","down","right"],category:"Symbols"},{emoji:"↙️",keywords:["arrow","southwest","down","left"],category:"Symbols"},{emoji:"↖️",keywords:["arrow","northwest","up","left"],category:"Symbols"},{emoji:"↕️",keywords:["arrow","up","down","vertical"],category:"Symbols"},{emoji:"↔️",keywords:["arrow","left","right","horizontal"],category:"Symbols"},{emoji:"🔀",keywords:["shuffle","random","crossed","arrows"],category:"Symbols"},{emoji:"🔁",keywords:["repeat","loop","arrows","cycle"],category:"Symbols"},{emoji:"🔂",keywords:["repeat","one","single","loop"],category:"Symbols"},{emoji:"▶️",keywords:["play","arrow","forward","start"],category:"Symbols"},{emoji:"⏩",keywords:["fast","forward","skip","double"],category:"Symbols"},{emoji:"⏭️",keywords:["next","track","skip","forward"],category:"Symbols"},{emoji:"⏯️",keywords:["play","pause","toggle"],category:"Symbols"},{emoji:"◀️",keywords:["reverse","back","left","arrow"],category:"Symbols"},{emoji:"⏪",keywords:["rewind","back","fast","double"],category:"Symbols"},{emoji:"⏮️",keywords:["previous","track","skip","back"],category:"Symbols"},{emoji:"⏸️",keywords:["pause","stop","hold","double"],category:"Symbols"},{emoji:"⏹️",keywords:["stop","square","end"],category:"Symbols"},{emoji:"⏺️",keywords:["record","circle","red","dot"],category:"Symbols"},{emoji:"🎦",keywords:["cinema","movie","film","camera"],category:"Symbols"},{emoji:"🔅",keywords:["dim","low","brightness","sun"],category:"Symbols"},{emoji:"🔆",keywords:["bright","high","brightness","sun"],category:"Symbols"},{emoji:"📶",keywords:["signal","strength","antenna","bars"],category:"Symbols"},{emoji:"📳",keywords:["vibration","mode","phone","silent"],category:"Symbols"},{emoji:"📴",keywords:["off","phone","mobile","silent"],category:"Symbols"},{emoji:"♀️",keywords:["female","woman","venus","gender"],category:"Symbols"},{emoji:"♂️",keywords:["male","man","mars","gender"],category:"Symbols"},{emoji:"⚧️",keywords:["transgender","symbol","gender"],category:"Symbols"},{emoji:"♻️",keywords:["recycle","environment","green","eco"],category:"Symbols"},{emoji:"⚜️",keywords:["fleur","de","lis","scout","french"],category:"Symbols"},{emoji:"🔱",keywords:["trident","emblem","poseidon","anchor"],category:"Symbols"},{emoji:"📛",keywords:["name","badge","tag","id"],category:"Symbols"},{emoji:"🔰",keywords:["beginner","japanese","symbol","new"],category:"Symbols"},{emoji:"⭕",keywords:["circle","o","round","ring"],category:"Symbols"},{emoji:"✅",keywords:["check","mark","button","yes"],category:"Symbols"},{emoji:"☑️",keywords:["check","box","vote","ballot"],category:"Symbols"},{emoji:"✔️",keywords:["check","mark","heavy","done"],category:"Symbols"},{emoji:"©️",keywords:["copyright","c","ip","legal"],category:"Symbols"},{emoji:"®️",keywords:["registered","r","trademark","legal"],category:"Symbols"},{emoji:"™️",keywords:["trademark","tm","brand","legal"],category:"Symbols"},{emoji:"#️⃣",keywords:["hashtag","number","pound","key"],category:"Symbols"},{emoji:"*️⃣",keywords:["asterisk","star","key"],category:"Symbols"},{emoji:"0️⃣",keywords:["zero","number","0","keycap"],category:"Symbols"},{emoji:"1️⃣",keywords:["one","number","1","keycap"],category:"Symbols"},{emoji:"2️⃣",keywords:["two","number","2","keycap"],category:"Symbols"},{emoji:"3️⃣",keywords:["three","number","3","keycap"],category:"Symbols"},{emoji:"4️⃣",keywords:["four","number","4","keycap"],category:"Symbols"},{emoji:"5️⃣",keywords:["five","number","5","keycap"],category:"Symbols"},{emoji:"6️⃣",keywords:["six","number","6","keycap"],category:"Symbols"},{emoji:"7️⃣",keywords:["seven","number","7","keycap"],category:"Symbols"},{emoji:"8️⃣",keywords:["eight","number","8","keycap"],category:"Symbols"},{emoji:"9️⃣",keywords:["nine","number","9","keycap"],category:"Symbols"},{emoji:"🔟",keywords:["ten","number","10","keycap"],category:"Symbols"},{emoji:"🅰️",keywords:["a","letter","blood","type"],category:"Symbols"},{emoji:"🆎",keywords:["ab","blood","type","letter"],category:"Symbols"},{emoji:"🅱️",keywords:["b","letter","blood","type"],category:"Symbols"},{emoji:"🆑",keywords:["cl","clear","button"],category:"Symbols"},{emoji:"🆒",keywords:["cool","word","button"],category:"Symbols"},{emoji:"🆓",keywords:["free","word","button"],category:"Symbols"},{emoji:"ℹ️",keywords:["info","information","help"],category:"Symbols"},{emoji:"🆔",keywords:["id","identity","button"],category:"Symbols"},{emoji:"Ⓜ️",keywords:["m","circle","metro","letter"],category:"Symbols"},{emoji:"🆕",keywords:["new","word","button"],category:"Symbols"},{emoji:"🆖",keywords:["ng","no","good","button"],category:"Symbols"},{emoji:"🅾️",keywords:["o","letter","blood","type"],category:"Symbols"},{emoji:"🆗",keywords:["ok","word","button","yes"],category:"Symbols"},{emoji:"🅿️",keywords:["p","parking","letter","button"],category:"Symbols"},{emoji:"🆘",keywords:["sos","help","emergency","button"],category:"Symbols"},{emoji:"🆙",keywords:["up","word","button","exclamation"],category:"Symbols"},{emoji:"🆚",keywords:["vs","versus","against","button"],category:"Symbols"},{emoji:"🏁",keywords:["checkered","flag","race","finish"],category:"Flags"},{emoji:"🚩",keywords:["flag","triangular","red","post"],category:"Flags"},{emoji:"🎌",keywords:["flags","crossed","japanese","celebration"],category:"Flags"},{emoji:"🏴",keywords:["flag","black","waving"],category:"Flags"},{emoji:"🏳️",keywords:["flag","white","surrender","peace"],category:"Flags"},{emoji:"🏳️‍🌈",keywords:["rainbow","flag","pride","lgbtq","gay"],category:"Flags"},{emoji:"🏳️‍⚧️",keywords:["transgender","flag","pride","trans"],category:"Flags"},{emoji:"🏴‍☠️",keywords:["pirate","flag","jolly","roger","skull"],category:"Flags"},{emoji:"🇺🇸",keywords:["usa","america","flag","united","states"],category:"Flags"},{emoji:"🇬🇧",keywords:["uk","britain","england","flag","united","kingdom"],category:"Flags"},{emoji:"🇨🇦",keywords:["canada","flag","maple"],category:"Flags"},{emoji:"🇦🇺",keywords:["australia","flag","aussie"],category:"Flags"},{emoji:"🇯🇵",keywords:["japan","flag","japanese"],category:"Flags"},{emoji:"🇰🇷",keywords:["korea","south","flag","korean"],category:"Flags"},{emoji:"🇨🇳",keywords:["china","flag","chinese"],category:"Flags"},{emoji:"🇮🇳",keywords:["india","flag","indian"],category:"Flags"},{emoji:"🇩🇪",keywords:["germany","flag","german"],category:"Flags"},{emoji:"🇫🇷",keywords:["france","flag","french"],category:"Flags"},{emoji:"🇮🇹",keywords:["italy","flag","italian"],category:"Flags"},{emoji:"🇪🇸",keywords:["spain","flag","spanish"],category:"Flags"},{emoji:"🇧🇷",keywords:["brazil","flag","brazilian"],category:"Flags"},{emoji:"🇲🇽",keywords:["mexico","flag","mexican"],category:"Flags"},{emoji:"🇷🇺",keywords:["russia","flag","russian"],category:"Flags"},{emoji:"🇳🇱",keywords:["netherlands","flag","dutch","holland"],category:"Flags"},{emoji:"🇸🇪",keywords:["sweden","flag","swedish"],category:"Flags"},{emoji:"🇳🇴",keywords:["norway","flag","norwegian"],category:"Flags"},{emoji:"🇵🇱",keywords:["poland","flag","polish"],category:"Flags"},{emoji:"🇺🇦",keywords:["ukraine","flag","ukrainian"],category:"Flags"}],mo=Ie.reduce((l,d)=>(l[d.category]||(l[d.category]=[]),l[d.category].push(d),l),{}),go=["Smileys","People","Gestures","Hearts","Animals","Nature","Weather","Food","Tools","Tech","Transport","Objects","Symbols","Flags"];function po({value:l,onChange:d}){const[s,t]=i.useState(!1),[c,k]=i.useState(""),n=i.useRef(null);i.useEffect(()=>{function g(h){n.current&&!n.current.contains(h.target)&&t(!1)}return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[]);const y=i.useMemo(()=>{const g=c.trim().toLowerCase();if(!g)return go.map(p=>({category:p,emojis:mo[p]||[]})).filter(p=>p.emojis.length>0);const h=Ie.filter(p=>p.keywords.some(S=>S.includes(g))||p.emoji===g);return h.length?[{category:"Results",emojis:h}]:[]},[c]),b=g=>{d(g),t(!1),k("")};return e.jsxs("div",{ref:n,className:"emoji-picker-container",children:[e.jsxs("div",{className:"emoji-picker-input-wrapper",children:[e.jsx("input",{type:"text",className:"form-input emoji-picker-input",value:l,onChange:g=>d(g.target.value),placeholder:"🚀",onClick:()=>t(!0),style:{textAlign:"center",fontSize:"18px",paddingRight:"32px"}}),e.jsx("button",{type:"button",className:"emoji-picker-toggle",onClick:()=>t(!s),title:"Browse emojis",children:"▼"})]}),s&&e.jsxs("div",{className:"emoji-picker-dropdown",children:[e.jsx("div",{className:"emoji-picker-search",children:e.jsx("input",{type:"text",className:"form-input",placeholder:"Search emojis...",value:c,onChange:g=>k(g.target.value),autoFocus:!0})}),e.jsx("div",{className:"emoji-picker-grid-container",children:y.length===0?e.jsx("div",{className:"emoji-picker-empty",children:"No emojis found"}):y.map(({category:g,emojis:h})=>e.jsxs("div",{className:"emoji-picker-category",children:[e.jsx("div",{className:"emoji-picker-category-label",children:g}),e.jsx("div",{className:"emoji-picker-grid",children:h.map((p,S)=>e.jsx("button",{type:"button",className:`emoji-picker-item ${l===p.emoji?"selected":""}`,onClick:()=>b(p.emoji),title:p.keywords.slice(0,3).join(", "),children:p.emoji},`${p.emoji}-${S}`))})]},g))})]})]})}async function ko(l){return new Promise((d,s)=>{const t=new FileReader;t.onload=async c=>{var n;const k=(n=c.target)==null?void 0:n.result;if(!k){s(new Error("Failed to read file"));return}try{const y=await uo(k);d(y)}catch(y){s(y)}},t.onerror=()=>{s(new Error("Failed to read file"))},t.readAsArrayBuffer(l)})}async function uo(l){return new Promise((d,s)=>{const t=new DataView(l);if(String.fromCharCode(t.getUint8(0),t.getUint8(1),t.getUint8(2),t.getUint8(3))!=="glTF"){s(new Error("Invalid GLB file: missing glTF magic number"));return}const k=new eo,n=new oo;n.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/"),k.setDRACOLoader(n),k.setMeshoptDecoder(so);const y=new Blob([l],{type:"model/gltf-binary"}),b=URL.createObjectURL(y);k.load(b,g=>{URL.revokeObjectURL(b),n.dispose();const h=g.animations.map(p=>p.name);h.sort((p,S)=>p.localeCompare(S)),d(h)},void 0,g=>{URL.revokeObjectURL(b),n.dispose();const h=g instanceof Error?g.message:"Unknown error";s(new Error(`Failed to parse GLB: ${h}`))})})}async function wo(l){return new Promise(d=>{if(!l.name.toLowerCase().endsWith(".glb")){d(!1);return}const s=new FileReader;s.onload=t=>{var y;const c=(y=t.target)==null?void 0:y.result;if(!c||c.byteLength<4){d(!1);return}const k=new DataView(c),n=String.fromCharCode(k.getUint8(0),k.getUint8(1),k.getUint8(2),k.getUint8(3));d(n==="glTF")},s.onerror=()=>{d(!1)},s.readAsArrayBuffer(l.slice(0,4))})}function jo(l){return l<1024?`${l} B`:l<1024*1024?`${(l/1024).toFixed(1)} KB`:`${(l/(1024*1024)).toFixed(1)} MB`}async function ze(l,d){const s=Re(),t=await fetch(D(`/api/custom-class-icons/${l}`),{method:"POST",headers:{"Content-Type":d.type||"image/png","X-Filename":encodeURIComponent(d.name),...s?{"X-Auth-Token":s}:{}},body:d});if(!t.ok){const c=await t.json().catch(()=>({error:t.statusText}));throw new Error(c.error||`Upload failed: ${t.statusText}`)}return t.json()}async function ho(l){const d=Re(),s=await fetch(D(`/api/custom-class-icons/${l}`),{method:"DELETE",headers:{...d?{"X-Auth-Token":d}:{}}});if(!s.ok)throw new Error(`Failed to delete class icon: ${s.statusText}`)}function bo(l){return l.startsWith("/api/")?Ae(D(l)):Ae(D(`/api/custom-class-icons/${l}`))}function fo(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").substring(0,64)}function Fo({isOpen:l,onClose:d}){const{t:s}=Pe(["tools","common"]),t=ro(),c=to(),k=ao(),[n,y]=i.useState("skills"),[b,g]=i.useState(null),[h,p]=i.useState(!1),[S,A]=i.useState(!1),[w,q]=i.useState(null),[j,B]=i.useState(""),[N,Q]=i.useState(""),[T,M]=i.useState(""),[O,z]=i.useState(""),[H,W]=i.useState("#4a9eff"),[K,U]=i.useState(""),[L,$]=i.useState("character-male-a.glb"),[Z,ee]=i.useState([]),[oe,_]=i.useState(""),[le,Y]=i.useState(!1),[f,X]=i.useState(null),[C,a]=i.useState([]),[u,R]=i.useState({}),[I,ce]=i.useState(1),[se,de]=i.useState(0),[re,ye]=i.useState(0),[te,me]=i.useState(0),[ge,ue]=i.useState(!1),[we,E]=i.useState(null),pe=i.useRef(null),[ne,ae]=i.useState(null),[je,ie]=i.useState(null),he=i.useRef(null),Ee=i.useCallback(()=>A(!1),[]),{handleMouseDown:Be,handleClick:We}=Me(Ee),V=i.useMemo(()=>{const o=P.findIndex(r=>r.file===L);return o>=0?o:0},[L]),Le=i.useMemo(()=>P[V]||P[0],[V]),be=i.useCallback(o=>{const r=o==="prev"?(V-1+P.length)%P.length:(V+1)%P.length;$(P[r].file)},[V]),fe=[...t.filter(o=>{if(!j)return!0;const r=j.toLowerCase();return o.name.toLowerCase().includes(r)||o.description.toLowerCase().includes(r)||o.slug.toLowerCase().includes(r)})].sort((o,r)=>o.enabled!==r.enabled?o.enabled?-1:1:o.name.localeCompare(r.name)),xe=k.filter(o=>{if(!N)return!0;const r=N.toLowerCase();return o.name.toLowerCase().includes(r)||o.description.toLowerCase().includes(r)||o.id.toLowerCase().includes(r)}),Ge=()=>{g(null),p(!0)},De=o=>{g(o),p(!0)},qe=o=>{v.updateSkill(o.id,{enabled:!o.enabled})},He=o=>{const r=[];return o.assignedAgentClasses.length>0&&r.push(s("tools:skills.classCount",{count:o.assignedAgentClasses.length})),o.assignedAgentIds.length>0&&r.push(s("tools:skills.agentCount",{count:o.assignedAgentIds.length})),r.length===0?s("tools:skills.notAssigned"):r.join(", ")},ve=o=>{if(!o.enabled)return 0;const r=new Set;for(const m of c.values())o.assignedAgentClasses.includes(m.class)&&r.add(m.id);for(const m of o.assignedAgentIds)r.add(m);return r.size},Ke=()=>{const o=["#4a9eff","#50fa7b","#ff79c6","#bd93f9","#ffb86c","#8be9fd","#f1fa8c","#ff5555","#6272a4","#44475a","#00d4aa","#ff6b6b","#4ecdc4","#45b7d1","#96ceb4","#ffeaa7","#dfe6e9","#a29bfe","#fd79a8","#00b894"];return o[Math.floor(Math.random()*o.length)]},Ue=()=>{q(null),M(""),z(""),W(Ke()),U(""),$("character-male-a.glb"),ee([]),_(""),Y(!1),X(null),a([]),R({}),ce(1),de(0),ye(0),me(0),E(null),ae(null),ie(null),A(!0)},$e=o=>{var m,G,F;const r=k.find(J=>J.id===o);r&&(q(o),M(r.name),z(r.icon),W(r.color),U(r.description),$(r.model||"character-male-a.glb"),ee(r.defaultSkillIds||[]),_(r.instructions||""),Y(!!r.customModelPath),X(null),a(r.availableAnimations||[]),R(r.animationMapping||{}),ce(r.modelScale||1),de(((m=r.modelOffset)==null?void 0:m.x)||0),ye(((G=r.modelOffset)==null?void 0:G.y)||0),me(((F=r.modelOffset)==null?void 0:F.z)||0),E(null),ae(null),ie(r.iconPath?bo(r.iconPath):null),A(!0))},_e=async()=>{const o={name:T,icon:O||"🔷",color:H,description:K,defaultSkillIds:Z,instructions:oe||void 0,modelScale:I!==1?I:void 0,modelOffset:se!==0||re!==0||te!==0?{x:se,y:re,z:te}:void 0,animationMapping:Object.keys(u).length>0?u:void 0,availableAnimations:C.length>0?C:void 0};if(le||(o.model=L,o.customModelPath=void 0),w){if(v.updateCustomAgentClass(w,o),f&&await Se(w),ne)try{const r=await ze(w,ne);v.updateCustomAgentClass(w,{iconPath:r.iconPath})}catch(r){console.error("Failed to upload class icon:",r)}}else{v.createCustomAgentClass(o);const r=fo(T);if(f&&(await new Promise(m=>setTimeout(m,100)),await Se(r)),ne){await new Promise(m=>setTimeout(m,f?0:100));try{const m=await ze(r,ne);v.updateCustomAgentClass(r,{iconPath:m.iconPath})}catch(m){console.error("Failed to upload class icon:",m)}}}A(!1)},Se=async o=>{if(f){ue(!0),E(null);try{const r=await Oe(D(`/api/custom-models/upload/${o}`),{method:"POST",headers:{"Content-Type":"application/octet-stream","X-Filename":f.name},body:f});if(!r.ok){const m=await r.json();throw new Error(m.error||s("tools:skills.uploadFailed"))}v.updateCustomAgentClass(o,{availableAnimations:C,animationMapping:u,modelScale:I!==1?I:void 0})}catch(r){E(r.message||s("tools:skills.failedToUploadModel")),console.error("Model upload error:",r)}finally{ue(!1)}}},Ye=async o=>{var G;const r=(G=o.target.files)==null?void 0:G[0];if(!r)return;if(E(null),!await wo(r)){E(s("tools:skills.invalidGlbFile"));return}if(r.size>50*1024*1024){E(s("tools:skills.fileTooLarge"));return}try{const F=await ko(r);X(r),a(F),Y(!0);const J={},ke=F.map(x=>x.toLowerCase()),Te=ke.findIndex(x=>x.includes("idle")||x==="static");Te>=0&&(J.idle=F[Te]);const Ce=ke.findIndex(x=>x.includes("walk")||x.includes("run"));Ce>=0&&(J.walk=F[Ce]);const Fe=ke.findIndex(x=>x.includes("work")||x.includes("action")||x.includes("attack")||x.includes("jump"));Fe>=0&&(J.working=F[Fe]),R(J)}catch(F){E(F.message||s("tools:skills.failedToParseModel")),console.error("Model parse error:",F)}o.target.value=""},Xe=async()=>{if(w)try{await Oe(D(`/api/custom-models/${w}`),{method:"DELETE"})}catch(o){console.error("Failed to delete model:",o)}Y(!1),X(null),a([]),R({}),ce(1),$("character-male-a.glb")},Ve=o=>{window.confirm(s("tools:skills.deleteClassConfirm"))&&v.deleteCustomAgentClass(o)},Je=o=>{ee(r=>r.includes(o)?r.filter(m=>m!==o):[...r,o])};return l?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"panel-overlay",onClick:d}),e.jsxs("div",{className:"skills-panel side-panel",children:[e.jsxs("div",{className:"panel-header",children:[e.jsx("h3",{children:s(n==="skills"?"tools:skills.title":"tools:skills.agentClasses")}),n==="skills"?e.jsx("button",{className:"btn btn-sm btn-primary",onClick:Ge,children:s("tools:skills.newSkill")}):e.jsx("button",{className:"btn btn-sm btn-primary",onClick:Ue,children:s("tools:skills.newClass")}),e.jsx("button",{className:"panel-close",onClick:d,children:"×"})]}),e.jsxs("div",{className:"panel-tabs",style:{display:"flex",borderBottom:"1px solid var(--border-color)",padding:"0 16px"},children:[e.jsxs("button",{className:`panel-tab ${n==="skills"?"active":""}`,onClick:()=>y("skills"),style:{padding:"8px 16px",background:"transparent",border:"none",borderBottom:n==="skills"?"2px solid var(--accent-blue)":"2px solid transparent",color:n==="skills"?"var(--text-primary)":"var(--text-secondary)",cursor:"pointer",fontWeight:n==="skills"?600:400},children:[s("tools:skills.title")," (",t.length,")"]}),e.jsxs("button",{className:`panel-tab ${n==="classes"?"active":""}`,onClick:()=>y("classes"),style:{padding:"8px 16px",background:"transparent",border:"none",borderBottom:n==="classes"?"2px solid var(--accent-blue)":"2px solid transparent",color:n==="classes"?"var(--text-primary)":"var(--text-secondary)",cursor:"pointer",fontWeight:n==="classes"?600:400},children:[s("tools:skills.agentClasses")," (",k.length,")"]})]}),n==="skills"&&e.jsx("div",{className:"panel-search",style:{padding:"12px 16px 12px"},children:e.jsx("input",{type:"text",className:"form-input",placeholder:s("tools:skills.searchSkills"),value:j,onChange:o=>B(o.target.value),style:{width:"100%"}})}),n==="classes"&&e.jsx("div",{className:"panel-search",style:{padding:"12px 16px 12px"},children:e.jsx("input",{type:"text",className:"form-input",placeholder:s("tools:skills.searchClasses"),value:N,onChange:o=>Q(o.target.value),style:{width:"100%"}})}),e.jsx("div",{className:"panel-content",style:{flex:1,overflowY:"auto",padding:"0 16px"},children:n==="skills"?fe.length===0?e.jsx("div",{className:"empty-state",style:{textAlign:"center",padding:"40px 20px",opacity:.6},children:j?e.jsx("p",{children:s("tools:skills.noClassesMatch",{query:j})}):e.jsxs(e.Fragment,{children:[e.jsx("p",{children:s("tools:skills.noSkillsDefined")}),e.jsx("p",{style:{fontSize:"12px",marginTop:"8px"},children:s("tools:skills.createSkillsHint")})]})}):e.jsx("div",{className:"skills-list",style:{display:"flex",flexDirection:"column",gap:"8px"},children:fe.map(o=>e.jsxs("div",{className:`skill-card ${o.enabled?"":"disabled"}`,style:{background:"var(--bg-secondary)",borderRadius:"8px",padding:"12px",border:"1px solid var(--border-color)",opacity:o.enabled?1:.6,cursor:"pointer"},onClick:()=>De(o.id),children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsxs("div",{style:{flex:1},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx("span",{style:{fontWeight:600,fontSize:"14px"},children:o.name}),o.builtin&&e.jsx("span",{style:{fontSize:"10px",background:"linear-gradient(135deg, var(--accent-cyan), var(--accent-purple))",color:"#fff",padding:"3px 8px",borderRadius:"10px",fontWeight:700,textTransform:"uppercase",letterSpacing:"0.5px",boxShadow:"0 2px 4px rgba(139, 233, 253, 0.3)"},children:s("tools:skills.builtIn")}),!o.enabled&&e.jsx("span",{style:{fontSize:"10px",background:"var(--bg-tertiary)",padding:"2px 6px",borderRadius:"3px"},children:s("tools:skills.disabled")})]}),e.jsxs("div",{style:{fontSize:"11px",color:"var(--text-secondary)",fontFamily:"monospace"},children:["/",o.slug]})]}),e.jsx("button",{className:"btn btn-sm btn-secondary",onClick:r=>{r.stopPropagation(),qe(o)},style:{fontSize:"10px",padding:"4px 8px"},children:o.enabled?s("tools:skills.disable"):s("tools:skills.enable")})]}),e.jsx("p",{style:{fontSize:"12px",color:"var(--text-secondary)",margin:"8px 0",lineHeight:1.4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:o.description}),e.jsxs("div",{style:{display:"flex",gap:"12px",fontSize:"11px",color:"var(--text-secondary)"},children:[o.builtin&&e.jsx("span",{style:{color:"var(--accent-cyan)"},title:s("tools:skills.builtInTideCommander"),children:"Tide Commander"}),e.jsx("span",{title:s("tools:skills.assignedTo"),children:He(o)}),o.allowedTools.length>0&&e.jsx("span",{title:s("tools:skills.allowedToolsTitle"),children:s("tools:skills.toolCount",{count:o.allowedTools.length})}),o.enabled&&ve(o)>0&&e.jsx("span",{style:{color:"var(--accent-green)"},children:s("tools:skills.activeOnAgents",{count:ve(o)})})]})]},o.id))}):k.length===0?e.jsxs("div",{className:"empty-state",style:{textAlign:"center",padding:"40px 20px",opacity:.6},children:[e.jsx("p",{children:s("tools:skills.noCustomClasses")}),e.jsx("p",{style:{fontSize:"12px",marginTop:"8px"},children:s("tools:skills.createClassesHint")})]}):xe.length===0?e.jsx("div",{className:"empty-state",style:{textAlign:"center",padding:"40px 20px",opacity:.6},children:e.jsx("p",{children:s("tools:skills.noClassesMatch",{query:N})})}):e.jsx("div",{className:"classes-list",style:{display:"flex",flexDirection:"column",gap:"8px",paddingTop:"12px"},children:xe.map(o=>{var r;return e.jsxs("div",{className:"class-card",style:{background:"var(--bg-secondary)",borderRadius:"8px",padding:"12px",border:`1px solid ${o.color}40`,cursor:"pointer"},onClick:()=>$e(o.id),children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[e.jsx("div",{style:{width:"36px",height:"36px",borderRadius:"8px",background:`${o.color}20`,display:"flex",alignItems:"center",justifyContent:"center",fontSize:"18px"},children:e.jsx(io,{classId:o.id,size:18})}),e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:600,fontSize:"14px"},children:o.name}),e.jsxs("div",{style:{fontSize:"11px",color:"var(--text-secondary)"},children:[s("tools:skills.model"),": ",((r=P.find(m=>m.file===o.model))==null?void 0:r.name)||o.model||"Male A"]})]})]}),e.jsx("button",{className:"btn btn-sm btn-secondary",onClick:m=>{m.stopPropagation(),Ve(o.id)},style:{fontSize:"10px",padding:"4px 8px",color:"var(--accent-red)"},children:s("common:buttons.delete")})]}),e.jsx("p",{style:{fontSize:"12px",color:"var(--text-secondary)",margin:"8px 0 0",lineHeight:1.4},children:o.description||s("tools:skills.noDescription")}),e.jsxs("div",{style:{marginTop:"8px",fontSize:"11px",color:"var(--text-secondary)",display:"flex",gap:"12px"},children:[o.defaultSkillIds.length>0&&e.jsx("span",{children:s("tools:skills.defaultSkillCount",{count:o.defaultSkillIds.length})}),o.instructions&&e.jsx("span",{style:{color:"var(--accent-cyan)"},children:s("tools:skills.hasInstructions")})]})]},o.id)})})}),e.jsx("div",{className:"panel-footer",style:{padding:"12px 16px",borderTop:"1px solid var(--border-color)"},children:e.jsx("div",{style:{fontSize:"11px",color:"var(--text-secondary)"},children:n==="skills"?e.jsxs(e.Fragment,{children:[s("tools:skills.total",{count:t.length}),t.filter(o=>o.enabled).length!==t.length&&e.jsxs("span",{children:[" (",s("tools:skills.enabled",{enabledCount:t.filter(o=>o.enabled).length}),")"]})]}):e.jsx(e.Fragment,{children:s("tools:skills.customClassesCount",{count:k.length})})})})]}),e.jsx(yo,{isOpen:h,onClose:()=>p(!1),skillId:b}),S&&e.jsx("div",{className:"modal-overlay visible",onMouseDown:Be,onClick:We,children:e.jsxs("div",{className:"modal skill-editor-modal",children:[e.jsx("div",{className:"modal-header",children:s(w?"tools:skills.editAgentClass":"tools:skills.createAgentClass")}),e.jsxs("div",{className:"modal-body",style:{padding:"16px"},children:[e.jsxs("div",{className:"form-section",style:{marginBottom:"12px"},children:[e.jsx("label",{className:"form-label",children:s("common:labels.name")}),e.jsx("input",{type:"text",className:"form-input",value:T,onChange:o=>M(o.target.value),placeholder:s("tools:skills.classNamePlaceholder")})]}),e.jsxs("div",{className:"form-section",style:{marginBottom:"16px"},children:[e.jsx("label",{className:"form-label",children:s("tools:skills.characterModel")}),e.jsx("input",{ref:pe,type:"file",accept:".glb",onChange:Ye,style:{display:"none"}}),le?e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{padding:"12px",background:"var(--bg-tertiary)",borderRadius:"8px",border:"1px solid var(--accent-cyan)"},children:[e.jsx("div",{style:{display:"flex",justifyContent:"center",marginBottom:"12px"},children:e.jsx(Ne,{customModelFile:f||void 0,customModelUrl:!f&&w?D(`/api/custom-models/${w}`):void 0,modelScale:I,modelOffset:{x:se,y:re,z:te},idleAnimation:u.idle!==void 0?u.idle:"",width:120,height:150})}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"12px"},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:"12px",fontWeight:500,color:"var(--accent-cyan)"},children:s("tools:skills.customModel")}),e.jsx("div",{style:{fontSize:"11px",color:"var(--text-secondary)",marginTop:"2px"},children:f?`${f.name} (${jo(f.size)})`:s("tools:skills.uploaded")})]}),e.jsx("button",{type:"button",onClick:Xe,style:{padding:"4px 8px",background:"transparent",border:"1px solid var(--accent-red)",borderRadius:"4px",color:"var(--accent-red)",cursor:"pointer",fontSize:"10px"},children:s("tools:skills.removeModel")})]}),e.jsxs("div",{style:{marginBottom:"12px"},children:[e.jsxs("label",{style:{fontSize:"11px",color:"var(--text-secondary)",display:"block",marginBottom:"4px"},children:[s("tools:skills.modelScale"),": ",I.toFixed(3),"x"]}),e.jsx("input",{type:"range",min:"0",max:"100",step:"1",value:Math.log(I/.01)/Math.log(1e4)*100,onChange:o=>{const r=parseFloat(o.target.value),m=.01*Math.pow(1e4,r/100);ce(Math.round(m*1e3)/1e3)},style:{width:"100%"}}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",fontSize:"9px",color:"var(--text-muted)",marginTop:"2px"},children:[e.jsx("span",{children:"0.01x"}),e.jsx("span",{children:"1x"}),e.jsx("span",{children:"100x"})]})]}),e.jsxs("div",{style:{marginBottom:"12px"},children:[e.jsxs("label",{style:{fontSize:"11px",color:"var(--text-secondary)",display:"block",marginBottom:"4px"},children:[s("tools:skills.positionOffsetX"),": ",se.toFixed(2)]}),e.jsx("input",{type:"range",min:"-1",max:"1",step:"0.01",value:se,onChange:o=>de(parseFloat(o.target.value)),style:{width:"100%"}})]}),e.jsxs("div",{style:{marginBottom:"12px"},children:[e.jsxs("label",{style:{fontSize:"11px",color:"var(--text-secondary)",display:"block",marginBottom:"4px"},children:[s("tools:skills.positionOffsetY"),": ",re.toFixed(2)]}),e.jsx("input",{type:"range",min:"-1",max:"1",step:"0.01",value:re,onChange:o=>ye(parseFloat(o.target.value)),style:{width:"100%"}})]}),e.jsxs("div",{style:{marginBottom:"12px"},children:[e.jsxs("label",{style:{fontSize:"11px",color:"var(--text-secondary)",display:"block",marginBottom:"4px"},children:[s("tools:skills.positionOffsetZ"),": ",te.toFixed(2)]}),e.jsx("input",{type:"range",min:"-3",max:"3",step:"0.01",value:te,onChange:o=>me(parseFloat(o.target.value)),style:{width:"100%"}})]}),C.length>0&&e.jsxs("div",{children:[e.jsxs("div",{style:{fontSize:"11px",color:"var(--text-secondary)",marginBottom:"8px"},children:[s("tools:skills.animationMapping")," (",s("tools:skills.detected",{count:C.length}),")"]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"6px"},children:[e.jsxs("span",{style:{fontSize:"11px",color:"var(--text-primary)",width:"60px"},children:[s("tools:skills.idle"),":"]}),e.jsxs("select",{value:u.idle||"",onChange:o=>R(r=>({...r,idle:o.target.value||void 0})),style:{flex:1,padding:"4px 8px",background:"var(--bg-secondary)",border:"1px solid var(--border-color)",borderRadius:"4px",color:"var(--text-primary)",fontSize:"11px"},children:[e.jsx("option",{value:"",children:s("tools:skills.none")}),C.map(o=>e.jsx("option",{value:o,children:o},o))]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"6px"},children:[e.jsxs("span",{style:{fontSize:"11px",color:"var(--text-primary)",width:"60px"},children:[s("tools:skills.walk"),":"]}),e.jsxs("select",{value:u.walk||"",onChange:o=>R(r=>({...r,walk:o.target.value||void 0})),style:{flex:1,padding:"4px 8px",background:"var(--bg-secondary)",border:"1px solid var(--border-color)",borderRadius:"4px",color:"var(--text-primary)",fontSize:"11px"},children:[e.jsx("option",{value:"",children:s("tools:skills.none")}),C.map(o=>e.jsx("option",{value:o,children:o},o))]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsxs("span",{style:{fontSize:"11px",color:"var(--text-primary)",width:"60px"},children:[s("tools:skills.working"),":"]}),e.jsxs("select",{value:u.working||"",onChange:o=>R(r=>({...r,working:o.target.value||void 0})),style:{flex:1,padding:"4px 8px",background:"var(--bg-secondary)",border:"1px solid var(--border-color)",borderRadius:"4px",color:"var(--text-primary)",fontSize:"11px"},children:[e.jsx("option",{value:"",children:s("tools:skills.noneBounce")}),C.map(o=>e.jsx("option",{value:o,children:o},o))]})]})]}),C.length===0&&e.jsx("div",{style:{fontSize:"11px",color:"var(--text-muted)",fontStyle:"italic"},children:s("tools:skills.noAnimations")})]}),e.jsx("button",{type:"button",onClick:()=>{var o;return(o=pe.current)==null?void 0:o.click()},style:{width:"100%",marginTop:"8px",padding:"6px 12px",background:"var(--bg-secondary)",border:"1px solid var(--border-color)",borderRadius:"6px",color:"var(--text-secondary)",cursor:"pointer",fontSize:"11px"},children:s("tools:skills.replaceModel")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:"12px",padding:"12px",background:"var(--bg-tertiary)",borderRadius:"8px",border:"1px solid var(--border-color)"},children:[e.jsx("button",{type:"button",onClick:()=>be("prev"),style:{width:"36px",height:"36px",borderRadius:"50%",border:"1px solid var(--border-color)",background:"var(--bg-secondary)",color:"var(--text-primary)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"18px"},children:"‹"}),e.jsxs("div",{style:{textAlign:"center"},children:[e.jsx(Ne,{modelFile:L,width:120,height:150}),e.jsx("div",{style:{marginTop:"8px",fontSize:"12px",fontWeight:500,color:"var(--text-primary)"},children:Le.name}),e.jsxs("div",{style:{fontSize:"10px",color:"var(--text-secondary)",marginTop:"2px"},children:[V+1," / ",P.length]})]}),e.jsx("button",{type:"button",onClick:()=>be("next"),style:{width:"36px",height:"36px",borderRadius:"50%",border:"1px solid var(--border-color)",background:"var(--bg-secondary)",color:"var(--text-primary)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"18px"},children:"›"})]}),e.jsx("button",{type:"button",onClick:()=>{var o;return(o=pe.current)==null?void 0:o.click()},style:{width:"100%",marginTop:"8px",padding:"8px 12px",background:"var(--bg-secondary)",border:"1px dashed var(--border-color)",borderRadius:"6px",color:"var(--text-secondary)",cursor:"pointer",fontSize:"12px"},children:s("tools:skills.uploadCustomModel")})]}),we&&e.jsx("div",{style:{marginTop:"8px",padding:"8px",background:"rgba(255, 85, 85, 0.1)",border:"1px solid var(--accent-red)",borderRadius:"4px",fontSize:"11px",color:"var(--accent-red)"},children:we})]}),e.jsxs("div",{style:{display:"flex",gap:"12px",marginBottom:"12px"},children:[e.jsxs("div",{className:"form-section",style:{flex:"0 0 80px"},children:[e.jsx("label",{className:"form-label",children:s("tools:skills.icon")}),je?e.jsxs("div",{className:"class-icon-preview-container",children:[e.jsx("img",{src:je,alt:"Class icon",className:"class-icon-preview-img"}),e.jsx("button",{className:"class-icon-preview-remove",onClick:()=>{if(ae(null),ie(null),w){const o=k.find(r=>r.id===w);o!=null&&o.iconPath&&ho(w).then(()=>{v.updateCustomAgentClass(w,{iconPath:void 0})}).catch(r=>console.error("Failed to delete class icon:",r))}},title:"Remove icon",children:"×"})]}):e.jsx(po,{value:O,onChange:o=>{z(o),ae(null),ie(null)}})]}),e.jsxs("div",{className:"form-section",style:{flex:"0 0 auto",display:"flex",flexDirection:"column",justifyContent:"flex-end"},children:[e.jsx("input",{ref:he,type:"file",accept:"image/png,image/jpeg,image/gif,image/webp,image/svg+xml",style:{display:"none"},onChange:o=>{var m;const r=(m=o.target.files)==null?void 0:m[0];if(r){ae(r),z("");const G=URL.createObjectURL(r);ie(G)}o.target.value=""}}),e.jsxs("button",{className:"class-icon-upload-btn",onClick:()=>{var o;return(o=he.current)==null?void 0:o.click()},title:"Upload custom icon",children:[e.jsx("span",{className:"class-icon-upload-icon",children:"+"}),e.jsx("span",{className:"class-icon-upload-label",children:"IMG"})]})]}),e.jsxs("div",{className:"form-section",style:{flex:1},children:[e.jsx("label",{className:"form-label",children:s("tools:skills.color")}),e.jsx("input",{type:"color",value:H,onChange:o=>W(o.target.value),style:{width:"100%",height:"36px",padding:"2px",cursor:"pointer"}})]})]}),e.jsxs("div",{className:"form-section",style:{marginBottom:"12px"},children:[e.jsx("label",{className:"form-label",children:s("common:labels.description")}),e.jsx("input",{type:"text",className:"form-input",value:K,onChange:o=>U(o.target.value),placeholder:s("tools:skills.classDescriptionPlaceholder")})]}),e.jsxs("div",{className:"form-section",style:{marginBottom:"12px"},children:[e.jsx("label",{className:"form-label",children:s("tools:skills.defaultSkillsLabel")}),e.jsx("p",{className:"form-hint",style:{fontSize:"11px",color:"var(--text-secondary)",marginBottom:"8px"},children:s("tools:skills.defaultSkillsHint")}),e.jsx("div",{style:{maxHeight:"120px",overflowY:"auto",border:"1px solid var(--border-color)",borderRadius:"6px",padding:"8px"},children:t.filter(o=>o.enabled).length===0?e.jsx("div",{style:{color:"var(--text-muted)",fontSize:"12px",textAlign:"center",padding:"12px"},children:s("tools:skills.noEnabledSkills")}):t.filter(o=>o.enabled).map(o=>e.jsxs("div",{onClick:()=>Je(o.id),style:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 8px",borderRadius:"4px",cursor:"pointer",background:Z.includes(o.id)?"rgba(80, 250, 123, 0.15)":"transparent"},children:[e.jsx("span",{style:{width:"16px",color:"var(--dracula-green)"},children:Z.includes(o.id)?"✓":""}),e.jsx("span",{style:{fontSize:"13px"},children:o.name})]},o.id))})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:s("tools:skills.instructionsLabel")}),e.jsx("p",{className:"form-hint",style:{fontSize:"11px",color:"var(--text-secondary)",marginBottom:"8px"},children:s("tools:skills.instructionsHint")}),e.jsx("textarea",{className:"form-input",value:oe,onChange:o=>_(o.target.value),placeholder:`# Agent Instructions
23
+
24
+ You are a specialized agent...
25
+
26
+ ## Guidelines
27
+ - Follow these rules...
28
+ - Use best practices...`,style:{minHeight:"150px",resize:"vertical",fontFamily:"monospace",fontSize:"12px",lineHeight:"1.5"}})]})]}),e.jsxs("div",{className:"modal-footer",style:{display:"flex",gap:"8px",justifyContent:"flex-end",padding:"12px 16px",borderTop:"1px solid var(--border-color)"},children:[e.jsx("button",{className:"btn btn-secondary",onClick:()=>A(!1),disabled:ge,children:s("common:buttons.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:_e,disabled:!T.trim()||ge,children:s(ge?"tools:skills.uploading":w?"common:buttons2.saveChanges":"tools:skills.createClass")})]})]})})]}):null}export{Fo as SkillsPanel};
@@ -0,0 +1 @@
1
+ import{u as P,r as d,j as e,C as $,bn as b}from"./main-D3GShQ8B.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function q({snapshots:h,isLoading:p=!1,onViewSnapshot:C,onDeleteSnapshot:v,onRestoreSnapshot:y,onExportSnapshot:f,selectedSnapshotId:S,onClose:A}){const{t}=P(["terminal","common"]),[o,N]=d.useState(""),[l,k]=d.useState("createdAt"),[m,j]=d.useState("desc"),[w,u]=d.useState(null),[D,r]=d.useState(null),x=d.useMemo(()=>{let s=[...h];if(o.trim()){const a=o.toLowerCase();s=s.filter(n=>{var c;return n.title.toLowerCase().includes(a)||n.agentName.toLowerCase().includes(a)||((c=n.descriptionPreview)==null?void 0:c.toLowerCase().includes(a))})}return s.sort((a,n)=>{let c=0;switch(l){case"createdAt":c=a.createdAt-n.createdAt;break;case"title":c=a.title.localeCompare(n.title);break;case"agentName":c=a.agentName.localeCompare(n.agentName);break}return m==="asc"?c:-c}),s},[h,o,l,m]),g=s=>{l===s?j(a=>a==="asc"?"desc":"asc"):(k(s),j("desc"))},L=async s=>{r(s);try{await v(s),u(null)}finally{r(null)}},F=async s=>{r(s);try{await y(s)}finally{r(null)}},T=async s=>{r(s);try{await f(s)}finally{r(null)}},E=s=>s in b?b[s]:{icon:"🤖",color:"#888888",description:"Custom agent"},I=s=>{const a=new Date(s),n=new Date,c=n.getTime()-a.getTime(),i=Math.floor(c/(1e3*60*60*24));return i===0?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):i===1?t("common:time.daysAgo",{count:1}):i<7?t("common:time.daysAgo",{count:i}):a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:a.getFullYear()!==n.getFullYear()?"numeric":void 0})};return e.jsxs("div",{className:"snapshot-manager",children:[e.jsxs("div",{className:"snapshot-manager-header",children:[e.jsxs("div",{className:"snapshot-manager-title",children:[e.jsx("span",{className:"snapshot-manager-icon",children:"📸"}),t("terminal:snapshot.title"),e.jsx("span",{className:"snapshot-manager-count",children:h.length})]}),e.jsx("button",{className:"snapshot-manager-close",onClick:A,title:"Close",children:"✕"})]}),e.jsxs("div",{className:"snapshot-manager-toolbar",children:[e.jsxs("div",{className:"snapshot-search",children:[e.jsx("span",{className:"snapshot-search-icon",children:"🔍"}),e.jsx("input",{type:"text",className:"snapshot-search-input",placeholder:t("terminal:snapshot.searchPlaceholder"),value:o,onChange:s=>N(s.target.value)}),o&&e.jsx("button",{className:"snapshot-search-clear",onClick:()=>N(""),title:"Clear search",children:"✕"})]}),e.jsxs("div",{className:"snapshot-sort",children:[e.jsxs("button",{className:`snapshot-sort-btn ${l==="createdAt"?"active":""}`,onClick:()=>g("createdAt"),children:[t("terminal:snapshot.sortDate")," ",l==="createdAt"&&(m==="desc"?"↓":"↑")]}),e.jsxs("button",{className:`snapshot-sort-btn ${l==="title"?"active":""}`,onClick:()=>g("title"),children:[t("terminal:snapshot.sortTitle")," ",l==="title"&&(m==="desc"?"↓":"↑")]}),e.jsxs("button",{className:`snapshot-sort-btn ${l==="agentName"?"active":""}`,onClick:()=>g("agentName"),children:[t("terminal:snapshot.sortAgent")," ",l==="agentName"&&(m==="desc"?"↓":"↑")]})]})]}),e.jsxs("div",{className:"snapshot-manager-content",children:[p&&e.jsxs("div",{className:"snapshot-loading",children:[e.jsx("div",{className:"snapshot-loading-spinner"}),t("terminal:snapshot.loadingSnapshots")]}),!p&&x.length===0&&e.jsx("div",{className:"snapshot-empty",children:o?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"snapshot-empty-icon",children:"🔍"}),e.jsx("span",{className:"snapshot-empty-text",children:t("terminal:snapshot.noSnapshotsMatch")})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"snapshot-empty-icon",children:"📸"}),e.jsx("span",{className:"snapshot-empty-text",children:t("terminal:snapshot.noSnapshotsYet")}),e.jsx("span",{className:"snapshot-empty-hint",children:t("terminal:snapshot.snapshotHint")})]})}),!p&&x.length>0&&e.jsx("div",{className:"snapshot-grid",children:x.map(s=>{const a=E(s.agentClass),n=s.id===S,c=w===s.id,i=D===s.id;return e.jsxs("div",{className:`snapshot-card ${n?"selected":""}`,onClick:()=>C(s.id),children:[e.jsxs("div",{className:"snapshot-card-header",children:[e.jsx("span",{className:"snapshot-card-agent-icon",style:{color:a.color},title:s.agentName,children:e.jsx($,{classId:s.agentClass,size:16})}),e.jsx("span",{className:"snapshot-card-agent-name",children:s.agentName}),e.jsx("span",{className:"snapshot-card-date",children:I(s.createdAt)})]}),e.jsx("div",{className:"snapshot-card-title",children:s.title}),s.descriptionPreview&&e.jsx("div",{className:"snapshot-card-description",children:s.descriptionPreview}),e.jsxs("div",{className:"snapshot-card-stats",children:[e.jsxs("span",{className:"snapshot-card-stat",children:["💬 ",s.outputCount]}),e.jsxs("span",{className:"snapshot-card-stat",children:["📄 ",s.fileCount]})]}),e.jsx("div",{className:"snapshot-card-actions",onClick:M=>M.stopPropagation(),children:c?e.jsxs("div",{className:"snapshot-delete-confirm",children:[e.jsx("span",{children:t("terminal:snapshot.deleteConfirm")}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>L(s.id),disabled:i,children:i?"...":t("common:buttons.yes")}),e.jsx("button",{className:"btn btn-sm btn-secondary",onClick:()=>u(null),disabled:i,children:t("common:buttons.no")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"snapshot-action-btn",onClick:()=>F(s.id),title:t("terminal:snapshot.restoreFiles"),disabled:i,children:"🔄"}),e.jsx("button",{className:"snapshot-action-btn",onClick:()=>T(s.id),title:t("terminal:snapshot.exportSnapshot"),disabled:i,children:"📤"}),e.jsx("button",{className:"snapshot-action-btn danger",onClick:()=>u(s.id),title:t("terminal:snapshot.deleteSnapshot"),disabled:i,children:"🗑️"})]})})]},s.id)})})]})]})}export{q as SnapshotManager};
@@ -0,0 +1 @@
1
+ import{u as Ve,I as Ze,M as Qe,N as es,O as ss,P as ns,r as t,U as as,S as ke,V as te,A as ye,l as le,W as ts,s as B,h as ls,j as s,X as os,C as Ae,Y as x,Z as is,_ as oe,$ as G,a0 as K,a1 as ie,a2 as cs}from"./main-D3GShQ8B.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function De(c,j){const S=j.filter(b=>!c.has(b));return S.length===0?`${j[Math.floor(Math.random()*j.length)]}-${Date.now()%1e3}`:S[Math.floor(Math.random()*S.length)]}function us({isOpen:c,onClose:j,onSpawnStart:S,onSpawnEnd:b,spawnPosition:Ee,spawnAreaId:v}){const{t:n}=Ve(["terminal","common"]),C=Ze(),$=Qe(),p=es(),ce=ss(),H=ce.length>0?ce:ns,[m,N]=t.useState(""),[M,P]=t.useState(()=>as(ke.LAST_CWD)),[i,Y]=t.useState("scout"),[re,D]=t.useState(!1),[Ie,T]=t.useState(!1),[de,J]=t.useState(!1),[pe,me]=t.useState(""),[k,X]=t.useState([]),[y,F]=t.useState(null),[Le,ue]=t.useState(!1),[E,he]=t.useState(""),[u,_e]=t.useState(""),[R,$e]=t.useState(!0),[U,Pe]=t.useState("bypass"),[o,V]=t.useState("claude"),[g,I]=t.useState({fullAuto:!0,sandbox:"workspace-write",approvalMode:"on-request",search:!1}),[we,Z]=t.useState(new Set),[Q,xe]=t.useState("opus"),[ee,fe]=t.useState("high"),[se,Te]=t.useState("gpt-5.3-codex"),[ne,Fe]=t.useState("minimax/MiniMax-M1-80k"),[je,Re]=t.useState(""),[A,Ue]=t.useState(""),z=t.useRef(null),ge=t.useRef(!1),L=t.useCallback(()=>{window.__spawnModalAreaContext=null},[]),h=t.useMemo(()=>$.filter(e=>e.enabled),[$]),ze=["full-notifications","streaming-exec","task-label","report-task-to-boss","agent-tracking"];t.useEffect(()=>{if(c&&!ge.current&&h.length>0){const a=h.filter(l=>ze.includes(l.slug)).map(l=>l.id);a.length>0&&Z(new Set(a))}ge.current=c},[c,h]);const ve=t.useMemo(()=>{if(!A.trim())return h;const e=A.toLowerCase();return h.filter(a=>a.name.toLowerCase().includes(e)||a.description.toLowerCase().includes(e)||a.slug.toLowerCase().includes(e))},[h,A]),qe=t.useCallback(e=>{Z(a=>{const l=new Set(a);return l.has(e)?l.delete(e):l.add(e),l})},[]);t.useMemo(()=>h.filter(e=>e.assignedAgentClasses.includes(i)),[h,i]);const We=t.useMemo(()=>{var a;const e=p.find(l=>l.id===i);return(a=e==null?void 0:e.defaultSkillIds)!=null&&a.length?$.filter(l=>e.defaultSkillIds.includes(l.id)):[]},[p,i,$]),Ne=t.useMemo(()=>{if(!E.trim())return k;const e=E.toLowerCase();return k.filter(a=>a.sessionId.toLowerCase().includes(e)||a.projectPath.toLowerCase().includes(e)||a.firstMessage&&a.firstMessage.toLowerCase().includes(e))},[k,E]),q=t.useMemo(()=>{if(!u.trim())return p;const e=u.toLowerCase();return p.filter(a=>a.name.toLowerCase().includes(e)||a.description.toLowerCase().includes(e)||a.id.toLowerCase().includes(e))},[p,u]),W=t.useMemo(()=>{if(!u.trim())return te;const e=u.toLowerCase();return te.filter(a=>{const l=ye[a.id];return a.name.toLowerCase().includes(e)||a.id.toLowerCase().includes(e)||l.description.toLowerCase().includes(e)})},[u]);t.useEffect(()=>{if(!c||!u.trim())return;const e=[...q.map(a=>a.id),...W.map(a=>a.id)];e.length===1&&e[0]!==i&&Y(e[0])},[c,u,q,W,i]);const r=t.useMemo(()=>p.find(e=>e.id===i),[p,i]),Oe=t.useMemo(()=>{if(r!=null&&r.model)return r.model},[r]),Be=t.useMemo(()=>{if(r!=null&&r.customModelPath)return le(`/api/custom-models/${r.id}`)},[r]),Ge=r==null?void 0:r.modelScale,Ke=t.useMemo(()=>r?"scout":i,[i,r]),O=t.useCallback(async e=>{ue(!0);try{const a=e?le(`/api/agents/claude-sessions?cwd=${encodeURIComponent(e)}`):le("/api/agents/claude-sessions"),d=await(await ts(a)).json();X(d.sessions||[])}catch(a){console.error("Failed to fetch sessions:",a),X([])}finally{ue(!1)}},[]);t.useEffect(()=>{c?O(M||void 0):(X([]),F(null),he(""))},[c,O]),t.useEffect(()=>{if(!c)return;const e=setTimeout(()=>{O(M||void 0),F(null)},300);return()=>clearTimeout(e)},[M,c,O]),t.useEffect(()=>{if(!c||!v)return;const e=B.getState().areas.get(v);if(e!=null&&e.directories&&e.directories.length>0){P(e.directories[0]);return}const a=Array.from(C.values()).filter(f=>{var _;return((_=B.getAreaForAgent(f.id))==null?void 0:_.id)===v&&f.cwd});if(a.length===0)return;const l=new Map;for(const f of a)l.set(f.cwd,(l.get(f.cwd)||0)+1);let d="",w=0;for(const[f,_]of l)_>w&&(d=f,w=_);d&&P(d)},[c,v,C]),t.useEffect(()=>{if(c){const e=new Set(Array.from(C.values()).map(w=>w.name)),a=De(e,H),l=p.find(w=>w.id===i),d=l?`${l.name} ${a}`:a;N(d),z.current&&(z.current.focus(),z.current.select())}},[c,C,H]),t.useEffect(()=>{if(!c)return;new Set(Array.from(C.values()).map(a=>a.name));const e=p.find(a=>a.id===i);if(e){const a=p.find(l=>m.startsWith(l.name+" "));if(a){const l=m.substring(a.name.length+1);N(`${e.name} ${l}`)}else N(`${e.name} ${m}`)}else{const a=p.find(l=>m.startsWith(l.name+" "));if(a){const l=m.substring(a.name.length+1);N(l)}}},[i]),t.useEffect(()=>{i==="boss"&&xe("opus")},[i]);const He=()=>{var d;console.log("[SpawnModal] handleSpawn called"),T(!1);const e=y&&((d=k.find(w=>w.sessionId===y))==null?void 0:d.projectPath)||M;if(console.log("[SpawnModal] Effective CWD:",e),console.log("[SpawnModal] Agent name:",m),console.log("[SpawnModal] Agent class:",i),console.log("[SpawnModal] Permission mode:",U),console.log("[SpawnModal] Provider:",o),console.log("[SpawnModal] Use Chrome:",R),console.log("[SpawnModal] Session ID:",y||"none"),!e.trim()){console.error("[SpawnModal] Empty CWD, showing error"),T(!0);return}if(!m.trim()){console.log("[SpawnModal] Empty name, regenerating");const w=new Set(Array.from(C.values()).map(f=>f.name));N(De(w,H));return}cs(ke.LAST_CWD,e),D(!0),S();const a=Array.from(we),l=je.trim()||void 0;console.log("[SpawnModal] Calling store.spawnAgent with:",{name:m.trim(),class:i,cwd:e.trim(),sessionId:y||void 0,useChrome:o==="claude"?R:!1,permissionMode:U,provider:o,codexConfig:o==="codex"?g:void 0,codexModel:o==="codex"?se:void 0,opencodeModel:o==="opencode"?ne:void 0,initialSkillIds:a,model:o==="claude"?Q:void 0,customInstructions:l?`${l.length} chars`:void 0,spawnAreaId:v||void 0}),window.__spawnModalAreaContext=v?{areaId:v}:null,B.spawnAgent(m.trim(),i,e.trim(),Ee||void 0,y||void 0,o==="claude"?R:!1,U,a,o,o==="codex"?g:void 0,o==="codex"?se:void 0,o==="claude"?Q:void 0,l,o==="claude"?ee:void 0,o==="opencode"?ne:void 0)},Se=()=>{console.log("[SpawnModal] Agent creation successful"),D(!1),N(""),Z(new Set),L(),b(),j()},be=()=>{console.error("[SpawnModal] Agent creation failed"),D(!1),T(!0),L(),b()},Ce=e=>{console.log("[SpawnModal] Directory not found:",e),D(!1),me(e),J(!0),b()},Me=()=>{J(!1),D(!0),S(),B.createDirectoryAndSpawn(pe,m.trim(),i)},ae=()=>{J(!1),me(""),L()};t.useEffect(()=>(window.__spawnModalSuccess=Se,window.__spawnModalError=be,window.__spawnModalDirNotFound=Ce,()=>{L(),delete window.__spawnModalSuccess,delete window.__spawnModalError,delete window.__spawnModalDirNotFound}),[m,i,Se,be,Ce,L]);const{handleMouseDown:Ye,handleClick:Je}=ls(j),Xe=e=>{e.key==="Escape"&&j()};return!c&&!de?null:de?s.jsx("div",{className:"modal-overlay visible",onClick:ae,onKeyDown:e=>{e.key==="Escape"&&ae(),e.key==="Enter"&&Me()},children:s.jsxs("div",{className:"modal confirm-modal",onClick:e=>e.stopPropagation(),children:[s.jsx("div",{className:"modal-header",children:n("terminal:spawn.directoryNotFound")}),s.jsxs("div",{className:"modal-body confirm-modal-body",children:[s.jsx("p",{children:n("terminal:spawn.directoryNotExist")}),s.jsx("code",{className:"confirm-modal-path",children:pe}),s.jsx("p",{children:n("terminal:spawn.wouldYouCreate")})]}),s.jsxs("div",{className:"modal-footer",children:[s.jsx("button",{className:"btn btn-secondary",onClick:ae,children:n("common:buttons.cancel")}),s.jsx("button",{className:"btn btn-primary",onClick:Me,autoFocus:!0,children:n("terminal:spawn.createDirectory")})]})]})}):s.jsx("div",{className:`modal-overlay ${c?"visible":""}`,onMouseDown:Ye,onClick:Je,onKeyDown:Xe,children:s.jsxs("div",{className:"modal spawn-modal",children:[s.jsx("div",{className:"modal-header",children:n("terminal:spawn.deployTitle")}),s.jsxs("div",{className:"modal-body spawn-modal-body",children:[s.jsxs("div",{className:"spawn-top-section",children:[s.jsx("div",{className:"spawn-preview-compact",children:s.jsx(os,{agentClass:Ke,modelFile:Oe,customModelUrl:Be,modelScale:Ge,width:100,height:120})}),s.jsxs("div",{className:"spawn-class-section",children:[s.jsx("div",{className:"spawn-class-label",children:n("terminal:spawn.agentClass")}),p.length+te.length>6&&s.jsx("input",{type:"text",className:"spawn-input class-search-input",placeholder:n("terminal:spawn.filterClasses"),value:u,onChange:e=>_e(e.target.value)}),s.jsxs("div",{className:"class-selector-inline",children:[q.map(e=>s.jsxs("button",{className:`class-chip ${i===e.id?"selected":""}`,onClick:()=>Y(e.id),title:e.description,children:[s.jsx(Ae,{classId:e.id,size:18,className:"class-chip-icon"}),s.jsx("span",{className:"class-chip-name",children:e.name})]},e.id)),W.map(e=>{const a=ye[e.id];return s.jsxs("button",{className:`class-chip ${i===e.id?"selected":""}`,onClick:()=>Y(e.id),title:a.description,children:[s.jsx(Ae,{classId:e.id,size:18,className:"class-chip-icon"}),s.jsx("span",{className:"class-chip-name",children:e.name})]},e.id)}),u&&q.length===0&&W.length===0&&s.jsx("div",{className:"class-search-empty",children:n("terminal:spawn.noClassesMatch",{query:u})})]})]})]}),s.jsxs("div",{className:"spawn-form-section",children:[s.jsxs("div",{className:"spawn-form-row",children:[s.jsxs("div",{className:"spawn-field",children:[s.jsx("label",{className:"spawn-label",children:n("common:labels.name")}),s.jsx("input",{ref:z,type:"text",className:"spawn-input",placeholder:n("terminal:spawn.agentNamePlaceholder"),value:m,onChange:e=>N(e.target.value)})]}),s.jsxs("div",{className:"spawn-field spawn-field-wide",children:[s.jsxs("label",{className:"spawn-label",children:[n("terminal:spawn.workingDir"),s.jsx(x,{text:n("terminal:spawn.helpWorkingDir"),title:n("terminal:spawn.workingDir"),position:"top",size:"sm"})]}),s.jsx(is,{value:M,onChange:e=>{P(e),T(!1)},placeholder:n("terminal:spawn.workingDirPlaceholder"),className:`spawn-input ${Ie?"error":""}`,directoriesOnly:!0})]})]}),s.jsxs("div",{className:"spawn-form-row",children:[s.jsxs("div",{className:"spawn-field",children:[s.jsxs("label",{className:"spawn-label",children:[n("terminal:spawn.selectRuntime"),s.jsx(x,{text:n("terminal:spawn.helpRuntime"),title:n("terminal:spawn.runtimeTitle"),position:"top",size:"sm"})]}),s.jsxs("div",{className:"spawn-select-row",children:[s.jsxs("button",{className:`spawn-select-btn ${o==="claude"?"selected":""}`,onClick:()=>V("claude"),title:n("terminal:spawn.useClaudeCli"),children:[s.jsx("img",{src:"/assets/claude.ico",alt:"Claude",className:"spawn-provider-icon"}),s.jsx("span",{children:"Claude"})]}),s.jsxs("button",{className:`spawn-select-btn ${o==="codex"?"selected":""}`,onClick:()=>V("codex"),title:n("terminal:spawn.useCodexCli"),children:[s.jsx("img",{src:"/assets/codex.ico",alt:"Codex",className:"spawn-provider-icon"}),s.jsx("span",{children:"Codex"})]}),s.jsxs("button",{className:`spawn-select-btn spawn-select-btn--opencode ${o==="opencode"?"selected":""}`,onClick:()=>V("opencode"),title:"Use OpenCode CLI (multi-provider)",children:[s.jsx("span",{children:"🟢"}),s.jsx("span",{children:"OpenCode"})]})]})]}),s.jsxs("div",{className:"spawn-field",children:[s.jsxs("label",{className:"spawn-label",children:[n("common:labels.permissions"),s.jsx(x,{text:n("terminal:spawn.helpPermission"),title:n("terminal:spawn.permissionMode"),position:"top",size:"sm"})]}),s.jsx("div",{className:"spawn-select-row",children:Object.keys(oe).map(e=>s.jsxs("button",{className:`spawn-select-btn ${U===e?"selected":""}`,onClick:()=>Pe(e),title:oe[e].description,children:[s.jsx("span",{children:e==="bypass"?"⚡":"🔐"}),s.jsx("span",{children:oe[e].label})]},e))})]})]}),s.jsxs("div",{className:"spawn-form-row",children:[s.jsxs("div",{className:"spawn-field",children:[s.jsxs("label",{className:"spawn-label",children:[n("common:labels.model"),s.jsx(x,{text:n("terminal:spawn.helpModel"),title:n("terminal:spawn.modelTitle"),position:"top",size:"sm"})]}),o==="claude"?s.jsx("div",{className:"spawn-select-row",children:Object.keys(G).map(e=>s.jsxs("button",{className:`spawn-select-btn ${Q===e?"selected":""}`,onClick:()=>xe(e),title:G[e].description,children:[s.jsx("span",{children:G[e].icon}),s.jsx("span",{children:G[e].label})]},e))}):o==="codex"?s.jsx("div",{className:"spawn-select-row spawn-select-row--codex-models",children:Object.keys(K).map(e=>s.jsxs("button",{className:`spawn-select-btn ${se===e?"selected":""}`,onClick:()=>Te(e),title:K[e].description,children:[s.jsx("span",{children:K[e].icon}),s.jsx("span",{children:K[e].label})]},e))}):o==="opencode"?s.jsx("input",{type:"text",className:"spawn-input",value:ne,onChange:e=>Fe(e.target.value),placeholder:"provider/model (e.g., minimax/MiniMax-M1-80k)"}):s.jsx("div",{className:"spawn-inline-hint",children:n("terminal:spawn.chooseCodexModel")})]}),o==="claude"&&s.jsxs("div",{className:"spawn-field",children:[s.jsx("label",{className:"spawn-label",children:"Effort"}),s.jsxs("div",{className:"spawn-select-row spawn-select-row--effort",children:[s.jsx("button",{className:`spawn-select-btn spawn-select-btn--compact ${ee===void 0?"selected":""}`,onClick:()=>fe(void 0),title:"Use default effort level",children:s.jsx("span",{children:"Default"})}),Object.keys(ie).map(e=>s.jsx("button",{className:`spawn-select-btn spawn-select-btn--compact ${ee===e?"selected":""}`,onClick:()=>fe(e),title:ie[e].description,children:s.jsx("span",{children:ie[e].label})},e))]})]}),s.jsxs("div",{className:"spawn-field",children:[s.jsx("label",{className:"spawn-label",children:n("terminal:spawn.browser")}),s.jsx("div",{className:"spawn-form-row spawn-options-row",children:s.jsxs("label",{className:"spawn-checkbox",children:[s.jsx("input",{type:"checkbox",checked:R,onChange:e=>$e(e.target.checked),disabled:o!=="claude"}),s.jsxs("span",{children:["🌐 ",n("terminal:spawn.chromeBrowser")]}),s.jsx(x,{text:n(o==="claude"?"terminal:spawn.helpChrome":"terminal:spawn.helpChromeDisabled"),title:n("terminal:spawn.chromeBrowser"),position:"top",size:"sm"})]})})]})]}),o==="codex"&&s.jsxs("div",{className:"codex-config-section",children:[s.jsx("div",{className:"codex-config-title",children:n("terminal:spawn.codex.configuration")}),s.jsxs("div",{className:"codex-config-options",children:[s.jsxs("div",{className:"codex-option-group",children:[s.jsxs("label",{className:"spawn-checkbox",children:[s.jsx("input",{type:"checkbox",checked:g.fullAuto!==!1,onChange:e=>I(a=>({...a,fullAuto:e.target.checked}))}),s.jsx("span",{children:n("terminal:spawn.codex.fullAuto")}),s.jsx(x,{text:n("terminal:spawn.helpFullAuto"),title:n("terminal:spawn.fullAutoTitle"),position:"top",size:"sm"})]}),s.jsxs("label",{className:"spawn-checkbox",children:[s.jsx("input",{type:"checkbox",checked:!!g.search,onChange:e=>I(a=>({...a,search:e.target.checked}))}),s.jsx("span",{children:n("terminal:spawn.codex.search")}),s.jsx(x,{text:n("terminal:spawn.helpSearch"),title:n("terminal:spawn.searchTitle"),position:"top",size:"sm"})]})]}),g.fullAuto===!1&&s.jsxs("div",{className:"codex-option-group",children:[s.jsx("div",{className:"codex-option-header",children:n("terminal:spawn.codex.restrictions")}),s.jsxs("select",{className:"spawn-input codex-select",value:g.sandbox||"workspace-write",onChange:e=>I(a=>({...a,sandbox:e.target.value})),children:[s.jsxs("option",{value:"read-only",children:["📖 ",n("terminal:spawn.codex.sandboxReadOnly")]}),s.jsxs("option",{value:"workspace-write",children:["✏️ ",n("terminal:spawn.codex.sandboxWorkspaceWrite")]}),s.jsxs("option",{value:"danger-full-access",children:["⚡ ",n("terminal:spawn.codex.sandboxDangerFullAccess")]})]}),s.jsxs("select",{className:"spawn-input codex-select",value:g.approvalMode||"on-request",onChange:e=>I(a=>({...a,approvalMode:e.target.value})),children:[s.jsxs("option",{value:"untrusted",children:["🔒 ",n("terminal:spawn.codex.approvalsUntrusted")]}),s.jsxs("option",{value:"on-failure",children:["⚠️ ",n("terminal:spawn.codex.approvalsOnFailure")]}),s.jsxs("option",{value:"on-request",children:["🤔 ",n("terminal:spawn.codex.approvalsOnRequest")]}),s.jsxs("option",{value:"never",children:["✅ ",n("terminal:spawn.codex.approvalsNever")]})]})]}),s.jsxs("div",{className:"codex-option-group",children:[s.jsx("div",{className:"codex-option-header",children:n("terminal:spawn.codex.profile")}),s.jsx("input",{type:"text",className:"spawn-input codex-profile-input",placeholder:n("terminal:spawn.codex.profilePlaceholder"),value:g.profile||"",onChange:e=>I(a=>({...a,profile:e.target.value||void 0}))})]})]})]}),h.length>0&&s.jsxs("div",{className:"spawn-skills-section",children:[s.jsxs("label",{className:"spawn-label",children:[n("terminal:spawn.skills")," ",s.jsxs("span",{className:"spawn-label-hint",children:["(",n("common:labels.optional"),")"]}),s.jsx(x,{text:n("terminal:spawn.helpSkills"),title:n("terminal:spawn.skillsTitle"),position:"top",size:"sm"})]}),h.length>6&&s.jsx("input",{type:"text",className:"spawn-input skill-search-input",placeholder:n("terminal:spawn.filterSkills"),value:A,onChange:e=>Ue(e.target.value)}),s.jsxs("div",{className:"spawn-skills-inline",children:[ve.map(e=>{const a=we.has(e.id);return We.some(d=>d.id===e.id)?null:s.jsxs("button",{className:`spawn-skill-chip ${a?"selected":""}`,onClick:()=>qe(e.id),title:e.description,children:[a&&s.jsx("span",{className:"spawn-skill-check",children:"✓"}),s.jsx("span",{children:e.name}),e.builtin&&s.jsx("span",{className:"spawn-skill-builtin",children:"TC"})]},e.id)}),A&&ve.length===0&&s.jsx("div",{className:"skill-search-empty",children:n("terminal:spawn.noSkillsMatch",{query:A})})]})]}),s.jsxs("div",{className:"spawn-custom-instructions-section",children:[s.jsxs("label",{className:"spawn-label",children:[n("terminal:spawn.customInstructions")," ",s.jsxs("span",{className:"spawn-label-hint",children:["(",n("common:labels.optional"),")"]}),s.jsx(x,{text:n("terminal:spawn.helpCustomInstructions"),title:n("terminal:spawn.customInstructions"),position:"top",size:"sm"})]}),s.jsx("textarea",{className:"spawn-input spawn-textarea",placeholder:n("terminal:spawn.customInstructionsPlaceholder"),value:je,onChange:e=>Re(e.target.value),rows:3})]}),s.jsxs("div",{className:"spawn-sessions-section",children:[s.jsxs("label",{className:"spawn-label",children:[n("terminal:spawn.linkSession")," ",s.jsxs("span",{className:"spawn-label-hint",children:["(",n("common:labels.optional"),")"]}),s.jsx(x,{text:n("terminal:spawn.helpLinkSession"),title:n("terminal:spawn.linkSessionTitle"),position:"top",size:"sm"})]}),k.length>0&&s.jsx("input",{type:"text",className:"spawn-input session-search-input",placeholder:n("terminal:spawn.searchSessions"),value:E,onChange:e=>he(e.target.value)}),s.jsx("div",{className:"sessions-list",children:Le?s.jsx("div",{className:"sessions-loading",children:n("terminal:spawn.loadingSessions")}):k.length===0?s.jsx("div",{className:"sessions-empty",children:n("terminal:spawn.noSessions")}):Ne.length===0?s.jsx("div",{className:"sessions-empty",children:n("terminal:spawn.noSessionsMatch",{query:E})}):Ne.map(e=>{const a=y===e.sessionId,l=Date.now()-new Date(e.lastModified).getTime(),d=l<6e4?n("common:time.justNow"):l<36e5?n("common:time.minutesAgo",{count:Math.floor(l/6e4)}):l<864e5?n("common:time.hoursAgo",{count:Math.floor(l/36e5)}):n("common:time.daysAgo",{count:Math.floor(l/864e5)});return s.jsxs("div",{className:`session-item ${a?"selected":""}`,onClick:()=>{a?F(null):(F(e.sessionId),P(e.projectPath))},children:[s.jsxs("div",{className:"session-item-header",children:[s.jsx("span",{className:"session-item-path",children:e.projectPath}),s.jsx("span",{className:"session-item-age",children:d})]}),s.jsx("div",{className:"session-item-preview",children:e.firstMessage||n("terminal:spawn.messagesCount",{count:e.messageCount})})]},e.sessionId)})})]})]})]}),s.jsxs("div",{className:"modal-footer",children:[s.jsx("button",{className:"btn btn-secondary",onClick:j,children:n("common:buttons.cancel")}),s.jsx("button",{className:"btn btn-primary",onClick:He,disabled:re,children:n(re?"common:buttons.deploying":"common:buttons2.deploy")})]})]})})}export{us as SpawnModal};
@@ -0,0 +1 @@
1
+ import{u as z,I as L,a5 as $,r as m,j as s,a3 as N,C as S,s as D}from"./main-D3GShQ8B.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function M({isOpen:o,bossId:c,onClose:l}){var x;const{t:a}=z(["terminal","common"]),f=L(),n=$(c),[i,r]=m.useState(new Set),[u,b]=m.useState(!1),d=Array.from(f.values()).filter(e=>e.class!=="boss"&&(!e.bossId||e.bossId===c));m.useEffect(()=>{o&&n&&r(new Set(n.subordinateIds||[]))},[o,n]);const g=()=>{b(!0),D.assignSubordinates(c,Array.from(i)),setTimeout(()=>{b(!1),l()},300)},p=e=>{const t=new Set(i);t.has(e)?t.delete(e):t.add(e),r(t)},y=()=>{r(new Set(d.map(e=>e.id)))},A=()=>{r(new Set)},C=e=>{e.target===e.currentTarget&&l()},w=e=>{e.key==="Escape"&&l()};if(!o||!n)return null;const k=N.boss,h=((x=n.subordinateIds)==null?void 0:x.length)||0,E=i.size,v=JSON.stringify([...n.subordinateIds||[]].sort())!==JSON.stringify([...i].sort());return s.jsx("div",{className:`modal-overlay ${o?"visible":""}`,onClick:C,onKeyDown:w,children:s.jsxs("div",{className:"modal subordinate-assignment-modal",children:[s.jsxs("div",{className:"modal-header",children:[s.jsx("span",{className:"boss-header-icon",style:{color:k.color},children:s.jsx(S,{agent:n,size:22})}),a("terminal:supervisor.manageTeam"),": ",n.name]}),s.jsxs("div",{className:"modal-body subordinate-assignment-body",children:[s.jsxs("div",{className:"subordinate-assignment-info",children:[s.jsx("p",{children:a("terminal:supervisor.selectAgents")}),s.jsxs("div",{className:"subordinate-assignment-actions",children:[s.jsx("button",{className:"btn btn-small",onClick:y,children:a("common:buttons.selectAll")}),s.jsx("button",{className:"btn btn-small",onClick:A,children:a("common:buttons.clearAll")})]})]}),s.jsx("div",{className:"subordinates-list",children:d.length===0?s.jsx("div",{className:"subordinates-empty",children:a("terminal:supervisor.noAgentsAvailable")}):d.map(e=>{var j;const t=i.has(e.id),T=N[e.class],I=(j=n.subordinateIds)==null?void 0:j.includes(e.id);return s.jsxs("div",{className:`subordinate-item ${t?"selected":""}`,onClick:()=>p(e.id),children:[s.jsx("div",{className:"subordinate-checkbox",children:t?"✓":""}),s.jsx("div",{className:"subordinate-icon",style:{color:T.color},children:s.jsx(S,{agent:e,size:18})}),s.jsxs("div",{className:"subordinate-info",children:[s.jsx("div",{className:"subordinate-name",children:e.name}),s.jsx("div",{className:"subordinate-class",children:e.class})]}),s.jsx("div",{className:`subordinate-status status-${e.status}`,children:e.status}),I&&s.jsx("div",{className:"subordinate-badge",children:a("common:status.current")})]},e.id)})}),s.jsx("div",{className:"subordinate-assignment-summary",children:v?s.jsxs("span",{className:"summary-changed",children:[h," → ",E," ",a("terminal:supervisor.subordinates").toLowerCase()]}):s.jsxs("span",{className:"summary-unchanged",children:[h," ",a("terminal:supervisor.subordinates").toLowerCase()]})})]}),s.jsxs("div",{className:"modal-footer",children:[s.jsx("button",{className:"btn btn-secondary",onClick:l,children:a("common:buttons.cancel")}),s.jsx("button",{className:"btn btn-boss",onClick:g,disabled:u||!v,children:a(u?"common:status.saving":"terminal:supervisor.saveTeam")})]})]})})}export{M as SubordinateAssignmentModal};
@@ -1 +1 @@
1
- import{u as c,f as b,aH as y,aI as k,j as s,s as o}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function h(e){const a=Math.floor((Date.now()-e)/1e3);if(a<60)return`${a}s ago`;const r=Math.floor(a/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}function M({isOpen:e,onClose:a}){const{t:r}=c(["terminal","common"]),n=b(),{lastReport:l,enabled:i,lastReportTime:d,generatingReport:m,autoReportOnComplete:t}=n.supervisor,v=y(),x=k(),p=()=>{o.requestSupervisorReport()},j=()=>{o.setSupervisorConfig({enabled:!i})},g=()=>{o.setSupervisorConfig({autoReportOnComplete:!t})},N=()=>{o.requestGlobalUsage()};return e?s.jsx("div",{className:"supervisor-panel-overlay",onClick:a,children:s.jsxs("div",{className:"supervisor-panel",onClick:f=>f.stopPropagation(),children:[s.jsxs("div",{className:"supervisor-header",children:[s.jsxs("h2",{className:"supervisor-title",children:[s.jsx("span",{className:"supervisor-icon",children:"🎖️"}),r("terminal:supervisor.overview")]}),s.jsxs("div",{className:"supervisor-controls",children:[s.jsx("button",{className:`supervisor-toggle ${i?"active":""}`,onClick:j,title:i?"Disable supervisor":"Enable supervisor",children:i?`● ${r("terminal:supervisor.active")}`:`○ ${r("terminal:supervisor.paused")}`}),s.jsx("button",{className:`supervisor-toggle auto-report ${t?"active":""}`,onClick:g,title:t?"Disable auto-report on task complete":"Enable auto-report on task complete",children:t?`⚡ ${r("terminal:supervisor.auto")}`:`◇ ${r("terminal:supervisor.manual")}`}),s.jsx("button",{className:"supervisor-refresh",onClick:p,disabled:m,children:m?r("terminal:supervisor.generating"):`↻ ${r("common:buttons.refresh")}`}),s.jsx("button",{className:"supervisor-close",onClick:a,children:"×"})]})]}),s.jsx(R,{usage:v,refreshing:x,onRefresh:N}),m?s.jsxs("div",{className:"supervisor-loading",children:[s.jsx("div",{className:"supervisor-loading-spinner"}),s.jsx("p",{children:r("terminal:supervisor.generatingReport")})]}):l?s.jsx(S,{report:l}):s.jsxs("div",{className:"supervisor-empty",children:[s.jsx("p",{children:r("terminal:supervisor.noReportYet")}),s.jsx("button",{onClick:p,children:r("terminal:supervisor.generateFirstReport")})]}),s.jsxs("div",{className:"supervisor-footer",children:[d&&s.jsx("span",{children:r("terminal:supervisor.lastReport",{time:h(d)})}),i&&t&&s.jsx("span",{children:r("terminal:supervisor.autoUpdatesOnComplete")}),i&&!t&&s.jsx("span",{children:r("terminal:supervisor.manualUpdatesOnly")})]})]})}):null}function S({report:e}){const{t:a}=c(["terminal"]);return s.jsxs("div",{className:"supervisor-report",children:[s.jsxs("div",{className:`supervisor-status-banner ${e.overallStatus}`,children:[s.jsx("span",{className:"status-icon",children:e.overallStatus==="healthy"?"✓":e.overallStatus==="attention_needed"?"⚠":"!"}),s.jsx("span",{className:"status-text",children:e.overallStatus==="healthy"?a("terminal:supervisor.allSystemsHealthy"):e.overallStatus==="attention_needed"?a("terminal:supervisor.attentionNeeded"):a("terminal:supervisor.criticalIssues")})]}),e.insights.length>0&&s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.keyInsights")}),s.jsx("ul",{className:"supervisor-insights",children:e.insights.map((r,n)=>s.jsx("li",{children:r},n))})]}),s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.agentStatus")}),s.jsx("div",{className:"supervisor-agents",children:e.agentSummaries.map(r=>s.jsx(U,{agent:r},r.agentId))})]}),e.recommendations.length>0&&s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.recommendations")}),s.jsx("ul",{className:"supervisor-recommendations",children:e.recommendations.map((r,n)=>s.jsx("li",{children:r},n))})]})]})}function U({agent:e}){const a={on_track:"#4aff9e",stalled:"#ff9e4a",blocked:"#ff4a4a",completed:"#4a9eff",idle:"#888"};return s.jsxs("div",{className:"agent-summary-card",children:[s.jsxs("div",{className:"agent-summary-header",children:[s.jsx("span",{className:"agent-summary-name",children:e.agentName}),s.jsx("span",{className:"agent-summary-progress",style:{color:a[e.progress]||"#888"},children:e.progress.replace("_"," ")})]}),s.jsx("p",{className:"agent-summary-status",children:e.statusDescription}),s.jsx("p",{className:"agent-summary-work",children:e.recentWorkSummary}),e.concerns&&e.concerns.length>0&&s.jsx("div",{className:"agent-summary-concerns",children:e.concerns.map((r,n)=>s.jsxs("span",{className:"concern-tag",children:["⚠ ",r]},n))})]})}function C(e){return e<50?"#4aff9e":e<75?"#ff9e4a":"#ff4a4a"}function R({usage:e,refreshing:a,onRefresh:r}){const{t:n}=c(["terminal","common"]);return s.jsxs("div",{className:"supervisor-section usage-section",children:[s.jsxs("div",{className:"usage-header",children:[s.jsx("h3",{children:n("terminal:supervisor.claudeApiUsage")}),s.jsx("button",{className:"usage-refresh-btn",onClick:r,disabled:a,title:"Refresh usage stats",children:a?"...":"↻"})]}),e?s.jsxs("div",{className:"usage-grid",children:[s.jsx(u,{label:n("terminal:supervisor.session"),percent:e.session.percentUsed,resetTime:e.session.resetTime}),s.jsx(u,{label:n("terminal:supervisor.weeklyAll"),percent:e.weeklyAllModels.percentUsed,resetTime:e.weeklyAllModels.resetTime}),s.jsx(u,{label:n("terminal:supervisor.weeklySonnet"),percent:e.weeklySonnet.percentUsed,resetTime:e.weeklySonnet.resetTime}),s.jsxs("div",{className:"usage-source",children:["via ",e.sourceAgentName," · ",h(e.lastUpdated)]})]}):s.jsxs("div",{className:"usage-empty",children:[s.jsx("p",{children:n("terminal:supervisor.noUsageData")}),s.jsx("button",{onClick:r,disabled:a,children:n(a?"terminal:supervisor.fetching":"common:buttons2.fetchUsage")})]})]})}function u({label:e,percent:a,resetTime:r}){const{t:n}=c(["terminal"]),l=C(a),i=Math.min(a,100);return s.jsxs("div",{className:"usage-bar-container",children:[s.jsxs("div",{className:"usage-bar-label",children:[s.jsx("span",{children:e}),s.jsxs("span",{className:"usage-percent",style:{color:l},children:[a.toFixed(1),"%"]})]}),s.jsx("div",{className:"usage-bar-track",children:s.jsx("div",{className:"usage-bar-fill",style:{width:`${i}%`,backgroundColor:l}})}),s.jsx("div",{className:"usage-bar-reset",children:n("terminal:supervisor.resets",{time:r})})]})}export{M as SupervisorPanel};
1
+ import{u as c,f as b,aI as y,aJ as k,j as s,s as o}from"./main-D3GShQ8B.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function h(e){const a=Math.floor((Date.now()-e)/1e3);if(a<60)return`${a}s ago`;const r=Math.floor(a/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}function M({isOpen:e,onClose:a}){const{t:r}=c(["terminal","common"]),n=b(),{lastReport:l,enabled:i,lastReportTime:d,generatingReport:m,autoReportOnComplete:t}=n.supervisor,v=y(),x=k(),p=()=>{o.requestSupervisorReport()},j=()=>{o.setSupervisorConfig({enabled:!i})},g=()=>{o.setSupervisorConfig({autoReportOnComplete:!t})},N=()=>{o.requestGlobalUsage()};return e?s.jsx("div",{className:"supervisor-panel-overlay",onClick:a,children:s.jsxs("div",{className:"supervisor-panel",onClick:f=>f.stopPropagation(),children:[s.jsxs("div",{className:"supervisor-header",children:[s.jsxs("h2",{className:"supervisor-title",children:[s.jsx("span",{className:"supervisor-icon",children:"🎖️"}),r("terminal:supervisor.overview")]}),s.jsxs("div",{className:"supervisor-controls",children:[s.jsx("button",{className:`supervisor-toggle ${i?"active":""}`,onClick:j,title:i?"Disable supervisor":"Enable supervisor",children:i?`● ${r("terminal:supervisor.active")}`:`○ ${r("terminal:supervisor.paused")}`}),s.jsx("button",{className:`supervisor-toggle auto-report ${t?"active":""}`,onClick:g,title:t?"Disable auto-report on task complete":"Enable auto-report on task complete",children:t?`⚡ ${r("terminal:supervisor.auto")}`:`◇ ${r("terminal:supervisor.manual")}`}),s.jsx("button",{className:"supervisor-refresh",onClick:p,disabled:m,children:m?r("terminal:supervisor.generating"):`↻ ${r("common:buttons.refresh")}`}),s.jsx("button",{className:"supervisor-close",onClick:a,children:"×"})]})]}),s.jsx(R,{usage:v,refreshing:x,onRefresh:N}),m?s.jsxs("div",{className:"supervisor-loading",children:[s.jsx("div",{className:"supervisor-loading-spinner"}),s.jsx("p",{children:r("terminal:supervisor.generatingReport")})]}):l?s.jsx(S,{report:l}):s.jsxs("div",{className:"supervisor-empty",children:[s.jsx("p",{children:r("terminal:supervisor.noReportYet")}),s.jsx("button",{onClick:p,children:r("terminal:supervisor.generateFirstReport")})]}),s.jsxs("div",{className:"supervisor-footer",children:[d&&s.jsx("span",{children:r("terminal:supervisor.lastReport",{time:h(d)})}),i&&t&&s.jsx("span",{children:r("terminal:supervisor.autoUpdatesOnComplete")}),i&&!t&&s.jsx("span",{children:r("terminal:supervisor.manualUpdatesOnly")})]})]})}):null}function S({report:e}){const{t:a}=c(["terminal"]);return s.jsxs("div",{className:"supervisor-report",children:[s.jsxs("div",{className:`supervisor-status-banner ${e.overallStatus}`,children:[s.jsx("span",{className:"status-icon",children:e.overallStatus==="healthy"?"✓":e.overallStatus==="attention_needed"?"⚠":"!"}),s.jsx("span",{className:"status-text",children:e.overallStatus==="healthy"?a("terminal:supervisor.allSystemsHealthy"):e.overallStatus==="attention_needed"?a("terminal:supervisor.attentionNeeded"):a("terminal:supervisor.criticalIssues")})]}),e.insights.length>0&&s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.keyInsights")}),s.jsx("ul",{className:"supervisor-insights",children:e.insights.map((r,n)=>s.jsx("li",{children:r},n))})]}),s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.agentStatus")}),s.jsx("div",{className:"supervisor-agents",children:e.agentSummaries.map(r=>s.jsx(U,{agent:r},r.agentId))})]}),e.recommendations.length>0&&s.jsxs("div",{className:"supervisor-section",children:[s.jsx("h3",{children:a("terminal:supervisor.recommendations")}),s.jsx("ul",{className:"supervisor-recommendations",children:e.recommendations.map((r,n)=>s.jsx("li",{children:r},n))})]})]})}function U({agent:e}){const a={on_track:"#4aff9e",stalled:"#ff9e4a",blocked:"#ff4a4a",completed:"#4a9eff",idle:"#888"};return s.jsxs("div",{className:"agent-summary-card",children:[s.jsxs("div",{className:"agent-summary-header",children:[s.jsx("span",{className:"agent-summary-name",children:e.agentName}),s.jsx("span",{className:"agent-summary-progress",style:{color:a[e.progress]||"#888"},children:e.progress.replace("_"," ")})]}),s.jsx("p",{className:"agent-summary-status",children:e.statusDescription}),s.jsx("p",{className:"agent-summary-work",children:e.recentWorkSummary}),e.concerns&&e.concerns.length>0&&s.jsx("div",{className:"agent-summary-concerns",children:e.concerns.map((r,n)=>s.jsxs("span",{className:"concern-tag",children:["⚠ ",r]},n))})]})}function C(e){return e<50?"#4aff9e":e<75?"#ff9e4a":"#ff4a4a"}function R({usage:e,refreshing:a,onRefresh:r}){const{t:n}=c(["terminal","common"]);return s.jsxs("div",{className:"supervisor-section usage-section",children:[s.jsxs("div",{className:"usage-header",children:[s.jsx("h3",{children:n("terminal:supervisor.claudeApiUsage")}),s.jsx("button",{className:"usage-refresh-btn",onClick:r,disabled:a,title:"Refresh usage stats",children:a?"...":"↻"})]}),e?s.jsxs("div",{className:"usage-grid",children:[s.jsx(u,{label:n("terminal:supervisor.session"),percent:e.session.percentUsed,resetTime:e.session.resetTime}),s.jsx(u,{label:n("terminal:supervisor.weeklyAll"),percent:e.weeklyAllModels.percentUsed,resetTime:e.weeklyAllModels.resetTime}),s.jsx(u,{label:n("terminal:supervisor.weeklySonnet"),percent:e.weeklySonnet.percentUsed,resetTime:e.weeklySonnet.resetTime}),s.jsxs("div",{className:"usage-source",children:["via ",e.sourceAgentName," · ",h(e.lastUpdated)]})]}):s.jsxs("div",{className:"usage-empty",children:[s.jsx("p",{children:n("terminal:supervisor.noUsageData")}),s.jsx("button",{onClick:r,disabled:a,children:n(a?"terminal:supervisor.fetching":"common:buttons2.fetchUsage")})]})]})}function u({label:e,percent:a,resetTime:r}){const{t:n}=c(["terminal"]),l=C(a),i=Math.min(a,100);return s.jsxs("div",{className:"usage-bar-container",children:[s.jsxs("div",{className:"usage-bar-label",children:[s.jsx("span",{children:e}),s.jsxs("span",{className:"usage-percent",style:{color:l},children:[a.toFixed(1),"%"]})]}),s.jsx("div",{className:"usage-bar-track",children:s.jsx("div",{className:"usage-bar-fill",style:{width:`${i}%`,backgroundColor:l}})}),s.jsx("div",{className:"usage-bar-reset",children:n("terminal:supervisor.resets",{time:r})})]})}export{M as SupervisorPanel};