@weppy/roblox-mcp 2.10.0 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dashboard/dist/assets/{AssetsPage-D9X2pUea.js → AssetsPage-DFC---br.js} +1 -1
  3. package/dashboard/dist/assets/{ChangelogDetailPage-Bc77mNht.js → ChangelogDetailPage-gvZDaLft.js} +1 -1
  4. package/dashboard/dist/assets/{ChangelogPage-Cvy3ismU.js → ChangelogPage-eOFIHxbD.js} +1 -1
  5. package/dashboard/dist/assets/{ConfirmModal-CEmy8izm.js → ConfirmModal-BqCEvp7Y.js} +1 -1
  6. package/dashboard/dist/assets/ConnectionPage-Ca5WLCm3.css +1 -0
  7. package/dashboard/dist/assets/ConnectionPage-DAz-lhiE.js +11 -0
  8. package/dashboard/dist/assets/{ControlsPage-CkTB6mEk.js → ControlsPage-CKEswTa6.js} +1 -1
  9. package/dashboard/dist/assets/{CurrentPlaceScope-CuZXV9Ku.js → CurrentPlaceScope-C8U9I15o.js} +1 -1
  10. package/dashboard/dist/assets/{GameChangeDetail-D2QTkbEB.js → GameChangeDetail-CMSmIwO-.js} +1 -1
  11. package/dashboard/dist/assets/{InfoLabel-BUXacsTE.js → InfoLabel-BAhsgLcj.js} +1 -1
  12. package/dashboard/dist/assets/{OverviewPage-CX5zVj8P.js → OverviewPage-COMQ7wYS.js} +1 -1
  13. package/dashboard/dist/assets/{PageHeader-B0qiATU4.js → PageHeader-Bfy2f-GH.js} +1 -1
  14. package/dashboard/dist/assets/{PlaytestPage-folHMgTW.js → PlaytestPage-BIkP1kCO.js} +1 -1
  15. package/dashboard/dist/assets/{SettingsPage-nlNo4CBL.js → SettingsPage-ClSPo4J8.js} +1 -1
  16. package/dashboard/dist/assets/{StatusBadge-B2VLfqa6.js → StatusBadge-Df9BQsJU.js} +1 -1
  17. package/dashboard/dist/assets/{SyncPage-Bi8xaHnB.js → SyncPage-O1vlpViJ.js} +1 -1
  18. package/dashboard/dist/assets/{Tabs-DqGYr78-.js → Tabs-Ccrw7Hjb.js} +1 -1
  19. package/dashboard/dist/assets/{ToolsPage-DVYql6ES.js → ToolsPage-CdPa3eYv.js} +1 -1
  20. package/dashboard/dist/assets/{TooltipText-DaLR7eg1.js → TooltipText-CGH7dKN6.js} +1 -1
  21. package/dashboard/dist/assets/{UiStudioPage-CHzKSJCc.js → UiStudioPage-io4UBG0Y.js} +1 -1
  22. package/dashboard/dist/assets/{WhatsNewPage-D5LMzwyf.js → WhatsNewPage-CGKwvik4.js} +1 -1
  23. package/dashboard/dist/assets/{copy-0T6g5IWT.js → copy-D-nSZB9j.js} +1 -1
  24. package/dashboard/dist/assets/{index-BDJHcdyQ.js → index-CnXGGM07.js} +13 -13
  25. package/dashboard/dist/assets/{sample-requests-Fif4AVnz.js → sample-requests-ythz0BoY.js} +1 -1
  26. package/dashboard/dist/assets/{useLiveUptime-KCA8LzCI.js → useLiveUptime-1Et9Q6mq.js} +1 -1
  27. package/dashboard/dist/assets/{useSettings-BJSPSJ0b.js → useSettings-DKMlodE_.js} +1 -1
  28. package/dashboard/dist/index.html +1 -1
  29. package/dist/index.js +78 -78
  30. package/package.json +1 -1
  31. package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
  32. package/dashboard/dist/assets/ConnectionPage-B5daijue.css +0 -1
  33. package/dashboard/dist/assets/ConnectionPage-C_XNqIG-.js +0 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weppy/roblox-mcp",
3
- "version": "2.10.0",
3
+ "version": "2.10.1",
4
4
  "description": "MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
