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.
- package/dist/assets/{BossLogsModal-CTo4Bbm7.js → BossLogsModal-BIFXXaaq.js} +1 -1
- package/dist/assets/BossSpawnModal-CL4eQrBS.js +1 -0
- package/dist/assets/ControlsModal-DX_FqPx7.js +1 -0
- package/dist/assets/{DockerLogsModal-CrHd6OZ3.js → DockerLogsModal-SoHgFfH1.js} +1 -1
- package/dist/assets/{EmbeddedEditor-h8IrAy4E.js → EmbeddedEditor-Dx6Y7JM3.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-io57q0N8.js → GmailOAuthSetup-K-SZcqrr.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-YyNFVd9Y.js → GoogleOAuthSetup-BfpfXmbM.js} +1 -1
- package/dist/assets/{IframeModal-DqmSDXCT.js → IframeModal-BAgB3UQ3.js} +1 -1
- package/dist/assets/IntegrationsPanel-B1nXTZW8.js +2 -0
- package/dist/assets/{LogViewerModal-CGW8yajP.js → LogViewerModal-4do7lATm.js} +1 -1
- package/dist/assets/{MonitoringModal-BfsYrF1j.js → MonitoringModal-OAExiDTA.js} +1 -1
- package/dist/assets/{PM2LogsModal-BJytXxKY.js → PM2LogsModal-DnA2AsIM.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-CtRiwwzT.js → RestoreArchivedAreaModal-C0ADFzsM.js} +1 -1
- package/dist/assets/{SaveSnapshotModal-BHBdh1dK.js → SaveSnapshotModal-Ct4aW93y.js} +1 -1
- package/dist/assets/Scene2DCanvas-C5mj6yGY.js +1 -0
- package/dist/assets/{SceneManager-u4hiSYdk.js → SceneManager-CPtKPGZP.js} +1 -1
- package/dist/assets/SkillsPanel-B0XFw3Ae.js +28 -0
- package/dist/assets/SnapshotManager-0NaWlDXc.js +1 -0
- package/dist/assets/SpawnModal-BOJQ1pln.js +1 -0
- package/dist/assets/SubordinateAssignmentModal-BuzBY1CB.js +1 -0
- package/dist/assets/{SupervisorPanel-D0c7Kkzt.js → SupervisorPanel-B2_2QYL0.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-RsbYDmIC.js → TriggerManagerPanel-CUD10Dg9.js} +2 -2
- package/dist/assets/{WorkflowEditorPanel-lpYmT8iN.js → WorkflowEditorPanel-qfjb7ozq.js} +2 -2
- package/dist/assets/{index-C6GdsxBK.js → index-BfXYjLRr.js} +4 -4
- package/dist/assets/{index-CpwhIgf8.js → index-BzvQBrQn.js} +3 -3
- package/dist/assets/{index-BOY5J4U4.js → index-CKitMIQJ.js} +1 -1
- package/dist/assets/{index-X9qZZBXG.js → index-CTdXoSNs.js} +2 -2
- package/dist/assets/{index-BexCA27h.js → index-D0e5Zn8j.js} +3 -3
- package/dist/assets/{index-BQdQ0iv_.js → index-DFTYc8O3.js} +1 -1
- package/dist/assets/index-K6Ld2Man.js +1 -0
- package/dist/assets/{index-BqPgrat9.js → index-RddWDRes.js} +1 -1
- package/dist/assets/{main-DjGrMNoB.css → main-Ch2CJGT4.css} +1 -1
- package/dist/assets/main-D3GShQ8B.js +153 -0
- package/dist/assets/{web-D94DaG2N.js → web-D0MII38C.js} +1 -1
- package/dist/assets/{web-XswRIovf.js → web-bLUMZcn-.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/data/index.js +28 -0
- package/dist/src/packages/server/routes/config.js +7 -0
- package/dist/src/packages/server/routes/custom-class-icons.js +138 -0
- package/dist/src/packages/server/routes/index.js +2 -0
- package/dist/src/packages/server/services/custom-class-service.js +7 -2
- package/dist/src/packages/server/websocket/handlers/agent-handler.js +3 -0
- package/package.json +1 -1
- package/dist/assets/BossSpawnModal-DOk9u7EW.js +0 -1
- package/dist/assets/ControlsModal-BzBzF0Cw.js +0 -1
- package/dist/assets/IntegrationsPanel-DiW8UeG5.js +0 -2
- package/dist/assets/Scene2DCanvas-BYUuUYur.js +0 -1
- package/dist/assets/SkillsPanel-D4IHFehE.js +0 -28
- package/dist/assets/SnapshotManager-Cys1dllC.js +0 -1
- package/dist/assets/SpawnModal-DUK7X8ql.js +0 -1
- package/dist/assets/SubordinateAssignmentModal-DeH34tA3.js +0 -1
- package/dist/assets/index-t5WzFf-W.js +0 -1
- package/dist/assets/main-CrRMpn-n.js +0 -153
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import{u as Te,bf as Ke,bg as Ue,r as i,h as Ce,j as e,s as z,bh as $e,bi as _e,bj as Ye,L as Ve,H as Je,M as Qe,bk as O,W as ve,w as me,V as Se}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Xe=[{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"}],Ze=[{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"}],eo=`## 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 oo({isOpen:d,onClose:g,skillId:s}){const{t:a}=Te(["tools","common"]),c=Ke(s??null),p=Ue(),l=!!c,n=(c==null?void 0:c.builtin)===!0,[h,y]=i.useState(""),[j,m]=i.useState(""),[v,F]=i.useState(""),[f,G]=i.useState(""),[u,E]=i.useState([]),[A,J]=i.useState(""),[S,M]=i.useState([]),[N,P]=i.useState([]),[D,I]=i.useState(!0),[q,H]=i.useState(!1),L=i.useRef(null),K=i.useRef(null);i.useEffect(()=>{d&&(c?(y(c.name),m(c.slug),F(c.description),G(c.content||""),E(c.allowedTools||[]),M(c.assignedAgentIds||[]),P(c.assignedAgentClasses||[]),I(c.enabled)):(y(a("tools:skills.newSkillDefault")),m(""),F(""),G(eo),E([]),M([]),P([]),I(!0)),J(""),H(!1),setTimeout(()=>{var t;return(t=L.current)==null?void 0:t.focus()},100))},[d,c]),i.useEffect(()=>{if(!l&&h){const t=h.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").substring(0,64);m(t)}},[h,l]);const Q=t=>{if(t.preventDefault(),n&&s){z.updateSkill(s,{assignedAgentIds:S,assignedAgentClasses:N,enabled:D}),g();return}if(!h.trim()||!v.trim())return;const k={name:h.trim(),slug:j.trim()||h.toLowerCase().replace(/[^a-z0-9]+/g,"-"),description:v.trim(),content:f.trim(),allowedTools:u,assignedAgentIds:S,assignedAgentClasses:N,enabled:D};if(l&&s){if(c&&(c.name!==k.name||c.description!==k.description||c.content!==k.content||c.enabled!==k.enabled||JSON.stringify(c.allowedTools)!==JSON.stringify(k.allowedTools))&&!confirm(a("tools:skills.updateSkillConfirm")))return;z.updateSkill(s,k)}else z.createSkill(k);g()},X=()=>{s&&confirm(a("tools:skills.deleteSkillConfirm"))&&(z.deleteSkill(s),g())},Z=t=>{u.includes(t)?E(u.filter(k=>k!==t)):E([...u,t])},U=()=>{A.trim()&&!u.includes(A.trim())&&(E([...u,A.trim()]),J(""))},ae=t=>{N.includes(t)?P(N.filter(k=>k!==t)):P([...N,t])},$=t=>{S.includes(t)?M(S.filter(k=>k!==t)):M([...S,t])},b=p.filter(t=>t.class!=="boss"),{handleMouseDown:_,handleClick:T}=Ce(g);return d?e.jsx("div",{className:"modal-overlay visible",onMouseDown:_,onClick:T,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:[a(l?n?"tools:skills.viewBuiltInSkill":"tools:skills.editSkill":"tools:skills.createSkill"),n&&e.jsx("span",{style:{fontSize:"10px",background:"var(--accent-cyan)",color:"var(--bg-primary)",padding:"2px 6px",borderRadius:"3px",fontWeight:600,marginLeft:"8px"},children:a("tools:skills.builtIn")})]}),l&&!n&&e.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:X,style:{marginLeft:"auto",marginRight:"12px"},children:a("common:buttons.delete")})]}),e.jsxs("form",{onSubmit:Q,children:[e.jsxs("div",{className:"modal-body",style:{maxHeight:"70vh",overflowY:"auto"},children:[n&&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:a("tools:skills.builtInNotice")}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.nameRequired")}),e.jsx("input",{ref:L,type:"text",className:"form-input",value:h,onChange:t=>y(t.target.value),placeholder:a("tools:skills.skillNamePlaceholder"),required:!0,disabled:n,style:n?{opacity:.7,cursor:"not-allowed"}:void 0})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.slugLabel")}),e.jsx("input",{type:"text",className:"form-input",value:j,onChange:t=>m(t.target.value),placeholder:a("tools:skills.slugPlaceholder"),style:{fontFamily:"monospace",fontSize:"12px",...n?{opacity:.7,cursor:"not-allowed"}:{}},disabled:n}),e.jsx("small",{className:"form-hint",children:a("tools:skills.slugHint")})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.descriptionRequired")}),e.jsx("textarea",{className:"form-input",value:v,onChange:t=>F(t.target.value),placeholder:a("tools:skills.skillDescPlaceholder"),rows:3,required:!0,style:{resize:"vertical",...n?{opacity:.7,cursor:"not-allowed"}:{}},disabled:n}),e.jsx("small",{className:"form-hint",children:a("tools:skills.descriptionHint")})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.instructionsMarkdown")}),e.jsx("textarea",{ref:K,className:"form-input",value:f,onChange:t=>G(t.target.value),placeholder:a("tools:skills.skillContentPlaceholder"),rows:12,style:{fontFamily:"monospace",fontSize:"12px",resize:"vertical",minHeight:"200px",...n?{opacity:.7,cursor:"not-allowed"}:{}},disabled:n})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.allowedTools")}),n?e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"4px",opacity:.7},children:u.length>0?u.map(t=>e.jsx("span",{style:{background:"var(--bg-tertiary)",padding:"2px 8px",borderRadius:"4px",fontSize:"11px"},children:t},t)):e.jsx("span",{style:{fontSize:"12px",color:"var(--text-muted)"},children:a("tools:skills.noSpecificTools")})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"tool-presets",style:{display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"8px"},children:Ze.map(t=>e.jsx("button",{type:"button",className:`btn btn-sm ${u.includes(t.value)?"btn-primary":"btn-secondary"}`,onClick:()=>Z(t.value),style:{fontSize:"11px",padding:"4px 8px"},children:a(t.labelKey)},t.value))}),e.jsxs("div",{style:{display:"flex",gap:"8px"},children:[e.jsx("input",{type:"text",className:"form-input",value:A,onChange:t=>J(t.target.value),placeholder:a("tools:skills.customToolPlaceholder"),style:{flex:1,fontSize:"12px"},onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),U())}}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:U,children:a("common:buttons.add")})]}),u.length>0&&e.jsx("div",{style:{marginTop:"8px",display:"flex",flexWrap:"wrap",gap:"4px"},children:u.map(t=>e.jsxs("span",{className:"tag",style:{background:"var(--bg-tertiary)",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",cursor:"pointer"},onClick:()=>Z(t),title:a("tools:skills.clickToRemove"),children:[t," ×"]},t))})]})]}),e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.assignToClasses")}),e.jsx("small",{className:"form-hint",style:{display:"block",marginBottom:"8px"},children:a("tools:skills.allAgentsOfClasses")}),e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, 1fr)",gap:"6px"},children:Xe.map(t=>e.jsxs("button",{type:"button",className:`btn btn-sm ${N.includes(t.value)?"btn-primary":"btn-secondary"}`,onClick:()=>ae(t.value),style:{fontSize:"11px",padding:"6px 8px",textAlign:"left"},children:[e.jsx("strong",{children:a(t.labelKey)}),e.jsxs("span",{style:{opacity:.7,marginLeft:"4px"},children:["- ",a(t.descriptionKey)]})]},t.value))})]}),b.length>0&&e.jsxs("div",{className:"form-section",children:[e.jsx("label",{className:"form-label",children:a("tools:skills.assignToAgents")}),e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:b.map(t=>e.jsxs("button",{type:"button",className:`btn btn-sm ${S.includes(t.id)?"btn-primary":"btn-secondary"}`,onClick:()=>$(t.id),style:{fontSize:"11px",padding:"4px 8px"},children:[t.name,e.jsxs("span",{style:{opacity:.6,marginLeft:"4px"},children:["(",t.class,")"]})]},t.id))})]}),e.jsxs("div",{className:"form-section",children:[e.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>H(!q),style:{marginBottom:"8px"},children:[a(q?"common:buttons2.hide":"common:buttons2.show")," ",a("tools:skills.advancedOptions")]}),q&&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:D,onChange:t=>I(t.target.checked)}),a("tools:skills.skillEnabled")]}),e.jsx("small",{className:"form-hint",children:a("tools:skills.disabledSkillsHint")})]})]})]}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{type:"button",className:"btn btn-secondary",onClick:g,children:a(n?"common:buttons.close":"common:buttons.cancel")}),!n&&e.jsx("button",{type:"submit",className:"btn btn-primary",children:a(l?"common:buttons2.saveChanges":"tools:skills.createSkill")}),n&&e.jsx("button",{type:"submit",className:"btn btn-primary",children:a("tools:skills.saveAssignments")})]})]})]})}):null}const Fe=[{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"}],so=Fe.reduce((d,g)=>(d[g.category]||(d[g.category]=[]),d[g.category].push(g),d),{}),ro=["Smileys","People","Gestures","Hearts","Animals","Nature","Weather","Food","Tools","Tech","Transport","Objects","Symbols","Flags"];function ao({value:d,onChange:g}){const[s,a]=i.useState(!1),[c,p]=i.useState(""),l=i.useRef(null);i.useEffect(()=>{function y(j){l.current&&!l.current.contains(j.target)&&a(!1)}return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[]);const n=i.useMemo(()=>{const y=c.trim().toLowerCase();if(!y)return ro.map(m=>({category:m,emojis:so[m]||[]})).filter(m=>m.emojis.length>0);const j=Fe.filter(m=>m.keywords.some(v=>v.includes(y))||m.emoji===y);return j.length?[{category:"Results",emojis:j}]:[]},[c]),h=y=>{g(y),a(!1),p("")};return e.jsxs("div",{ref:l,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:d,onChange:y=>g(y.target.value),placeholder:"🚀",onClick:()=>a(!0),style:{textAlign:"center",fontSize:"18px",paddingRight:"32px"}}),e.jsx("button",{type:"button",className:"emoji-picker-toggle",onClick:()=>a(!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:y=>p(y.target.value),autoFocus:!0})}),e.jsx("div",{className:"emoji-picker-grid-container",children:n.length===0?e.jsx("div",{className:"emoji-picker-empty",children:"No emojis found"}):n.map(({category:y,emojis:j})=>e.jsxs("div",{className:"emoji-picker-category",children:[e.jsx("div",{className:"emoji-picker-category-label",children:y}),e.jsx("div",{className:"emoji-picker-grid",children:j.map((m,v)=>e.jsx("button",{type:"button",className:`emoji-picker-item ${d===m.emoji?"selected":""}`,onClick:()=>h(m.emoji),title:m.keywords.slice(0,3).join(", "),children:m.emoji},`${m.emoji}-${v}`))})]},y))})]})]})}async function to(d){return new Promise((g,s)=>{const a=new FileReader;a.onload=async c=>{var l;const p=(l=c.target)==null?void 0:l.result;if(!p){s(new Error("Failed to read file"));return}try{const n=await io(p);g(n)}catch(n){s(n)}},a.onerror=()=>{s(new Error("Failed to read file"))},a.readAsArrayBuffer(d)})}async function io(d){return new Promise((g,s)=>{const a=new DataView(d);if(String.fromCharCode(a.getUint8(0),a.getUint8(1),a.getUint8(2),a.getUint8(3))!=="glTF"){s(new Error("Invalid GLB file: missing glTF magic number"));return}const p=new $e,l=new _e;l.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/"),p.setDRACOLoader(l),p.setMeshoptDecoder(Ye);const n=new Blob([d],{type:"model/gltf-binary"}),h=URL.createObjectURL(n);p.load(h,y=>{URL.revokeObjectURL(h),l.dispose();const j=y.animations.map(m=>m.name);j.sort((m,v)=>m.localeCompare(v)),g(j)},void 0,y=>{URL.revokeObjectURL(h),l.dispose();const j=y instanceof Error?y.message:"Unknown error";s(new Error(`Failed to parse GLB: ${j}`))})})}async function lo(d){return new Promise(g=>{if(!d.name.toLowerCase().endsWith(".glb")){g(!1);return}const s=new FileReader;s.onload=a=>{var n;const c=(n=a.target)==null?void 0:n.result;if(!c||c.byteLength<4){g(!1);return}const p=new DataView(c),l=String.fromCharCode(p.getUint8(0),p.getUint8(1),p.getUint8(2),p.getUint8(3));g(l==="glTF")},s.onerror=()=>{g(!1)},s.readAsArrayBuffer(d.slice(0,4))})}function co(d){return d<1024?`${d} B`:d<1024*1024?`${(d/1024).toFixed(1)} KB`:`${(d/(1024*1024)).toFixed(1)} MB`}function no(d){return d.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").substring(0,64)}function wo({isOpen:d,onClose:g}){const{t:s}=Te(["tools","common"]),a=Ve(),c=Je(),p=Qe(),[l,n]=i.useState("skills"),[h,y]=i.useState(null),[j,m]=i.useState(!1),[v,F]=i.useState(!1),[f,G]=i.useState(null),[u,E]=i.useState(""),[A,J]=i.useState(""),[S,M]=i.useState(""),[N,P]=i.useState(""),[D,I]=i.useState("#4a9eff"),[q,H]=i.useState(""),[L,K]=i.useState("character-male-a.glb"),[Q,X]=i.useState([]),[Z,U]=i.useState(""),[ae,$]=i.useState(!1),[b,_]=i.useState(null),[T,t]=i.useState([]),[k,R]=i.useState({}),[B,te]=i.useState(1),[ee,ie]=i.useState(0),[oe,le]=i.useState(0),[se,ce]=i.useState(0),[ne,ge]=i.useState(!1),[pe,W]=i.useState(null),de=i.useRef(null),Ae=i.useCallback(()=>F(!1),[]),{handleMouseDown:Ne,handleClick:Oe}=Ce(Ae),Y=i.useMemo(()=>{const o=O.findIndex(r=>r.file===L);return o>=0?o:0},[L]),ze=i.useMemo(()=>O[Y]||O[0],[Y]),ke=i.useCallback(o=>{const r=o==="prev"?(Y-1+O.length)%O.length:(Y+1)%O.length;K(O[r].file)},[Y]),we=[...a.filter(o=>{if(!u)return!0;const r=u.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)),ue=p.filter(o=>{if(!A)return!0;const r=A.toLowerCase();return o.name.toLowerCase().includes(r)||o.description.toLowerCase().includes(r)||o.id.toLowerCase().includes(r)}),Me=()=>{y(null),m(!0)},Pe=o=>{y(o),m(!0)},Re=o=>{z.updateSkill(o.id,{enabled:!o.enabled})},Be=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(", ")},je=o=>{if(!o.enabled)return 0;const r=new Set;for(const w of c.values())o.assignedAgentClasses.includes(w.class)&&r.add(w.id);for(const w of o.assignedAgentIds)r.add(w);return r.size},We=()=>{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)]},Ee=()=>{G(null),M(""),P(""),I(We()),H(""),K("character-male-a.glb"),X([]),U(""),$(!1),_(null),t([]),R({}),te(1),ie(0),le(0),ce(0),W(null),F(!0)},Ie=o=>{var w,re,C;const r=p.find(V=>V.id===o);r&&(G(o),M(r.name),P(r.icon),I(r.color),H(r.description),K(r.model||"character-male-a.glb"),X(r.defaultSkillIds||[]),U(r.instructions||""),$(!!r.customModelPath),_(null),t(r.availableAnimations||[]),R(r.animationMapping||{}),te(r.modelScale||1),ie(((w=r.modelOffset)==null?void 0:w.x)||0),le(((re=r.modelOffset)==null?void 0:re.y)||0),ce(((C=r.modelOffset)==null?void 0:C.z)||0),W(null),F(!0))},Le=async()=>{const o={name:S,icon:N||"🔷",color:D,description:q,defaultSkillIds:Q,instructions:Z||void 0,modelScale:B!==1?B:void 0,modelOffset:ee!==0||oe!==0||se!==0?{x:ee,y:oe,z:se}:void 0,animationMapping:Object.keys(k).length>0?k:void 0,availableAnimations:T.length>0?T:void 0};if(ae||(o.model=L,o.customModelPath=void 0),f)z.updateCustomAgentClass(f,o),b&&await he(f);else if(z.createCustomAgentClass(o),b){const r=no(S);await new Promise(w=>setTimeout(w,100)),await he(r)}F(!1)},he=async o=>{if(b){ge(!0),W(null);try{const r=await Se(me(`/api/custom-models/upload/${o}`),{method:"POST",headers:{"Content-Type":"application/octet-stream","X-Filename":b.name},body:b});if(!r.ok){const w=await r.json();throw new Error(w.error||s("tools:skills.uploadFailed"))}z.updateCustomAgentClass(o,{availableAnimations:T,animationMapping:k,modelScale:B!==1?B:void 0})}catch(r){W(r.message||s("tools:skills.failedToUploadModel")),console.error("Model upload error:",r)}finally{ge(!1)}}},Ge=async o=>{var re;const r=(re=o.target.files)==null?void 0:re[0];if(!r)return;if(W(null),!await lo(r)){W(s("tools:skills.invalidGlbFile"));return}if(r.size>50*1024*1024){W(s("tools:skills.fileTooLarge"));return}try{const C=await to(r);_(r),t(C),$(!0);const V={},ye=C.map(x=>x.toLowerCase()),be=ye.findIndex(x=>x.includes("idle")||x==="static");be>=0&&(V.idle=C[be]);const fe=ye.findIndex(x=>x.includes("walk")||x.includes("run"));fe>=0&&(V.walk=C[fe]);const xe=ye.findIndex(x=>x.includes("work")||x.includes("action")||x.includes("attack")||x.includes("jump"));xe>=0&&(V.working=C[xe]),R(V)}catch(C){W(C.message||s("tools:skills.failedToParseModel")),console.error("Model parse error:",C)}o.target.value=""},De=async()=>{if(f)try{await Se(me(`/api/custom-models/${f}`),{method:"DELETE"})}catch(o){console.error("Failed to delete model:",o)}$(!1),_(null),t([]),R({}),te(1),K("character-male-a.glb")},qe=o=>{window.confirm(s("tools:skills.deleteClassConfirm"))&&z.deleteCustomAgentClass(o)},He=o=>{X(r=>r.includes(o)?r.filter(w=>w!==o):[...r,o])};return d?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"panel-overlay",onClick:g}),e.jsxs("div",{className:"skills-panel side-panel",children:[e.jsxs("div",{className:"panel-header",children:[e.jsx("h3",{children:s(l==="skills"?"tools:skills.title":"tools:skills.agentClasses")}),l==="skills"?e.jsx("button",{className:"btn btn-sm btn-primary",onClick:Me,children:s("tools:skills.newSkill")}):e.jsx("button",{className:"btn btn-sm btn-primary",onClick:Ee,children:s("tools:skills.newClass")}),e.jsx("button",{className:"panel-close",onClick:g,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 ${l==="skills"?"active":""}`,onClick:()=>n("skills"),style:{padding:"8px 16px",background:"transparent",border:"none",borderBottom:l==="skills"?"2px solid var(--accent-blue)":"2px solid transparent",color:l==="skills"?"var(--text-primary)":"var(--text-secondary)",cursor:"pointer",fontWeight:l==="skills"?600:400},children:[s("tools:skills.title")," (",a.length,")"]}),e.jsxs("button",{className:`panel-tab ${l==="classes"?"active":""}`,onClick:()=>n("classes"),style:{padding:"8px 16px",background:"transparent",border:"none",borderBottom:l==="classes"?"2px solid var(--accent-blue)":"2px solid transparent",color:l==="classes"?"var(--text-primary)":"var(--text-secondary)",cursor:"pointer",fontWeight:l==="classes"?600:400},children:[s("tools:skills.agentClasses")," (",p.length,")"]})]}),l==="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:u,onChange:o=>E(o.target.value),style:{width:"100%"}})}),l==="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:A,onChange:o=>J(o.target.value),style:{width:"100%"}})}),e.jsx("div",{className:"panel-content",style:{flex:1,overflowY:"auto",padding:"0 16px"},children:l==="skills"?we.length===0?e.jsx("div",{className:"empty-state",style:{textAlign:"center",padding:"40px 20px",opacity:.6},children:u?e.jsx("p",{children:s("tools:skills.noClassesMatch",{query:u})}):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:we.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:()=>Pe(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(),Re(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:Be(o)}),o.allowedTools.length>0&&e.jsx("span",{title:s("tools:skills.allowedToolsTitle"),children:s("tools:skills.toolCount",{count:o.allowedTools.length})}),o.enabled&&je(o)>0&&e.jsx("span",{style:{color:"var(--accent-green)"},children:s("tools:skills.activeOnAgents",{count:je(o)})})]})]},o.id))}):p.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")})]}):ue.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:A})})}):e.jsx("div",{className:"classes-list",style:{display:"flex",flexDirection:"column",gap:"8px",paddingTop:"12px"},children:ue.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:()=>Ie(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:o.icon}),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=O.find(w=>w.file===o.model))==null?void 0:r.name)||o.model||"Male A"]})]})]}),e.jsx("button",{className:"btn btn-sm btn-secondary",onClick:w=>{w.stopPropagation(),qe(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:l==="skills"?e.jsxs(e.Fragment,{children:[s("tools:skills.total",{count:a.length}),a.filter(o=>o.enabled).length!==a.length&&e.jsxs("span",{children:[" (",s("tools:skills.enabled",{enabledCount:a.filter(o=>o.enabled).length}),")"]})]}):e.jsx(e.Fragment,{children:s("tools:skills.customClassesCount",{count:p.length})})})})]}),e.jsx(oo,{isOpen:j,onClose:()=>m(!1),skillId:h}),v&&e.jsx("div",{className:"modal-overlay visible",onMouseDown:Ne,onClick:Oe,children:e.jsxs("div",{className:"modal skill-editor-modal",children:[e.jsx("div",{className:"modal-header",children:s(f?"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:S,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:de,type:"file",accept:".glb",onChange:Ge,style:{display:"none"}}),ae?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(ve,{customModelFile:b||void 0,customModelUrl:!b&&f?me(`/api/custom-models/${f}`):void 0,modelScale:B,modelOffset:{x:ee,y:oe,z:se},idleAnimation:k.idle!==void 0?k.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:b?`${b.name} (${co(b.size)})`:s("tools:skills.uploaded")})]}),e.jsx("button",{type:"button",onClick:De,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"),": ",B.toFixed(3),"x"]}),e.jsx("input",{type:"range",min:"0",max:"100",step:"1",value:Math.log(B/.01)/Math.log(1e4)*100,onChange:o=>{const r=parseFloat(o.target.value),w=.01*Math.pow(1e4,r/100);te(Math.round(w*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"),": ",ee.toFixed(2)]}),e.jsx("input",{type:"range",min:"-1",max:"1",step:"0.01",value:ee,onChange:o=>ie(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"),": ",oe.toFixed(2)]}),e.jsx("input",{type:"range",min:"-1",max:"1",step:"0.01",value:oe,onChange:o=>le(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"),": ",se.toFixed(2)]}),e.jsx("input",{type:"range",min:"-3",max:"3",step:"0.01",value:se,onChange:o=>ce(parseFloat(o.target.value)),style:{width:"100%"}})]}),T.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:T.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:k.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")}),T.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:k.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")}),T.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:k.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")}),T.map(o=>e.jsx("option",{value:o,children:o},o))]})]})]}),T.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=de.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:()=>ke("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(ve,{modelFile:L,width:120,height:150}),e.jsx("div",{style:{marginTop:"8px",fontSize:"12px",fontWeight:500,color:"var(--text-primary)"},children:ze.name}),e.jsxs("div",{style:{fontSize:"10px",color:"var(--text-secondary)",marginTop:"2px"},children:[Y+1," / ",O.length]})]}),e.jsx("button",{type:"button",onClick:()=>ke("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=de.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")})]}),pe&&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:pe})]}),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")}),e.jsx(ao,{value:N,onChange:P})]}),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:D,onChange:o=>I(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:q,onChange:o=>H(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:a.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")}):a.filter(o=>o.enabled).map(o=>e.jsxs("div",{onClick:()=>He(o.id),style:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 8px",borderRadius:"4px",cursor:"pointer",background:Q.includes(o.id)?"rgba(80, 250, 123, 0.15)":"transparent"},children:[e.jsx("span",{style:{width:"16px",color:"var(--dracula-green)"},children:Q.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:Z,onChange:o=>U(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:()=>F(!1),disabled:ne,children:s("common:buttons.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:Le,disabled:!S.trim()||ne,children:s(ne?"tools:skills.uploading":f?"common:buttons2.saveChanges":"tools:skills.createClass")})]})]})})]}):null}export{wo as SkillsPanel};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as $,r as d,j as e,bl as b}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function R({snapshots:h,isLoading:p=!1,onViewSnapshot:v,onDeleteSnapshot:C,onRestoreSnapshot:y,onExportSnapshot:f,selectedSnapshotId:S,onClose:A}){const{t}=$(["terminal","common"]),[o,g]=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]),N=s=>{l===s?j(a=>a==="asc"?"desc":"asc"):(k(s),j("desc"))},L=async s=>{r(s);try{await C(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"},M=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=>g(s.target.value)}),o&&e.jsx("button",{className:"snapshot-search-clear",onClick:()=>g(""),title:"Clear search",children:"✕"})]}),e.jsxs("div",{className:"snapshot-sort",children:[e.jsxs("button",{className:`snapshot-sort-btn ${l==="createdAt"?"active":""}`,onClick:()=>N("createdAt"),children:[t("terminal:snapshot.sortDate")," ",l==="createdAt"&&(m==="desc"?"↓":"↑")]}),e.jsxs("button",{className:`snapshot-sort-btn ${l==="title"?"active":""}`,onClick:()=>N("title"),children:[t("terminal:snapshot.sortTitle")," ",l==="title"&&(m==="desc"?"↓":"↑")]}),e.jsxs("button",{className:`snapshot-sort-btn ${l==="agentName"?"active":""}`,onClick:()=>N("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:()=>v(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:a.icon}),e.jsx("span",{className:"snapshot-card-agent-name",children:s.agentName}),e.jsx("span",{className:"snapshot-card-date",children:M(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:P=>P.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{R as SnapshotManager};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as Xe,H as Ve,L as Ze,M as Qe,N as es,O as ss,r as t,P as ns,S as ke,U as te,A as ye,w as le,V as as,s as B,h as ts,j as s,W as ls,X as x,Y as os,Z as oe,_ as G,$ as K,a0 as ie,a1 as is}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function Ae(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 ms({isOpen:c,onClose:j,onSpawnStart:S,onSpawnEnd:b,spawnPosition:De,spawnAreaId:v}){const{t:n}=Xe(["terminal","common"]),C=Ve(),$=Ze(),p=Qe(),ce=es(),H=ce.length>0?ce:ss,[m,N]=t.useState(""),[M,P]=t.useState(()=>ns(ke.LAST_CWD)),[i,Y]=t.useState("scout"),[re,D]=t.useState(!1),[Ee,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,Ie]=t.useState(!0),[U,$e]=t.useState("bypass"),[o,V]=t.useState("claude"),[g,L]=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,Pe]=t.useState("gpt-5.3-codex"),[ne,Te]=t.useState("minimax/MiniMax-M1-80k"),[je,Fe]=t.useState(""),[A,Re]=t.useState(""),q=t.useRef(null),ge=t.useRef(!1),_=t.useCallback(()=>{window.__spawnModalAreaContext=null},[]),h=t.useMemo(()=>$.filter(e=>e.enabled),[$]),Ue=["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=>Ue.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 ze=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]),z=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=[...z.map(a=>a.id),...W.map(a=>a.id)];e.length===1&&e[0]!==i&&Y(e[0])},[c,u,z,W,i]);const r=t.useMemo(()=>p.find(e=>e.id===i),[p,i]),We=t.useMemo(()=>{if(r!=null&&r.model)return r.model},[r]),Oe=t.useMemo(()=>{if(r!=null&&r.customModelPath)return le(`/api/custom-models/${r.id}`)},[r]),Be=r==null?void 0:r.modelScale,Ge=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 as(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 I;return((I=B.getAreaForAgent(f.id))==null?void 0:I.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,I]of l)I>w&&(d=f,w=I);d&&P(d)},[c,v,C]),t.useEffect(()=>{if(c){const e=new Set(Array.from(C.values()).map(w=>w.name)),a=Ae(e,H),l=p.find(w=>w.id===i),d=l?`${l.name} ${a}`:a;N(d),q.current&&(q.current.focus(),q.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 Ke=()=>{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(Ae(w,H));return}is(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(),De||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),_(),b(),j()},be=()=>{console.error("[SpawnModal] Agent creation failed"),D(!1),T(!0),_(),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(""),_()};t.useEffect(()=>(window.__spawnModalSuccess=Se,window.__spawnModalError=be,window.__spawnModalDirNotFound=Ce,()=>{_(),delete window.__spawnModalSuccess,delete window.__spawnModalError,delete window.__spawnModalDirNotFound}),[m,i,Se,be,Ce,_]);const{handleMouseDown:He,handleClick:Ye}=ts(j),Je=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:He,onClick:Ye,onKeyDown:Je,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(ls,{agentClass:Ge,modelFile:We,customModelUrl:Oe,modelScale:Be,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:[z.map(e=>s.jsxs("button",{className:`class-chip ${i===e.id?"selected":""}`,onClick:()=>Y(e.id),title:e.description,children:[s.jsx("span",{className:"class-chip-icon",children:e.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("span",{className:"class-chip-icon",children:a.icon}),s.jsx("span",{className:"class-chip-name",children:e.name})]},e.id)}),u&&z.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:q,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(os,{value:M,onChange:e=>{P(e),T(!1)},placeholder:n("terminal:spawn.workingDirPlaceholder"),className:`spawn-input ${Ee?"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:()=>$e(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:()=>Pe(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=>Te(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=>Ie(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=>L(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=>L(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=>L(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=>L(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=>L(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=>Re(e.target.value)}),s.jsxs("div",{className:"spawn-skills-inline",children:[ve.map(e=>{const a=we.has(e.id);return ze.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=>Fe(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:Ke,disabled:re,children:n(re?"common:buttons.deploying":"common:buttons2.deploy")})]})]})})}export{ms as SpawnModal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as I,H as L,a4 as $,r as m,j as s,a2 as f,s as D}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function G({isOpen:o,bossId:c,onClose:l}){var j;const{t:a}=I(["terminal","common"]),g=L(),n=$(c),[i,r]=m.useState(new Set),[u,b]=m.useState(!1),d=Array.from(g.values()).filter(e=>e.class!=="boss"&&(!e.bossId||e.bossId===c));m.useEffect(()=>{o&&n&&r(new Set(n.subordinateIds||[]))},[o,n]);const p=()=>{b(!0),D.assignSubordinates(c,Array.from(i)),setTimeout(()=>{b(!1),l()},300)},y=e=>{const t=new Set(i);t.has(e)?t.delete(e):t.add(e),r(t)},A=()=>{r(new Set(d.map(e=>e.id)))},C=()=>{r(new Set)},w=e=>{e.target===e.currentTarget&&l()},k=e=>{e.key==="Escape"&&l()};if(!o||!n)return null;const h=f.boss,v=((j=n.subordinateIds)==null?void 0:j.length)||0,E=i.size,x=JSON.stringify([...n.subordinateIds||[]].sort())!==JSON.stringify([...i].sort());return s.jsx("div",{className:`modal-overlay ${o?"visible":""}`,onClick:w,onKeyDown:k,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:h.color},children:h.icon}),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:A,children:a("common:buttons.selectAll")}),s.jsx("button",{className:"btn btn-small",onClick:C,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 S;const t=i.has(e.id),N=f[e.class],T=(S=n.subordinateIds)==null?void 0:S.includes(e.id);return s.jsxs("div",{className:`subordinate-item ${t?"selected":""}`,onClick:()=>y(e.id),children:[s.jsx("div",{className:"subordinate-checkbox",children:t?"✓":""}),s.jsx("div",{className:"subordinate-icon",style:{color:N.color},children:N.icon}),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}),T&&s.jsx("div",{className:"subordinate-badge",children:a("common:status.current")})]},e.id)})}),s.jsx("div",{className:"subordinate-assignment-summary",children:x?s.jsxs("span",{className:"summary-changed",children:[v," → ",E," ",a("terminal:supervisor.subordinates").toLowerCase()]}):s.jsxs("span",{className:"summary-unchanged",children:[v," ",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:p,disabled:u||!x,children:a(u?"common:status.saving":"terminal:supervisor.saveTeam")})]})]})})}export{G as SubordinateAssignmentModal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{z as ts,u as ns,B as _s,j as e,C as Is,E as Ms,G as Es,r as g,H as $s,I as Ds,J as Ss,K as Ls,s as Y,m as B}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Xs=1,gs=Xs*2.5;function Rs(s,v,d){const l=v.filter(o=>o.position&&!isNaN(o.position.x)&&!isNaN(o.position.z));let t,i,n,u;if(s.type==="rectangle"){const o=(s.width||10)/2,N=(s.height||10)/2;t=s.center.x-o,i=s.center.x+o,n=s.center.z-N,u=s.center.z+N}else{const o=s.radius||5;t=s.center.x-o,i=s.center.x+o,n=s.center.z-o,u=s.center.z+o}const b=2;if(t+=b,i-=b,n+=b,u-=b,d){const o={...d};if(o.x=Math.max(t,Math.min(i,o.x)),o.z=Math.max(n,Math.min(u,o.z)),fs(o,l,s))return o}const x=(t+i)/2,S=(n+u)/2,j=Math.min(i-x,u-S);for(let o=0;o<j;o+=gs*.5)for(let N=0;N<Math.PI*2;N+=Math.PI/8){const C=x+Math.cos(N)*o,E=S+Math.sin(N)*o,_={x:C,z:E};if(_.x=Math.max(t,Math.min(i,_.x)),_.z=Math.max(n,Math.min(u,_.z)),fs(_,l,s))return _}return{x,z:S}}function fs(s,v,d){for(const l of v){if(!l.position)continue;if(Math.hypot(s.x-l.position.x,s.z-l.position.z)<gs)return!1}if(d.type==="rectangle"){const l=(d.width||10)/2,t=(d.height||10)/2,i=s.x>=d.center.x-l+1&&s.x<=d.center.x+l-1,n=s.z>=d.center.z-t+1&&s.z<=d.center.z+t-1;return i&&n}else{const l=(d.radius||5)-1;return Math.hypot(s.x-d.center.x,s.z-d.center.z)<=l}}function vs(s){switch(s){case"idle":case"running":return"healthy";case"working":case"waiting":case"waiting_permission":case"starting":case"stopping":return"working";case"error":case"offline":case"orphaned":case"stopped":return"error";default:return"unknown"}}function Ps(s){switch(s){case"scout":return"🔍";case"builder":return"🔨";case"debugger":return"🐛";case"architect":return"📐";case"warrior":return"⚔️";case"support":return"🛟";case"boss":return"👑";default:return"🤖"}}function Us(s){switch(s){case"server":return"🖥️";case"link":return"🔗";case"database":return"🗄️";case"docker":return"🐳";case"monitor":return"📊";case"folder":return"📁";case"boss":return"🏰";default:return"🏢"}}function Ys(s,v){const d=[],l=new Set;for(const i of v.values()){if(i.archived)continue;const n=[];for(const u of i.assignedAgentIds){const b=s.get(u);b&&(n.push(b),l.add(u))}d.push({area:i,agents:n,label:i.name,color:i.color})}d.sort((i,n)=>i.label.localeCompare(n.label));const t=[];for(const i of s.values())l.has(i.id)||t.push(i);return t.length>0&&d.push({area:null,agents:t,label:"Unassigned",color:"#555"}),d}function Gs(s,v){const d=[],l=[],t=[];for(const n of s.values())n.status==="working"||n.status==="waiting"||n.status==="waiting_permission"?d.push(n):n.status==="error"||n.status==="offline"||n.status==="orphaned"?t.push(n):v&&v.has(n.id)?d.push(n):l.push(n);const i=[];return t.length>0&&i.push({area:null,agents:t,label:"Errors",color:"#d64545"}),d.length>0&&i.push({area:null,agents:d,label:"Working & Unseen",color:"#f5d76e"}),l.length>0&&i.push({area:null,agents:l,label:"Idle",color:"#5cb88a"}),i}function Hs(s){const v=Date.now(),l=[...Array.from(s.values())].sort((o,N)=>(N.lastActivity||0)-(o.lastActivity||0)),t=[],i=[],n=[],u=[],b=300*1e3,x=3600*1e3,S=1440*60*1e3;for(const o of l){const N=v-(o.lastActivity||0);N<b?t.push(o):N<x?i.push(o):N<S?n.push(o):u.push(o)}const j=[];return t.length>0&&j.push({area:null,agents:t,label:"Just Now (< 5m)",color:"#4ade80"}),i.length>0&&j.push({area:null,agents:i,label:"Recent (5m - 1h)",color:"#60a5fa"}),n.length>0&&j.push({area:null,agents:n,label:"Stale (1h - 1d)",color:"#facc15"}),u.length>0&&j.push({area:null,agents:u,label:"Very Stale (> 1d)",color:"#f87171"}),j}function Zs(s){return s.contextLimit<=0?0:Math.round(s.contextUsed/s.contextLimit*100)}function Bs(s){return s>=80?"red":s>=50?"yellow":"green"}function ms(s){return as(s)}function as(s,v={}){const{prioritizeRecentlyIdle:d=!1}=v;return[...s].sort((l,t)=>{const i={error:0,offline:0,orphaned:0,working:1,waiting:1,waiting_permission:1,idle:2},n=i[l.status]??3,u=i[t.status]??3;if(n!==u)return n-u;if(d&&l.status==="idle"&&t.status==="idle"){const b=!!l.taskLabel,x=!!t.taskLabel;return b!==x?b?-1:1:(t.lastActivity||0)-(l.lastActivity||0)}return l.name.localeCompare(t.name)})}const bs=ts.memo(({agent:s,isSelected:v,isKeyboardFocused:d=!1,onSelect:l,onDoubleClick:t,onChat:i,onFocus:n,onKill:u,onDragStart:b})=>{const{t:x}=ns(["dashboard","common"]),j=_s().has(s.id),o=vs(s.status),N=Ps(s.class),C=Zs(s),E=Bs(C),_=s.taskLabel?`📋 ${s.taskLabel}`:s.currentTask||s.lastAssignedTask,X=s.status==="idle"&&s.lastActivity>0,[,F]=ts.useState(0);return ts.useEffect(()=>{if(!X)return;const z=window.setInterval(()=>F(I=>I+1),15e3);return()=>window.clearInterval(z)},[X]),e.jsxs("div",{className:`dash-card dash-card--${o} ${v?"dash-card--selected":""} ${d?"dash-card--keyboard-focused":""}`,"data-agent-id":s.id,onClick:l,onDoubleClick:z=>{z.stopPropagation(),t()},onDragStart:z=>{b==null||b(s),z.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[e.jsxs("div",{className:"dash-card__row1",children:[e.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${o}`}),e.jsx("span",{className:"dash-card__name",children:s.name}),e.jsxs("span",{className:"dash-card__class",children:[N," ",s.class]}),e.jsxs("span",{className:`dash-card__provider dash-card__provider--${s.provider}`,children:[s.provider==="codex"?"🔸":s.provider==="opencode"?"🟢":"🤖"," ",s.provider]}),j&&e.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),e.jsxs("div",{className:"dash-card__row2",children:[e.jsx("span",{className:`dash-card__status dash-card__status--${o}`,children:j?"Unseen":s.status}),e.jsxs("div",{className:"dash-card__context",children:[e.jsx("div",{className:"dash-card__context-bar",children:e.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${E}`,style:{width:`${C}%`}})}),e.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${E}`,children:[C,"%"]})]})]}),e.jsxs("div",{className:"dash-card__row3",children:[e.jsxs("span",{className:"dash-card__workdir",title:s.cwd,children:["📁 ",s.cwd.split("/").pop()||s.cwd]}),X&&e.jsxs("span",{className:"dash-card__idle-time",style:{color:Es(s.lastActivity)},title:Ms(s.lastActivity),children:["⏱ ",Is(s.lastActivity)]})]}),_&&e.jsx("div",{className:"dash-card__row4",children:e.jsx("span",{className:"dash-card__task",children:_})}),e.jsxs("div",{className:"dash-card__actions",children:[i&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:z=>{z.stopPropagation(),i()},title:x("cards.openTerminal"),children:x("cards.chat")}),u&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:z=>{z.stopPropagation(),u()},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});bs.displayName="AgentCard";const ps=({buildings:s,onSelectBuilding:v})=>{const{t:d}=ns(["dashboard"]),l=g.useMemo(()=>Array.from(s.values()).sort((t,i)=>t.name.localeCompare(i.name)),[s]);return e.jsxs("div",{className:"dashboard-view__buildings",children:[e.jsxs("div",{className:"dashboard-view__buildings-header",children:[e.jsx("span",{className:"dashboard-view__buildings-title",children:d("buildings.title")}),e.jsx("span",{className:"dashboard-view__buildings-count",children:l.length})]}),e.jsx("div",{className:"dashboard-view__buildings-row",children:l.map(t=>{const i=vs(t.status),n=Us(t.type);return e.jsxs("button",{className:`dash-pill dash-pill--${i}`,onClick:()=>v==null?void 0:v(t.id),title:`${t.name} (${t.type}) - ${t.status}`,children:[e.jsx("span",{className:"dash-pill__icon",children:n}),e.jsx("span",{className:"dash-pill__name",children:t.name}),e.jsx("span",{className:`dash-pill__dot dash-pill__dot--${i}`})]},t.id)})})]})};ps.displayName="BuildingPills";function Ks({onSelectAgent:s,onFocusAgent:v,onKillAgent:d,onSelectBuilding:l,onOpenTerminal:t,onFocusZone:i}){const{t:n}=ns(["dashboard","common"]),u=$s(),b=Ds(),x=Ss(),S=Ls(),j=_s(),[o,N]=g.useState(""),[C,E]=g.useState("all"),[_,X]=g.useState("zone"),[F,z]=g.useState(new Set),[I,J]=g.useState(null),[ws,V]=g.useState(null),[G,Q]=g.useState(!1),[M,T]=g.useState(null),W=g.useMemo(()=>{const a=Array.from(u.values());return{total:a.length,working:a.filter(h=>h.status==="working"||h.status==="waiting"||h.status==="waiting_permission").length,idle:a.filter(h=>h.status==="idle").length,error:a.filter(h=>h.status==="error"||h.status==="offline"||h.status==="orphaned").length}},[u]),rs=g.useMemo(()=>_==="zone"?Ys(u,x):_==="status"?Gs(u,j):Hs(u),[u,x,_,j]),K=g.useMemo(()=>{const a=o.toLowerCase().trim(),h=rs.map(p=>({...p,agents:p.agents.filter(k=>{if(C==="working"){if(k.status!=="working"&&k.status!=="waiting"&&k.status!=="waiting_permission")return!1}else if(C==="error"&&k.status!=="error"&&k.status!=="offline"&&k.status!=="orphaned")return!1;return!(a&&!k.name.toLowerCase().includes(a)&&!k.class.toLowerCase().includes(a))})}));return _==="zone"?h:h.filter(p=>p.agents.length>0)},[rs,C,o,_]),O=g.useCallback(a=>a.area?`area:${a.area.id}`:`${_}:${a.label}`,[_]),$=g.useMemo(()=>{const a=[];return K.forEach(h=>{const p=O(h);if(F.has(p))return;const k=_==="status"?as(h.agents,{prioritizeRecentlyIdle:!0}):ms(h.agents);a.push(...k)}),a},[K,F,_,O]),xs=g.useCallback(a=>{z(h=>{const p=new Set(h);return p.has(a)?p.delete(a):p.add(a),p})},[]),Ns=g.useCallback(a=>{t==null||t(a)},[t]),ks=g.useCallback(a=>{J(a)},[]),js=g.useCallback((a,h)=>{a.preventDefault(),a.dataTransfer.dropEffect="move",V(h)},[]),ys=g.useCallback(()=>{V(null)},[]),Cs=g.useCallback(a=>{if(!I)return;if(a===null){const R=Y.getState(),r=Array.from(R.areas.values()).find(c=>c.assignedAgentIds.includes(I.id));r&&Y.unassignAgentFromArea(I.id,r.id),J(null),V(null);return}const h=x.get(a);if(!h)return;const p=Array.from(u.values()),k=Rs(h,p,I.position);Y.updateAgent({...I,position:{...I.position,x:k.x,z:k.z}}),Y.assignAgentToArea(I.id,a),J(null),V(null)},[I,x,u]);return g.useEffect(()=>{if($.length===0){Q(!1),T(null);return}G&&(!M||!$.some(a=>a.id===M))&&(T($[0].id),s==null||s($[0].id))},[$,G,M,s]),g.useEffect(()=>{const a=r=>r instanceof HTMLElement?r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.tagName==="SELECT"||r.isContentEditable:!1,h=r=>r instanceof HTMLElement?!!r.closest(".guake-terminal")||r.classList.contains("guake-input")||r.classList.contains("agent-panel-input"):!1,p=r=>{const c=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(L=>L.dataset.agentId===r);c==null||c.scrollIntoView({block:"nearest",inline:"nearest"})},k=(r,c)=>{var os,cs,ds,ls,us,hs;const L=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(f=>{const w=f.dataset.agentId;if(!w)return null;const D=f.getBoundingClientRect();return{id:w,centerX:D.left+D.width/2,centerY:D.top+D.height/2,height:D.height}}).filter(f=>f!==null).sort((f,w)=>f.centerY-w.centerY||f.centerX-w.centerX);if(L.length===0)return r;const ss=L.reduce((f,w)=>f+w.height,0)/L.length,es=Math.max(18,ss*.6),A=[];for(const f of L){const w=A[A.length-1];if(!w){A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}]);continue}const D=w.reduce((As,zs)=>As+zs.centerY,0)/w.length;Math.abs(f.centerY-D)<=es?w.push({id:f.id,centerX:f.centerX,centerY:f.centerY}):A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}])}A.forEach(f=>f.sort((w,D)=>w.centerX-D.centerX));const H=A.findIndex(f=>f.some(w=>w.id===r));if(H===-1)return((cs=(os=A[0])==null?void 0:os[0])==null?void 0:cs.id)??r;const P=A[H],y=P.findIndex(f=>f.id===r);if(y===-1)return((ls=(ds=A[0])==null?void 0:ds[0])==null?void 0:ls.id)??r;if(c==="left")return((us=P[Math.max(0,y-1)])==null?void 0:us.id)??r;if(c==="right")return((hs=P[Math.min(P.length-1,y+1)])==null?void 0:hs.id)??r;const q=c==="up"?Math.max(0,H-1):Math.min(A.length-1,H+1),m=A[q],Z=P[y].centerX;let U=m[0],is=Math.abs(U.centerX-Z);for(const f of m){const w=Math.abs(f.centerX-Z);w<is&&(U=f,is=w)}return(U==null?void 0:U.id)??r},R=r=>{const c=Y.getShortcuts(),L=c.find(m=>m.id==="dashboard-selector-toggle"),ss=c.find(m=>m.id==="dashboard-vim-left"),es=c.find(m=>m.id==="dashboard-vim-down"),A=c.find(m=>m.id==="dashboard-vim-up"),H=c.find(m=>m.id==="dashboard-vim-right"),P=c.find(m=>m.id==="open-terminal"),y=Y.getState();if(a(r.target))if(!y.terminalOpen&&h(r.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(B(r,L)){if($.length===0)return;r.preventDefault(),r.stopPropagation(),Q(!0),T(m=>{const Z=m&&$.some(U=>U.id===m)?m:$[0].id;return s==null||s(Z),window.setTimeout(()=>p(Z),0),Z});return}const q=B(r,ss)||r.key==="ArrowLeft"?"left":B(r,es)||r.key==="ArrowDown"?"down":B(r,A)||r.key==="ArrowUp"?"up":B(r,H)||r.key==="ArrowRight"?"right":null;if(q&&G&&M){r.preventDefault(),r.stopPropagation();const m=k(M,q);m!==M&&(T(m),s==null||s(m),window.setTimeout(()=>p(m),0));return}if(B(r,P)){if(y.terminalOpen)return;if(G&&M&&y.agents.has(M)){r.preventDefault(),t==null||t(M);return}if(y.selectedAgentIds.size===1){r.preventDefault();const m=Array.from(y.selectedAgentIds)[0];t==null||t(m);return}if(y.lastSelectedAgentId&&y.agents.has(y.lastSelectedAgentId)){r.preventDefault(),t==null||t(y.lastSelectedAgentId);return}}};return document.addEventListener("keydown",R,!0),()=>document.removeEventListener("keydown",R,!0)},[$,G,M,t,s]),g.useEffect(()=>{const a=document.activeElement;a instanceof HTMLElement&&a.closest(".guake-terminal")&&!Y.getState().terminalOpen&&a.blur()},[]),e.jsxs("div",{className:"dashboard-view",children:[e.jsxs("div",{className:"dashboard-view__topbar",children:[e.jsxs("div",{className:"dashboard-view__metrics",children:[e.jsxs("button",{className:`dashboard-view__metric-btn ${C==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.total}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:labels.agents")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${C==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("working"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.working}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.working")})]}),e.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.idle}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.idle")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${C==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("error"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.error}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.error")})]})]}),e.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:n("searchPlaceholder"),value:o,onChange:a=>N(a.target.value)})]}),e.jsxs("div",{className:"dashboard-view__grouping",children:[e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("zone"),children:n("grouping.byZone")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("status"),children:n("grouping.byStatus")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("activity"),children:n("grouping.byActivity")})]}),e.jsxs("div",{className:"dashboard-view__content",children:[K.map(a=>{const h=O(a),p=F.has(h),k=_==="status"?as(a.agents,{prioritizeRecentlyIdle:!0}):ms(a.agents),R=a.agents.filter(c=>c.status==="working"||c.status==="waiting"||c.status==="waiting_permission").length,r=a.agents.filter(c=>j.has(c.id)).length;return e.jsxs("div",{className:`dashboard-view__zone ${ws===(a.area?a.area.id:null)&&I?"dashboard-view__zone--drag-over":""}`,onDragOver:c=>js(c,a.area?a.area.id:null),onDragLeave:ys,onDrop:()=>Cs(a.area?a.area.id:null),children:[e.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>xs(h),children:[e.jsxs("div",{className:"dashboard-view__zone-left",children:[e.jsx("span",{className:`dashboard-view__zone-chevron ${p?"dashboard-view__zone-chevron--collapsed":""}`,children:"▼"}),e.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:a.color}}),e.jsx("span",{className:"dashboard-view__zone-name",children:a.label}),e.jsxs("span",{className:"dashboard-view__zone-count",children:[n("agentCount",{count:a.agents.length}),R>0&&e.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",R," ",n("working")]}),r>0&&e.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",r," Unseen"]})]})]}),a.area&&i&&e.jsx("button",{className:"dashboard-view__zone-focus",onClick:c=>{c.stopPropagation(),i(a.area.id)},title:n("focusZone"),children:n("focusZone")})]}),!p&&e.jsx("div",{className:"dashboard-view__zone-grid",children:k.map(c=>e.jsx(bs,{agent:c,isSelected:S.has(c.id),isKeyboardFocused:G&&M===c.id,onSelect:()=>{s==null||s(c.id),Q(!0),T(c.id)},onDoubleClick:()=>Ns(c.id),onChat:()=>t==null?void 0:t(c.id),onFocus:v?()=>v(c.id):void 0,onKill:d?()=>d(c.id):void 0,onDragStart:ks},c.id))})]},h)}),K.length===0&&e.jsx("div",{className:"dashboard-view__empty",children:o?n("noAgentsMatching",{search:o}):n("noAgentsSpawned")}),b.size>0&&e.jsx(ps,{buildings:b,onSelectBuilding:l})]})]})}export{Ks as DashboardView};
|