@codesys/mcp-toolkit 2.1.2 → 2.3.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/CHANGELOG.md +100 -0
- package/README.md +190 -10
- package/README.zh-CN.md +254 -0
- package/dist/actions.d.ts +9 -4
- package/dist/actions.js +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/bridge/bridge.d.ts +12 -1
- package/dist/bridge/bridge.js +77 -11
- package/dist/bridge/bridge.js.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/codesys/debug.d.ts +5 -0
- package/dist/codesys/debug.js +89 -0
- package/dist/codesys/debug.js.map +1 -0
- package/dist/codesys/device-tools.d.ts +3 -0
- package/dist/codesys/device-tools.js +38 -0
- package/dist/codesys/device-tools.js.map +1 -0
- package/dist/codesys/graphical.d.ts +76 -0
- package/dist/codesys/graphical.js +226 -0
- package/dist/codesys/graphical.js.map +1 -0
- package/dist/codesys/lang.d.ts +39 -0
- package/dist/codesys/lang.js +177 -0
- package/dist/codesys/lang.js.map +1 -0
- package/dist/codesys/simtest.d.ts +48 -0
- package/dist/codesys/simtest.js +103 -0
- package/dist/codesys/simtest.js.map +1 -0
- package/dist/codesys/st.d.ts +1 -1
- package/dist/codesys/st.js.map +1 -1
- package/dist/codesys/trace.d.ts +19 -0
- package/dist/codesys/trace.js +139 -0
- package/dist/codesys/trace.js.map +1 -0
- package/dist/hmi/native.d.ts +89 -0
- package/dist/hmi/native.js +447 -0
- package/dist/hmi/native.js.map +1 -0
- package/dist/hmi/render.d.ts +90 -0
- package/dist/hmi/render.js +307 -0
- package/dist/hmi/render.js.map +1 -0
- package/dist/hmi/route.d.ts +32 -0
- package/dist/hmi/route.js +184 -0
- package/dist/hmi/route.js.map +1 -0
- package/dist/hmi/service.d.ts +45 -0
- package/dist/hmi/service.js +182 -0
- package/dist/hmi/service.js.map +1 -0
- package/dist/hmi/spec.d.ts +821 -0
- package/dist/hmi/spec.js +191 -0
- package/dist/hmi/spec.js.map +1 -0
- package/dist/hmi/templates.d.ts +11 -0
- package/dist/hmi/templates.js +92 -0
- package/dist/hmi/templates.js.map +1 -0
- package/dist/hmi/tools.d.ts +4 -0
- package/dist/hmi/tools.js +222 -0
- package/dist/hmi/tools.js.map +1 -0
- package/dist/hmi/value.d.ts +3 -0
- package/dist/hmi/value.js +26 -0
- package/dist/hmi/value.js.map +1 -0
- package/dist/panel/hmi.js +138 -0
- package/dist/panel.d.ts +3 -0
- package/dist/panel.js +17 -0
- package/dist/panel.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +7 -2
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts +5 -1
- package/dist/tools.js +19 -3
- package/dist/tools.js.map +1 -1
- package/dist/viewer.d.ts +1 -1
- package/dist/viewer.js +13 -2
- package/dist/viewer.js.map +1 -1
- package/package.json +1 -1
- package/watcher/mcp_alarms.py +134 -0
- package/watcher/mcp_debug.py +161 -0
- package/watcher/mcp_devices.py +83 -0
- package/watcher/mcp_lang.py +179 -0
- package/watcher/mcp_ops.py +3 -1
- package/watcher/mcp_trace.py +90 -0
- package/watcher/mcp_ui.py +54 -0
- package/watcher/mcp_visu.py +422 -0
- package/watcher/watcher.py +52 -10
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Parsing PLC values; no dependencies, so the browser page can use it too. */
|
|
2
|
+
/** A PLC value as the simulation reports it ("TRUE", "INT#8", "REAL#1.5", "T#1s"), as a number or boolean. */
|
|
3
|
+
export function plcValue(raw) {
|
|
4
|
+
if (raw === undefined)
|
|
5
|
+
return undefined;
|
|
6
|
+
const s = raw.trim();
|
|
7
|
+
if (/^true$/i.test(s))
|
|
8
|
+
return true;
|
|
9
|
+
if (/^false$/i.test(s))
|
|
10
|
+
return false;
|
|
11
|
+
const typed = /^[A-Z_]+#(.*)$/i.exec(s);
|
|
12
|
+
const body = typed ? typed[1] : s;
|
|
13
|
+
if (/^[+-]?\d+(\.\d+)?(e[+-]?\d+)?$/i.test(body))
|
|
14
|
+
return Number(body);
|
|
15
|
+
const time = /^(?:T|TIME|LTIME)#(.+)$/i.exec(s);
|
|
16
|
+
if (time) {
|
|
17
|
+
let ms = 0;
|
|
18
|
+
for (const m of time[1].matchAll(/(\d+(?:\.\d+)?)(ms|us|ns|d|h|m|s)/gi)) {
|
|
19
|
+
const n = Number(m[1]);
|
|
20
|
+
ms += { d: 86_400_000, h: 3_600_000, m: 60_000, s: 1000, ms: 1, us: 0.001, ns: 0.000001 }[m[2].toLowerCase()] * n;
|
|
21
|
+
}
|
|
22
|
+
return ms;
|
|
23
|
+
}
|
|
24
|
+
return s;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.js","sourceRoot":"","sources":["../../src/hmi/value.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8GAA8G;AAC9G,MAAM,UAAU,QAAQ,CAAC,GAAuB;IAC9C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAS,CAAE,GAAG,CAAC,CAAC;QAC7H,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";(()=>{var Q=t=>"id"in t&&t.id||"label"in t&&t.label||void 0;function lt(t,i){switch(t.type){case"tank":{let{x:e,y:c,w:p,h:d}=t,o=e+p/2;return{top:{at:[o,c],dir:"u"},bottom:{at:[o,c+d],dir:"d"},left:{at:[e,c+d*.85],dir:"l"},right:{at:[e+p,c+d*.85],dir:"r"},"left-high":{at:[e,c+d*.15],dir:"l"},"right-high":{at:[e+p,c+d*.15],dir:"r"}}}case"pump":case"fan":{let e=t.size/2,c=e/i;return{in:{at:[t.x-e,t.y],dir:"l"},out:{at:[t.x+e,t.y],dir:"r"},top:{at:[t.x,t.y-c],dir:"u"},bottom:{at:[t.x,t.y+c],dir:"d"}}}case"valve":{let e=t.size/2;return t.vertical?{in:{at:[t.x,t.y+e/i],dir:"d"},out:{at:[t.x,t.y-e/i],dir:"u"}}:{in:{at:[t.x-e,t.y],dir:"l"},out:{at:[t.x+e,t.y],dir:"r"}}}case"junction":return{c:{at:[t.x,t.y],dir:"r"}};default:return{}}}var ct={tank:["top","bottom","left","right","left-high","right-high"],pump:["in","out","top","bottom"],fan:["in","out","top","bottom"],valve:["in","out"],junction:["c"]};var q=t=>t==="l"||t==="r";function dt(t,i,e){if(!t.from||!t.to)return t.points??[];let c=new Map(i.flatMap(h=>Q(h)&&h.type in ct?[[Q(h).toLowerCase(),h]]:[])),p=(h,S)=>{if(typeof h!="string"){if(h[0]<=5)return{at:h,dir:"l"};if(h[0]>=95)return{at:h,dir:"r"};if(h[1]<=5)return{at:h,dir:"u"};if(h[1]>=95)return{at:h,dir:"d"};let g=S??[50,50],y=g[0]-h[0],v=(g[1]-h[1])/e;return{at:h,dir:Math.abs(y)>=Math.abs(v)?y>=0?"r":"l":v>=0?"d":"u"}}let[z,P]=h.split("."),f=c.get(z.toLowerCase());return(f?lt(f,e):{})[P]??{at:[50,50],dir:"r"}},d=typeof t.from=="string"?p(t.from):void 0,o=typeof t.to=="string"?p(t.to):void 0,s=d??p(t.from,o?.at??(Array.isArray(t.to)?t.to:void 0)),r=o??p(t.to,s.at),l=(h,S)=>{if(!(typeof t.from=="string"&&h===s&&t.from.endsWith(".c"))&&!(typeof t.to=="string"&&h===r&&t.to.endsWith(".c")))return h;let z=S[0]-h.at[0],P=(S[1]-h.at[1])/e;return{at:h.at,dir:Math.abs(z)>=Math.abs(P)?z>=0?"r":"l":P>=0?"d":"u"}},n=l(s,r.at),m=l(r,s.at),x=[n.at],$=[...t.via??[],m.at],b=n.at,M=n.dir;return $.forEach((h,S)=>{let P=S===$.length-1?m.dir:void 0;for(let u of pt(b,M,h,P))x.push(u);let f=x[x.length-2]??b;M=f[0]===h[0]?h[1]>=f[1]?"d":"u":h[0]>=f[0]?"r":"l",b=h}),ut(x)}function pt(t,i,e,c){let p=(o,s)=>Math.abs(o-s)<1e-6;if(p(t[0],e[0])||p(t[1],e[1]))return[e];let d=c?q(c):!q(i);if(q(i)&&d){let o=(t[0]+e[0])/2;return[[o,t[1]],[o,e[1]],e]}if(!q(i)&&!d){let o=(t[1]+e[1])/2;return[[t[0],o],[e[0],o],e]}return q(i)?[[e[0],t[1]],e]:[[t[0],e[1]],e]}function ut(t){let i=[];for(let e of t){let c=i[i.length-1];if(c&&Math.abs(c[0]-e[0])<1e-6&&Math.abs(c[1]-e[1])<1e-6)continue;let p=i[i.length-2];c&&p&&(Math.abs(p[0]-c[0])<1e-6&&Math.abs(c[0]-e[0])<1e-6||Math.abs(p[1]-c[1])<1e-6&&Math.abs(c[1]-e[1])<1e-6)&&i.pop(),i.push(e)}return i}function tt(t,i){return t.map(e=>e.type==="pipe"?{...e,points:dt(e,t,i),from:void 0,to:void 0,via:void 0}:e)}function B(t){let[i,e]=(t.size??"1280x720").split("x").map(Number);return e<=480?{w:i,h:e,header:54,pad:12,gap:9}:e>=1080?{w:i,h:e,header:96,pad:28,gap:18}:{w:i,h:e,header:76,pad:20,gap:14}}var k=t=>t.replace(/[&<>"']/g,i=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[i]),a=t=>Math.round(t*10)/10,R=["#38bdf8","#a78bfa","#fbbf24","#34d399","#f472b6","#60a5fa"];function mt(t,i){let[e,c]=t.grid,{w:p,h:d,header:o,pad:s,gap:r}=B(t),l=(p-2*s-(e-1)*r)/e,n=(d-o-s-(c-1)*r)/c,[m,x,$,b]=i;return{x:s+(m-1)*(l+r),y:o+(x-1)*(n+r),w:$*l+($-1)*r,h:b*n+(b-1)*r}}function et(t,i={}){let e=[],c=b=>`data-b="${e.push(b)-1}"`,p=0,d=b=>`${b}${++p}`,o=[],s=(b,M,h)=>{let S=`fp-${o.length+1}`;return o.push(ft(S,b,M,h,c)),`data-open="${S}"`},r=B(t),l=t.widgets.map(b=>{let M=mt(t,b.at),h=gt(b,M,c,d,s),S=b.title?`<div class="t-title">${k(b.title)}</div>`:"";return`<section class="tile t-${b.type}${b.title?"":" untitled"}${M.h<110?" compact":""}" style="left:${a(M.x)}px;top:${a(M.y)}px;width:${a(M.w)}px;height:${a(M.h)}px">${S}<div class="t-body">${h}</div></section>`}),n=(i.pages?.length??0)>1?`<nav class="h-nav">${i.pages.map(b=>`<button class="h-page${b.name===t.name?" cur":""}" data-nav="${k(b.name)}">${k(b.title)}</button>`).join("")}</nav>`:"",m=(i.alarms??[]).map(b=>b.active),x=m.length?`<div class="h-alarm" ${c({kind:"count",vars:m})}><span class="dot"></span><span class="n">0</span><span class="lbl">alarms</span></div>`:"";return{html:`<div class="hmi theme-${t.theme}${r.h<=480?" small":r.h>=1080?" large":""}" style="width:${r.w}px;height:${r.h}px;--hdr:${r.header}px">
|
|
2
|
+
<div class="glow"></div>
|
|
3
|
+
<svg width="0" height="0" style="position:absolute" aria-hidden="true">${vt}</svg>
|
|
4
|
+
<header class="h-bar"><div class="h-titles"><div class="h-title">${k(t.title)}</div>${t.subtitle?`<div class="h-sub">${k(t.subtitle)}</div>`:""}</div>
|
|
5
|
+
${n}<div class="h-right">${x}<div class="h-sim" data-sim><span class="dot"></span><span class="lbl">Offline</span></div><div class="h-clock" data-clock>--:--:--</div></div></header>
|
|
6
|
+
${l.join(`
|
|
7
|
+
`)}
|
|
8
|
+
${o.join(`
|
|
9
|
+
`)}
|
|
10
|
+
</div>`,bindings:e,css:W}}function ft(t,i,e,c,p){let d=[c.running?`<span class="led tone-ok" ${p({kind:"on",v:c.running})}><span class="led-dot"></span>Running</span>`:"",c.open?`<span class="led tone-ok" ${p({kind:"on",v:c.open})}><span class="led-dot"></span>Open</span>`:"",c.fault?`<span class="led tone-alarm" ${p({kind:"on",v:c.fault})}><span class="led-dot"></span>Fault</span>`:""].join(""),o=e.auto?`<label class="sw" data-act="toggle" data-var="${k(e.auto)}" ${p({kind:"on",v:e.auto})}><span class="sw-track"><span class="sw-knob"></span></span><span class="sw-lbl">Automatic</span><span class="sw-state"><span class="s-on">AUTO</span><span class="s-off">MANUAL</span></span></label>`:"",s=(x,$,b)=>$?`<button class="btn tone-${b}" data-act="tap" data-var="${k($)}" ${p({kind:"on",v:$})}>${x}</button>`:"",r=[s("Start",e.start,"ok"),s("Stop",e.stop,"alarm"),s("Open",e.open,"ok"),s("Close",e.close,"alarm"),s("Reset",e.reset,"warn")].join(""),l=(e.values??[]).map(x=>`<div class="fp-row"><span>${k(x.label)}</span><b ${p({kind:"text",v:x.value,decimals:x.decimals,unit:x.unit})}>\u2013</b></div>`).join(""),n=e.setpoint,m=n?`<div class="fp-sp"><div class="fp-row"><span>${k(n.label??"Setpoint")}</span></div><div class="sp" data-var="${k(n.variable)}" data-min="${n.min}" data-max="${n.max}" data-step="${n.step??1}" ${p({kind:"setpoint",v:n.variable,decimals:1})}><div class="sp-row"><button class="sp-btn" data-step="-1">\u2212</button><div class="sp-val"><span class="sp-num" ${p({kind:"text",v:n.variable,decimals:1})}>\u2013</span><span class="sp-unit">${k(n.unit??"")}</span></div><button class="sp-btn" data-step="1">+</button></div><input class="sp-range" type="range" min="${n.min}" max="${n.max}" step="${n.step??1}"></div></div>`:"";return`<div class="fp" id="${t}" hidden><div class="fp-card"><div class="fp-head"><div class="fp-title">${k(e.title??i)}</div><button class="fp-x" data-close>\xD7</button></div>${d?`<div class="fp-status">${d}</div>`:""}${o}${r?`<div class="btns fp-btns">${r}</div>`:""}${l}${m}</div></div>`}function U(t){return t??"accent"}function gt(t,i,e,c,p){let d=i.h-(t.title?44:20);switch(t.type){case"value":{let o=Math.max(22,Math.min(64,d*(t.trend?.36:.55),i.w/6)),s=t.trend?`<svg class="spark" viewBox="0 0 200 40" preserveAspectRatio="none" ${e({kind:"spark",v:t.value})}><path class="spark-fill"/><path class="spark-line"/></svg>`:"";return`<div class="v-wrap"><div class="v-num" style="font-size:${a(o)}px" ${e({kind:"text",v:t.value,decimals:t.decimals,bands:t.bands})}>\u2013</div>${t.unit?`<div class="v-unit">${k(t.unit)}</div>`:""}</div>${s}`}case"gauge":{let o=Math.min(i.w-24,d*1.25),s=80,r=xt(100,100,s,-120,120),l=a(240/360*2*Math.PI*s),n=Array.from({length:11},(m,x)=>{let $=(-120+x*24)*Math.PI/180,b=x%5===0?62:66;return`<line x1="${a(100+b*Math.sin($))}" y1="${a(100-b*Math.cos($))}" x2="${a(100+70*Math.sin($))}" y2="${a(100-70*Math.cos($))}"/>`}).join("");return`<svg class="gauge" style="width:${a(o)}px;height:${a(o*.86)}px;--len:${l}" viewBox="0 0 200 172" ${e({kind:"level",v:t.value,min:t.min,max:t.max,bands:t.bands})}>
|
|
11
|
+
<path class="g-track" d="${r}"/><path class="g-val" d="${r}" style="stroke-dasharray:${l};"/><g class="g-ticks">${n}</g>
|
|
12
|
+
<text x="100" y="104" class="g-num" ${e({kind:"text",v:t.value,decimals:t.decimals,bands:t.bands})}>\u2013</text>
|
|
13
|
+
<text x="100" y="128" class="g-unit">${k(t.unit??"")}</text>
|
|
14
|
+
<text x="${a(100-s*Math.sin(120*Math.PI/180))}" y="166" class="g-lim">${t.min}</text><text x="${a(100+s*Math.sin(120*Math.PI/180))}" y="166" class="g-lim">${t.max}</text></svg>`}case"bar":{let o=e({kind:"level",v:t.value,min:t.min,max:t.max,bands:t.bands});return`<div class="bar-wrap${t.vertical?" vert":""}"><div class="bar" ${o}><div class="bar-fill"></div></div><div class="bar-read"><span class="bar-num" ${e({kind:"text",v:t.value,decimals:1,bands:t.bands})}>\u2013</span> <span class="bar-unit">${k(t.unit??"")}</span><span class="bar-lim">${t.min} \u2013 ${t.max}</span></div></div>`}case"status":return`<ul class="status">${t.items.map(o=>`<li class="led tone-${U(o.tone??"ok")}" ${e({kind:"on",v:o.on,invert:o.invert})}><span class="led-dot"></span><span>${k(o.label)}</span></li>`).join("")}</ul>`;case"buttons":return`<div class="btns${t.items.length>2&&i.w<360?" col":""}">${t.items.map(o=>`<button class="btn tone-${U(o.tone??(/stop|reset|off/i.test(o.label)?"alarm":"accent"))}" data-act="${o.action}" data-var="${k(o.variable)}" ${o.action==="tap"||o.action==="toggle"?e({kind:"on",v:o.variable}):""}>${k(o.label)}</button>`).join("")}</div>`;case"switch":return`<label class="sw" data-act="toggle" data-var="${k(t.variable)}" ${e({kind:"on",v:t.variable})}><span class="sw-track"><span class="sw-knob"></span></span><span class="sw-lbl">${k(t.label??"")}</span><span class="sw-state"><span class="s-on">ON</span><span class="s-off">OFF</span></span></label>`;case"setpoint":{let o=t.step!==void 0&&!Number.isInteger(t.step)?String(t.step).split(".")[1].length:0;return`<div class="sp" data-var="${k(t.variable)}" data-min="${t.min}" data-max="${t.max}" data-step="${t.step??1}" ${e({kind:"setpoint",v:t.variable,decimals:o})}>
|
|
15
|
+
<div class="sp-row"><button class="sp-btn" data-step="-1">\u2212</button><div class="sp-val"><span class="sp-num" ${e({kind:"text",v:t.variable,decimals:o})}>\u2013</span><span class="sp-unit">${k(t.unit??"")}</span></div><button class="sp-btn" data-step="1">+</button></div>
|
|
16
|
+
<input class="sp-range" type="range" min="${t.min}" max="${t.max}" step="${t.step??1}"><div class="sp-lim"><span>${t.min}</span><span>${t.max}</span></div></div>`}case"trend":{let o=t.series.map((l,n)=>`<path class="tr-line" style="stroke:${R[n%R.length]}"/>`).join(""),s=t.series.map((l,n)=>`<span><i style="background:${R[n%R.length]}"></i>${k(l.label??l.value.split(".").pop())}</span>`).join(""),r=[.25,.5,.75].map(l=>`<line x1="0" x2="600" y1="${200*l}" y2="${200*l}"/>`).join("");return`<div class="tr-legend">${s}</div><svg class="trend" viewBox="0 0 600 200" preserveAspectRatio="none" ${e({kind:"trend",series:t.series.map(l=>l.value),min:t.min,max:t.max,seconds:t.seconds})}><g class="tr-grid">${r}</g>${o}</svg><div class="tr-axis"><span>\u2212${t.seconds} s</span><span class="tr-range"><span class="tr-min"></span> \u2013 <span class="tr-max"></span></span><span>now</span></div>`}case"alarms":return`<ul class="alarms">${t.items.map(o=>`<li class="al sev-${o.severity}" ${e({kind:"alarm",v:o.active})}><span class="al-badge">${o.severity==="info"?"INFO":o.severity==="warning"?"WARN":"ALARM"}</span><span class="al-text">${k(o.text)}</span></li>`).join("")}<li class="al-none">No active alarms</li></ul>`;case"text":return`<div class="txt">${k(t.text).replace(/\n/g,"<br>")}</div>`;case"process":{let s=a(100*Math.max(60,d)/Math.max(60,i.w-24)),r=s/100,l=tt(t.items,r).sort((n,m)=>(n.type==="pipe"?-1:0)-(m.type==="pipe"?-1:0));return`<svg class="proc" viewBox="0 0 100 ${s}" preserveAspectRatio="xMidYMid meet">${l.map(n=>bt(n,r,e,c,p)).join("")}</svg>`}}}function xt(t,i,e,c,p){let d=n=>[t+e*Math.sin(n*Math.PI/180),i-e*Math.cos(n*Math.PI/180)].map(a),[o,s]=d(c),[r,l]=d(p);return`M${o} ${s} A${e} ${e} 0 ${p-c>180?1:0} 1 ${r} ${l}`}var vt=`<defs>
|
|
17
|
+
<linearGradient id="gShell" x1="0" x2="1"><stop offset="0" stop-color="var(--shell-a)"/><stop offset=".5" stop-color="var(--shell-b)"/><stop offset="1" stop-color="var(--shell-a)"/></linearGradient>
|
|
18
|
+
<linearGradient id="gLiquid" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="var(--liq-a)"/><stop offset="1" stop-color="var(--liq-b)"/></linearGradient>
|
|
19
|
+
<radialGradient id="gHub" cx=".35" cy=".35" r=".8"><stop offset="0" stop-color="var(--hub-a)"/><stop offset="1" stop-color="var(--hub-b)"/></radialGradient>
|
|
20
|
+
<filter id="fGlow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.2" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
|
|
21
|
+
</defs>`;function bt(t,i,e,c,p){let d=s=>a(s*i),o=(s,r,l)=>l?`<text class="p-label" x="${a(s)}" y="${d(r)}">${k(l)}</text>`:"";switch(t.type){case"pipe":{let s=(t.points??[]).map(([r,l],n)=>`${n?"L":"M"}${a(r)} ${d(l)}`).join(" ");return`<g class="pipe" ${t.flow?e({kind:"on",v:t.flow}):""}><path class="pipe-outer" d="${s}"/><path class="pipe-inner" d="${s}"/><path class="pipe-flow" d="${s}"/></g>`}case"tank":{let s=a(t.x),r=d(t.y),l=a(t.w),n=d(t.h),m=c("tk"),x=[.25,.5,.75].map($=>`<line x1="${a(s+l-2.2)}" x2="${a(s+l-.8)}" y1="${a(r+n*(1-$))}" y2="${a(r+n*(1-$))}"/>`).join("");return`<g class="tank" ${e({kind:"level",v:t.level,min:0,max:t.max,bands:t.bands})}>
|
|
22
|
+
<clipPath id="${m}"><rect x="${s}" y="${r}" width="${l}" height="${n}" rx="${a(Math.min(l,n)*.12)}"/></clipPath>
|
|
23
|
+
<rect class="tank-shell" x="${s}" y="${r}" width="${l}" height="${n}" rx="${a(Math.min(l,n)*.12)}"/>
|
|
24
|
+
<g clip-path="url(#${m})"><g class="tank-liq" style="transform-origin:${s}px ${a(r+n)}px"><rect x="${s}" y="${r}" width="${l}" height="${n}" fill="url(#gLiquid)"/><path class="tank-wave" d="M${s} ${a(r+1)} q ${a(l/8)} -1.2 ${a(l/4)} 0 t ${a(l/4)} 0 t ${a(l/4)} 0 t ${a(l/4)} 0 t ${a(l/4)} 0 V ${a(r+3)} H ${s} Z"/></g></g>
|
|
25
|
+
<rect class="tank-gloss" x="${a(s+l*.1)}" y="${a(r+n*.05)}" width="${a(l*.12)}" height="${a(n*.9)}" rx="${a(l*.06)}"/>
|
|
26
|
+
<g class="tank-ticks">${x}</g>
|
|
27
|
+
<text class="tank-num" x="${a(s+l/2)}" y="${a(r+n/2+1.5)}" ${e({kind:"text",v:t.level,decimals:0,unit:t.unit})}>\u2013</text>
|
|
28
|
+
${o(s+l/2,t.y+t.h+2.8/i,t.label)}</g>`}case"pump":{let s=t.size,r=a(t.x),l=d(t.y),n=a(s/2),m=[0,60,120,180,240,300].map(x=>`<path d="M0 0 Q ${a(n*.3)} ${a(-n*.25)} ${a(n*.12)} ${a(-n*.62)}" transform="rotate(${x})"/>`).join("");return`<g ${t.fault?e({kind:"fault",v:t.fault}):""} ${t.faceplate?`class="clickable" ${p(t.label??"Pump",t.faceplate,{running:t.running,fault:t.fault})}`:""}><g class="pump" ${e({kind:"on",v:t.running})}>
|
|
29
|
+
<circle class="pump-ring" cx="${r}" cy="${l}" r="${n}"/><circle class="pump-body" cx="${r}" cy="${l}" r="${a(n*.86)}" fill="url(#gHub)"/>
|
|
30
|
+
<g transform="translate(${r} ${l})"><g class="pump-imp">${m}<circle r="${a(n*.14)}" class="pump-hub"/></g></g>
|
|
31
|
+
${o(t.x,t.y+(s/2+2.6)/i,t.label)}</g></g>`}case"fan":{let s=t.size,r=a(t.x),l=d(t.y),n=a(s/2),m=[0,120,240].map(x=>`<path d="M0 0 C ${a(n*.5)} ${a(-n*.2)} ${a(n*.55)} ${a(-n*.8)} 0 ${a(-n*.86)} C ${a(-n*.2)} ${a(-n*.6)} ${a(-n*.1)} ${a(-n*.2)} 0 0Z" transform="rotate(${x})"/>`).join("");return`<g class="pump fan${t.faceplate?" clickable":""}" ${e({kind:"on",v:t.running})} ${t.faceplate?p(t.label??"Fan",t.faceplate,{running:t.running}):""}><circle class="pump-ring" cx="${r}" cy="${l}" r="${n}"/><circle class="pump-body" cx="${r}" cy="${l}" r="${a(n*.9)}" fill="url(#gHub)"/><g transform="translate(${r} ${l})"><g class="pump-imp">${m}<circle r="${a(n*.12)}" class="pump-hub"/></g></g>${o(t.x,t.y+(s/2+2.6)/i,t.label)}</g>`}case"valve":{let s=t.size,r=a(t.x),l=d(t.y),n=a(s/2),m=`<path class="valve-body" d="M${a(-n)} ${a(-n*.7)} L${n} ${a(n*.7)} L${n} ${a(-n*.7)} L${a(-n)} ${a(n*.7)} Z"/><line class="valve-stem" x1="0" y1="0" x2="0" y2="${a(-n*1.1)}"/><rect class="valve-act" x="${a(-n*.5)}" y="${a(-n*1.5)}" width="${n}" height="${a(n*.45)}" rx="${a(n*.1)}"/>`;return`<g class="valve${t.faceplate?" clickable":""}" ${e({kind:"on",v:t.open})} ${t.faceplate?p(t.label??"Valve",t.faceplate,{open:t.open}):""}><g transform="translate(${r} ${l})${t.vertical?" rotate(90)":""}">${m}</g>${t.label?t.vertical?`<text class="p-label left" x="${a(t.x+s*.75)}" y="${a(l+.6)}">${k(t.label)}</text>`:o(t.x,t.y+(s/2+2.6)/i,t.label):""}</g>`}case"sensor":{let s=a(t.x),r=d(t.y);return`<g class="sensor"><rect class="sen-box" x="${a(s-6.5)}" y="${a(r-2.1)}" width="13" height="4.2" rx="2.1"/><text class="sen-num" x="${s}" y="${a(r+.75)}" ${e({kind:"text",v:t.value,decimals:t.decimals??1,unit:t.unit})}>\u2013</text>${t.label?`<text class="sen-tag" x="${s}" y="${a(r-3)}">${k(t.label)}</text>`:""}</g>`}case"lamp":{let s=a(t.x),r=d(t.y);return`<g class="plamp tone-${U(t.tone??"ok")}" ${e({kind:"on",v:t.on})}><circle class="pl-halo" cx="${s}" cy="${r}" r="2.2"/><circle class="pl-dot" cx="${s}" cy="${r}" r="1.3"/>${t.label?`<text class="p-label left" x="${a(s+3)}" y="${a(r+.65)}">${k(t.label)}</text>`:""}</g>`}case"junction":return`<circle class="junction" cx="${a(t.x)}" cy="${d(t.y)}" r="1.1"/>`;case"label":return`<text class="p-text" x="${a(t.x)}" y="${d(t.y)}">${k(t.text)}</text>`}}var W=String.raw`
|
|
32
|
+
.hmi{position:relative;overflow:hidden;font-family:"Segoe UI Variable Display","Segoe UI",Inter,system-ui,sans-serif;color:var(--fg);background:var(--bg);border-radius:18px;box-sizing:border-box;-webkit-font-smoothing:antialiased}
|
|
33
|
+
.hmi *{box-sizing:border-box}
|
|
34
|
+
.theme-dark{--bg:radial-gradient(1200px 600px at 15% -10%,#13284a 0%,transparent 60%),radial-gradient(900px 500px at 110% 110%,#1c1640 0%,transparent 55%),#070d1a;--fg:#e6edf7;--muted:#8193ad;--tile:linear-gradient(160deg,rgba(30,41,64,.72),rgba(14,21,37,.78));--tile-bd:rgba(148,163,184,.13);--tile-sh:0 10px 30px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.05);--track:rgba(148,163,184,.16);--accent:#38bdf8;--ok:#22c55e;--warn:#f59e0b;--alarm:#ef4444;--neutral:#64748b;--shell-a:#1e293b;--shell-b:#334155;--liq-a:#38bdf8;--liq-b:#0369a1;--hub-a:#475569;--hub-b:#0f172a;--pipe:#334155;--pipe-in:#1e293b;--btn:rgba(148,163,184,.1)}
|
|
35
|
+
.theme-light{--bg:radial-gradient(1000px 500px at 10% -10%,#dbeafe 0%,transparent 60%),#eef2f7;--fg:#0f172a;--muted:#64748b;--tile:linear-gradient(160deg,#ffffff,#f8fafc);--tile-bd:#e2e8f0;--tile-sh:0 6px 20px rgba(15,23,42,.06);--track:#e2e8f0;--accent:#0284c7;--ok:#16a34a;--warn:#d97706;--alarm:#dc2626;--neutral:#94a3b8;--shell-a:#cbd5e1;--shell-b:#f1f5f9;--liq-a:#38bdf8;--liq-b:#0284c7;--hub-a:#e2e8f0;--hub-b:#94a3b8;--pipe:#94a3b8;--pipe-in:#cbd5e1;--btn:#f1f5f9}
|
|
36
|
+
.glow{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(56,189,248,.06),transparent 30%)}
|
|
37
|
+
.h-bar{position:absolute;left:20px;right:20px;top:0;height:var(--hdr,76px);display:flex;align-items:center;justify-content:space-between}
|
|
38
|
+
.h-title{font-size:24px;font-weight:650;letter-spacing:-.01em}
|
|
39
|
+
.h-sub{font-size:13px;color:var(--muted);margin-top:2px}
|
|
40
|
+
.h-right{display:flex;gap:12px;align-items:center}
|
|
41
|
+
.h-sim{display:flex;align-items:center;gap:8px;padding:7px 13px;border-radius:999px;border:1px solid var(--tile-bd);background:var(--tile);font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
|
|
42
|
+
.h-sim .dot{width:8px;height:8px;border-radius:50%;background:var(--neutral)}
|
|
43
|
+
.h-sim.run{color:var(--ok)}.h-sim.run .dot{background:var(--ok);box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 25%,transparent);animation:pulse 1.6s infinite}
|
|
44
|
+
.h-sim.stop{color:var(--warn)}.h-sim.stop .dot{background:var(--warn)}
|
|
45
|
+
.h-nav{position:absolute;left:50%;transform:translateX(-50%);display:flex;gap:4px;padding:4px;border-radius:12px;background:var(--tile);border:1px solid var(--tile-bd)}
|
|
46
|
+
.h-page{border:0;border-radius:9px;padding:8px 16px;background:transparent;color:var(--muted);font:600 13px/1 inherit;cursor:pointer;letter-spacing:.02em}
|
|
47
|
+
.h-page:hover{color:var(--fg)}.h-page.cur{background:var(--accent);color:#04121f}
|
|
48
|
+
.h-alarm{display:flex;align-items:center;gap:7px;padding:7px 12px;border-radius:999px;border:1px solid var(--tile-bd);background:var(--tile);font-size:12px;font-weight:700;color:var(--muted)}
|
|
49
|
+
.h-alarm .dot{width:8px;height:8px;border-radius:50%;background:var(--ok)}.h-alarm.on{color:#fff;background:color-mix(in srgb,var(--alarm) 75%,transparent);border-color:var(--alarm);animation:blink 1.2s infinite}.h-alarm.on .dot{background:#fff}
|
|
50
|
+
.clickable{cursor:pointer}.clickable:hover .pump-ring,.clickable:hover .valve-body{filter:drop-shadow(0 0 1.5px var(--accent))}
|
|
51
|
+
.fp{position:absolute;inset:0;background:rgba(2,6,23,.55);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:20}.fp[hidden]{display:none}
|
|
52
|
+
.fp-card{width:380px;border-radius:18px;background:var(--tile);background-color:#111a2e;border:1px solid var(--tile-bd);box-shadow:0 30px 80px rgba(0,0,0,.55);padding:18px 20px;display:flex;flex-direction:column;gap:14px}
|
|
53
|
+
.theme-light .fp-card{background-color:#fff}
|
|
54
|
+
.fp-head{display:flex;align-items:center;justify-content:space-between}.fp-title{font-size:18px;font-weight:650}
|
|
55
|
+
.fp-x{border:0;background:var(--btn);color:var(--fg);width:32px;height:32px;border-radius:10px;font-size:18px;cursor:pointer}
|
|
56
|
+
.fp-status{display:flex;gap:16px}.fp-btns{height:auto}.fp-btns .btn{min-height:46px}
|
|
57
|
+
.fp-row{display:flex;justify-content:space-between;font-size:14px;color:var(--muted)}.fp-row b{color:var(--fg);font-variant-numeric:tabular-nums}
|
|
58
|
+
.h-clock{font-variant-numeric:tabular-nums;font-size:15px;color:var(--muted);min-width:76px;text-align:right}
|
|
59
|
+
.tile{position:absolute;border-radius:16px;background:var(--tile);border:1px solid var(--tile-bd);box-shadow:var(--tile-sh);backdrop-filter:blur(8px);display:flex;flex-direction:column;padding:14px 16px 12px}
|
|
60
|
+
.tile.compact{padding:8px 16px}.tile.compact .t-title{height:15px;font-size:10.5px}
|
|
61
|
+
.t-title{font-size:11.5px;font-weight:650;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);height:20px;flex:none}
|
|
62
|
+
.t-body{flex:1;min-height:0;display:flex;flex-direction:column;justify-content:center;position:relative}
|
|
63
|
+
.tone-accent{--c:var(--accent)}.tone-ok{--c:var(--ok)}.tone-warn{--c:var(--warn)}.tone-alarm{--c:var(--alarm)}.tone-neutral{--c:var(--neutral)}
|
|
64
|
+
[data-tone=accent]{--c:var(--accent)}[data-tone=ok]{--c:var(--ok)}[data-tone=warn]{--c:var(--warn)}[data-tone=alarm]{--c:var(--alarm)}[data-tone=neutral]{--c:var(--neutral)}
|
|
65
|
+
.v-wrap{display:flex;align-items:baseline;gap:8px}
|
|
66
|
+
.v-num{font-weight:650;letter-spacing:-.02em;font-variant-numeric:tabular-nums;line-height:1;color:var(--c,var(--fg));transition:color .3s}
|
|
67
|
+
.v-unit{font-size:15px;color:var(--muted);font-weight:500}
|
|
68
|
+
.spark{width:100%;height:34%;margin-top:8px}.spark-line{fill:none;stroke:var(--accent);stroke-width:2;vector-effect:non-scaling-stroke}.spark-fill{fill:color-mix(in srgb,var(--accent) 16%,transparent)}
|
|
69
|
+
.gauge{display:block;margin:0 auto;--p:0}.g-track,.g-val{fill:none;stroke-width:14;stroke-linecap:round}.g-track{stroke:var(--track)}
|
|
70
|
+
.g-val{stroke:var(--c,var(--accent));stroke-dashoffset:calc(var(--len) * (1 - var(--p)));transition:stroke-dashoffset .5s cubic-bezier(.2,.8,.2,1),stroke .3s;filter:drop-shadow(0 0 6px color-mix(in srgb,var(--c,var(--accent)) 55%,transparent))}
|
|
71
|
+
.g-ticks line{stroke:var(--muted);stroke-width:1.5;opacity:.5}
|
|
72
|
+
.g-num{font-size:34px;font-weight:650;text-anchor:middle;fill:var(--fg);font-variant-numeric:tabular-nums}.g-unit{font-size:13px;text-anchor:middle;fill:var(--muted)}.g-lim{font-size:11px;fill:var(--muted);text-anchor:middle}
|
|
73
|
+
.bar-wrap{display:flex;flex-direction:column;gap:10px;--p:0}.bar{height:16px;border-radius:999px;background:var(--track);overflow:hidden;--p:0}
|
|
74
|
+
.bar-fill{height:100%;width:calc(var(--p) * 100%);border-radius:999px;background:linear-gradient(90deg,color-mix(in srgb,var(--c,var(--accent)) 70%,transparent),var(--c,var(--accent)));box-shadow:0 0 14px color-mix(in srgb,var(--c,var(--accent)) 45%,transparent);transition:width .5s cubic-bezier(.2,.8,.2,1)}
|
|
75
|
+
.bar-wrap.vert{flex-direction:row;height:100%;align-items:stretch}.bar-wrap.vert .bar{width:22px;height:auto;display:flex;align-items:flex-end}.bar-wrap.vert .bar-fill{width:100%;height:calc(var(--p) * 100%);transition:height .5s}
|
|
76
|
+
.bar-read{display:flex;align-items:baseline;gap:4px}.bar-num{font-size:26px;font-weight:650;font-variant-numeric:tabular-nums;color:var(--c,var(--fg))}.bar-unit{color:var(--muted);font-size:13px}.bar-lim{margin-left:auto;color:var(--muted);font-size:11px}
|
|
77
|
+
.status{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
|
|
78
|
+
.led{display:flex;align-items:center;gap:11px;font-size:14px;color:var(--muted);transition:color .3s}
|
|
79
|
+
.led-dot{width:12px;height:12px;border-radius:50%;background:var(--track);box-shadow:inset 0 1px 2px rgba(0,0,0,.4);transition:all .3s;flex:none}
|
|
80
|
+
.led.on{color:var(--fg)}.led.on .led-dot{background:radial-gradient(circle at 35% 35%,#fff 0,var(--c) 45%);box-shadow:0 0 0 3px color-mix(in srgb,var(--c) 22%,transparent),0 0 14px var(--c)}
|
|
81
|
+
.btns{display:flex;gap:10px;height:100%;align-items:center}.btns.col{flex-direction:column;align-items:stretch}
|
|
82
|
+
.btn{flex:1;min-height:52px;border-radius:12px;border:1px solid color-mix(in srgb,var(--c) 40%,var(--tile-bd));background:linear-gradient(180deg,color-mix(in srgb,var(--c) 22%,var(--btn)),color-mix(in srgb,var(--c) 10%,var(--btn)));color:var(--fg);font:650 16px/1 inherit;letter-spacing:.03em;cursor:pointer;transition:all .15s;box-shadow:0 4px 14px color-mix(in srgb,var(--c) 18%,transparent),inset 0 1px 0 rgba(255,255,255,.08)}
|
|
83
|
+
.btn:hover{filter:brightness(1.15)}.btn:active,.btn.on{transform:translateY(1px);background:color-mix(in srgb,var(--c) 45%,var(--btn));box-shadow:0 0 18px color-mix(in srgb,var(--c) 45%,transparent)}
|
|
84
|
+
.sw{display:flex;align-items:center;gap:14px;cursor:pointer;user-select:none}
|
|
85
|
+
.sw-track{width:58px;height:32px;border-radius:999px;background:var(--track);position:relative;transition:background .25s;flex:none}
|
|
86
|
+
.sw-knob{position:absolute;top:3px;left:3px;width:26px;height:26px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.35);transition:transform .25s cubic-bezier(.2,.8,.2,1)}
|
|
87
|
+
.sw.on .sw-track{background:var(--ok);box-shadow:0 0 16px color-mix(in srgb,var(--ok) 45%,transparent)}.sw.on .sw-knob{transform:translateX(26px)}
|
|
88
|
+
.sw-lbl{font-size:15px;flex:1}.sw-state{font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--muted)}.sw .s-on{display:none}.sw.on .s-on{display:inline;color:var(--ok)}.sw.on .s-off{display:none}
|
|
89
|
+
.sp{display:flex;flex-direction:column;gap:10px}.sp-row{display:flex;align-items:center;gap:10px}
|
|
90
|
+
.sp-btn{width:40px;height:40px;border-radius:12px;border:1px solid var(--tile-bd);background:var(--btn);color:var(--fg);font-size:22px;cursor:pointer}.sp-btn:hover{border-color:var(--accent)}
|
|
91
|
+
.sp-val{flex:1;text-align:center}.sp-num{font-size:30px;font-weight:650;font-variant-numeric:tabular-nums}.sp-unit{margin-left:6px;color:var(--muted);font-size:13px}
|
|
92
|
+
.sp-range{width:100%;accent-color:var(--accent)}.sp-lim{display:flex;justify-content:space-between;color:var(--muted);font-size:11px}
|
|
93
|
+
.tr-legend{display:flex;gap:14px;font-size:12px;color:var(--muted);margin-bottom:6px;flex-wrap:wrap}.tr-legend i{display:inline-block;width:10px;height:3px;border-radius:2px;margin-right:6px;vertical-align:middle}
|
|
94
|
+
.trend{flex:1;width:100%;min-height:0}.tr-grid line{stroke:var(--track);stroke-width:1;vector-effect:non-scaling-stroke}
|
|
95
|
+
.tr-line{fill:none;stroke-width:2.2;vector-effect:non-scaling-stroke;stroke-linejoin:round;filter:drop-shadow(0 0 4px rgba(56,189,248,.35))}
|
|
96
|
+
.tr-axis{display:flex;justify-content:space-between;font-size:10.5px;color:var(--muted);margin-top:4px}
|
|
97
|
+
.t-alarms .t-body,.t-status .t-body{justify-content:flex-start}
|
|
98
|
+
.alarms{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px;overflow:hidden}
|
|
99
|
+
.al{display:none;align-items:center;gap:9px;padding:8px 10px;border-radius:10px;font-size:12.5px;line-height:1.25;background:color-mix(in srgb,var(--c) 12%,transparent);border:1px solid color-mix(in srgb,var(--c) 35%,transparent)}
|
|
100
|
+
.al.active{display:flex}.sev-alarm{--c:var(--alarm)}.sev-warning{--c:var(--warn)}.sev-info{--c:var(--accent)}
|
|
101
|
+
.sev-alarm.active{animation:blink 1.2s infinite}
|
|
102
|
+
.al-badge{font-size:10px;font-weight:800;letter-spacing:.08em;padding:3px 7px;border-radius:6px;background:var(--c);color:#fff}
|
|
103
|
+
.al-none{display:flex;align-items:center;gap:9px;color:var(--ok);font-size:14px}.al-none::before{content:"";width:10px;height:10px;border-radius:50%;background:var(--ok);box-shadow:0 0 10px var(--ok)}
|
|
104
|
+
.alarms.has .al-none{display:none}
|
|
105
|
+
.txt{font-size:14px;line-height:1.5;color:var(--muted)}
|
|
106
|
+
.proc{width:100%;height:100%;overflow:visible}
|
|
107
|
+
.p-label{font-size:1.75px;fill:var(--muted);text-anchor:middle;font-weight:600;letter-spacing:.05em}.p-label.left{text-anchor:start}.p-text{font-size:2px;fill:var(--fg);font-weight:600}
|
|
108
|
+
.junction{fill:var(--pipe)}
|
|
109
|
+
.pipe-outer{fill:none;stroke:var(--pipe);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.pipe-inner{fill:none;stroke:var(--pipe-in);stroke-width:1;stroke-linecap:round;stroke-linejoin:round}
|
|
110
|
+
.pipe-flow{fill:none;stroke:var(--accent);stroke-width:.55;stroke-dasharray:1.1 1.9;stroke-linecap:round;opacity:0;transition:opacity .4s}.pipe.on .pipe-flow{opacity:1;animation:flow .8s linear infinite;filter:drop-shadow(0 0 1px var(--accent))}
|
|
111
|
+
.tank{--p:0}.tank-shell{fill:url(#gShell);stroke:var(--tile-bd);stroke-width:.4}.tank-liq{transform:scaleY(var(--p));transition:transform .8s cubic-bezier(.2,.8,.2,1)}
|
|
112
|
+
.tank-liq rect{fill:url(#gLiquid);opacity:.92}.tank[data-tone=warn] .tank-liq rect{fill:var(--warn)}.tank[data-tone=alarm] .tank-liq rect{fill:var(--alarm)}
|
|
113
|
+
.tank-wave{fill:rgba(255,255,255,.22);animation:wave 3s ease-in-out infinite alternate}
|
|
114
|
+
.tank-gloss{fill:rgba(255,255,255,.08)}.tank-ticks line{stroke:var(--muted);stroke-width:.3}
|
|
115
|
+
.tank-num{font-size:3.4px;font-weight:700;fill:#fff;text-anchor:middle;paint-order:stroke;stroke:rgba(2,6,23,.45);stroke-width:.6px;font-variant-numeric:tabular-nums}
|
|
116
|
+
.pump-ring{fill:none;stroke:var(--neutral);stroke-width:.9;transition:all .3s}.pump-body{stroke:var(--tile-bd);stroke-width:.3}.pump-out{fill:var(--shell-b);stroke:var(--tile-bd);stroke-width:.3}
|
|
117
|
+
.pump-imp path{fill:none;stroke:var(--muted);stroke-width:.9;stroke-linecap:round}.fan .pump-imp path{fill:var(--muted);stroke:none;opacity:.85}.pump-hub{fill:var(--muted)}
|
|
118
|
+
.pump.on .pump-ring{stroke:var(--ok);filter:url(#fGlow)}.pump.on .pump-imp{animation:spin 1s linear infinite}.pump.on .pump-imp path{stroke:var(--ok)}.fan.on .pump-imp path{fill:var(--ok)}.pump.on .pump-hub{fill:var(--ok)}
|
|
119
|
+
.fault .pump-ring{stroke:var(--alarm);animation:blink .8s infinite}
|
|
120
|
+
.valve-body{fill:var(--neutral);stroke:var(--tile-bd);stroke-width:.3;transition:fill .3s}.valve-stem{stroke:var(--muted);stroke-width:.6}.valve-act{fill:var(--shell-b);stroke:var(--tile-bd);stroke-width:.3}
|
|
121
|
+
.valve.on .valve-body{fill:var(--ok);filter:url(#fGlow)}
|
|
122
|
+
.sen-box{fill:rgba(2,6,23,.6);stroke:color-mix(in srgb,var(--accent) 70%,transparent);stroke-width:.22}.theme-light .sen-box{fill:#fff}
|
|
123
|
+
.sen-num{font-size:2px;font-weight:700;fill:var(--fg);text-anchor:middle;font-variant-numeric:tabular-nums}.sen-tag{font-size:1.5px;fill:var(--muted);text-anchor:middle;font-weight:600;letter-spacing:.06em}
|
|
124
|
+
.plamp .pl-dot{fill:var(--track);transition:all .3s}.plamp .pl-halo{fill:none}.plamp.on .pl-dot{fill:var(--c)}.plamp.on .pl-halo{fill:color-mix(in srgb,var(--c) 30%,transparent);filter:url(#fGlow)}
|
|
125
|
+
@keyframes spin{to{transform:rotate(360deg)}}@keyframes flow{to{stroke-dashoffset:-3}}@keyframes pulse{50%{opacity:.55}}@keyframes blink{50%{opacity:.45}}
|
|
126
|
+
@keyframes wave{from{transform:translateX(-6%)}to{transform:translateX(0)}}
|
|
127
|
+
.small .h-title{font-size:18px}.small .h-sub{display:none}.small .h-page{padding:6px 10px;font-size:11px}.small .t-title{font-size:10px}.small .tile{padding:9px 11px}
|
|
128
|
+
.large .h-title{font-size:32px}.large .h-page{font-size:16px;padding:10px 20px}.large .t-title{font-size:14px}
|
|
129
|
+
@media (prefers-reduced-motion:reduce){.hmi *{animation:none!important;transition:none!important}}
|
|
130
|
+
`;function O(t){if(t===void 0)return;let i=t.trim();if(/^true$/i.test(i))return!0;if(/^false$/i.test(i))return!1;let e=/^[A-Z_]+#(.*)$/i.exec(i),c=e?e[1]:i;if(/^[+-]?\d+(\.\d+)?(e[+-]?\d+)?$/i.test(c))return Number(c);let p=/^(?:T|TIME|LTIME)#(.+)$/i.exec(i);if(p){let d=0;for(let o of p[1].matchAll(/(\d+(?:\.\d+)?)(ms|us|ns|d|h|m|s)/gi)){let s=Number(o[1]);d+={d:864e5,h:36e5,m:6e4,s:1e3,ms:1,us:.001,ns:1e-6}[o[2].toLowerCase()]*s}return d}return i}var A=t=>typeof t=="number"?t:typeof t=="boolean"?t?1:0:void 0,N=t=>t===!0||typeof t=="number"&&t!==0;function X(t,i){if(typeof t=="boolean")return t?"ON":"OFF";if(typeof t=="number"){let e=i??(Number.isInteger(t)||Math.abs(t)>=100?0:Math.abs(t)>=10?1:2);return t.toLocaleString("en-US",{minimumFractionDigits:e,maximumFractionDigits:e})}return t===void 0?"\u2013":String(t)}function nt(t,i){if(t===void 0||!i?.length)return;let e;for(let c of[...i].sort((p,d)=>p.from-d.from))t>=c.from&&(e=c.tone);return e}var F=new Map;function at(t,i,e,c){let p=(f,u)=>{e(f,u),z({[f]:u})},d=new Map;t.querySelectorAll("[data-b]").forEach(f=>{let u=Number(f.dataset.b);d.set(u,[...d.get(u)??[],f])});let o={},s=()=>Date.now(),r=f=>O(o[f]),l=f=>{let u=f.target.closest("[data-act]");if(!u||!t.contains(u))return;let g=u.dataset.var,y=u.dataset.act;if(y==="tap"){p(g,"TRUE");let v=()=>{p(g,"FALSE"),window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",v)};window.addEventListener("pointerup",v),window.addEventListener("pointercancel",v)}else y==="toggle"?p(g,N(r(g))?"FALSE":"TRUE"):y==="set"?p(g,"TRUE"):y==="reset"&&p(g,"FALSE");f.preventDefault()},n=(f,u)=>{let g=Number(f.dataset.min),y=Number(f.dataset.max),v=Number(f.dataset.step)||1,w=Math.min(y,Math.max(g,Math.round(u/v)*v));p(f.dataset.var,String(Number(w.toFixed(6))))},m=f=>{let u=f.target,g=u.closest("[data-nav]");if(g)return c?.(g.dataset.nav);let y=u.closest("[data-open]");if(y){t.querySelector(`#${y.getAttribute("data-open")}`)?.removeAttribute("hidden");return}if(u.closest("[data-close]")||u.classList.contains("fp")){u.closest(".fp")?.setAttribute("hidden","");return}let v=u.closest(".sp-btn");if(!v)return;let w=v.closest(".sp"),L=A(r(w.dataset.var))??Number(w.dataset.min);n(w,L+Number(v.dataset.step)*(Number(w.dataset.step)||1))},x=f=>{let u=f.target;u.classList.contains("sp-range")&&n(u.closest(".sp"),Number(u.value))};t.addEventListener("pointerdown",l),t.addEventListener("click",m),t.addEventListener("change",x);let $=t.querySelector("[data-clock]"),b=()=>$&&($.textContent=new Date().toLocaleTimeString("en-GB"));b();let M=setInterval(b,1e3);function h(f,u,g,y,v,w,L){let E=f.viewBox.baseVal,Z=s(),V=Z-y*1e3,D=g.flat().filter(C=>C.t>=V).map(C=>C.v),j=v??Math.min(...D),T=w??Math.max(...D);if(!D.length)return{min:0,max:0};T-j<1e-9&&(j-=1,T+=1);let J=(T-j)*.08;return v===void 0&&(j-=J),w===void 0&&(T+=J),g.forEach((C,K)=>{let _=C.filter(I=>I.t>=V).map((I,ot)=>`${ot?"L":"M"}${((I.t-V)/(Z-V)*E.width).toFixed(1)} ${(E.height-(I.v-j)/(T-j)*E.height).toFixed(1)}`).join(" ");u[K]?.setAttribute("d",_),L&&K===0&&_&&L.setAttribute("d",`${_} L${E.width} ${E.height} L0 ${E.height} Z`.replace(/^M[\d.]+/,I=>I))}),{min:j,max:T}}let S;function z(f,u=S){S=u,o={...o,...f};let g=s();for(let[v,w]of Object.entries(f)){let L=A(O(w));if(L===void 0)continue;let E=F.get(v)??[];for(E.push({t:g,v:L});E.length&&E[0].t<g-36e5;)E.shift();F.set(v,E)}d.forEach((v,w)=>{let L=i[w];if(L)for(let E of v)P(E,L)}),t.querySelectorAll(".alarms").forEach(v=>v.classList.toggle("has",!!v.querySelector(".al.active")));let y=t.querySelector("[data-sim]");if(y){let v=u?.state,w=v==="run";y.classList.toggle("run",w),y.classList.toggle("stop",!!v&&!w),y.querySelector(".lbl").textContent=w?"Simulation running":v?`Simulation ${v}`:"Offline"}}function P(f,u){switch(u.kind){case"text":{let g="v"in u?r(u.v):void 0;f.textContent=X(g,u.decimals)+(u.unit&&g!==void 0?` ${u.unit}`:"");let y=nt(A(g),u.bands);y?f.dataset.tone=y:delete f.dataset.tone;break}case"on":f.classList.toggle("on",N(r(u.v))!==!!u.invert);break;case"fault":f.classList.toggle("fault",N(r(u.v)));break;case"alarm":f.classList.toggle("active",N(r(u.v)));break;case"count":{let g=u.vars.filter(w=>N(r(w))).length;f.classList.toggle("on",g>0);let y=f.querySelector(".n");y&&(y.textContent=String(g));let v=f.querySelector(".lbl");v&&(v.textContent=g===1?"alarm":"alarms");break}case"level":{let g=A(r(u.v)),y=g===void 0?0:Math.min(1,Math.max(0,(g-u.min)/(u.max-u.min||1)));f.style.setProperty("--p",y.toFixed(4));let v=nt(g,u.bands);v?f.dataset.tone=v:delete f.dataset.tone;break}case"setpoint":{let g=f.querySelector(".sp-range"),y=A(r(u.v));g&&y!==void 0&&document.activeElement!==g&&(g.value=String(y));break}case"spark":{let g=f;h(g,[g.querySelector(".spark-line")],[F.get(u.v)??[]],60,void 0,void 0,g.querySelector(".spark-fill"));break}case"trend":{let g=f,y=h(g,[...g.querySelectorAll(".tr-line")],u.series.map(w=>F.get(w)??[]),u.seconds,u.min,u.max),v=g.parentElement?.querySelector(".tr-axis");v&&(v.querySelector(".tr-max").textContent=X(y.max),v.querySelector(".tr-min").textContent=X(y.min));break}}}return{update:z,destroy(){clearInterval(M),t.removeEventListener("pointerdown",l),t.removeEventListener("click",m),t.removeEventListener("change",x)}}}function st(t,i,e=60){let c=Date.now(),p=Date.now;for(let d=30;d>=1;d--){let o=c-d*e*1e3/30;Date.now=()=>o;let s={};for(let[r,l]of Object.entries(i)){let n=O(l);s[r]=typeof n=="number"?String(n*(1+.08*Math.sin(d/3)+.03*Math.cos(d*1.7))):l}t.update(s)}Date.now=p,t.update(i)}var ht=`
|
|
131
|
+
html,body{margin:0;height:100%;background:#05080f;overflow:hidden}
|
|
132
|
+
#stage{position:absolute;left:50%;top:50%;transform-origin:0 0}
|
|
133
|
+
#tabs{position:fixed;left:50%;bottom:14px;transform:translateX(-50%);display:flex;gap:6px;padding:5px;border-radius:999px;background:rgba(15,23,42,.75);border:1px solid rgba(148,163,184,.18);backdrop-filter:blur(10px);font:600 13px "Segoe UI",system-ui,sans-serif;z-index:5}
|
|
134
|
+
#tabs:empty{display:none}
|
|
135
|
+
#tabs button{border:0;border-radius:999px;padding:7px 16px;background:transparent;color:#94a3b8;font:inherit;cursor:pointer}
|
|
136
|
+
#tabs button.cur{background:#38bdf8;color:#04121f}
|
|
137
|
+
#banner{position:fixed;left:50%;top:14px;transform:translateX(-50%);padding:9px 16px;border-radius:10px;background:#7f1d1d;color:#fff;font:500 13px "Segoe UI",system-ui,sans-serif;z-index:6}
|
|
138
|
+
`;function $t(t){let i=document.createElement("style");i.textContent=t,document.head.appendChild(i)}var rt;function it(t,i,e,c={},p){let d=et(i,c);return t.innerHTML=d.html,rt=i,at(t.firstElementChild,d.bindings,e,p)}function Y(t,i){if(i){t.style.left="0",t.style.top="0";return}let e=B(rt??{}),c=Math.min(innerWidth/e.w,innerHeight/e.h)*.98;t.style.left="50%",t.style.top="50%",t.style.transform=`translate(-50%,-50%) scale(${c})`,t.style.transformOrigin="center"}async function yt(t){let i=new URLSearchParams(location.search),e=i.get("t")??"",c=i.get("s")??void 0,p=document.getElementById("tabs"),d=document.getElementById("banner"),o=async(m,x)=>{let $=await fetch("/call",{method:"POST",headers:{"content-type":"application/json","x-viewer-token":e},body:JSON.stringify({name:m,arguments:x})});if(!$.ok)throw new Error($.status===403?"This link is out of date: ask Claude to open the HMI again.":await $.text());let b=await $.json(),M=b.content?.[0]?.text??"{}";if(b.isError)throw new Error(M);return JSON.parse(M)},s=m=>{d.hidden=!m,d.textContent=m??""},r="",l,n=(m,x)=>{o("ui_hmi_write",{variable:m,value:x}).then($=>s($.ok===!1?String($.message):void 0),$=>s($.message))};for(;;){try{let m=await o("get_hmi",{screen:c});if(s(m.screen?void 0:"No HMI screens in this project yet: ask Claude to make one."),p.innerHTML="",m.screens.length>1&&m.screens.map(x=>`<button data-s="${x.name}" class="${x.name===m.screen?.name?"cur":""}">${x.title.replace(/[<&]/g,"")}</button>`).join(""),m.screen){let x=JSON.stringify([m.screen,m.screens,m.alarms]);if(x!==r){l?.destroy();let $=b=>{c=b,history.replaceState(null,"",`?t=${encodeURIComponent(e)}&s=${encodeURIComponent(b)}`),r=""};l=it(t,m.screen,n,{pages:m.screens,alarms:m.alarms},$),r=x,document.title=m.screen.title,Y(t,!1)}l.update(m.values??{},m.sim)}}catch(m){s(m.message.includes("fetch")?"The CODESYS MCP server isn't answering; this page reconnects by itself.":m.message)}await new Promise(m=>setTimeout(m,300)),p.onclick=m=>{let x=m.target.closest("button");x&&(c=x.dataset.s,history.replaceState(null,"",`?t=${encodeURIComponent(e)}&s=${encodeURIComponent(c??"")}`))}}}$t(W+ht);var G=document.getElementById("stage"),H=window.HMI_STATIC;if(H){Y(G,!0);let t=it(G,H.screen,()=>{},H.page??{});st(t,H.values),t.update(H.values,H.sim),document.body.dataset.ready="1"}else addEventListener("resize",()=>Y(G,!1)),yt(G);})();
|
package/dist/panel.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { PanelState } from "./panel-types.js";
|
|
|
3
3
|
import type { ProjectCache } from "./codesys/cache.js";
|
|
4
4
|
import { type ChangeStore } from "./codesys/changes.js";
|
|
5
5
|
import type { Driver } from "./driver.js";
|
|
6
|
+
import type { HmiService } from "./hmi/service.js";
|
|
6
7
|
export declare const PANEL_URI = "ui://codesys/sim-panel.html";
|
|
7
8
|
/** The name the browser viewer's own connection uses; it isn't a card. */
|
|
8
9
|
export declare const VIEWER_CLIENT = "codesys-viewer";
|
|
@@ -23,5 +24,7 @@ export interface PanelDeps {
|
|
|
23
24
|
revert?: (path: string, to: string) => Promise<string>;
|
|
24
25
|
/** The server log: how far a card got, since a client can accept the tool and draw nothing. */
|
|
25
26
|
log?: (message: string) => void;
|
|
27
|
+
/** HMI screens of the open project. */
|
|
28
|
+
hmi?: HmiService;
|
|
26
29
|
}
|
|
27
30
|
export declare function registerPanel(server: McpServer, ws?: PanelDeps): void;
|
package/dist/panel.js
CHANGED
|
@@ -196,6 +196,23 @@ export function registerPanel(server, ws = { project: () => undefined }) {
|
|
|
196
196
|
ws.cache?.bump();
|
|
197
197
|
return r;
|
|
198
198
|
});
|
|
199
|
+
tools.push(registerAppTool(server, "get_hmi", {
|
|
200
|
+
description: "Panel: the project's HMI screens, one screen's description and its live values from the simulation.",
|
|
201
|
+
inputSchema: z.object({ screen: z.string().optional() }),
|
|
202
|
+
annotations: { readOnlyHint: true },
|
|
203
|
+
_meta: appOnly,
|
|
204
|
+
}, async ({ screen }) => {
|
|
205
|
+
const hmi = ws.hmi;
|
|
206
|
+
const all = hmi?.screens() ?? [];
|
|
207
|
+
const s = hmi?.screen(screen) ?? all[0];
|
|
208
|
+
const live = s && hmi ? await hmi.values(s).catch(() => ({ values: {}, errors: {} })) : { values: {}, errors: {} };
|
|
209
|
+
return json({ screens: all.map((x) => ({ name: x.name, title: x.title })), ...(s ? { screen: s } : {}), values: live.values, sim: hmi?.sim() ?? {}, alarms: hmi?.page().alarms ?? [] });
|
|
210
|
+
}));
|
|
211
|
+
action("ui_hmi_write", "operate the HMI: write a value into CODESYS's simulation (only variables on an HMI screen).", z.object({ variable: z.string(), value: z.string() }), async (a) => {
|
|
212
|
+
if (!ws.hmi)
|
|
213
|
+
throw new Error("No HMI.");
|
|
214
|
+
return ws.hmi.write(a.variable, a.value);
|
|
215
|
+
});
|
|
199
216
|
// Clients without MCP Apps support would show app-only tools to the model; hide them there.
|
|
200
217
|
const prev = server.server.oninitialized;
|
|
201
218
|
server.server.oninitialized = () => {
|
package/dist/panel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
2
|
import { type AppContext } from "./tools.js";
|
|
3
|
-
export declare const VERSION = "2.
|
|
3
|
+
export declare const VERSION = "2.3.0";
|
|
4
4
|
export declare function createServer(ctx: AppContext): McpServer;
|
|
5
5
|
export type { AppContext };
|
package/dist/server.js
CHANGED
|
@@ -3,23 +3,28 @@ import { EXTENSION_ID } from "@modelcontextprotocol/ext-apps/server";
|
|
|
3
3
|
import { currentCodesysSim } from "./codesys/simulation.js";
|
|
4
4
|
import { registerTools, revertObject, versionLine } from "./tools.js";
|
|
5
5
|
import { registerPanel } from "./panel.js";
|
|
6
|
-
|
|
6
|
+
import { HmiService } from "./hmi/service.js";
|
|
7
|
+
export const VERSION = "2.3.0";
|
|
7
8
|
const INSTRUCTIONS = `CODESYS V3.5 automation through a persistent CODESYS session.
|
|
8
9
|
Everything goes through the one tool named codesys, as {"action": "<name>", "args": {...}}. The names below are its actions; {"action": "help"} lists them all with their arguments.
|
|
9
10
|
Use batch whenever you know the next steps: it sends several actions in one call and is much faster than separate calls. For example, all the create_object and write_object calls of a step followed by compile, or codesys_sim_force, wait, codesys_sim_cycle and codesys_sim_read for one test.
|
|
10
11
|
Workflow: open_project (or create_project) -> get_project_tree -> read_objects -> write_object / create_object -> compile.
|
|
11
12
|
Object paths are relative to the active application: 'PLC_PRG', 'FB_Pump/Start' (method), 'FB_Pump/Speed/Get' (property accessor).
|
|
12
|
-
|
|
13
|
+
Write code as Structured Text; create ladder, FBD or SFC POUs with create_graphical. Existing graphical bodies are marked [non-ST] and can't be edited in place. Before calling a library FB, check its interface with get_signature instead of guessing; find_references shows where a name is used.
|
|
13
14
|
The first call after start can take 1-3 minutes while CODESYS starts; codesys_status shows progress without waiting.
|
|
14
15
|
To check that logic works, use CODESYS's own simulation (no controller, nothing extra to install, the real compiler and libraries): codesys_sim_start -> codesys_sim_control (run) or codesys_sim_cycle (exact cycles) -> codesys_sim_read / write / force / unforce -> codesys_sim_stop. The project is locked until codesys_sim_stop.
|
|
15
16
|
Fix code with write_object after codesys_sim_stop, then codesys_sim_start again to load it.
|
|
17
|
+
To check timing, set up a trace (trace_setup, before codesys_sim_start) and record it (trace_record) while the simulation runs.
|
|
18
|
+
Operator screens: hmi_template gives page layouts; hmi_save_screen stores a page, hmi_screenshot shows it to you, open_hmi opens it live for the user, hmi_export_codesys builds it as a native CODESYS visualization.
|
|
16
19
|
Right after opening or creating a project, call the separate tool open_sim_panel: it shows the user a live CODESYS-style workspace in the chat (the project tree and the code as you write it, changes, compile results and the simulation), so they can watch you work.`;
|
|
17
20
|
export function createServer(ctx) {
|
|
18
21
|
// A host treats an extension the server doesn't advertise as unsupported, and then runs
|
|
19
22
|
// open_sim_panel as a plain text tool and never fetches the card's page.
|
|
20
23
|
const server = new McpServer({ name: "codesys-mcp-toolkit", version: VERSION }, { instructions: INSTRUCTIONS, capabilities: { extensions: { [EXTENSION_ID]: {} } } });
|
|
24
|
+
ctx.hmi ??= new HmiService(ctx);
|
|
21
25
|
registerTools(server, ctx);
|
|
22
26
|
registerPanel(server, {
|
|
27
|
+
hmi: ctx.hmi,
|
|
23
28
|
cache: ctx.cache,
|
|
24
29
|
changes: ctx.changes,
|
|
25
30
|
project: () => ctx.project?.path,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,YAAY,GAAG;;;;;;;;;;;yQAWoP,CAAC;AAE1Q,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,wFAAwF;IACxF,yEAAyE;IACzE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACtK,GAAG,CAAC,GAAG,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,aAAa,CAAC,MAAM,EAAE;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI;QAChC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC;QAC7G,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC;QACxC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACjD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;KACzB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** The CODESYS actions (ST only), all behind the one model-facing tool. See actions.ts. */
|
|
2
|
+
import { HmiService } from "./hmi/service.js";
|
|
1
3
|
import type { McpServer } from "@modelcontextprotocol/server";
|
|
2
4
|
import { type CodesysBridge } from "./bridge/bridge.js";
|
|
3
5
|
import { type ChangeStore } from "./codesys/changes.js";
|
|
@@ -33,8 +35,10 @@ export interface AppContext {
|
|
|
33
35
|
/** The browser viewer (the panel in a normal browser window). */
|
|
34
36
|
viewer?: {
|
|
35
37
|
url: string;
|
|
36
|
-
open(force?: boolean): boolean;
|
|
38
|
+
open(force?: boolean, target?: string): boolean;
|
|
37
39
|
};
|
|
40
|
+
/** HMI screens of the open project. */
|
|
41
|
+
hmi?: HmiService;
|
|
38
42
|
/** Attach mode: adopts the project already open in the user's window (set by registerTools). */
|
|
39
43
|
adoptProject?: () => Promise<void>;
|
|
40
44
|
/** The server log. */
|
package/dist/tools.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { registerHmiActions } from "./hmi/tools.js";
|
|
2
|
+
import { registerLangActions, registerRenameAction } from "./codesys/lang.js";
|
|
3
|
+
import { registerTraceActions } from "./codesys/trace.js";
|
|
4
|
+
import { registerGraphicalActions } from "./codesys/graphical.js";
|
|
5
|
+
import { registerDebugActions } from "./codesys/debug.js";
|
|
6
|
+
import { registerSimTestAction } from "./codesys/simtest.js";
|
|
7
|
+
import { registerDeviceActions } from "./codesys/device-tools.js";
|
|
2
8
|
import { copyFile } from "node:fs/promises";
|
|
3
9
|
import { registerActionTool } from "./actions.js";
|
|
4
10
|
import { getUiCapability } from "@modelcontextprotocol/ext-apps/server";
|
|
@@ -57,6 +63,7 @@ const CREATE_TO_NODE = {
|
|
|
57
63
|
interface: { kind: "interface" },
|
|
58
64
|
dut: { kind: "dut" },
|
|
59
65
|
gvl: { kind: "gvl" },
|
|
66
|
+
persistent_vars: { kind: "gvl" },
|
|
60
67
|
folder: { kind: "folder" },
|
|
61
68
|
};
|
|
62
69
|
/** " Compiler 3.5.21.0. Defines: FAST, MODE." plus a note when CODESYS is newer than the project. */
|
|
@@ -203,7 +210,7 @@ export function registerTools(server, ctx) {
|
|
|
203
210
|
const h = b.health();
|
|
204
211
|
const lines = [
|
|
205
212
|
`CODESYS: ${ctx.codesys ? `${ctx.codesys.label} (${ctx.codesys.profile ? `profile "${ctx.codesys.profile}"` : "no profile"})${h.scripting ? `, Scripting ${h.scripting}` : ""}` : "unknown"}`,
|
|
206
|
-
`Bridge: ${h.state} / ${h.verdict}${h.pid ? `, pid ${h.pid}` : ""}${h.readyAfterMs ? `, started in ${Math.round(h.readyAfterMs / 1000)}s` : ""}, ${h.calls} call(s), ${h.restarts} restart(s)`,
|
|
213
|
+
`Bridge: ${h.state} / ${h.verdict}${h.pid ? `, pid ${h.pid}` : ""}${h.readyAfterMs ? `, started in ${Math.round(h.readyAfterMs / 1000)}s` : ""}, ${h.calls} call(s), ${h.restarts} restart(s)${b.visible ? ", window shown (--show-window)" : ""}`,
|
|
207
214
|
];
|
|
208
215
|
if (h.heartbeat)
|
|
209
216
|
lines.push(`Watcher: ${h.heartbeat.state}${h.heartbeat.op ? ` (${h.heartbeat.op})` : ""}, heartbeat ${Math.round(h.heartbeat.ageMs / 1000)}s ago`);
|
|
@@ -352,7 +359,7 @@ export function registerTools(server, ctx) {
|
|
|
352
359
|
description: "Create an ST object. kind: program | function_block | function (needs returnType) | method (under a POU or interface) | property (needs returnType) | action | interface | dut (dutType struct|enum|union|alias) | gvl | folder. Optionally set its declaration/implementation in the same call.",
|
|
353
360
|
inputSchema: z.object({
|
|
354
361
|
parent: pathArg.optional().describe("Parent object path (default: the application). Methods/properties/actions go under their POU."),
|
|
355
|
-
kind: z.enum(["program", "function_block", "function", "method", "property", "action", "interface", "dut", "gvl", "folder"]),
|
|
362
|
+
kind: z.enum(["program", "function_block", "function", "method", "property", "action", "interface", "dut", "gvl", "persistent_vars", "folder"]),
|
|
356
363
|
name: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/, "must be an IEC identifier"),
|
|
357
364
|
returnType: z.string().optional(),
|
|
358
365
|
dutType: z.enum(["struct", "enum", "union", "alias"]).optional(),
|
|
@@ -713,6 +720,15 @@ export function registerTools(server, ctx) {
|
|
|
713
720
|
return f.errors ? f.text : undefined;
|
|
714
721
|
},
|
|
715
722
|
});
|
|
723
|
+
registerLangActions(reg, ctx, (fn) => run(ctx, fn));
|
|
724
|
+
registerRenameAction(reg, ctx, (fn) => run(ctx, fn));
|
|
725
|
+
registerTraceActions(reg, ctx, (fn) => run(ctx, fn));
|
|
726
|
+
registerGraphicalActions(reg, ctx, (fn) => run(ctx, fn));
|
|
727
|
+
registerDebugActions(reg, ctx, (fn) => run(ctx, fn));
|
|
728
|
+
registerSimTestAction(reg, ctx, (fn) => run(ctx, fn));
|
|
729
|
+
registerDeviceActions(reg, ctx, (fn) => run(ctx, fn));
|
|
730
|
+
if (ctx.hmi)
|
|
731
|
+
registerHmiActions(reg, ctx, ctx.hmi, (fn) => run(ctx, fn));
|
|
716
732
|
registerActionTool(server, actions);
|
|
717
733
|
}
|
|
718
734
|
/**
|