Binary file
@@ -1 +0,0 @@
1
- ._container_1h084_2{max-height:200px;overflow-y:auto;font-family:var(--font-code);font-size:12px;line-height:1.6;padding:8px 12px;background:var(--bg-secondary);border-radius:4px}._entry_1h084_14{display:flex;gap:8px;white-space:nowrap}._timestamp_1h084_21{color:var(--text-muted);flex-shrink:0}._message_1h084_27{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis}._warn_1h084_34 ._message_1h084_27{color:var(--warning)}._error_1h084_39 ._message_1h084_27{color:var(--error)}._empty_1h084_44{color:var(--text-muted);font-style:italic;padding:8px 0}._page_ralzo_2{display:flex;flex-direction:column;gap:16px;width:100%;max-width:1180px}._card_ralzo_11{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._topologyCard_ralzo_19{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:18px 20px 20px}._topologyDisconnected_ralzo_26{border-color:var(--error-border)}._topologyHeader_ralzo_30{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;margin-bottom:18px}._topologyIntro_ralzo_38{margin:-6px 0 0;color:var(--text-secondary);font-size:13px;line-height:1.5}._topologyNetwork_ralzo_45{position:relative}._topologyLinks_ralzo_49{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;width:100%;height:100%;pointer-events:none;overflow:visible}._topologyLink_ralzo_49{stroke:color-mix(in srgb,var(--accent) 62%,var(--border));stroke-linecap:round;stroke-width:1.5;opacity:.82}._topologyLink_agent_ralzo_66{stroke:color-mix(in srgb,var(--accent) 58%,var(--border))}._topologyLink_studio_ralzo_70{stroke:color-mix(in srgb,var(--accent) 66%,var(--border))}._topologyGrid_ralzo_74{position:relative;z-index:1;display:grid;grid-template-columns:minmax(220px,1fr) minmax(220px,.82fr) minmax(240px,1.18fr);align-items:start;gap:52px}._topologyColumn_ralzo_83{min-width:0;display:flex;flex-direction:column;gap:10px}._topologyColumnHeader_ralzo_90{display:flex;align-items:center;gap:8px;min-height:28px;color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:700}._topologyColumnHeaderSpacer_ralzo_101{min-height:28px}._topologyCount_ralzo_105{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 6px;border-radius:var(--radius-pill);background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);font-family:var(--font-code);font-size:11px}._topologyList_ralzo_120{display:flex;flex-direction:column;gap:8px;justify-content:flex-start;min-height:178px}._topologyListCentered_ralzo_128{justify-content:center}._topologyNode_ralzo_132{min-width:0;border:1px solid var(--border);border-radius:8px;background:var(--bg-secondary);padding:10px 12px}._topologyNodeTitle_ralzo_140{display:flex;align-items:center;min-width:0;gap:8px;color:var(--text-primary);font-family:var(--font-label);font-size:13px;font-weight:600}._topologyNodeTitle_ralzo_140 strong,._topologyNodeTitle_ralzo_140 span{min-width:0}._topologyNodeMeta_ralzo_156,._topologyNodeSubtle_ralzo_157{margin-top:6px;color:var(--text-secondary);font-family:var(--font-code);font-size:11px;line-height:1.4;overflow-wrap:anywhere}._topologyNodeSubtle_ralzo_157{color:var(--text-muted)}._topologyState_ralzo_170{margin-left:auto;flex:0 0 auto;border:1px solid var(--border);border-radius:var(--radius-pill);padding:2px 7px;background:color-mix(in srgb,var(--bg-card) 76%,transparent);color:var(--text-secondary);font-family:var(--font-label);font-size:10px;font-weight:600}._topologyEmpty_ralzo_183{min-height:82px;display:flex;align-items:center;justify-content:center;border:1px dashed var(--border);border-radius:8px;color:var(--text-muted);background:color-mix(in srgb,var(--bg-secondary) 58%,transparent);padding:12px;text-align:center;font-size:12px;line-height:1.45}._topologyOverflow_ralzo_198{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:34px;padding:6px 8px 6px 12px;border:1px solid var(--border);border-radius:7px;background:color-mix(in srgb,var(--bg-card) 72%,transparent);color:var(--text-secondary);font-family:var(--font-label);font-size:12px}._topologyOverflowButton_ralzo_213{flex:0 0 auto;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;font-family:var(--font-label);font-size:11px;font-weight:600;padding:4px 8px;transition:background var(--transition),border-color var(--transition),color var(--transition)}._topologyOverflowButton_ralzo_213:hover{border-color:var(--border-highlight);background:var(--accent-dim);color:var(--accent)}._topologyServerColumn_ralzo_236{min-width:0;display:flex;flex-direction:column;gap:10px}._topologyServer_ralzo_236{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:178px;border-color:color-mix(in srgb,var(--accent) 42%,var(--border));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 16%,transparent)}._topologyServerIcon_ralzo_254{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--border-highlight);border-radius:50%;background:var(--accent-dim);color:var(--accent);margin-bottom:10px}._topologyServerBody_ralzo_267{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0;width:100%}._topologyServerTitle_ralzo_276{color:var(--text-primary);font-family:var(--font-label);font-size:15px;font-weight:700}._topologyServerMeta_ralzo_283{color:var(--text-secondary);font-family:var(--font-code);font-size:11px;overflow-wrap:anywhere}._routingSummaryCompact_ralzo_290{display:flex;justify-content:center;width:100%;min-width:0}._disabled_ralzo_298{opacity:.4;pointer-events:none}._cardHeader_ralzo_304{font-family:var(--font-label);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);margin-bottom:12px;display:flex;align-items:center;justify-content:space-between}._cardHint_ralzo_317{margin:-4px 0 12px;color:var(--text-muted);font-size:12px;line-height:1.5}._clearButton_ralzo_324{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger-text);border-radius:var(--radius-control);padding:6px 12px;font-family:var(--font-label);font-size:12px;font-weight:600;cursor:pointer;transition:background var(--transition),border-color var(--transition),color var(--transition)}._clearButton_ralzo_324:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._clearButton_ralzo_324:focus-visible{outline:none;box-shadow:var(--focus-ring)}._serverGrid_ralzo_348{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;font-family:var(--font-code);font-size:13px}._serverGrid_ralzo_348 dt{color:var(--text-muted)}._serverGrid_ralzo_348 dd{color:var(--text-primary);margin:0}._statusRow_ralzo_366{display:flex;align-items:center;gap:16px;margin-bottom:12px}._metaItem_ralzo_373{font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._table_ralzo_380{width:100%;border-collapse:collapse;font-family:var(--font-code);font-size:12px}._table_ralzo_380 th{text-align:left;color:var(--text-muted);font-weight:400;padding:4px 8px 4px 0;border-bottom:1px solid var(--border)}._table_ralzo_380 td{padding:6px 8px 6px 0;color:var(--text-primary)}._tableWrap_ralzo_400{overflow-x:auto}._table_ralzo_380 tr:hover td{background:var(--accent-dim)}._routingSummary_ralzo_290{display:inline-flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}._manageLink_ralzo_416{display:inline-flex;align-items:center;height:24px;padding:0 8px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-primary);font-family:var(--font-label);font-size:11px;font-weight:600;text-decoration:none;transition:border-color var(--transition),background var(--transition),color var(--transition)}._manageLink_ralzo_416:hover{border-color:var(--border-highlight);background:var(--accent-dim);color:var(--accent);text-decoration:none}._segment_ralzo_442,._segmentActive_ralzo_443{height:28px;padding:0 10px;border:none;border-right:1px solid var(--border);background:transparent;color:var(--text-secondary);font-family:var(--font-label);font-size:12px;cursor:pointer}._segment_ralzo_442:last-child,._segmentActive_ralzo_443:last-child{border-right:none}._segment_ralzo_442:hover:not(:disabled){background:var(--accent-dim);color:var(--accent)}._segmentActive_ralzo_443{background:var(--accent-dim);color:var(--text-primary);font-weight:600}._segment_ralzo_442:disabled,._segmentActive_ralzo_443:disabled{cursor:default;opacity:.55}._targetPrimary_ralzo_477{white-space:nowrap}._monoMuted_ralzo_481{color:var(--text-secondary)}._copyIconButton_ralzo_485{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-left:6px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;vertical-align:middle;transition:border-color var(--transition),background var(--transition),color var(--transition)}._copyIconButton_ralzo_485:hover{color:var(--accent);border-color:var(--border-highlight);background:var(--accent-dim)}._routingBadge_ralzo_510{display:inline-flex;align-items:center;min-height:22px;padding:0 8px;border:1px solid var(--border-highlight);border-radius:var(--radius-control);background:var(--accent-dim);color:var(--text-primary);font-family:var(--font-label);font-size:11px;font-weight:600}._toggleBtn_ralzo_525{background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:12px;padding:0 4px;transition:color var(--transition)}._toggleBtn_ralzo_525:hover{color:var(--accent)}._disconnected_ralzo_540{text-align:center;padding:32px 16px}._disconnected_ralzo_540 h3{color:var(--error);font-size:16px;margin:0 0 8px}._disconnected_ralzo_540 p{color:var(--text-secondary);font-size:13px;margin:0 0 4px}._disconnectedActions_ralzo_557{display:flex;gap:8px;justify-content:center;margin-top:16px}._btn_ralzo_564{font-family:var(--font-label);font-size:12px;padding:6px 14px;border-radius:var(--radius-control);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btn_ralzo_564:hover{border-color:var(--accent);background:var(--accent-dim)}._activity_active_ralzo_582,._activity_stale_ralzo_583,._activity_unknown_ralzo_584{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle}._activity_active_ralzo_582{background:var(--success);box-shadow:0 0 4px var(--success)}._activity_stale_ralzo_583{background:var(--text-muted)}._activity_unknown_ralzo_584{background:var(--text-muted);opacity:.4}._killBtn_ralzo_608{font-family:var(--font-label);font-size:11px;padding:3px 10px;border-radius:var(--radius-control);border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger-text);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._killBtn_ralzo_608:hover{background:var(--danger-hover-bg);border-color:var(--danger);color:var(--danger-text)}._killBtn_ralzo_608:focus-visible{outline:none;box-shadow:var(--focus-ring)}._emptyRow_ralzo_632{color:var(--text-muted);font-style:italic}@media(max-width:980px){._topologyHeader_ralzo_30{flex-direction:column;align-items:stretch}._topologyGrid_ralzo_74{grid-template-columns:1fr;gap:10px}._topologyColumnHeaderSpacer_ralzo_101{display:none}._topologyServer_ralzo_236{min-height:150px}}@media(max-width:640px){._card_ralzo_11,._topologyCard_ralzo_19{padding:14px}._topologyNodeTitle_ralzo_140{flex-wrap:wrap}._topologyState_ralzo_170{margin-left:0}}
@@ -1,11 +0,0 @@
1
- import{i as Z,u as oo,r as d,j as o,f as to,a as H,D as no,L as so,M as co,k as V,e as lo,l as io,s as ao}from"./index-BDJHcdyQ.js";import{I as h}from"./InfoLabel-BUXacsTE.js";import{P as ro}from"./PageHeader-B0qiATU4.js";import{S as eo}from"./StatusBadge-B2VLfqa6.js";import{T as go}from"./TooltipText-DaLR7eg1.js";import{C as X}from"./ConfirmModal-CEmy8izm.js";import{u as po,f as uo}from"./useLiveUptime-KCA8LzCI.js";import{C as K}from"./copy-0T6g5IWT.js";import"./ConfirmModal.module-D1aZY2bQ.js";/**
2
- * @license lucide-react v1.8.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const ho=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],yo=Z("bot",ho);/**
7
- * @license lucide-react v1.8.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const mo=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],xo=Z("server",mo),_o="_container_1h084_2",jo="_entry_1h084_14",vo="_timestamp_1h084_21",fo="_message_1h084_27",Co="_warn_1h084_34",So="_error_1h084_39",bo="_empty_1h084_44",D={container:_o,entry:jo,timestamp:vo,message:fo,warn:Co,error:So,empty:bo};function No(e){const s=new Date(e);return Number.isNaN(s.getTime())?e:`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function wo({entries:e}){const{t:s}=oo(),n=d.useRef(null);return d.useEffect(()=>{const l=n.current;l&&(l.scrollTop=l.scrollHeight)},[e.length]),o.jsx("div",{ref:n,className:D.container,children:e.length===0?o.jsx("div",{className:D.empty,children:s("connection.log.empty","No events yet")}):e.map((l,r)=>o.jsxs("div",{className:`${D.entry} ${l.type?D[l.type]:""}`,children:[o.jsx("span",{className:D.timestamp,children:No(l.timestamp)}),o.jsx("span",{className:D.message,children:l.message})]},r))})}const J=50;function Io(){const e=new Date;return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function ko(){const{level:e,status:s,error:n}=to(),[l,r]=d.useState(null),[j,g]=d.useState(null),[c,L]=d.useState([]),b=d.useRef(null),z=d.useCallback((p,v)=>{L(w=>{const _=[...w,{timestamp:Io(),message:p,type:v}];return _.length>J?_.slice(-J):_})},[]),y=d.useCallback(async()=>{try{const p=await H.get("/connection-info");r(p)}catch{r(null)}},[]),A=d.useCallback(async()=>{try{const p=await H.get("/api/dashboard/studio-routing");g(p)}catch{g(null)}},[]),I=d.useCallback(async p=>{const v=await H.patch("/api/dashboard/studio-routing",p);return g(v),await y(),v},[y]),P=d.useCallback(async()=>{try{const p=await H.get("/api/dashboard/connection-log");L(p.entries??[])}catch{L([])}},[]),$=d.useCallback(async()=>{await H.post("/api/dashboard/connection-log/clear"),L([])},[]),N=d.useCallback(async p=>{await H.post("/api/dashboard/kill-agent",{instanceId:p}),await y()},[y]);return d.useEffect(()=>{e!=="disconnected"&&s?(y(),A()):g(null),P()},[e,s,y,P,A]),d.useEffect(()=>{const p=new no;b.current=p,p.connect();const v=p.on("connection",_=>{const u=_;u.status!=="updated"&&u.clientId&&z(`Plugin ${u.status} — ${u.clientId}`,u.status==="disconnected"?"warn":"info"),y(),A()}),w=p.on("mcp_status",_=>{const u=_,F=u.status==="registered"?"registered":"unregistered";z(`MCP ${F} — ${u.aiClientName}`,u.status==="registered"?"info":"warn"),y(),A()});return()=>{v(),w(),p.disconnect(),b.current=null}},[z,y,A]),{status:s,connectionInfo:l,studioRouting:j,connectionLog:c,level:e,error:n,clearConnectionLog:$,killAgent:N,updateStudioRouting:I}}const Lo="_page_ralzo_2",zo="_card_ralzo_11",Ao="_topologyCard_ralzo_19",Mo="_topologyDisconnected_ralzo_26",Po="_topologyHeader_ralzo_30",Bo="_topologyIntro_ralzo_38",$o="_topologyNetwork_ralzo_45",Eo="_topologyLinks_ralzo_49",To="_topologyLink_ralzo_49",Ho="_topologyLink_agent_ralzo_66",Do="_topologyLink_studio_ralzo_70",Oo="_topologyGrid_ralzo_74",Fo="_topologyColumn_ralzo_83",Uo="_topologyColumnHeader_ralzo_90",Go="_topologyColumnHeaderSpacer_ralzo_101",qo="_topologyCount_ralzo_105",Wo="_topologyList_ralzo_120",Vo="_topologyListCentered_ralzo_128",Ko="_topologyNode_ralzo_132",Yo="_topologyNodeTitle_ralzo_140",Ro="_topologyNodeMeta_ralzo_156",Xo="_topologyNodeSubtle_ralzo_157",Jo="_topologyState_ralzo_170",Qo="_topologyEmpty_ralzo_183",Zo="_topologyOverflow_ralzo_198",oe="_topologyOverflowButton_ralzo_213",ee="_topologyServerColumn_ralzo_236",te="_topologyServer_ralzo_236",ne="_topologyServerIcon_ralzo_254",se="_topologyServerBody_ralzo_267",ce="_topologyServerTitle_ralzo_276",le="_topologyServerMeta_ralzo_283",ie="_routingSummaryCompact_ralzo_290",ae="_disabled_ralzo_298",re="_cardHeader_ralzo_304",de="_cardHint_ralzo_317",ge="_clearButton_ralzo_324",pe="_serverGrid_ralzo_348",ue="_statusRow_ralzo_366",he="_metaItem_ralzo_373",ye="_table_ralzo_380",me="_tableWrap_ralzo_400",xe="_routingSummary_ralzo_290",_e="_manageLink_ralzo_416",je="_segment_ralzo_442",ve="_segmentActive_ralzo_443",fe="_targetPrimary_ralzo_477",Ce="_monoMuted_ralzo_481",Se="_copyIconButton_ralzo_485",be="_routingBadge_ralzo_510",Ne="_toggleBtn_ralzo_525",we="_disconnected_ralzo_540",Ie="_disconnectedActions_ralzo_557",ke="_btn_ralzo_564",Le="_activity_active_ralzo_582",ze="_activity_stale_ralzo_583",Ae="_activity_unknown_ralzo_584",Me="_killBtn_ralzo_608",Pe="_emptyRow_ralzo_632",t={page:Lo,card:zo,topologyCard:Ao,topologyDisconnected:Mo,topologyHeader:Po,topologyIntro:Bo,topologyNetwork:$o,topologyLinks:Eo,topologyLink:To,topologyLink_agent:Ho,topologyLink_studio:Do,topologyGrid:Oo,topologyColumn:Fo,topologyColumnHeader:Uo,topologyColumnHeaderSpacer:Go,topologyCount:qo,topologyList:Wo,topologyListCentered:Vo,topologyNode:Ko,topologyNodeTitle:Yo,topologyNodeMeta:Ro,topologyNodeSubtle:Xo,topologyState:Jo,topologyEmpty:Qo,topologyOverflow:Zo,topologyOverflowButton:oe,topologyServerColumn:ee,topologyServer:te,topologyServerIcon:ne,topologyServerBody:se,topologyServerTitle:ce,topologyServerMeta:le,routingSummaryCompact:ie,disabled:ae,cardHeader:re,cardHint:de,clearButton:ge,serverGrid:pe,statusRow:ue,metaItem:he,table:ye,tableWrap:me,routingSummary:xe,manageLink:_e,segment:je,segmentActive:ve,targetPrimary:fe,monoMuted:Ce,copyIconButton:Se,routingBadge:be,toggleBtn:Ne,disconnected:we,disconnectedActions:Ie,btn:ke,activity_active:Le,activity_stale:ze,activity_unknown:Ae,killBtn:Me,emptyRow:Pe},W=5;function Be(e){return e?Date.now()-e<3e4?"active":"stale":"unknown"}function $e(e,s){return e==="active"?s("connection.topology.active","Active"):e==="stale"?s("connection.topology.stale","Stale"):s("connection.topology.unknown","Unknown")}function Ee(e){return e.length>10?e.slice(0,10):e}function Q(e,s){return e.replace("{count}",String(s))}function Te(e,s){return e.length!==s.length?!1:e.every((n,l)=>{const r=s[l];return r!==void 0&&n.id===r.id&&n.side===r.side&&Math.abs(n.x1-r.x1)<.5&&Math.abs(n.y1-r.y1)<.5&&Math.abs(n.x2-r.x2)<.5&&Math.abs(n.y2-r.y2)<.5})}function S(e,s,n){return{x:s-e.left,y:n-e.top}}function He(e,s,n,l){if(s.right<=n.left){const g=S(l,s.right,s.top+s.height/2),c=S(l,n.left,n.top+n.height/2);return{id:e,side:"agent",x1:g.x,y1:g.y,x2:c.x,y2:c.y}}if(s.bottom<=n.top){const g=S(l,s.left+s.width/2,s.bottom),c=S(l,n.left+n.width/2,n.top);return{id:e,side:"agent",x1:g.x,y1:g.y,x2:c.x,y2:c.y}}const r=S(l,s.left+s.width/2,s.top),j=S(l,n.left+n.width/2,n.bottom);return{id:e,side:"agent",x1:r.x,y1:r.y,x2:j.x,y2:j.y}}function De(e,s,n,l){if(n.right<=s.left){const g=S(l,s.left,s.top+s.height/2),c=S(l,n.right,n.top+n.height/2);return{id:e,side:"studio",x1:g.x,y1:g.y,x2:c.x,y2:c.y}}if(n.bottom<=s.top){const g=S(l,s.left+s.width/2,s.top),c=S(l,n.left+n.width/2,n.bottom);return{id:e,side:"studio",x1:g.x,y1:g.y,x2:c.x,y2:c.y}}const r=S(l,s.left+s.width/2,s.bottom),j=S(l,n.left+n.width/2,n.top);return{id:e,side:"studio",x1:r.x,y1:r.y,x2:j.x,y2:j.y}}function Oe({agents:e,isDisconnected:s,pinnedTargetClientId:n,priorityTarget:l,status:r,studioRoutingMode:j,studioTargets:g,t:c,timeAgo:L,onCopySelector:b,onManageRouting:z}){const[y,A]=d.useState(!1),[I,P]=d.useState(!1),[$,N]=d.useState([]),p=d.useRef(null),v=d.useRef(null),w=d.useRef(new Map),_=d.useRef(new Map),u=j==="pinned"?c("connection.routing.pinned","Manual: Pinned Studio"):c("connection.routing.recentPriority","Automatic: Recent priority"),F=s?"offline":"online",C=d.useMemo(()=>y?e:e.slice(0,W),[e,y]),E=Math.max(0,e.length-C.length),f=d.useMemo(()=>I?g:g.slice(0,W),[g,I]),B=Math.max(0,g.length-f.length),Y=[t.topologyList,C.length<=1?t.topologyListCentered:""].filter(Boolean).join(" "),R=[t.topologyList,f.length<=1?t.topologyListCentered:""].filter(Boolean).join(" "),T=d.useCallback(a=>m=>{if(m){w.current.set(a,m);return}w.current.delete(a)},[]),i=d.useCallback(a=>m=>{if(m){_.current.set(a,m);return}_.current.delete(a)},[]),k=d.useCallback(()=>{const a=p.current,m=v.current;if(!a||!m){N([]);return}const x=a.getBoundingClientRect(),U=m.getBoundingClientRect(),q=[];C.forEach(M=>{const G=w.current.get(M.instanceId);G&&q.push(He(`agent-${M.instanceId}`,G.getBoundingClientRect(),U,x))}),f.forEach(M=>{const G=_.current.get(M.clientId);G&&q.push(De(`studio-${M.clientId}`,G.getBoundingClientRect(),U,x))}),N(M=>Te(M,q)?M:q)},[C,f]);return d.useLayoutEffect(()=>{k();const a=[p.current,v.current,...C.map(x=>w.current.get(x.instanceId)),...f.map(x=>_.current.get(x.clientId))].filter(x=>x!=null);if(window.addEventListener("resize",k),typeof ResizeObserver>"u")return()=>{window.removeEventListener("resize",k)};const m=new ResizeObserver(k);return a.forEach(x=>m.observe(x)),()=>{window.removeEventListener("resize",k),m.disconnect()}},[k,C,f]),o.jsxs("section",{className:`${t.topologyCard} ${s?t.topologyDisconnected:""}`,"aria-label":c("connection.topology.ariaLabel","Connection topology"),children:[o.jsxs("div",{className:t.topologyHeader,children:[o.jsxs("div",{children:[o.jsx("div",{className:t.cardHeader,children:c("connection.topology.title","Connection topology")}),o.jsx("p",{className:t.topologyIntro,children:c("connection.topology.description","AI agents and Roblox Studio windows connect through one WEPPY MCP Server.")})]}),o.jsx(so,{to:"/controls?section=studio-routing",className:t.manageLink,onClick:z,children:c("connection.routing.manage","Manage routing")})]}),o.jsxs("div",{className:t.topologyNetwork,ref:p,children:[o.jsx("svg",{"aria-hidden":"true",className:t.topologyLinks,"data-testid":"topology-connection-lines",focusable:"false",children:$.map(a=>o.jsx("line",{className:`${t.topologyLink} ${t[`topologyLink_${a.side}`]}`,"data-side":a.side,vectorEffect:"non-scaling-stroke",x1:a.x1,x2:a.x2,y1:a.y1,y2:a.y2},a.id))}),o.jsxs("div",{className:t.topologyGrid,children:[o.jsxs("div",{className:t.topologyColumn,children:[o.jsxs("div",{className:t.topologyColumnHeader,children:[o.jsx(yo,{size:15,"aria-hidden":"true"}),o.jsx("span",{children:c("connection.agents.title","AI Agents")}),o.jsx("span",{className:t.topologyCount,children:e.length})]}),o.jsxs("div",{className:Y,children:[e.length>0?C.map(a=>{const m=Be(a.lastSeen),x=a.aiClientName??Ee(a.instanceId),U=a.lastSeen??a.lastCommandAt??a.connectedAt;return o.jsxs("div",{className:t.topologyNode,ref:T(a.instanceId),children:[o.jsxs("div",{className:t.topologyNodeTitle,children:[o.jsx("span",{className:t[`activity_${m}`]}),o.jsx("strong",{children:x}),o.jsx("span",{className:t.topologyState,children:$e(m,c)})]}),o.jsx("div",{className:t.topologyNodeMeta,children:U?`${c("connection.topology.lastActivity","Last activity")} ${L(U)}`:c("connection.topology.noActivity","No recent activity")})]},a.instanceId)}):o.jsx("div",{className:t.topologyEmpty,children:c("connection.agents.none","No agents connected")}),e.length>W?o.jsxs("div",{className:t.topologyOverflow,children:[E>0?o.jsx("span",{children:Q(c("connection.topology.moreAgents","+{count} more agents"),E)}):o.jsx("span",{children:c("connection.topology.allAgentsVisible","All agents visible")}),o.jsx("button",{type:"button",className:t.topologyOverflowButton,"aria-label":y?c("connection.topology.showLessAgents","Show less AI agents"):c("connection.topology.showAllAgents","Show all AI agents"),onClick:()=>A(a=>!a),children:y?c("connection.topology.showLess","Show less"):c("connection.topology.showAll","Show all")})]}):null]})]}),o.jsxs("div",{className:t.topologyServerColumn,children:[o.jsx("div",{className:t.topologyColumnHeaderSpacer,"aria-hidden":"true"}),o.jsxs("div",{className:`${t.topologyNode} ${t.topologyServer}`,ref:v,children:[o.jsx("div",{className:t.topologyServerIcon,children:o.jsx(xo,{size:18,"aria-hidden":"true"})}),o.jsxs("div",{className:t.topologyServerBody,children:[o.jsx("div",{className:t.topologyServerTitle,children:c("connection.topology.serverTitle","MCP Server")}),o.jsx(eo,{status:F}),o.jsxs("div",{className:t.topologyServerMeta,children:[r!=null&&r.version?`v${r.version}`:c("connection.topology.versionUnknown","Version unknown"),r!=null&&r.sessionId?` · ${c("connection.server.session","Session")} ${r.sessionId.slice(0,8)}`:""]}),o.jsx("div",{className:t.routingSummaryCompact,children:o.jsx("span",{className:t.routingBadge,children:u})})]})]})]}),o.jsxs("div",{className:t.topologyColumn,children:[o.jsxs("div",{className:t.topologyColumnHeader,children:[o.jsx(co,{size:15,"aria-hidden":"true"}),o.jsx("span",{children:c("connection.targets.title","Studio Targets")}),o.jsx("span",{className:t.topologyCount,children:g.length})]}),o.jsxs("div",{className:R,children:[g.length>0?f.map(a=>{const m=j==="pinned"&&n===a.clientId,x=j==="recentPriority"&&(l==null?void 0:l.clientId)===a.clientId;return o.jsxs("div",{className:t.topologyNode,ref:i(a.clientId),children:[o.jsxs("div",{className:t.topologyNodeTitle,children:[o.jsx("span",{className:t.targetPrimary,children:a.targetAlias}),o.jsx(V,{text:c("connection.targets.copyTargetAlias","Copy Studio ID"),children:o.jsx("button",{type:"button",className:t.copyIconButton,"aria-label":c("connection.targets.copyTargetAlias","Copy Studio ID"),onClick:()=>b(a.targetAlias,"target_alias"),children:o.jsx(K,{size:13,"aria-hidden":"true"})})}),m?o.jsx("span",{className:t.routingBadge,children:c("connection.routing.pinnedBadge","Pinned")}):x?o.jsx("span",{className:t.routingBadge,children:c("connection.routing.priorityBadge","Priority")}):null]}),o.jsxs("div",{className:t.topologyNodeMeta,children:[o.jsx("span",{children:a.placeName??c("connection.topology.placeUnknown","Place unknown")}),a.placeId!==void 0?` · ${a.placeId}`:""]}),o.jsxs("div",{className:t.topologyNodeSubtle,children:[a.connectionState," · ",c("connection.targets.lastSeen","Last Seen")," ",L(a.lastSeen)]})]},a.clientId)}):o.jsx("div",{className:t.topologyEmpty,children:c("connection.targets.none","No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.")}),g.length>W?o.jsxs("div",{className:t.topologyOverflow,children:[B>0?o.jsx("span",{children:Q(c("connection.topology.moreStudios","+{count} more studios"),B)}):o.jsx("span",{children:c("connection.topology.allStudiosVisible","All studios visible")}),o.jsx("button",{type:"button",className:t.topologyOverflowButton,"aria-label":I?c("connection.topology.showLessStudios","Show less Studio targets"):c("connection.topology.showAllStudios","Show all Studio targets"),onClick:()=>P(a=>!a),children:I?c("connection.topology.showLess","Show less"):c("connection.topology.showAll","Show all")})]}):null]})]})]})]})]})}function O(e,s){const n=Math.max(0,Math.floor((Date.now()-e)/1e3));return n<60?`${n}${s("connection.time.secondsAgo","s ago")}`:n<3600?`${Math.floor(n/60)}${s("connection.time.minutesAgo","m ago")}`:`${Math.floor(n/3600)}${s("connection.time.hoursAgo","h ago")}`}function Fe(e){return e?Date.now()-e<3e4?"active":"stale":"unknown"}function Je(){const{t:e}=oo(),{trackEvent:s}=lo(),{status:n,connectionInfo:l,studioRouting:r,connectionLog:j,level:g,clearConnectionLog:c,killAgent:L}=ko(),{show:b}=io(),[z,y]=d.useState(!0),[A,I]=d.useState(!1),[P,$]=d.useState(!1),[N,p]=d.useState(null),[v,w]=d.useState(!1),_=po(n==null?void 0:n.uptime),u=g==="disconnected",F=u?"offline":"online",C=(r==null?void 0:r.studioRoutingMode)??(n==null?void 0:n.studioRoutingMode)??"recentPriority",E=(r==null?void 0:r.pinnedTargetClientId)??(n==null?void 0:n.pinnedTargetClientId)??null,f=ao((r==null?void 0:r.targets)??(n==null?void 0:n.pluginClients)??[],C,E),B=(r==null?void 0:r.priorityTarget)??f[0],Y=async()=>{if(N){w(!0);try{await L(N.instanceId),b(e("connection.agents.killed","Agent killed"),"success"),p(null)}catch{b(e("connection.agents.killFailed","Failed to kill agent"),"error")}finally{w(!1)}}},R=async()=>{$(!0);try{await c(),b(e("toast.clearSuccess","Cleared successfully"),"success"),I(!1)}catch{b(e("toast.clearFailed","Failed to clear data"),"error")}finally{$(!1)}},T=async(i,k)=>{try{await navigator.clipboard.writeText(i),b(e("connection.targets.copied","Copied value"),"success"),s("dashboard_click_event",{click_target:`connection_copy_${k}`,page:"connection"})}catch{b(e("connection.targets.copyFailed","Failed to copy value"),"error")}};return o.jsxs("div",{className:t.page,children:[o.jsx(ro,{title:e("page.connection.title","Connection"),description:e("page.connection.description","Inspect MCP server, AI agent, Studio plugin, and connection log status."),helpTopicId:"connection",helpState:{connectionLevel:g}}),o.jsx(Oe,{agents:(l==null?void 0:l.mcpInstances)??[],isDisconnected:u,pinnedTargetClientId:E,priorityTarget:B,status:n??null,studioRoutingMode:C,studioTargets:f,t:e,timeAgo:i=>O(i,e),onCopySelector:T,onManageRouting:()=>s("dashboard_click_event",{click_target:"connection_manage_routing",page:"connection"})}),o.jsxs("div",{className:t.card,children:[o.jsx("div",{className:t.cardHeader,children:e("connection.server.title","Server Status")}),u?o.jsxs("div",{className:t.disconnected,children:[o.jsx("h3",{children:e("level.l0.title")}),o.jsx("p",{children:e("level.l0.message")}),o.jsx("p",{children:e("common.reconnecting")}),o.jsxs("div",{className:t.disconnectedActions,children:[o.jsx("button",{className:t.btn,onClick:()=>window.location.reload(),children:e("connection.reconnect","Reconnect")}),o.jsx("button",{className:t.btn,onClick:()=>{window.location.hash="#/settings"},children:e("connection.checkSettings","Check Settings")})]})]}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:t.statusRow,children:o.jsx(eo,{status:F})}),o.jsxs("dl",{className:t.serverGrid,children:[(n==null?void 0:n.version)&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:o.jsx(h,{label:e("connection.server.version","Version"),tooltip:e("connection.server.version.tooltip","Installed MCP server version")})}),o.jsx("dd",{children:o.jsx(go,{text:e("connection.server.version.tooltip","Installed MCP server version"),children:`v${n.version}`})})]}),(n==null?void 0:n.pid)!=null&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:o.jsx(h,{label:e("connection.server.pid","PID"),tooltip:e("connection.server.pid.tooltip","Operating system process identifier")})}),o.jsx("dd",{children:n.pid})]}),(n==null?void 0:n.uptime)!=null&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:o.jsx(h,{label:e("connection.server.uptime","Uptime"),tooltip:e("connection.server.uptime.tooltip","Time elapsed since the MCP server started")})}),o.jsx("dd",{children:uo(_??n.uptime)})]}),(n==null?void 0:n.sessionId)&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:o.jsx(h,{label:e("connection.server.session","Session"),tooltip:e("connection.server.session.tooltip","Current MCP session identifier")})}),o.jsx("dd",{children:n.sessionId.slice(0,8)})]}),(l==null?void 0:l.serverExecutable)&&o.jsxs(o.Fragment,{children:[o.jsx("dt",{children:o.jsx(h,{label:e("connection.server.exec","Exec"),tooltip:e("connection.server.exec.tooltip","Executable path used to launch the MCP server")})}),o.jsx("dd",{children:l.serverExecutable})]})]})]})]}),o.jsxs("div",{className:`${t.card} ${u?t.disabled:""}`,children:[o.jsxs("div",{className:t.cardHeader,children:[o.jsxs("span",{children:[e("connection.agents.title","AI Agents")," ","(",(l==null?void 0:l.mcpInstanceCount)??0,")"]}),o.jsx("button",{className:t.toggleBtn,onClick:()=>y(i=>!i),"aria-label":z?e("common.collapse","Collapse"):e("common.expand","Expand"),children:z?"▾":"▸"})]}),z&&o.jsxs("table",{className:t.table,children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:e("connection.agents.name","Agent")}),o.jsx("th",{children:o.jsx(h,{label:e("connection.server.pid","PID"),tooltip:e("connection.server.pid.tooltip","Operating system process identifier")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.agents.projectRoot","Project Root"),tooltip:e("connection.agents.projectRoot.tooltip","Authoritative project root for sync ownership")})}),o.jsx("th",{children:e("connection.agents.connected","Connected")}),o.jsx("th",{children:o.jsx(h,{label:e("connection.agents.lastSeen","Last Seen"),tooltip:e("connection.agents.lastSeen.tooltip","Most recent heartbeat or activity from this agent")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.agents.lastCommand","Last Command"),tooltip:e("connection.agents.lastCommand.tooltip","Most recent tool call executed by this agent")})}),o.jsx("th",{})]})}),o.jsx("tbody",{children:l!=null&&l.mcpInstances&&l.mcpInstances.length>0?l.mcpInstances.map(i=>o.jsxs("tr",{children:[o.jsxs("td",{children:[o.jsx("span",{className:t[`activity_${Fe(i.lastSeen)}`]}),i.aiClientName??e("connection.agents.unknown","Unknown")]}),o.jsx("td",{children:i.pid}),o.jsx("td",{children:i.projectRoot??i.cwd??e("connection.agents.projectRoot.unresolved","Unresolved")}),o.jsx("td",{children:O(i.connectedAt,e)}),o.jsx("td",{children:i.lastSeen?O(i.lastSeen,e):"-"}),o.jsx("td",{children:i.lastCommandAt?O(i.lastCommandAt,e):"-"}),o.jsx("td",{children:!i.isServer&&o.jsx("button",{className:t.killBtn,onClick:()=>{s("dashboard_click_event",{click_target:"connection_kill_agent",page:"connection"}),p({instanceId:i.instanceId,name:i.aiClientName??i.instanceId.slice(0,8)})},children:e("connection.agents.kill","Kill")})})]},i.instanceId)):o.jsx("tr",{children:o.jsx("td",{colSpan:7,className:t.emptyRow,children:e("connection.agents.none","No agents connected")})})})]})]}),o.jsxs("div",{className:`${t.card} ${u?t.disabled:""}`,children:[o.jsxs("div",{className:t.cardHeader,children:[e("connection.targets.title","Studio Targets")," ","(",f.length,")"]}),o.jsx("p",{className:t.cardHint,children:e("connection.targets.help","When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.")}),o.jsx("div",{className:t.tableWrap,children:o.jsxs("table",{className:t.table,children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.target","Studio ID"),tooltip:e("connection.targets.target.tooltip","Short name for this Roblox Studio window")})}),o.jsx("th",{children:e("connection.targets.place","Place")}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.placeId","Place ID"),tooltip:e("connection.targets.placeId.tooltip","Roblox Place ID for this Studio window")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.clientId","Connection ID"),tooltip:e("connection.targets.clientId.tooltip","Full connection ID for diagnostics. Usually use Studio ID instead.")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.session","Session"),tooltip:e("connection.targets.session.tooltip","Command channel state for this Studio target")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.lastUsed","Last Used"),tooltip:e("connection.targets.lastUsed.tooltip","Most recent plugin-route request routed to this Studio target")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.lastSeen","Last Seen"),tooltip:e("connection.targets.lastSeen.tooltip","Most recent heartbeat received from this Studio target")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.version","Version"),tooltip:e("connection.targets.version.tooltip","Installed plugin version reported by Studio")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.routing","Routing"),tooltip:e("connection.targets.routing.tooltip","Routing priority for requests without a named Studio target")})}),o.jsx("th",{children:o.jsx(h,{label:e("connection.targets.inFlight","In Flight"),tooltip:e("connection.targets.inFlight.tooltip","Active command request currently routed to this Studio target")})})]})}),o.jsx("tbody",{children:f.length>0?f.map(i=>{const k=i.clientId.slice(0,10);return o.jsxs("tr",{children:[o.jsxs("td",{children:[o.jsx("span",{className:t.monoMuted,title:i.clientId,children:i.targetAlias}),o.jsx(V,{text:e("connection.targets.copyTargetAlias","Copy Studio ID"),children:o.jsx("button",{type:"button",className:t.copyIconButton,"aria-label":e("connection.targets.copyTargetAlias","Copy Studio ID"),onClick:()=>T(i.targetAlias,"target_alias"),children:o.jsx(K,{size:13,"aria-hidden":"true"})})})]}),o.jsx("td",{children:o.jsx("span",{className:t.targetPrimary,children:i.placeName??"-"})}),o.jsxs("td",{children:[i.placeId??"-",i.placeId!==void 0?o.jsx(V,{text:e("connection.targets.copyPlaceId","Copy Place ID"),children:o.jsx("button",{type:"button",className:t.copyIconButton,"aria-label":e("connection.targets.copyPlaceId","Copy Place ID"),onClick:()=>T(String(i.placeId),"place_id"),children:o.jsx(K,{size:13,"aria-hidden":"true"})})}):null]}),o.jsxs("td",{children:[o.jsx("span",{className:t.monoMuted,title:i.clientId,children:k}),o.jsx(V,{text:e("connection.targets.copyClientId","Copy Connection ID"),children:o.jsx("button",{type:"button",className:t.copyIconButton,"aria-label":e("connection.targets.copyClientId","Copy Connection ID"),onClick:()=>T(i.clientId,"client_id"),children:o.jsx(K,{size:13,"aria-hidden":"true"})})})]}),o.jsx("td",{children:i.connectionState}),o.jsx("td",{children:i.lastRoutedAt?O(i.lastRoutedAt,e):"-"}),o.jsx("td",{children:O(i.lastSeen,e)}),o.jsx("td",{children:i.pluginVersion??"-"}),o.jsx("td",{children:C==="pinned"&&E===i.clientId?o.jsx("span",{className:t.routingBadge,children:e("connection.routing.pinnedBadge","Pinned")}):C==="recentPriority"&&(B==null?void 0:B.clientId)===i.clientId?o.jsx("span",{className:t.routingBadge,children:e("connection.routing.priorityBadge","Priority")}):o.jsx("span",{className:t.monoMuted,children:"-"})}),o.jsx("td",{children:i.inFlightRequestId?i.inFlightRequestId.slice(0,8):"-"})]},i.clientId)}):o.jsx("tr",{children:o.jsx("td",{colSpan:9,className:t.emptyRow,children:e("connection.targets.none","No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.")})})})]})})]}),o.jsxs("div",{className:`${t.card} ${u?t.disabled:""}`,children:[o.jsxs("div",{className:t.cardHeader,children:[o.jsx("span",{children:e("connection.log.title","Connection Log")}),o.jsx("button",{className:t.clearButton,onClick:()=>{s("dashboard_click_event",{click_target:"connection_clear_log",page:"connection"}),I(!0)},children:e("common.clear","Clear")})]}),o.jsx(wo,{entries:j})]}),o.jsx(X,{open:A,title:e("connection.clear.title","Clear connection log?"),message:e("connection.clear.message","This permanently removes the stored connection log for the current project."),cancelLabel:e("common.cancel","Cancel"),confirmLabel:e("common.clear","Clear"),loading:P,onCancel:()=>!P&&I(!1),onConfirm:R}),o.jsx(X,{open:!!N,title:e("connection.agents.kill.title","Kill agent?"),message:`"${N==null?void 0:N.name}" 프로세스를 강제 종료합니다. 해당 에이전트의 진행 중인 작업이 중단됩니다.`,cancelLabel:e("common.cancel","Cancel"),confirmLabel:e("connection.agents.kill","Kill"),loading:v,onCancel:()=>!v&&p(null),onConfirm:Y})]})}export{Je as Component};