@likec4/mcp 1.54.0 → 1.55.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.
package/dist/index.mjs CHANGED
@@ -1,1251 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as ee,A as te,B as ne,C as re,D as ie,E as ae,F as oe,G as se,H as _,I as ce,J as le,K as ue,L as v,M as y,N as de,O as b,P as fe,Q as pe,R as me,S as he,T as ge,U as _e,V as ve,W as ye,X as be,Y as xe,Z as Se,_ as x,_t as Ce,a as we,at as S,b as Te,c as Ee,ct as C,d as De,dt as Oe,et as w,f as ke,ft as Ae,g as je,gt as Me,h as Ne,ht as Pe,i as Fe,it as Ie,j as Le,k as Re,l as ze,lt as Be,m as Ve,mt as He,n as Ue,nt as We,o as Ge,ot as Ke,p as qe,pt as Je,q as Ye,r as Xe,rt as Ze,s as Qe,st as $e,t as et,tt,u as nt,ut as T,v as rt,w as it,x as at,y as ot,z as st}from"./_chunks/libs/remeda.mjs";import{t as ct}from"./_chunks/libs/natural-compare-lite.mjs";import{n as lt,t as ut}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as dt,t as ft}from"./_chunks/libs/graphology-dag.mjs";import{a as pt,i as mt,n as ht,o as gt,r as _t,s as vt,t as E}from"./_chunks/libs/mnemonist.mjs";import{t as yt}from"./_chunks/libs/ohash.mjs";import{t as bt}from"./_chunks/libs/defu.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as xt}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as St}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Ct}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as wt,t as Tt}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Et}from"./_chunks/libs/remark-gfm.mjs";import{t as Dt}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Ot}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as kt}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/is-plain-obj.mjs";import"./_chunks/libs/trough.mjs";import{t as At}from"./_chunks/libs/unified.mjs";import{n as jt,t as Mt}from"./_chunks/libs/immer.mjs";import{a as Nt,i as Pt,n as Ft,r as It,t as Lt}from"./_chunks/libs/@logtape/logtape.mjs";import{n as Rt,t as zt}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import{t as Bt}from"./_chunks/libs/safe-stringify.mjs";import{a as Vt,i as Ht,n as Ut,r as Wt,t as Gt}from"./_chunks/libs/@lume/kiwi.mjs";import{n as Kt,r as qt,t as D}from"./_chunks/libs/ts-graphviz.mjs";import{t as Jt}from"./_chunks/libs/word-wrap.mjs";import{n as Yt,r as Xt,t as Zt}from"./_chunks/libs/khroma.mjs";import{t as Qt}from"./_chunks/libs/graphology.mjs";import{t as $t}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as en}from"./_chunks/libs/p-queue.mjs";import{n as tn,t as nn}from"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as rn}from"./_chunks/libs/which.mjs";import{$ as an,A as on,B as sn,C as cn,D as ln,E as un,F as dn,G as fn,H as pn,I as mn,J as hn,K as gn,L as _n,M as vn,N as yn,O as bn,P as xn,Q as Sn,R as Cn,S as wn,T as Tn,U as En,V as Dn,W as On,X as kn,Y as An,Z as jn,_ as Mn,a as Nn,at as Pn,b as Fn,c as In,ct as Ln,d as Rn,dt as zn,et as Bn,f as Vn,ft as Hn,g as Un,h as Wn,i as Gn,it as Kn,j as qn,k as Jn,l as Yn,lt as Xn,m as Zn,mt as Qn,n as $n,nt as er,o as tr,ot as nr,p as rr,pt as ir,q as ar,r as or,rt as sr,s as cr,st as lr,t as ur,tt as dr,u as fr,ut as pr,v as mr,w as hr,x as gr,y as _r,z as vr}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as yr}from"./_chunks/libs/json5.mjs";import{J as O,i as br,n as xr,r as Sr,t as Cr}from"./_chunks/libs/@hono/mcp.mjs";import{n as wr,t as Tr}from"./_chunks/libs/fdir.mjs";import{t as Er}from"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Dr}from"./_chunks/libs/pretty-ms.mjs";import{a as Or,c as kr,d as Ar,i as jr,l as Mr,n as Nr,o as Pr,r as Fr,s as Ir,t as Lr,u as Rr}from"./_chunks/libs/ufo.mjs";import{a as zr,c as k,d as A,f as Br,i as Vr,l as j,n as Hr,o as Ur,p as Wr,r as M,s as Gr,t as Kr,u as qr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{t as Jr}from"./_chunks/libs/@hono/node-server.mjs";import"./_chunks/libs/fast-equals.mjs";import{t as Yr}from"./_chunks/libs/strip-indent.mjs";import"./_chunks/libs/destr.mjs";import{n as Xr,t as Zr}from"./_chunks/libs/unstorage.mjs";import{n as Qr,t as $r}from"./_chunks/libs/pathe.mjs";import{t as ei}from"./_chunks/libs/tinyrainbow.mjs";import{n as ti,t as ni}from"./_chunks/libs/citty.mjs";import{basename as ri,dirname as ii,resolve as ai}from"node:path";import{Graphviz as oi}from"@hpcc-js/wasm-graphviz";import*as si from"node:fs/promises";import{unlink as ci,writeFile as li}from"node:fs/promises";import ui from"node:os";import{pathToFileURL as di}from"url";import{isColorSupported as fi,isDevelopment as pi}from"std-env";import{bundleRequire as mi}from"bundle-require";import{formatMessagesSync as hi}from"esbuild";import{mkdirSync as gi,statSync as _i}from"node:fs";const vi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},yi={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},bi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},xi={primary:vi,blue:vi,secondary:yi,sky:yi,muted:bi,slate:bi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},Si={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Ci={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},wi={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Ti={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},Ei={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:wi,gray:Si,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:Ci,primary:wi,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Ti,sky:Ti,slate:Ci},Di={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Oi=[`xs`,`sm`,`md`,`lg`,`xl`],ki=[`left`,`right`,`top`,`bottom`],Ai=[`solid`,`dashed`,`dotted`,`none`],ji=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Mi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Ni=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Pi={tomato:f.tomato9,grass:s.grass9,blue:u.blue9,ruby:i.ruby9,orange:m.orange9,indigo:n.indigo9,pink:r.pink9,teal:a.teal9,purple:c.purple9,amber:h.amber9,crimson:p.crimson9,red:g.red9,lime:d.lime9,yellow:o.yellow9,violet:l.violet9};function Fi(e){return e in Pi}const Ii={colors:Mi.reduce((e,t)=>(e[t]={elements:xi[t],relationships:Ei[t]},e),{}),...Di};var Li=t(ct(),1);function Ri(e,t){return e===t?0:de(e)?de(t)?(0,Li.default)(e,t):1:de(t)?-1:0}function zi(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Li.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Bi(e){let t=[],n=[];for(let[r,i]of Ke(e))y(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return T(n,De(Ri),b((e,t)=>({tag:e,spec:{color:N(Ni[t%Ni.length])}})),Ae(t),De((e,t)=>Ri(e.tag,t.tag)),je(x(`tag`),x(`spec`)))}function Vi(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,T(et(e,t),Qe(([e,t])=>n(e,t)),b(([e,t])=>e)))}function Hi(e){return e!=null&&typeof e==`string`}function Ui(e){return!!e&&Array.isArray(e)&&e.length>0}function Wi(...e){return(t=>e.some(e=>e(t)))}function Gi(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function Ki(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const qi=e=>Hi(e)?e:e.id;function I(e,t){let n=qi(e);return t?qi(t).startsWith(n+`.`):e=>{let t=qi(e);return n.startsWith(t+`.`)}}function Ji(e,t){if(!t)return t=>Ji(e,t);let n=qi(e),r=qi(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function Yi(e,t){return t?I(t,e):t=>I(e,t)}function Xi(e){return(Hi(e)?e:e.id).split(`.`).length}function Zi(e,t){let n=Hi(e)?e:e.id,r=Hi(t)?t:t.id;if(n===r)return 0;let i=Xi(n),a=Xi(r);if(Ji(n,r))return Math.abs(i-a);let o=Qi(n,r),s=o?Xi(o):0;return i+a-(2*s+1)}function Qi(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function $i(e){let t=e.split(`.`);if(t.pop(),!C(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function ea(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function ta(e,t){return ea(e.id,t.id)}function na(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ra(e,t){let n=t;for(let t of e)t!==n&&I(t,n)&&(n=t);return n===t?null:n}function ia(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ra(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function aa(e,t){if(!e||Hi(e)){let t=e??`asc`;return e=>aa(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Ri(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function oa(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function sa(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ca(e,t){let n=t??e;P(ne(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function la(e,t){let n=t??e;P(ne(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function ua(e){return e?da(e):da}function*da(e){for(let t of e)yield*t}function fa(e){return e?pa(e):pa}function pa(e){let{value:t}=e[Symbol.iterator]().next();return t}function ma(e,t){let n=t??e;P(ne(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function ha(e,t){let n=t??e;P(ne(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function ga(e){return e?new Set(e):e=>new Set(e)}function _a(e){return e?va(e):va}function*va(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function ya(...e){let t=100;return e.length===2?t=Ne(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function ba(){return Promise.resolve().then(()=>void 0)}function xa(e){Promise.resolve().then(e)}const Sa=(e,t)=>{let n=Qi(e.source.id,e.target.id),r=Qi(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?ea(n,r):0;if(i!==0)return i;let a=ea(e.source.id,t.source.id);return a===0?ea(e.target.id,t.target.id):a};function Ca(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function wa(e,...t){let n=new Set;if(e.size===0)return n;let r=C(t,2)?(0,gt.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function Ta(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function Ea(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function Da(e,t){return(0,gt.symmetricDifference)(e,t)}function Oa(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function ka(e){return P(typeof e==`object`&&st(e),`objectHash: value must be an object`),yt(e)}function Aa(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function ja(){return At().use(Ot).use(Et).use(Dt).use(kt,{allowDangerousHtml:!0}).use(St,bt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},xt)).use(Ct,{allowDangerousHtml:!0})}function Ma(e){return(``+ja().processSync(e)).trim()}function Na(e){return wt(Tt(e),{includeHtml:!1,includeImageAlt:!1})}function Pa(e){P(lt.valid(e),`Invalid color: ${e}`);let t=ut(e),n=t[6],r=Fa(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Fa(e){let t=lt(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=lt.contrastAPCA(t,n),s=lt.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!le(n,i)||!le(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const Ia={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},La=Ii,Ra=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function z(e){return it(e,e=>e===void 0)}function za(e){return e.summary??e.description}function Ba(e){return e.description??e.summary}function Va(e,t){return e[Ha]===t}const Ha=`_stage`,Ua=`_type`,Wa=`_layout`;function Ga(e){return e}function Ka(e){return typeof e==`string`?{txt:e}:e}function qa(e){if(ve(e))return null;let t=de(e)?e:e.txt??e.md;return y(t?.trim())?t:null}function Ja(e,t){return t?t+`.`+e:e}const Ya=`@group`;function Xa(e){return e.kind===Ya}function Za(e){return e}function Qa(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function $a(e){return e.startsWith(`@`)}function eo(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function to(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function no(e){return e.startsWith(`step-`)}function ro(e){if(!no(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let B;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(de(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return Qa(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(B||={});let V;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&B.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(V||={});let io;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(io||={});let ao;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return io.isWhere(e)}e.isRelationWhere=n;function r(e){return V.isWhere(e)}e.isFqnExprWhere=r;function i(e){return V.is(e)||V.isWhere(e)||V.isCustom(e)}e.isFqnExpr=i;function a(e){return io.is(e)||io.isWhere(e)||io.isCustom(e)}e.isRelation=a})(ao||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(H||={});let oo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(oo||={});let so;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return oo.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return oo.is(e)||oo.isWhere(e)||oo.isCustom(e)}e.isRelationExpr=a})(so||={});function co(e){return y(e.kind)&&!y(e.element)}function lo({size:e,padding:t,textSize:n,iconSize:r,...i},a=Ro.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function uo(e){return`tag`in e}function fo(e){return`kind`in e}function po(e){return`metadata`in e}function mo(e){return`participant`in e}function ho(e){return`not`in e}function go(e){return`and`in e}function _o(e){return`or`in e}function vo(e){switch(!0){case mo(e):{let t=e.participant;return yo(t,vo(e.operator))}case uo(e):{if(de(e.tag)||`eq`in e.tag){let t=de(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case fo(e):{if(de(e.kind)||`eq`in e.kind){let t=de(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>v(e.kind)||e.kind!==t}case po(e):{let{key:t,value:n}=e.metadata;if(n===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(de(n)||`eq`in n){let e=de(n)?n:n.eq;return n=>{if(!n.metadata)return!1;let r=n.metadata[t];return Array.isArray(r)?r.includes(e):r===e}}let r=n.neq;return e=>{if(!e.metadata)return!0;let n=e.metadata[t];return n==null?!0:Array.isArray(n)?!n.includes(r):n!==r}}case ho(e):return me(vo(e.not));case go(e):return Me(e.and.map(vo));case _o(e):return Pe(e.or.map(vo));default:F(e)}}function yo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function bo(e){return`include`in e||`exclude`in e}function xo(e){return`targets`in e&&`style`in e}function So(e){return e._type===`element`}function Co(e){return So(e)&&y(e.extends)}function wo(e){return e._type===`deployment`}function To(e){return e._type===`dynamic`}function Eo(e){return`styleId`in e}function Do(e){return`predicateId`in e}function Oo(e){return`direction`in e}function ko(e){return no(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function Ao(e){return!!e&&`__parallel`in e&&se(e.__parallel)}function jo(e){return!!e&&`__series`in e&&se(e.__series)}function Mo(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function No(e){return`rank`in e&&Array.isArray(e.targets)}const Po=Symbol.for(`text`),Fo=Symbol.for(`html`);var Io=class e{static mdcache=new mt.default(500);static txtcache=new mt.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Po,()=>Na(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Fo,()=>Ma(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function Lo(e,t){let n=t??6,r=lt(e.fill),i=lt(e.stroke),a=r.luminance()>.8,o=T(et(lt.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),lt.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),b(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Ro={theme:La,defaults:Ia};var zo=class e{theme;defaults;static DEFAULT=new e(Ro);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=bt({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},Ro);return ve(r?.content)&&le(o,Ro)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get fingerprint(){return R(this,`fingerprint`,()=>ka({config:this.config,customCss:this.customCss}))}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??this.defaults.color)}compoundColorsCache=new ht.default(e=>new E.default(t=>Lo(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=lo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!lt.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return Pa(e)}equals(e){return e===this?!0:this.constructor===e.constructor?this.fingerprint===e.fingerprint:!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:Fi(e)?this.computeFrom(Pi[e]).elements:this.computeFrom(e).elements}};function Bo(e,t){let{nodes:n,edges:r,hasManualLayout:i,...a}=e,o=new Map(n.map(e=>[e.id,e])),s=new Map(r.map(e=>[e.id,e])),c=t.nodes.map(e=>{let t=o.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),l=t.edges.map(e=>{let t=s.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints}}:e}),u={...t,...a,[Ha]:`layouted`,bounds:t.bounds,nodes:c,edges:l};return i?u[Wa]=`auto`:delete u[Wa],u}function Vo(e){return T(e,S(e=>!!e.notation),be(x(`notation`)),ae(rt(be(x(`shape`)),ae(rt(be(x(`color`)),ae(rt(b(x(`kind`)),we())),Ke(),b(([e,t])=>({kinds:t,color:e})))),Ke(),w(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),Ke(),w(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),nt(x(`shape`),x(`title`),[e=>e.kinds.length,`desc`]))}const Ho=(e,t)=>e===t||v(e)&&v(t)?!1:!le(e,t);function Uo(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],v(t.style.border)?delete e.style.border:e.style.border=t.style.border,ce(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,v(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function Wo(e,t,n){if(Ho(t.icon??`none`,e.icon??`none`)){let r=y(e.icon)&&e.icon!==`none`;switch(!0){case r&&y(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(v(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&y(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Go(e,t,n){let r=!0;return Ho(e.style.iconColor,t.style.iconColor)&&(v(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),Ho(e.style.iconSize,t.style.iconSize)&&(n?v(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),Ho(e.style.iconPosition,t.style.iconPosition)&&(n?v(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Ko(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function qo(e,t,n){let r=!0;return Ho(e.title,t.title)&&(n?e.title=t.title:r=!1),Ho(e.description,t.description)&&(v(t.description)?delete e.description:n?e.description=Ko(e.description,t.description):r=!1),Ho(e.technology,t.technology)&&(v(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Jo(e,t,n){return e.title=t.title,v(t.description)?delete e.description:e.description=Ko(e.description,t.description),v(t.technology)?delete e.technology:e.technology=t.technology,!0}function Yo(e,t){P(e.id===t.id,`applyManualLayout: view ids do not match`),P(e._stage===`layouted`,`applyManualLayout: expected layouted view`),P(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),P(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Xo(t.nodes,e.nodes,n),i=Zo(t.edges,e.edges,n),a=Vo(r);return jt(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[Wa]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=Mt(r),o.edges=Mt(i),To(e)&&o._type===`dynamic`&&(o.variant=e.variant),So(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];C(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Xo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),jt(e,r=>{Uo(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(Ho(r.modelRef,t.modelRef)||Ho(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),Ho(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;Ho(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Go(r,t,s)||i.add(`label-changed`),Wo(r,t,s&&o===a)||i.add(`label-changed`),(a?Jo:qo)(r,t,s)||i.add(`label-changed`),Ho(r.notes,t.notes)&&(v(t.notes)?delete r.notes:r.notes=Ko(r.notes,t.notes)),Ho(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&Da(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];C(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Zo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??T(r.values(),ca(t=>t.source===e.source&&t.target===e.target),fa());return t&&r.delete(t.id),jt(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:P(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),P(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),P(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,Ho(e.notes,t.notes)&&(v(e.notes)!==v(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,Ho(Te(e,[`label`,`description`,`technology`,`labelBBox`]),Te(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),Ho(e.label,t.label)&&(v(t.label)!==v(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),Ho(e.description,t.description)&&(v(t.description)!==v(e.description)&&i.add(`label-changed`),t.description&&(r.description=Ko(e.description,t.description))),Ho(e.technology,t.technology)&&(v(t.technology)!==v(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:P(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),P(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];C(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function Qo(e,t){let{drifts:n,...r}=Yo(e,t);if(!n||n.length===0)return jt(e,e=>{delete e.drifts,e[Wa]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),jt(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??T(o.values(),ca(t=>t.source===e.source&&t.target===e.target),fa());return t&&o.delete(t.id),jt(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return jt(e,e=>{C(l,1)?e.drifts=l:delete e.drifts,e.nodes=Mt(s),e.edges=Mt(c),e[Wa]=`auto`})}const $o=e=>e.split(`
3
- `).map(e=>e.trim().replace(`file://`,``));function es(e,t=2){e=Array.isArray(e)?e:e.split(`
4
- `);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
5
- `)}function U(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=zt(e);if(t.stack){let e=$o(t.stack);return t.message+`
6
- `+es(e.slice(1))}return t.message}return Bt(e,{indentation:` `})}function ts(e,t){return Rt(e,t)}function ns(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=zt(t);return e.stack&&=$o(e.stack).join(`
7
- `),[e]}return e===`error`||e===`err`?[Error(U(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function rs(e){let t=ns(e);return t&&typeof e.rawMessage==`string`?Rt(t,e.rawMessage+`
8
- `):t}function is(e,t=!1){let n=ns(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
9
- `+es(n.stack.split(`
10
- `).slice(1))),t&&(r=`${us.red}${r}${ls}`),{...e,message:e.message+`
11
- `+es(r)}}return e}const as={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function os(){return cs({format:({message:e})=>e})}const ss=e=>as[e];function cs(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return Pt({timestamp:`time`,level:ss,category:`.`,...e,format:e=>t(is(e))})}const ls=`\x1B[0m`,us={red:`\x1B[31m`};function ds(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return It({timestamp:`time`,level:ss,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(is(e,!0))})}function fs(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function ps(e){return Ft({formatter:fs(),...e})}function ms(e){let t=e?.formatter??fs();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const hs=Nt(`likec4`);function gs(e){return hs.getChild(e)}function _s(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:ps(),...t};Lt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}function vs(e){return T(e,be(e=>e.parallelPrefix??void 0),ae((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),Xe())}function ys(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new vt.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=vt.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var bs=class{#e=new Gt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,Ht.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of vs(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,Ht.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,Ht.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,Ht.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Re(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return b(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,Ht.strong).before(i),this.put(s,Ht.strong).before(r),this.put(c,Ht.strong).after(a.right),this.put(l,Ht.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=he(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Vt;return this.#e.addEditVariable(t,Ht.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,Ht.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,Ht.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,Ht.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,Ht.weak);break}}constraint(e,t,n=void 0,r=Ht.medium){let i;switch(t){case`==`:i=Wt.Eq;break;case`>=`:i=Wt.Ge;break;case`<=`:i=Wt.Le;break;case`== 0`:i=Wt.Eq,n=0;break;case`>= 0`:i=Wt.Ge,n=0;break;case`<= 0`:i=Wt.Le,n=0;break;default:F(t)}this.#e.addConstraint(new Ut(e,i,n??0,r))}put(e,t=Ht.required){let n=t===Ht.required?Ht.medium:Ht.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function xs(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>no(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(C(i,1),`actors array must not be empty`);let a=new E.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=ko(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new bs({actors:i,steps:o,compounds:ys(i,e.nodes)}),l=c.getViewBounds(),u=T(c.getCompoundBoxes(),b(({node:e,...t})=>({...t,id:e.id,origin:e.id})),xe(`id`),ae((e,t)=>C(e,2)?b(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Xe(),tt());return{actors:i.map(e=>Ss({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:b(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function Ss({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var Cs=t(Jt(),1);function ws(e){return e.children.length>0}function Ts(e){switch(e){case`open`:return`vee`;default:return e}}function Es(e){return Array.isArray(e)?[Es(e[0]),Es(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const Ds=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),W=e=>Math.ceil(e/72*1e3)/1e3,Os=e=>Math.ceil(e);Os(40).toString();function ks(e,t){return Xt(Zt(e,{l:-35-5*t,s:-15-5*t}))}function As(e){return Xt(Yt(e,.3))}function js(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Ms(e,{maxchars:t,maxLines:n,sanitize:r=Ye()}){let i=(0,Cs.default)(e,{width:t,indent:``,escape:r}).split(`
12
- `);return _e(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Ns({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Ms(e,{maxchars:t,maxLines:r,sanitize:js}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${Os(n)}"${s}>${o}</FONT>`}function Ps(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Fs(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=y(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[Ns({text:e.title,fontsize:r.textSize,maxchars:Ps(n),maxLines:a?1:3})];if(n!==`xs`){y(e.technology?.trim())&&l.push(Ns({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Io.from(e.description).text;t&&l.push(Ns({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function Is(e,t){let n=Ns({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Ls=`BGCOLOR="${zo.DEFAULT.relationshipColors.labelBg}A0"`;function Rs({label:e,technology:t}){let n=[];return y(e?.trim())&&n.push(Ns({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),y(t?.trim())&&n.push(Ns({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Ls}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function zs(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Ls}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${Os(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return y(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Ls} CELLPADDING="3">`,Ns({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Bs=`dashed`,Vs=`Arial`,Hs=gs(`dot`),Us=50.1;var Ws=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Qt({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(ws).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=Zi(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(ws(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(ws(t))v(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return qt(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=Kt({[D.likec4_viewId]:this.view.id,[D.bgcolor]:`transparent`,[D.layout]:`dot`,[D.compound]:!0,[D.rankdir]:e.direction,[D.TBbalance]:`min`,[D.splines]:`spline`,[D.outputorder]:`nodesfirst`,[D.nodesep]:W(e.nodeSep??110),[D.ranksep]:W(e.rankSep??120),[D.pad]:W(15),[D.fontname]:Vs});return t.attributes.graph.apply({[D.fontsize]:Os(this.styles.fontSize()),[D.labeljust]:e.direction===`RL`?`r`:`l`,[D.labelloc]:e.direction===`BT`?`b`:`t`,[D.margin]:Us}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[D.fontname]:Vs,[D.shape]:`rect`,[D.fillcolor]:t.fill,[D.fontcolor]:t.hiContrast,[D.color]:t.stroke,[D.style]:`filled`,[D.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[D.arrowsize]:.75,[D.fontname]:Vs,[D.fontsize]:Os(14),[D.penwidth]:Os(2),[D.color]:t.line,[D.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=ws(e),n=Ki(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=Ki(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(ws(e),`node should be compound`),P(ce(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=As(n.loContrast);return t.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.likec4_depth]:e.depth,[D.fillcolor]:ks(n.fill,e.depth),[D.color]:ks(n.stroke,e.depth),[D.style]:`filled`,[D.margin]:Os(e.children.length>1?40:32)}),_(e.title.trim())||t.set(D.label,Is(e,r)),t}elementToNode(e,t){P(!ws(e),`node should not be compound`);let n=y(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.label]:Fs(e,this.styles),[D.margin]:`${W(s)},${W(i)}`}),t.attributes.set(D.width,W(a)),t.attributes.set(D.height,W(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[D.fillcolor]:r.fill,[D.fontcolor]:r.hiContrast,[D.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[D.margin]:`${W(s)},${W(0)}`,[D.penwidth]:Os(2),[D.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[D.margin]:`${W(n?s:s+4)},${W(i+6)}`});break;case`mobile`:t.attributes.apply({[D.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`queue`:t.attributes.apply({[D.width]:W(a),[D.height]:W(o-8),[D.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`component`:t.attributes.apply({[D.width]:W(a+10),[D.margin]:`${W(s+20)},${W(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!ws(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return ws(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(ws(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return T(this.descendants(e),w(e=>Ae(e.inEdges,e.outEdges)),we(),Be(Ae(t.inEdges,t.outEdges)),b(e=>this.view.edges.find(t=>t.id===e)),S(y))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=T(this.view.nodes,S(ws),b(e=>e.id),De(ea),ke(),b(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),S(({edges:e})=>e.length>1&&e.length<8),Ee(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(D.group,n.id),i.attributes.set(D.group,n.id)}catch(e){Hs.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=W(i.center.x)+n,o=W(e-i.center.y);i.fixedsize?t.attributes.apply({[D.pos]:`${a},${o}!`,[D.pin]:!0,[D.width]:W(i.fixedsize.width),[D.height]:W(i.fixedsize.height),[D.fixedsize]:!0}):t.attributes.set(D.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(D.weight),e.attributes.delete(D.minlen),e.attributes.delete(D.constraint);return this.graphvizModel.apply({[D.layout]:`fdp`,[D.overlap]:`vpsc`,[D.sep]:`+50,50`,[D.esep]:`+10,10`,[D.start]:`random2`,[D.splines]:`compound`,[D.K]:10}),this.graphvizModel.delete(D.compound),this.graphvizModel.delete(D.rankdir),this.graphvizModel.delete(D.nodesep),this.graphvizModel.delete(D.ranksep),this.graphvizModel.delete(D.pack),this.graphvizModel.delete(D.pad),this.graphvizModel.delete(D.packmode),this.graphvizModel.attributes.graph.delete(D.margin),this}},Gs=class extends Ws{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(D.TBbalance),e.apply({[D.nodesep]:W(t.nodeSep??130),[D.ranksep]:W(t.rankSep??130)}),e}postBuild(e){T(this.view.nodes,b(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),be(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Xe(),b(e=>e),ee(t=>{t.length<2||e.subgraph({[D.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),Ge(()=>{e.set(D.newrank,!0),e.set(D.clusterrank,`global`),e.delete(D.pack),e.delete(D.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(D.margin,Os(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,We),u=st(l)||st(o),d=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});l&&d.attributes.set(D.lhead,l),o&&d.attributes.set(D.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(D.weight,f);let p=Rs(e);if(p&&d.attributes.set(u?D.xlabel:D.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[D.arrowhead]:Ts(m),[D.arrowtail]:Ts(e.tail??m),[D.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(D.constraint,!1),d):(m&&d.attributes.set(D.arrowhead,Ts(m)),h!==`none`&&d.attributes.set(D.arrowtail,Ts(h)),d)}},Ks=class extends Ws{postBuild(e){e.delete(D.TBbalance),e.set(D.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Re(e)),[c,l,u]=this.edgeEndpoint(i,We),d=t.edge([o,l],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});if(u&&d.attributes.set(D.lhead,u),s&&d.attributes.set(D.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(y).join(`
13
- `),p=zs(ro(e.id),f);d.attributes.set(D.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[D.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[D.arrowtail]:Ts(h),[D.dir]:`back`}),g!==`none`&&d.attributes.apply({[D.arrowhead]:Ts(g),[D.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[D.arrowhead]:Ts(h),[D.arrowtail]:Ts(g),[D.dir]:`both`}),d):h===`none`?(d.attributes.delete(D.arrowhead),d.attributes.apply({[D.arrowtail]:Ts(g),[D.minlen]:0,[D.dir]:`back`}),d):(d.attributes.set(D.arrowhead,Ts(h)),d)}};const qs=gs(`dot.rank`);var Js=class extends Ws{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(ws(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=T(e.children,S(e=>!this.compoundIds.has(e)),b(e=>this.computedNode(e)),S(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;He(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[D.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[D.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(D.newrank,!0),e.set(D.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[D.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,qs.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,We),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});l&&f.attributes.set(D.lhead,l),o&&f.attributes.set(D.ltail,o);let p=st(l)||st(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(D.weight,d.weight);let m=Rs(e);if(m&&f.attributes.set(p?D.xlabel:D.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[D.arrowtail]:Ts(h),[D.dir]:`back`}),g!==`none`&&f.attributes.apply({[D.arrowhead]:Ts(g),[D.dir]:`both`,[D.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`,[D.minlen]:0,[D.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[D.arrowhead]:Ts(h),[D.arrowtail]:Ts(g),[D.dir]:`both`}),f;if(f.attributes.set(D.arrowhead,Ts(h)),g!==`none`&&f.attributes.set(D.arrowtail,Ts(g)),this.view.edges.length===1)return f;let ee;return ee=u===null&&i.parent==null&&s.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return ws(n)||ws(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(D.minlen,0),f}};function Ys(e){let[t,n,r,i]=e?e.split(`,`).map(e=>Es(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function Xs(e){try{let[t,n]=e.split(`,`);return{x:Es(parseFloat(t)),y:Es(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function Zs(e){let{x:t,y:n}=Xs(e.pos),r=Ds(parseFloat(e.width)),i=Ds(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function Qs(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=Es(c.size);continue}if(c.op===`T`){let e=Es(c.pt[0])-t,l=Es(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=Es(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return hs.warn(`Failed on parsing label draw ops:
14
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function $s({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(C(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&hs.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>Es(e));return P(C(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function ec(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=Qs(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Ms(a,{maxchars:40,maxLines:5}).join(`
15
- `):null,{id:t,source:n,target:r,label:a,...y(o)&&{description:o},points:$s(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function tc(e,t){let n=Ys(e.bb),{nodes:r,edges:i,hasManualLayout:a,...o}=t,s=[],c=[],l;if(l=o._type===`dynamic`?{...o,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[Ha]:`layouted`,bounds:n,nodes:s,edges:c}:{...o,[Ha]:`layouted`,bounds:n,nodes:s,edges:c},a){let e=l;e[Wa]=`auto`}let u=e.objects??[];for(let e of r){let t=u.find(t=>t.likec4_id===e.id);P(t,`View ${o.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?Ys(t.bb):Zs(t),o=[n,r];s.push({...e,x:n,y:r,width:i,height:a,labelBBox:Qs(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let d=e.edges??[];for(let e of i){let t=d.find(t=>t.likec4_id===e.id);if(!t){hs.warn`View ${o.id} edge ${e.id} not found in graphviz output, skipping`;continue}c.push(ec(t,e,o.id))}return l}function nc(e,t){return tc(e,t)}var rc=class e extends Ws{static toDot(t){return new e(t).print()}constructor(e){super(e,zo.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[D.nodesep]:W(100),[D.ranksep]:W(100)}),e.delete(D.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[D.likec4_id]:e.id,[D.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=N(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=N(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[D.likec4_id]:e.id,[D.likec4_project]:e.projectId,[D.style]:e.line??Bs});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(D.weight,i.weight);let o=Rs(e);if(o&&a.attributes.set(D.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}return a}};const ic=$t(1);var ac=class e{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){oi.unload()}[Symbol.dispose](){this.dispose()}async attempt(t,n,r){return await ic(async()=>{let i=hs.getChild([`graphviz`,`wasm`,t,Ve(4)]);try{i.trace`execute`;let t=await r();return++e.opsCount>=20&&(e.opsCount=0,i.trace`reached 20 operations, unloading wasm`,oi.unload()),t}catch(t){i.debug(`FAILED DOT`,{dot:n}),i.error(U(t)),e.opsCount=0,oi.unload()}i.warn(`Retrying...`);try{return await ya(30,300),await r()}catch(e){return i.error(U(e)),Promise.reject(e)}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await oi.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await oi.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await oi.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await oi.load()).layout(e,`svg`))}};const oc=({view:e,styles:t})=>{switch(!0){case To(e):return new Ks(e,t);case wo(e):return new Gs(e,t);case So(e):return new Js(e,t);default:F(e)}},sc=hs.getChild(`layouter`);var cc=class{graphviz;constructor(e){this.graphviz=e??new ac,sc.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,sc.trace`change port to ${this.graphviz.name}`}printToDot(e){return oc(e).print()}async dotToJson(e){let t=sc.getChild([`dotToJson`,Ve(3)]),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(U(n)),t.error`Failed to convert DOT to JSON:\n${e}`,n}try{return JSON.parse(n)}catch(r){throw t.error(U(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=sc.getChild([`layout`,Ve(3)]);try{t.debug`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=tc(await this.dotToJson(n),r);return To(i)&&Object.assign(i,{sequenceLayout:xs(i)}),n=n.split(`
16
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Us}`))).join(`
17
- `),t.debug`layouting view ${e.view.id} done`,{dot:n,diagram:i}}catch(n){throw t.warn(U(n)),ts(n,`Error during layout: ${e.view.id}`)}}async svg(e){let t=await this.dot(e);return t=t.split(`
18
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Us}`))).join(`
19
- `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=sc.getChild([`dot`,Ve(3)]);t.trace`generating dot for view ${e.view.id}`;let n=oc(e).print();if(!So(e.view))return n;try{return t.trace`unflattening dot`,await this.graphviz.unflatten(n)}catch(r){return t.warn(`Error during unflatten: ${e.view.id}`,{error:r}),n}}async layoutProjectsView(e){let t=sc.getChild([`layoutProjectsView`,Ve(3)]);t.debug`layouting projects overview...`;let n=new rc(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting projects overview done`,nc(r,e)}};const lc=hs.getChild([`layouter-queue`]);var uc=class extends cc{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new en({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=lc.getChild([`run`,Ve(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await ba(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),lc.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,lc.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=lc.getChild([`batch`,Ve(3)]);if(this.isProcessingBatch)return t.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await ba(),e.cancelToken?.isCancellationRequested?(t.debug`cancellation requested`,[]):(t.debug`retry`,await this.batchLayout(e));let n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.debug`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await ba(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}}finally{let e=this.queue.pending+this.queue.size;e>0&&(t.trace`waiting ${e} tasks to finish`,await this.queue.onIdle()),t.debug`batch layout done`,this.isProcessingBatch=!1}return r}async waitForQueueToShrink(e=this.queue.concurrency,t=lc){this.queue.size>e+2&&(t.debug`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},dc=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=eo(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=Xi(r)):(this.imported=null,this.hierarchyLevel=Xi(this.id))}get name(){return Ki(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get metadata(){return this.$element.metadata??{}}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!fe(this.$element.summary,this.$element.description)}get summary(){return Io.memoize(this,`summary`,za(this.$element))}get description(){return Io.memoize(this,`description`,Ba(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>fa(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Qi(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?aa([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return y(fa(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!_(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},fc=class{Aux;get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return Ki(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Io.memoize(this,`summary`,za(this.$node))}get description(){return Io.memoize(this,`description`,Ba(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Qi(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>_c.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>_c.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!_(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},pc=class extends fc{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=Xi(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get metadata(){return this.$node.metadata??{}}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=fa(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return wa(t,e)}},mc=class extends fc{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=Xi(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return Io.memoize(this,`summary`,za(this.$instance)??za(this.element.$element))}get description(){return Io.memoize(this,`description`,Ba(this.$instance)??Ba(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},hc=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},gc=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=Qi(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return y(this.$relationship.title)?this.$relationship.title:null}get technology(){return ve(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Io.memoize(this,`summary`,za(this.$relationship))}get description(){return Io.memoize(this,`description`,Ba(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!_(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},_c=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(wa(this.model,t.model),wa(this.deployment,t.deployment))}difference(t){return e.from(Ta(this.model,t.model),Ta(this.deployment,t.deployment))}union(t){return e.from(Ca(this.model,t.model),Ca(this.deployment,t.deployment))}};const G=e=>typeof e==`string`?e:e.id,vc=e=>{if(P(!e.includes(`
20
- `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return C(t,1)?t:[``]}return[e.trim()]},yc=e=>vc(e).join(`/`),bc=e=>{let t=vc(e);return C(t,2)?t.slice(0,-1).join(`/`):null},xc=e=>e.includes(`/`)?vc(e).pop()??e:e.trim();var Sc=class{#e=new Map;#t=new Map;#n=new E.default(()=>new Set);#r=new E.default(()=>new Set);#i=new Set;#a=new Map;#o=new E.default(()=>new Set);#s=new E.default(()=>new Set);#c=new E.default(()=>new Set);#l=new E.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Xe(t.elements);for(let e of ia(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of Xe(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof pc||e instanceof mc)return e;let t=G(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=G(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(B.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return oa(this.#u,`${t}@${n}`,()=>new hc(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=G(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=G(e);return this.#t.get(t)||null}children(e){let t=G(e);return this.#n.get(t)}*siblings(e){let t=G(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=G(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=co(e)?new pc(this,Object.freeze(e)):new mc(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=Gi(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new gc(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...$i(n)])this.#c.get(e).add(t);for(let e of $i(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of $i(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},Cc=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(B.flatten(t.source)),this.target=e.element(B.flatten(t.target));let n=Qi(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return ve(this.$relationship.title)?null:this.$relationship.title}get technology(){return ve(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Io.memoize(this,`summary`,za(this.$relationship))}get description(){return Io.memoize(this,`description`,Ba(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!_(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},wc=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Io.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?ro(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return no(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},Tc=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Io.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Io.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return y(this.$node.modelRef)}hasDeployment(){return y(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return Xa(this.$node)}isTagged(e){return this.tags.includes(e)}},Ec=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new E.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new Tc(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new wc(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?xc(n.title):null,this.viewPath=n.title?yc(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Ua]}get stage(){return this.#e[Ha]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Io.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>Qo(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Yo(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=G(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(G(e))??null}findNodeWithElement(e){let t=G(e);return this.#i.has(t)?la(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=G(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(G(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(G(e))}includesDeployment(e){return this.#a.has(G(e))}includesRelation(e){return this.#o.has(G(e))}isComputed(){return this.#e[Ha]===`computed`}isLayouted(){return this.#e[Ha]===`layouted`}isDiagram(){return this.#e[Ha]===`layouted`}isElementView(){return this.#e[Ua]===`element`}isScopedElementView(){return this.#e[Ua]===`element`&&y(this.#e.viewOf)}isDeploymentView(){return this.#e[Ua]===`deployment`}isDynamicView(){return this.#e[Ua]===`dynamic`}},Dc=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Re(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),ve(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof Ec&&e.push(t);return e})}},Oc=class e{Aux;_elements=new Map;_parents=new Map;_children=new E.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new E.default(()=>new Set);_outgoing=new E.default(()=>new Set);_internal=new E.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new E.default(()=>new Set);_allTags=new E.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[Ha]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of Ke(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of Ke(e.imports??{}))for(let e of ia(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of Xe(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new Sc(this),Va(e,`computed`)||Va(e,`layouted`)){let t=zi(`/`),n=T(Xe(e.views),b(e=>({view:e,path:yc(e.title??e.id),folderPath:e.title&&bc(e.title)||``})),De((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ze(e,`/`);P(C(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new Dc(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ze(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(_(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new Ec(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new Dc(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>zo.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[Ha]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof dc)return e;let t=G(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(G(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=G(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(G(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=G(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=G(e);return this._parents.get(t)||null}children(e){let t=G(e);return this._children.get(t)}*siblings(e){let t=G(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=G(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>De([...this._allTags.keys()],Ri))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>T([...this._allTags.entries()],b(([e,t])=>({tag:e,count:t.size,tagged:t})),De((e,t)=>Ri(e.tag,t.tag)),nt([x(`count`),`desc`])))}findByTag(e,t){return ca(this._allTags.get(e),e=>t===`elements`?e instanceof dc:t===`views`?e instanceof Ec:t===`relationships`?e instanceof Cc:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=vo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=vo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new dc(this,Object.freeze(e));this._elements.set(t.id,t);let n=Gi(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!$a(t.id),`Imported element already has global FQN`);let n=Qa(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new dc(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=Gi(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=Gi(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new Cc(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=Qi(n.id,r.id);if(i)for(let e of[i,...$i(i)])this._internal.get(e).add(t);for(let e of $i(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of $i(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Oc.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Oc||={});let kc;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(kc||={});const Ac=Symbol.for(`nodejs.util.inspect.custom`);var jc=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Aa(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[Ac](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
21
- `)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&Ea(this.relations.model,t.relations.model)&&Ea(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new _c(t.model??new Set,t.deployment??new Set):this.relations)}};function Mc(e,t){if(!t){let t=e;return e=>Mc(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function Nc(e,t){let n=t;for(let t of e)Mc(t,n)&&(n=t);return n===t?null:n}function Pc(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Fc(e,t){if(!e||Hi(e)){let t=e??`asc`;return e=>Ic(e,t)}return Ic(e,t??`asc`)}function Ic(e,t){return T(e,b(e=>({id:Pc(e),conn:e})),aa(t),b(e=>e.conn))}function Lc(e,t){return e.filter(e=>Mc(t,e))}function Rc(e,t){return e.filter(Mc(t))}function zc(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Bc(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function Vc(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Hc(e,t){if(!t){let t=e;return e=>Hc(e,t)}let n=e;return Yi(n.source,t)&&!Yi(n.target,t)}function Uc(e,t){if(!t){let t=e;return e=>Uc(e,t)}let n=e;return Yi(n.target,t)&&!Yi(n.source,t)}function Wc(e,t){if(!t){let t=e;return e=>Wc(e,t)}let n=e;return Yi(n.source,t)!==Yi(n.target,t)}var Gc=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Aa(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&ha(this.relations,me(Vc(this)))}get directRelations(){return new Set(ca(this.relations,Vc(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,Ca(this.relations,t.relations))}difference(t){return new e(this.source,this.target,Ta(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,wa(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&Ea(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[Ac](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
22
- `)}reversed(){return new e(this.target,this.source)}},Kc=e({findConnection:()=>qc,findConnectionsBetween:()=>Jc,findConnectionsWithin:()=>Yc});function qc(e,t,n=`directed`){if(e===t||Ji(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new jc(e,t,r)]:[];return n===`directed`?i:[...i,...qc(t,e,`directed`)]}function Jc(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of qc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Yc(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Jc(t,r.slice(n+1),`both`)),e),[])}var Xc=e({findConnection:()=>Zc,findConnectionsBetween:()=>Qc,findConnectionsWithin:()=>$c});function Zc(e,t,n=`directed`){if(e===t||Ji(e,t))return[];let r=wa(e.allOutgoing,t.allIncoming),i=r.size>0?new Gc(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=wa(e.allIncoming,t.allOutgoing),o=a.size>0?new Gc(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function Qc(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Zc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function $c(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Qc(t,r.slice(n+1),`both`)),e),[])}function el(e){return e instanceof pc}function tl(e){return e instanceof mc}function nl(e){return el(e)||tl(e)}function rl(e){return e instanceof hc}function il(e){return e instanceof dc}var al=t(rn(),1);const ol=hs.getChild([`graphviz`,`binary`]);var sl=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,ui.availableParallelism()-2)}get dotpath(){return this._dotpath??R(this,`_dotpath`,()=>{let e=al.default.sync(`dot`);return ol.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??R(this,`_unflattenpath`,()=>{let e=al.default.sync(`unflatten`);return ol.debug`Found ${e}`,e})}async unflatten(e){let t,n=ol.getChild([`unflatten`,Ve(4)]);try{let r=await nn(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=r.stdout,_(r.stderr)?n.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):n.warn(`{command} has stderr:
23
- `+r.stderr,{command:r.command})}catch(r){n.debug(`FAILED DOT`,{dot:e}),n.error(U(r)),r instanceof tn&&!_(r.stdout)&&(n.warn(`{command} returned result but failed with exitcode {exitCode}:
24
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),t=r.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=ol.getChild([`layoutJson`,Ve(4)]),n;try{let r=await nn(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,_(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
25
- `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!_(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
26
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=ol.getChild([`svg`,Ve(4)]),n;try{let r=await nn(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,_(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
27
- `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!_(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
28
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}};const K=hs.getChild(`server`);function q(e){K.warn(U(e))}function cl(e){let t=os();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=rs(n);i?e.telemetry.logEvent({eventName:`error`,message:`${i.name}: ${i.message}`,category:r,...i.stack&&{stack:i.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(n),category:r});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function ll({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=pi?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!pi;_s({reset:!0,sinks:{console:n?ms({formatter:cs()}):ps({formatter:a?ds():cs(),nonBlocking:i}),...o&&{telemetry:cl(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),K.trace(`logger configured`)}const ul=/^@[A-Za-z0-9_-]*$/,dl=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,fl=O.string().min(1,`Image alias key cannot be empty`).regex(ul,`Image alias key must match /^@\\w+$/`),pl=O.string().min(1,`Image alias value cannot be empty`).regex(dl,`Image alias value must be a relative path (no leading slash or protocol)`),ml=O.record(fl,pl).meta({id:`ImageAliases`,description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`}),hl=O.string().min(1,`Include path cannot be empty`).regex(/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),gl=O.strictObject({paths:O.array(hl).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
29
- `)}),maxDepth:O.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
30
- `)}),fileThreshold:O.number().int().min(1).max(1e4).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
31
- `)})}).meta({id:`include-config`,description:[`Configuration for including additional LikeC4 source files from other directories.`,`Example: { "paths": ["../shared", "../common/specs"], "maxDepth": 5, "fileThreshold": 50 }`].join(`
32
- `)}),_l=O.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),vl=O.enum(ji).meta({id:`ElementShape`}),yl=O.enum(Ai).meta({id:`BorderStyle`}),bl=O.enum(Oi).meta({id:`ElementSize`}),xl=O.enum(ki).meta({id:`IconPosition`}),Sl=O.enum(Ra).meta({id:`ArrowType`}),Cl=O.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),wl=O.enum(Mi).meta({id:`ThemeColorName`}),Tl=O.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),El=wl.or(Tl).transform(e=>e).meta({id:`ColorName`}),Dl=O.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),Ol=O.strictObject({fill:Dl.meta({description:`Background color`}),stroke:Dl.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Dl.meta({description:`High contrast text color (title)`}),loContrast:Dl.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),kl=O.strictObject({line:Dl.meta({description:`Line color`}),label:Dl.meta({description:`Label text color`}),labelBg:Dl.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),Al=O.strictObject({elements:Ol.or(Dl.transform(e=>Pa(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:kl.or(Dl.transform(e=>Pa(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(Dl.transform(e=>Pa(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),jl=O.partialRecord(El,Al).transform(e=>e),Ml=O.strictObject({width:O.number().min(50),height:O.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),Nl=O.partialRecord(bl,Ml),Pl=O.strictObject({colors:jl.optional().meta({description:`Override theme colors`}),sizes:Nl.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>z({colors:e?z(e):void 0,sizes:t?z(t):void 0})),Fl=O.strictObject({color:El.optional().meta({description:`Default color for groups
33
- (must be a valid color name from the theme)`}),opacity:_l.optional().meta({description:`Default opacity for groups`}),border:yl.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),Il=O.strictObject({color:El.optional().meta({description:`Default color for relationships
34
- (must be a valid color name from the theme)`}),line:Cl.optional().meta({description:`Default line style for relationships`}),arrow:Sl.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
35
- These values will be used if such property is not defined`}),Ll=O.strictObject({color:El.optional().meta({description:`Default color for elements
36
- (must be a valid color name from the theme)`}),opacity:_l.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:yl.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:bl.optional().meta({description:`Default size for elements`}),shape:vl.optional().meta({description:`Default shape for elements`}),iconPosition:xl.optional().meta({description:`Default icon position for elements`}),group:Fl.optional().meta({description:`Override default values for group style properties
37
- These values will be used if such property is not defined`}),relationship:Il.optional().meta({description:`Override default values for relationship style properties
38
- These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),Rl=O.union([O.string().min(1,`Custom CSS file path cannot be empty`),O.array(O.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),zl=O.strictObject({theme:Pl.optional().meta({description:`Project theme customization`}),defaults:Ll.optional().meta({description:`Override default values for style properties
39
- These values will be used if such property is not defined`}),customCss:Rl.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>z({defaults:Bl(t),customCss:Vl(n),theme:e}));function Bl(e){if(!e)return;let{relationship:t,group:n,...r}=e;return z({...r,relationship:t&&z(t),group:n&&z(n)})}function Vl(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const Hl=O.strictObject({outDir:O.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
40
- `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),Ul=O.union([O.strictObject({redirect:O.literal(!0)}),O.strictObject({include:O.array(O.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`include list cannot be empty`)}),O.strictObject({exclude:O.array(O.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`exclude list cannot be empty`)})]).meta({id:`LandingPageConfig`,description:`Configure the landing page. Use redirect to go to the index view, or include/exclude to filter the view grid.`}),Wl=O.object({name:O.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),extends:O.union([O.string().min(1,`Extend path cannot be empty`),O.array(O.string().min(1,`Extend path cannot be empty`)).min(1,`Extend list cannot be empty`)]).optional().meta({description:`Extend styles from other config files`}),title:O.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:O.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),metadata:O.record(O.string(),O.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:zl.optional().meta({description:`Project styles customization`}),imageAliases:ml.optional(),include:gl.optional(),exclude:O.array(O.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:Hl.optional(),inferTechnologyFromIcon:O.boolean().optional().meta({description:[`Automatically derive element technology from icon name when technology is not set explicitly.`,`Applies to aws:, azure:, gcp:, and tech: icons. Bootstrap icons are excluded.`,`Defaults to true.`].join(`
41
- `)}),implicitViews:O.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`}),landingPage:Ul.optional()}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),Gl=O.instanceof(Function),Kl=O.record(O.string(),Gl);Wl.extend({generators:Kl.optional()});function ql(e){let t=e.landingPage,n=null;if(t!=null){let e=Ul.safeParse(t);if(!e.success)throw Error(`Config validation failed:
42
- `+O.prettifyError(e.error));n=e.data}let r=Wl.safeParse(e);if(!r.success)throw Error(`Config validation failed:
43
- `+O.prettifyError(r.error));let i=r.data;n!==null&&(i={...i,landingPage:n});let a=e.generators;if(typeof a==`object`&&a&&!Array.isArray(a)){let e=Kl.safeParse(a);if(!e.success)throw Error(`Config validation failed (generators):
44
- `+O.prettifyError(e.error));return{...i,generators:e.data}}return i}function Jl(e){return ql(yr.parse(e.trim()||`{}`))}const Yl={parse:Jl,validate:ql,normalizeInclude:e=>{let t=gl.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function Xl(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function Zl(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function Ql(e){let t=Xl(e),n=Zl(t);return n[n.length-1]||t}const $l=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],eu=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...$l,...eu];function tu(e){return $l.includes(Ql(e))}function nu(e){return eu.includes(Ql(e))}function ru(e){return tu(e)||nu(e)}const iu=Wl.pick({extends:!0,styles:!0}).loose(),au=e=>e?Array.isArray(e)?e:[e]:[],ou=async e=>{let t=await si.readFile(e,`utf-8`),n;try{n=yr.parse(t.trim()||`{}`)}catch(t){throw ts(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=iu.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+O.prettifyError(r.error));return r.data},su=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await ou(e),r=au(n.extends),i=[...t,e],a=[];for(let t of r){let n=ai(ii(e),t);a.push(...await su(n,i))}return[...a,n]};async function cu(e){e=typeof e==`string`?e:e.fsPath,hs.getChild(`config`).debug`Loading config: ${e}`;let t=ii(e),n=ri(e),r={name:ri(t)};if(tu(n)){let t=await su(ai(e),[]);P(C(t,1),`Expect at least one config`);let n=ge(Re(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(st),a=i.length>0?bt({},...i.reverse()):void 0;return ql({...r,...n,...a?{styles:a}:{}})}P(nu(n),`Invalid name for config file: ${e}`);let{mod:i}=await mi({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=hi(e.errors,{kind:`error`});for(let e of t)hs.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
45
- // Mock implementation to allow loading config files without bundling @likec4/config
46
- function mock(x) { return x }
47
- export {
48
- mock as defineConfig,
49
- mock as defineGenerators,
50
- mock as defineStyle,
51
- mock as defineTheme,
52
- mock as defineThemeColor,
53
- }`,loader:`js`}))}}]}});return ql(Object.assign(r,i?.default??i))}var lu=Tr();const uu={aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)},du=[`likec4lib {`,` icons {`,...[...Object.entries(uu)].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
54
- `),fu=`likec4builtin`,pu=`${fu}:///likec4/lib/icons.c4`;function mu(e){return(`uri`in e?e.uri:e).scheme===fu}function hu(e){return!mu(e)}ir();var gu=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){q(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};const _u=`AnyProperty`;function vu(e){return J.isInstance(e,_u)}const yu=`ColorLiteral`;function bu(e){return J.isInstance(e,yu)}const xu=`DeploymentElement`;function Su(e){return J.isInstance(e,xu)}const Cu=`DeploymentNodeOrElementKind`,wu=`DeploymentViewRule`;function Tu(e){return J.isInstance(e,wu)}const Eu=`DynamicViewProperty`,Du=`DynamicViewRule`;function Ou(e){return J.isInstance(e,Du)}const ku=`DynamicViewStep`;function Au(e){return J.isInstance(e,ku)}const ju=`ElementProperty`;function Mu(e){return J.isInstance(e,ju)}const Nu=`ExpressionV2`;function Pu(e){return J.isInstance(e,Nu)}const Fu=`ExtendElementProperty`,Iu=`ExtendRelationProperty`,Lu=`FqnExpr`;function Ru(e){return J.isInstance(e,Lu)}const zu=`FqnExprOrWhere`;function Bu(e){return J.isInstance(e,zu)}const Vu=`FqnExprOrWith`;function Hu(e){return J.isInstance(e,Vu)}const Uu=`FqnReferenceable`,Wu=`LikeC4View`;function Gu(e){return J.isInstance(e,Wu)}const Ku=`MetadataProperty`;function qu(e){return J.isInstance(e,Ku)}const Ju=`MetadataValue`,Yu=`ModelReferenceable`,Xu=`Referenceable`,Zu=`RelationExpr`;function Qu(e){return J.isInstance(e,Zu)}const $u=`RelationExprOrWhere`;function ed(e){return J.isInstance(e,$u)}const td=`RelationExprOrWith`;function nd(e){return J.isInstance(e,td)}const rd=`RelationProperty`,id=`RelationshipStyleProperty`;function ad(e){return J.isInstance(e,id)}const od=`SizeProperty`;function sd(e){return J.isInstance(e,od)}const cd=`StringProperty`;function ld(e){return J.isInstance(e,cd)}const ud=`StyleProperty`;function dd(e){return J.isInstance(e,ud)}const fd=`ViewProperty`;function pd(e){return J.isInstance(e,fd)}const md=`ViewRule`;function hd(e){return J.isInstance(e,md)}const gd=`ViewRuleStyleOrGlobalRef`;function _d(e){return J.isInstance(e,gd)}const vd=`WhereElement`;function yd(e){return J.isInstance(e,vd)}const bd=`WhereElementExpression`;function xd(e){return J.isInstance(e,bd)}const Sd=`WhereExpression`,Cd=`WhereKindEqual`;function wd(e){return J.isInstance(e,Cd)}const Td=`WhereMetadataEqual`;function Ed(e){return J.isInstance(e,Td)}const Dd=`WhereRelation`;function Od(e){return J.isInstance(e,Dd)}const kd=`WhereRelationExpression`;function Ad(e){return J.isInstance(e,kd)}const jd=`WhereTagEqual`;function Md(e){return J.isInstance(e,jd)}const Nd=`AbstractDynamicStep`,Pd=`ArrowProperty`;function Fd(e){return J.isInstance(e,Pd)}const Id=`BorderProperty`;function Ld(e){return J.isInstance(e,Id)}const Rd=`ColorProperty`;function zd(e){return J.isInstance(e,Rd)}const Bd=`CustomColor`,Vd=`CustomElementProperties`;function Hd(e){return J.isInstance(e,Vd)}const Ud=`CustomRelationProperties`;function Wd(e){return J.isInstance(e,Ud)}const Gd=`DeployedInstance`;function Kd(e){return J.isInstance(e,Gd)}const qd=`DeployedInstanceBody`;function Jd(e){return J.isInstance(e,qd)}const Yd=`DeploymentNode`;function Xd(e){return J.isInstance(e,Yd)}const Zd=`DeploymentNodeBody`;function Qd(e){return J.isInstance(e,Zd)}const $d=`DeploymentNodeKind`;function ef(e){return J.isInstance(e,$d)}const tf=`DeploymentRelation`;function nf(e){return J.isInstance(e,tf)}const rf=`DeploymentRelationBody`;function af(e){return J.isInstance(e,rf)}const of=`DeploymentView`;function sf(e){return J.isInstance(e,of)}const cf=`DeploymentViewBody`;function lf(e){return J.isInstance(e,cf)}const uf=`DeploymentViewRulePredicate`;function df(e){return J.isInstance(e,uf)}const ff=`DeploymentViewRuleStyle`;function pf(e){return J.isInstance(e,ff)}const mf=`DirectedRelationExpr`;function hf(e){return J.isInstance(e,mf)}const gf=`DynamicView`;function _f(e){return J.isInstance(e,gf)}const vf=`DynamicViewBody`;function yf(e){return J.isInstance(e,vf)}const bf=`DynamicViewDisplayVariantProperty`;function xf(e){return J.isInstance(e,bf)}const Sf=`DynamicViewGlobalPredicateRef`;function Cf(e){return J.isInstance(e,Sf)}const wf=`DynamicViewIncludePredicate`;function Tf(e){return J.isInstance(e,wf)}const Ef=`DynamicViewParallelSteps`;function Df(e){return J.isInstance(e,Ef)}const Of=`DynamicViewRef`,kf=`Element`;function Af(e){return J.isInstance(e,kf)}const jf=`ElementBody`;function Mf(e){return J.isInstance(e,jf)}const Nf=`ElementKind`;function Pf(e){return J.isInstance(e,Nf)}const Ff=`ElementKindExpression`;function If(e){return J.isInstance(e,Ff)}const Lf=`ElementRef`;function Rf(e){return J.isInstance(e,Lf)}const zf=`ElementStringProperty`;function Bf(e){return J.isInstance(e,zf)}const Vf=`ElementStyleProperty`;function Hf(e){return J.isInstance(e,Vf)}const Uf=`ElementTagExpression`;function Wf(e){return J.isInstance(e,Uf)}const Gf=`ElementView`;function Kf(e){return J.isInstance(e,Gf)}const qf=`ElementViewBody`;function Jf(e){return J.isInstance(e,qf)}const Yf=`ElementViewRef`,Xf=`Expressions`;function Zf(e){return J.isInstance(e,Xf)}const Qf=`ExtendDeployment`;function $f(e){return J.isInstance(e,Qf)}const ep=`ExtendDeploymentBody`;function tp(e){return J.isInstance(e,ep)}const np=`ExtendElement`;function rp(e){return J.isInstance(e,np)}const ip=`ExtendElementBody`;function ap(e){return J.isInstance(e,ip)}const op=`ExtendRelation`;function sp(e){return J.isInstance(e,op)}const cp=`ExtendRelationBody`;function lp(e){return J.isInstance(e,cp)}const up=`FqnExpressions`;function dp(e){return J.isInstance(e,up)}const fp=`FqnExprWhere`;function pp(e){return J.isInstance(e,fp)}const mp=`FqnExprWith`;function hp(e){return J.isInstance(e,mp)}const gp=`FqnRef`;function _p(e){return J.isInstance(e,gp)}const vp=`FqnRefExpr`;function yp(e){return J.isInstance(e,vp)}const bp=`GlobalDynamicPredicateGroup`;function xp(e){return J.isInstance(e,bp)}const Sp=`GlobalPredicateGroup`;function Cp(e){return J.isInstance(e,Sp)}const wp=`Globals`;function Tp(e){return J.isInstance(e,wp)}const Ep=`GlobalStyle`;function Dp(e){return J.isInstance(e,Ep)}const Op=`GlobalStyleGroup`;function kp(e){return J.isInstance(e,Op)}const Ap=`GlobalStyleId`,jp=`HexColor`;function Mp(e){return J.isInstance(e,jp)}const Np=`IconColorProperty`;function Pp(e){return J.isInstance(e,Np)}const Fp=`IconPositionProperty`;function Ip(e){return J.isInstance(e,Fp)}const Lp=`IconProperty`;function Rp(e){return J.isInstance(e,Lp)}const zp=`IconSizeProperty`;function Bp(e){return J.isInstance(e,zp)}const Vp=`Imported`;function Hp(e){return J.isInstance(e,Vp)}const Up=`ImportsFromPoject`;function Wp(e){return J.isInstance(e,Up)}const Gp=`IncomingRelationExpr`;function Kp(e){return J.isInstance(e,Gp)}const qp=`InOutRelationExpr`;function Jp(e){return J.isInstance(e,qp)}const Yp=`LibIcon`;function Xp(e){return J.isInstance(e,Yp)}const Zp=`LikeC4Grammar`;function Qp(e){return J.isInstance(e,Zp)}const $p=`LikeC4Lib`;function em(e){return J.isInstance(e,$p)}const tm=`LineProperty`;function nm(e){return J.isInstance(e,tm)}const rm=`LinkProperty`;function im(e){return J.isInstance(e,rm)}const am=`MarkdownOrString`;function om(e){return J.isInstance(e,am)}const sm=`MetadataArray`;function cm(e){return J.isInstance(e,sm)}const lm=`MetadataAttribute`;function um(e){return J.isInstance(e,lm)}const dm=`MetadataBody`;function fm(e){return J.isInstance(e,dm)}const pm=`Model`;function mm(e){return J.isInstance(e,pm)}const hm=`ModelDeployments`;function gm(e){return J.isInstance(e,hm)}const _m=`ModelViews`;function vm(e){return J.isInstance(e,_m)}const ym=`MultipleProperty`;function bm(e){return J.isInstance(e,ym)}const xm=`NavigateToProperty`;function Sm(e){return J.isInstance(e,xm)}const Cm=`NotationProperty`;function wm(e){return J.isInstance(e,Cm)}const Tm=`NotesProperty`;function Em(e){return J.isInstance(e,Tm)}const Dm=`OpacityProperty`;function Om(e){return J.isInstance(e,Dm)}const km=`OutgoingRelationExpr`;function Am(e){return J.isInstance(e,km)}const jm=`PaddingSizeProperty`;function Mm(e){return J.isInstance(e,jm)}const Nm=`Relation`;function Pm(e){return J.isInstance(e,Nm)}const Fm=`RelationBody`;function Im(e){return J.isInstance(e,Fm)}const Lm=`RelationExprWhere`;function Rm(e){return J.isInstance(e,Lm)}const zm=`RelationExprWith`;function Bm(e){return J.isInstance(e,zm)}const Vm=`RelationKindDotRef`;function Hm(e){return J.isInstance(e,Vm)}const Um=`RelationNavigateToProperty`;function Wm(e){return J.isInstance(e,Um)}const Gm=`RelationshipKind`;function Km(e){return J.isInstance(e,Gm)}const qm=`RelationStringProperty`;function Jm(e){return J.isInstance(e,qm)}const Ym=`RelationStyleProperty`;function Xm(e){return J.isInstance(e,Ym)}const Zm=`RGBAColor`;function Qm(e){return J.isInstance(e,Zm)}const $m=`ShapeProperty`;function eh(e){return J.isInstance(e,$m)}const th=`ShapeSizeProperty`;function nh(e){return J.isInstance(e,th)}const rh=`SpecificationColor`;function ih(e){return J.isInstance(e,rh)}const ah=`SpecificationDeploymentNodeKind`;function oh(e){return J.isInstance(e,ah)}const sh=`SpecificationElementKind`;function ch(e){return J.isInstance(e,sh)}const lh=`SpecificationElementStringProperty`;function uh(e){return J.isInstance(e,lh)}const dh=`SpecificationRelationshipKind`;function fh(e){return J.isInstance(e,dh)}const ph=`SpecificationRelationshipStringProperty`;function mh(e){return J.isInstance(e,ph)}const hh=`SpecificationRule`;function gh(e){return J.isInstance(e,hh)}const _h=`SpecificationTag`;function vh(e){return J.isInstance(e,_h)}const yh=`StrictFqnElementRef`;function bh(e){return J.isInstance(e,yh)}const xh=`StrictFqnRef`;function Sh(e){return J.isInstance(e,xh)}function Ch(e){return J.isInstance(e,`Tag`)}const wh=`TagRef`;function Th(e){return J.isInstance(e,wh)}const Eh=`Tags`;function Dh(e){return J.isInstance(e,Eh)}const Oh=`TextSizeProperty`;function kh(e){return J.isInstance(e,Oh)}const Ah=`ViewRef`,jh=`ViewRuleAutoLayout`;function Mh(e){return J.isInstance(e,jh)}const Nh=`ViewRuleGlobalPredicateRef`;function Ph(e){return J.isInstance(e,Nh)}const Fh=`ViewRuleGlobalStyle`;function Ih(e){return J.isInstance(e,Fh)}const Lh=`ViewRuleGroup`;function Rh(e){return J.isInstance(e,Lh)}const zh=`ViewRulePredicate`;function Bh(e){return J.isInstance(e,zh)}const Vh=`ViewRuleRank`;function Hh(e){return J.isInstance(e,Vh)}const Uh=`ViewRuleStyle`;function Wh(e){return J.isInstance(e,Uh)}const Gh=`ViewStringProperty`;function Kh(e){return J.isInstance(e,Gh)}const qh=`WhereBinaryExpression`;function Jh(e){return J.isInstance(e,qh)}const Yh=`WhereElementKind`;function Xh(e){return J.isInstance(e,Yh)}const Zh=`WhereElementMetadata`;function Qh(e){return J.isInstance(e,Zh)}const $h=`WhereElementNegation`;function eg(e){return J.isInstance(e,$h)}const tg=`WhereElementTag`;function ng(e){return J.isInstance(e,tg)}const rg=`WhereRelationKind`;function ig(e){return J.isInstance(e,rg)}const ag=`WhereRelationMetadata`;function og(e){return J.isInstance(e,ag)}const sg=`WhereRelationNegation`;function cg(e){return J.isInstance(e,sg)}const lg=`WhereRelationParticipantKind`;function ug(e){return J.isInstance(e,lg)}const dg=`WhereRelationParticipantMetadata`;function fg(e){return J.isInstance(e,dg)}const pg=`WhereRelationParticipantTag`;function mg(e){return J.isInstance(e,pg)}const hg=`WhereRelationTag`;function gg(e){return J.isInstance(e,hg)}const _g=`WildcardExpression`;function vg(e){return J.isInstance(e,_g)}const yg=`DynamicStepChain`;function bg(e){return J.isInstance(e,yg)}const xg=`DynamicStepSingle`;function Sg(e){return J.isInstance(e,xg)}var Cg=class extends Bn{getAllTypes(){return[Nd,_u,Pd,Id,yu,Rd,Bd,Vd,Ud,Gd,qd,xu,Yd,Zd,$d,Cu,tf,rf,of,cf,wu,uf,ff,mf,yg,xg,gf,vf,bf,Sf,wf,Ef,Eu,Of,Du,ku,kf,jf,Nf,Ff,ju,Lf,zf,Vf,Uf,Gf,qf,Yf,Nu,Xf,Qf,ep,np,ip,Fu,op,cp,Iu,Lu,zu,Vu,fp,mp,up,gp,vp,Uu,bp,Sp,Ep,Op,Ap,wp,jp,Np,Fp,Lp,zp,Vp,Up,qp,Gp,Yp,Zp,$p,Wu,tm,rm,am,sm,lm,dm,Ku,Ju,pm,hm,Yu,_m,ym,xm,Cm,Tm,Dm,km,jm,Zm,Xu,Nm,Fm,Zu,$u,td,Lm,zm,Vm,Um,rd,qm,Ym,Gm,id,$m,th,od,rh,ah,sh,lh,dh,ph,hh,_h,yh,xh,cd,ud,`Tag`,wh,Eh,Oh,fd,Ah,md,jh,Nh,Fh,Lh,zh,Vh,Uh,gd,Gh,qh,vd,bd,Yh,Zh,$h,tg,Sd,Cd,Td,Dd,kd,rg,ag,sg,lg,dg,pg,hg,jd,_g]}computeIsSubtype(e,t){switch(e){case Pd:case tm:return this.isSubtype(id,t);case Id:case Np:case Fp:case ym:case Dm:case $m:return this.isSubtype(ud,t);case Rd:return this.isSubtype(id,t)||this.isSubtype(ud,t);case Gd:case Yd:return this.isSubtype(xu,t)||this.isSubtype(Xu,t);case $d:case Nf:return this.isSubtype(Cu,t);case of:case gf:case Gf:return this.isSubtype(Wu,t);case uf:case ff:return this.isSubtype(wu,t);case mf:case Gp:case qp:case km:return this.isSubtype(Zu,t);case yg:case xg:return this.isSubtype(Nd,t)||this.isSubtype(ku,t);case bf:return this.isSubtype(Eu,t);case Sf:case wf:return this.isSubtype(Du,t);case Eu:case ju:case xm:case rd:case id:case cd:case ud:return this.isSubtype(_u,t);case kf:return this.isSubtype(Uu,t)||this.isSubtype(Yu,t)||this.isSubtype(Xu,t);case Ff:case Uf:case vp:case _g:return this.isSubtype(Lu,t);case zf:return this.isSubtype(ju,t)||this.isSubtype(cd,t);case Vf:return this.isSubtype(ju,t);case Qf:case np:case Xu:return this.isSubtype(Uu,t);case Lu:case fp:return this.isSubtype(zu,t);case zu:case mp:return this.isSubtype(Vu,t);case Vu:case td:return this.isSubtype(Nu,t);case jp:case Zm:return this.isSubtype(yu,t);case Lp:return this.isSubtype(ju,t)||this.isSubtype(ud,t);case zp:case jm:case th:case Oh:return this.isSubtype(od,t)||this.isSubtype(ud,t);case Vp:return this.isSubtype(Yu,t)||this.isSubtype(Xu,t);case rm:return this.isSubtype(ju,t)||this.isSubtype(Fu,t)||this.isSubtype(Iu,t)||this.isSubtype(rd,t)||this.isSubtype(fd,t);case am:case sm:return this.isSubtype(Ju,t);case lm:case lh:case ph:return this.isSubtype(cd,t);case dm:return this.isSubtype(Ku,t);case Ku:return this.isSubtype(ju,t)||this.isSubtype(Fu,t)||this.isSubtype(Iu,t)||this.isSubtype(rd,t);case Cm:case Tm:return this.isSubtype(_u,t)||this.isSubtype(cd,t);case Zu:case Lm:return this.isSubtype($u,t);case $u:case zm:return this.isSubtype(td,t);case Um:case Ym:return this.isSubtype(rd,t);case qm:return this.isSubtype(rd,t)||this.isSubtype(cd,t);case fd:return this.isSubtype(_u,t)||this.isSubtype(Eu,t);case jh:return this.isSubtype(wu,t)||this.isSubtype(Du,t)||this.isSubtype(md,t);case Nh:case Lh:case zh:case Vh:return this.isSubtype(md,t);case Fh:case Uh:return this.isSubtype(gd,t);case gd:return this.isSubtype(Du,t)||this.isSubtype(md,t);case Gh:return this.isSubtype(cd,t)||this.isSubtype(fd,t);case qh:return this.isSubtype(bd,t)||this.isSubtype(kd,t);case vd:case $h:return this.isSubtype(bd,t);case bd:case kd:return this.isSubtype(Sd,t);case Yh:return this.isSubtype(vd,t)||this.isSubtype(Cd,t);case Zh:return this.isSubtype(vd,t)||this.isSubtype(Td,t);case tg:return this.isSubtype(vd,t)||this.isSubtype(jd,t);case Dd:case sg:return this.isSubtype(kd,t);case rg:case lg:return this.isSubtype(Cd,t)||this.isSubtype(Dd,t);case ag:case dg:return this.isSubtype(Td,t)||this.isSubtype(Dd,t);case pg:case hg:return this.isSubtype(Dd,t)||this.isSubtype(jd,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return Gm;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Bd;case`DeploymentNode:kind`:return $d;case`DynamicViewGlobalPredicateRef:predicate`:return bp;case`DynamicViewRef:view`:return gf;case`Element:kind`:case`ElementKindExpression:kind`:return Nf;case`ElementViewRef:view`:return Gf;case`FqnRef:value`:case`StrictFqnRef:value`:return Xu;case`IconProperty:libicon`:return Yp;case`Imported:imported`:case`StrictFqnElementRef:el`:return kf;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Wu;case`ViewRuleGlobalPredicateRef:predicate`:return Sp;case`ViewRuleGlobalStyle:style`:return Ap;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Cu;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Nd:return{name:Nd,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Pd:return{name:Pd,properties:[{name:`key`},{name:`value`}]};case Id:return{name:Id,properties:[{name:`key`},{name:`value`}]};case Rd:return{name:Rd,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Bd:return{name:Bd,properties:[{name:`name`}]};case Vd:return{name:Vd,properties:[{name:`props`,defaultValue:[]}]};case Ud:return{name:Ud,properties:[{name:`props`,defaultValue:[]}]};case Gd:return{name:Gd,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case qd:return{name:qd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Yd:return{name:Yd,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Zd:return{name:Zd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case $d:return{name:$d,properties:[{name:`name`}]};case tf:return{name:tf,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case rf:return{name:rf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case of:return{name:of,properties:[{name:`body`},{name:`name`}]};case cf:return{name:cf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case uf:return{name:uf,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case ff:return{name:ff,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case mf:return{name:mf,properties:[{name:`source`},{name:`target`}]};case gf:return{name:gf,properties:[{name:`body`},{name:`name`}]};case vf:return{name:vf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case bf:return{name:bf,properties:[{name:`key`},{name:`value`}]};case Sf:return{name:Sf,properties:[{name:`predicate`}]};case wf:return{name:wf,properties:[{name:`exprs`}]};case Ef:return{name:Ef,properties:[{name:`steps`,defaultValue:[]}]};case Of:return{name:Of,properties:[{name:`view`}]};case kf:return{name:kf,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case jf:return{name:jf,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Nf:return{name:Nf,properties:[{name:`name`}]};case Ff:return{name:Ff,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Lf:return{name:Lf,properties:[{name:`modelElement`}]};case zf:return{name:zf,properties:[{name:`key`},{name:`value`}]};case Vf:return{name:Vf,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Uf:return{name:Uf,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Gf:return{name:Gf,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case qf:return{name:qf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Yf:return{name:Yf,properties:[{name:`view`}]};case Xf:return{name:Xf,properties:[{name:`prev`},{name:`value`}]};case Qf:return{name:Qf,properties:[{name:`body`},{name:`deploymentNode`}]};case ep:return{name:ep,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case np:return{name:np,properties:[{name:`body`},{name:`element`}]};case ip:return{name:ip,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case op:return{name:op,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case cp:return{name:cp,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case up:return{name:up,properties:[{name:`prev`},{name:`value`}]};case fp:return{name:fp,properties:[{name:`subject`},{name:`where`}]};case mp:return{name:mp,properties:[{name:`custom`},{name:`subject`}]};case gp:return{name:gp,properties:[{name:`parent`},{name:`value`}]};case vp:return{name:vp,properties:[{name:`ref`},{name:`selector`}]};case bp:return{name:bp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Sp:return{name:Sp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case wp:return{name:wp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Ep:return{name:Ep,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Op:return{name:Op,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Ap:return{name:Ap,properties:[{name:`name`}]};case jp:return{name:jp,properties:[{name:`hex`}]};case Np:return{name:Np,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Fp:return{name:Fp,properties:[{name:`key`},{name:`value`}]};case Lp:return{name:Lp,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case zp:return{name:zp,properties:[{name:`key`},{name:`value`}]};case Vp:return{name:Vp,properties:[{name:`imported`},{name:`prev`}]};case Up:return{name:Up,properties:[{name:`imports`},{name:`project`}]};case Gp:return{name:Gp,properties:[{name:`to`}]};case qp:return{name:qp,properties:[{name:`inout`}]};case Yp:return{name:Yp,properties:[{name:`name`}]};case Zp:return{name:Zp,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case $p:return{name:$p,properties:[{name:`icons`,defaultValue:[]}]};case tm:return{name:tm,properties:[{name:`key`},{name:`value`}]};case rm:return{name:rm,properties:[{name:`key`},{name:`title`},{name:`value`}]};case am:return{name:am,properties:[{name:`markdown`},{name:`text`}]};case sm:return{name:sm,properties:[{name:`values`,defaultValue:[]}]};case lm:return{name:lm,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case dm:return{name:dm,properties:[{name:`props`,defaultValue:[]}]};case pm:return{name:pm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case hm:return{name:hm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case _m:return{name:_m,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case ym:return{name:ym,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case xm:return{name:xm,properties:[{name:`key`},{name:`value`}]};case Cm:return{name:Cm,properties:[{name:`key`},{name:`value`}]};case Tm:return{name:Tm,properties:[{name:`key`},{name:`value`}]};case Dm:return{name:Dm,properties:[{name:`key`},{name:`value`}]};case km:return{name:km,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case jm:return{name:jm,properties:[{name:`key`},{name:`value`}]};case Nm:return{name:Nm,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Fm:return{name:Fm,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Lm:return{name:Lm,properties:[{name:`subject`},{name:`where`}]};case zm:return{name:zm,properties:[{name:`custom`},{name:`subject`}]};case Vm:return{name:Vm,properties:[{name:`kind`}]};case Um:return{name:Um,properties:[{name:`key`},{name:`value`}]};case Gm:return{name:Gm,properties:[{name:`name`}]};case qm:return{name:qm,properties:[{name:`key`},{name:`value`}]};case Ym:return{name:Ym,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Zm:return{name:Zm,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case $m:return{name:$m,properties:[{name:`key`},{name:`value`}]};case th:return{name:th,properties:[{name:`key`},{name:`value`}]};case rh:return{name:rh,properties:[{name:`color`},{name:`name`}]};case ah:return{name:ah,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case sh:return{name:sh,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case lh:return{name:lh,properties:[{name:`key`},{name:`value`}]};case dh:return{name:dh,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case ph:return{name:ph,properties:[{name:`key`},{name:`value`}]};case hh:return{name:hh,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case _h:return{name:_h,properties:[{name:`color`},{name:`tag`}]};case yh:return{name:yh,properties:[{name:`el`},{name:`parent`}]};case xh:return{name:xh,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case wh:return{name:wh,properties:[{name:`tag`}]};case Eh:return{name:Eh,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Oh:return{name:Oh,properties:[{name:`key`},{name:`value`}]};case Ah:return{name:Ah,properties:[{name:`view`}]};case jh:return{name:jh,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Nh:return{name:Nh,properties:[{name:`predicate`}]};case Fh:return{name:Fh,properties:[{name:`style`}]};case Lh:return{name:Lh,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case zh:return{name:zh,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Vh:return{name:Vh,properties:[{name:`targets`},{name:`value`}]};case Uh:return{name:Uh,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Gh:return{name:Gh,properties:[{name:`key`},{name:`value`}]};case qh:return{name:qh,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Yh:return{name:Yh,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Zh:return{name:Zh,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case $h:return{name:$h,properties:[{name:`value`}]};case tg:return{name:tg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case rg:return{name:rg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ag:return{name:ag,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case sg:return{name:sg,properties:[{name:`value`}]};case lg:return{name:lg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case dg:return{name:dg,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case pg:return{name:pg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case hg:return{name:hg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case _g:return{name:_g,properties:[{name:`isWildcard`,defaultValue:!1}]};case yg:return{name:yg,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case xg:return{name:xg,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const J=new Cg;let wg;const Tg=()=>wg??=Zn(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@126"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@116/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@116/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/([a-zA-Z]|_+[a-zA-Z0-9])[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@118"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@149"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@145"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@4/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@5/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@103"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@114"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@135"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@151"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),Eg={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Dg={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Og={AstReflection:()=>new Cg},kg={Grammar:()=>Tg(),LanguageMetaData:()=>Eg,parser:{ParserConfig:()=>Dg}},Ag=Symbol.for(`idattr`),jg={writeId(e,t){return e[Ag]=t,e},readId(e){return e[Ag]}},Mg={writeId(e,t){return v(t)?e[Ag]=void 0:e[Ag]=t,e},readId(e){return e[Ag]}};function Ng(e){return e?.textDocument.languageId===Eg.languageId}function Pg(e){return Ng(e)&&hu(e)}function Fg(e){return e?.markdown||e?.text}function Ig(e){let t=parseFloat(e);return isNaN(t)?100:Je(t,{min:0,max:100})}function Lg({value:e}){return Ig(e)}function Rg({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:F(e)}}function zg({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function Bg(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case zd(r):{let e=Vg(r);y(e)&&(n.color=e);break}case nm(r):n.line=r.value;break;case Fd(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function Vg(e){return e?.themeColor??e?.customColor?.$refText}function Hg(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function Ug(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function Wg(e){return On(e,e=>Bh(e)||df(e)||Tf(e))}const Gg=e=>mm(e)||Mf(e)||ap(e)||Jf(e)||yf(e)||Rf(e),Kg=e=>gm(e)||lf(e)||Qd(e)||tp(e)||Jd(e);function qg(e){for(;;){if(Kg(e)||Gg(e))return!1;if(Tp(e)||vm(e))return!0;if(e.$container)e=e.$container;else return!1}}function Jg(e){for(;;){if(Kg(e))return!1;if(Gg(e))return!0;if(e.$container)e=e.$container;else return!1}}function Yg(e){for(;;){if(Gg(e))return!1;if(Kg(e))return!0;if(e.$container)e=e.$container;else return!1}}function Xg(e){try{let t=bh(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function Zg(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function Qg(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function $g(e){let t;for(;t=e.value?.ref;){if(Xd(t))return null;if(Kd(t))return t;if(v(e.parent))return null;e=e.parent}return null}function e_(e){let t=Qg(e);return t?.$type===`Imported`?t:null}function t_(e){let t;for(;t=e.value?.ref;){if(Su(t))return!0;if(v(e.parent))return!1;e=e.parent}return!1}var n_=class extends rr{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=fn(e);let r=super.createDescription(e,t,n);return mu(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},r_=class extends Vn{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return kn(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const i_=zi(`/`),a_=(e,t)=>i_(e.uri.path,t.uri.path);var o_=class extends Jn{constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(a_);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);Pg(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return Pg(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return kn(this.documentMap.values()).filter(e=>Pg(e)&&!this.projectsManager.isExcluded(e))}get all(){return kn(this.documentMap.values()).map(e=>(Pg(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return kn(this.documentMap.values()).filter(n=>Pg(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return T(this.userDocuments.toArray(),b(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),be(x(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,Pg(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},s_=t(wr(),1);const Y=K.getChild(`projects`);function c_(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function l_(e){return c_(e)?e.uri.toString():typeof e==`string`?Fr(e,{acceptRelative:!1,strict:!0})?e:_n.file(e).toString():e.toString()}const u_=zi(`/`,!0),d_=(e,t)=>u_(Ar(e.path),Ar(t.path));function f_(e){return t=>e.startsWith(Hi(t)?t:t.folder)}function p_(e,t){let n=Hi(e)?e:e.folder,r=Hi(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function m_(...e){return Ce(p_,e)}function h_(e,t){return t.startsWith(e.folder)||e.includePaths?.some(f_(t))?!g_(e,t):!1}function g_(e,t){return e.exclude?.(Rr(t))??!1}function __(...e){return Ce(h_,e)}function v_(...e){return Ce(g_,e)}function y_(e){return e=l_(e),Ir(e)}const b_=(e,t)=>d_(e.folderUri,t.folderUri);function x_(e){return e.sort(b_)}const S_={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,s_.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function C_(e){return S_.exclude(Rr(e))}function w_(e){if(`configUri`in e){P(!ve(e.configUri),`configUri is emptyish`);let t=_n.isUri(e.configUri)?e.configUri:_n.parse(l_(e.configUri)),n=y_(mn.dirname(t));return{configUri:t,folder:n,folderUri:_n.parse(n)}}P(!ve(e.folderUri),`folderUri is emptyish`);let t=y_(e.folderUri),n=_n.parse(t);return{configUri:mn.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var T_=class e{static DefaultProjectId=S_.id;#e=[];#t=void 0;#n=[];#r=new E.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=mn.joinPath(e,`likec4.config.json`),r=y_(e);return{id:t,config:S_.config,folder:r,folderUri:_n.parse(r),configUri:n,exclude:S_.exclude,includeConfig:{...S_.includeConfig}}}return N(this.#n.find(e=>e.id===t),`Project ${t} not found`)});#i=new E.default(e=>{let t=l_(e),n=this.#a.get(t);return n?v_(n,t)?!this.#n.some(__(t)):!1:C_(t)});#a=new E.default(e=>{let t=f_(e);return this.#n.find(t)??this.#n.find(__(e))??null});constructor(e){this.services=e,Y.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#n.length>1))return C(this.#n,1)?this.#n[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#t=void 0,!t||t===e.DefaultProjectId){Y.debug`reset default project ID`;return}P(this.#n.find(e=>e.id===t),`Project "${t}" not found`),Y.debug`set default project ID to ${t}`,this.#t=t}}get default(){return this.#r.get(this.defaultProjectId??e.DefaultProjectId)}get all(){if(C(this.#n,1)){let e=[...b(this.#n,x(`id`)),S_.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[S_.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#r.get(t)}findOverlaped(e){let t=m_(y_(e));return this.#n.filter(e=>t(e)||!!e.includePaths&&!!Ie(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#n.some(e=>t===e.id),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${b(this.#n,x(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#n.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return c_(t)&&mu(t)?!0:e.length===1?this.#i.get(l_(t)):v_(this.#r.get(e[0]),l_(t))}isIncluded(t,n){let r=l_(n);return C(this.#n,1)?t===e.DefaultProjectId?!this.#a.get(r)&&!C_(r):__(this.#r.get(t),l_(n)):!C_(r)}async registerConfigFile(e,t){if(C_(l_(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${S_.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!yn(t))throw ts(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Yl.validate(e.config),{configUri:r,folder:i,folderUri:a}=w_(e),o=Yl.normalizeInclude(n.include),s=this.#n.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(Y.info`project name changed from ${s.config.name} to ${n.name}`,Y.info`unregistering ${s.id}`,s.id=this.uniqueProjectId(n.name),Y.info`register ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#n=x_([...this.#n,s]),Y.info`register ${s.id}`),N_(()=>this.updateIncludesExcludes(s)),this.#o?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>yn(e)?Promise.reject(e):(Y.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#a.get(l_(t))?.id??this.#t??e.DefaultProjectId}#o=null;async reloadProjects(e){return this.#o?(Y.debug`reload projects is already in progress, waiting`,await this.#o.catch(()=>{})):(Y.debug`schedule reload projects`,this.#o=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(yn(e)||Y.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#o=null,this.notifyListeners()}),await this.#o)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Y.warn(`Failed to reloadProjects, no workspace folders found`);return}Y.debug`start reload projects`;let n=[];for(let e of t){let t=_n.parse(e.uri);Y.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)Y.debug`found config ${mn.relative(t,r.uri)}`,n.push(r.uri)}catch(e){Y.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#n.length===0){Y.warning(`No config files found`);return}Y.warning(`no config files found, but {count} projects were registered before`,{count:this.#n.length}),Y.warning(`reset`)}n.sort(d_);let r=new Map(this.#n.map(e=>[e.configUri.toString(),e]));this.#n=[],this.#r.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){Y.warn(U(t));let n=r.get(e.toString());n&&(Y.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{Y.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(b(this.#n,x(`id`))),n=e;if(!t.has(n))return n;Y.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){Y.trace(`resetCaches`),this.#t&&!this.#n.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#r.clear(),this.#a.clear(),this.#i.clear()}async rebuildProject(t,n){let r=this.#n.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?Y.info`Rebuilding all documents `:Y.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=Y.getChild(r.id),a=this.services.workspace.LangiumDocuments.userDocuments.filter(e=>__(r,l_(e))).map(e=>e.uri).toArray();if(a.length===0){i.debug`no documents found for project ${r.id}, skipping rebuild`;return}i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#n)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Wn.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Y.warn(`Failed to get workspace URI, using default folder`,{error:e}),_n.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){Y.warn(U(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case v(t.exclude):e.exclude=S_.exclude;break;case t.exclude&&C(t.exclude,1):e.exclude=(0,s_.default)(b(t.exclude,t=>(!jr(t)&&!t.startsWith(`**`)&&(t=Pr(`**`,t)),Lr(Or(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!C(n,1))return e;e.includePaths=b(n,t=>{let n=mn.resolvePath(e.folderUri,t);return{uri:n,folder:y_(n)}}),Y.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#n)n.id!==e.id&&(m_(t,n)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{m_(t,r)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=b([e.configUri,t],mn.basename);n!==r&&Y.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}};function E_(e){return Eg.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function D_(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const O_=zi(`/`);function k_(e,t){return O_(e.uri.path,t.uri.path)}var A_=class extends Rn{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=_n.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){q(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){q(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(du,_n.parse(pu)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{K.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&K.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){K.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Fe(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){K.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?K.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):K.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=mn.basename(t.uri);return t.isDirectory?!D_(r):t.isFile?(n.fileExtensions.includes(mn.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&C(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();K.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),_n.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Wn.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};function j_(e){if(Hp(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(Wp(e))}if(Wp(e))return e.project;let t=dr(e)?fn(e):e;return t.likec4ProjectId?t.likec4ProjectId:(K.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,T_.DefaultProjectId)}function M_(...e){return Aa(e.length>1?e.join(`:::`):e[0])}function N_(e){try{return e()}catch(e){K.trace(`Safe call failed`,{error:e});return}}function P_(){try{return globalThis.performance.now()}catch{return Date.now()}}function F_(){let e=P_();return{get ms(){return P_()-e},get pretty(){return Dr(P_()-e)}}}const I_=K.getChild(`manual-layouts`),L_=`.likec4.snap`,R_=e=>e.endsWith(L_);function z_(e){return`${e}${L_}`}function B_(e){let t=mn.basename(e);return R_(t)?t.slice(0,-12):null}function V_(e){return mn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const H_={manualLayouts:e=>new W_(e)},U_=`file://./`;var W_=class{cache;listeners=[];#e=$t(1);constructor(e){this.services=e,this.cache=new Fn,xa(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async handleFileSystemUpdate(e){let t=e.update??e.delete,n=B_(t)??void 0,r=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(r),`delete`in e){this.triggerUpdate(z({removed:t,projectId:r,viewId:n}));return}let i=this.services.workspace.ProjectsManager.getProject(r);if(!n){let e=await this.readSnapshot(t,i);e?n=e.id:(I_.error(`File ${t} does not exist or is not a valid manual layout file`),n=`index`)}this.triggerUpdate({updated:t,projectId:r,viewId:n})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=I_.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=V_(e),i=[];try{let a=await n.scanDirectory(r,R_);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=yr.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.trace`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=ue(i,x(`id`));return{hash:ka(a),views:a}}async readSnapshot(e,t){let n=this.services.workspace.FileSystemProvider;try{let r=await n.readFile(e),i=yr.parse(r);if(!t){let n=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(n)}return{...this.resolveIconPathsAfterRead(i,t.folderUri),_layout:`manual`}}catch(t){return I_.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return t;let n=await this.readManualLayouts(e);return this.cache.set(e.id,n),n})}async write(e,t){this.cache.delete(e.id);let n=I_.getChild(e.id),r=V_(e),i=mn.joinPath(r,z_(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=yr.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:Ln.create(lr.create(0,0),lr.create(a.split(`
55
- `).length-1,1))};n.debug`write snapshot of ${t.id} in project ${e.id} to ${i.fsPath}`;let s=this.services.workspace.FileSystemProvider;try{await s.writeFile(i,a+`
56
- `),this.triggerUpdate({updated:i,projectId:e.id,viewId:t.id})}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=I_.getChild(e.id),r=V_(e),i=mn.joinPath(r,z_(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:Ln.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null;this.triggerUpdate({removed:i,projectId:e.id,viewId:t})}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){I_.trace`clear caches`,this.cache.clear()}triggerUpdate(e){for(let t of this.listeners)N_(()=>t(e))}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=_n.parse(e.icon),r=mn.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${U_}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(U_)){let n=e.icon.substring(9),r=mn.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const G_=K.getChild(`chokidar`),K_={fileSystemWatcher:e=>new J_(e)},q_=e=>{let t=ri(e);return E_(t)||ru(t)||R_(t)};var J_=class{watcher;queue=new en({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){G_.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){G_.debug`create watcher for folder: ${e}`;let t=Er.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!q_(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){G_.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{G_.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=ri(e),r=_n.file(e);switch(!0){case ru(n):G_.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case E_(n):G_.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case R_(n):G_.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ManualLayouts.handleFileSystemUpdate({update:r});break;default:G_.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=ri(e),r=_n.file(e);switch(!0){case ru(n):G_.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case E_(n):G_.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case R_(n):G_.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:r});break;default:G_.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){G_.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},Y_=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(mu(e))return Promise.resolve(du);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},X_=class{watch(){}dispose(){return Promise.resolve()}},Z_=class{handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}};const Q_={fileSystemWatcher:()=>new X_},$_={fileSystemProvider:()=>new Y_,...Q_},ev={manualLayouts:()=>new Z_},tv=K.getChild(`filesystem`);function nv(e,t=!1){return!t&&ru(ri(e))}function rv(e,t=!1){return!t&&E_(ri(e))}const iv=(e=!0)=>({fileSystemProvider:()=>new av,...e?K_:Q_});var av=class extends ur{async readFile(e){if(mu(e))return Promise.resolve(du);try{return await super.readFile(e)}catch(t){return tv.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new lu.fdir().withSymlinks({resolvePaths:!1}).exclude(D_).withFullPaths().filter(rv);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:_n.file(e)})}catch(t){tv.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(k_)}async scanProjectFiles(e){return await this.scanDirectory(e,nv)}async scanDirectory(e,t){let n=[];try{let r=await new lu.fdir().withSymlinks({resolvePaths:!1}).exclude(D_).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:_n.file(e)})}catch(t){tv.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await cu(e)}async writeFile(e,t){let n=ii(e.fsPath),r=_i(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(tv.debug(`creating directory {path}`,{path:n}),gi(n,{recursive:!0})),tv.debug(`writing file {path}`,{path:e.fsPath}),await li(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=_i(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await ci(t),tv.debug(`deleted file {path}`,{path:t}),!0):(tv.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){tv.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const ov={mcpServer:()=>new sv,mcpServerFactory:()=>new cv};var sv=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},cv=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const lv=K.getChild(`mcp`);function uv(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},dv(n,e,t)]}function dv(e,t,n){let r=n.bind(null,t);return(async function(t,n){lv.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return lv.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:U(t)}],isError:!0}}})}var fv=`1.54.0`;const pv=j({name:A().describe(`Project identifier`),title:A().optional().describe(`Human-readable project title`),contactPerson:A().optional().describe(`Maintainer contact information`),metadata:qr(A(),Wr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Br([A(),M(A())]).optional().describe(`Style inheritance paths`),exclude:M(A()).optional().describe(`File exclusion patterns`),include:j({paths:M(A()).describe(`Include paths`),maxDepth:k().describe(`Maximum directory depth`),fileThreshold:k().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:j({outDir:A().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:j({hasTheme:Vr().describe(`Whether theme customization is defined`),hasDefaults:Vr().describe(`Whether default style values are defined`),hasCustomCss:Vr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function mv(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const hv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A(),tags:M(A()),metadata:qr(Br([A(),M(A())])),includedInViews:M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function gv(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:xv(e.views())}}function _v(e,t,n,r,i,a){P(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...gv(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const vv=j({path:A().describe(`Path to the file`),range:j({start:j({line:k(),character:k()}),end:j({line:k(),character:k()})}).describe(`Range in the file`)}).nullable(),yv=A().refine(e=>!0).optional().default(T_.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),bv=M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})),xv=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),Sv=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:_n.parse(r.uri).fsPath,range:r.range}:null}catch(e){return lv.debug(`Failed to locate {params}`,{error:e,params:n}),null}},Cv=hv.extend({description:A().nullable().describe(`Element description`),technology:A().nullable().describe(`Element technology`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),children:M(A()).describe(`Direct child element ids`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),wv=uv({name:`batch-read-elements`,description:`
57
- Read details of multiple elements in a single call, reducing round-trips.
58
- Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
59
-
60
- Request:
61
- - ids: string[] — array of element ids (FQNs) to read (max 50)
62
- - project: string (optional) — project id. Defaults to "default" if omitted.
63
-
64
- Response (JSON object):
65
- - elements: Array of element details, each with:
66
- - id: string — element id (FQN)
67
- - name: string — element name
68
- - kind: string — element kind
69
- - title: string — human-readable title
70
- - description: string|null — optional description
71
- - technology: string|null — optional technology
72
- - tags: string[] — assigned tags
73
- - metadata: Record<string, string | string[]> — element metadata
74
- - shape: string — rendered shape
75
- - color: string — rendered color
76
- - children: string[] — direct child element ids
77
- - incomingCount: number — number of incoming relationships
78
- - outgoingCount: number — number of outgoing relationships
79
- - includedInViews: View[] — views that include this element
80
- - notFound: string[] — ids that were not found in the project
81
-
82
- View (object) fields:
83
- - id: string — view identifier
84
- - title: string — view title
85
- - type: "element" | "deployment" | "dynamic"
86
-
87
- Notes:
88
- - Read-only, idempotent, no side effects.
89
- - Safe to call repeatedly.
90
- - Maximum 50 element ids per call.
91
- - Elements not found are listed in notFound array (not an error).
92
- - More efficient than multiple read-element calls when you need summary data for many elements.
93
-
94
- Example response:
95
- {
96
- "elements": [
97
- {
98
- "id": "shop.frontend",
99
- "name": "frontend",
100
- "kind": "container",
101
- "title": "Frontend",
102
- "description": "User-facing web app",
103
- "technology": "React",
104
- "tags": ["public"],
105
- "metadata": { "owner": "web-team" },
106
- "shape": "browser",
107
- "color": "#2F80ED",
108
- "children": ["shop.frontend.auth"],
109
- "incomingCount": 2,
110
- "outgoingCount": 3,
111
- "includedInViews": [
112
- { "id": "system-overview", "title": "System Overview", "type": "element" }
113
- ]
114
- }
115
- ],
116
- "notFound": []
117
- }
118
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:M(A()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:yv},outputSchema:{elements:M(Cv),notFound:M(A()).describe(`Element ids that were not found`)}},async(e,t)=>{P(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...gv(t),description:t.description.text,technology:t.technology,shape:t.shape,color:t.color,children:[...t.children()].map(e=>e.id),incomingCount:t.allIncoming.size,outgoingCount:t.allOutgoing.size})}return{elements:i,notFound:a}}),Tv=j({id:A(),kind:A(),title:A(),description:A().nullable(),technology:A().nullable(),shape:A(),color:A()}),Ev=j({element1:Tv,element2:Tv,propertyDiffs:M(j({property:A().describe(`Property name`),element1Value:A().nullable().describe(`Value in element1`),element2Value:A().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:j({onlyInElement1:M(A()).describe(`Tags present only in element1`),onlyInElement2:M(A()).describe(`Tags present only in element2`),common:M(A()).describe(`Tags present in both elements`)}),metadata:j({onlyInElement1:qr(Br([A(),M(A())])).describe(`Metadata keys only in element1`),onlyInElement2:qr(Br([A(),M(A())])).describe(`Metadata keys only in element2`),different:M(j({key:A(),element1Value:Br([A(),M(A())]),element2Value:Br([A(),M(A())])})).describe(`Metadata keys present in both but with different values`),common:qr(Br([A(),M(A())])).describe(`Metadata keys with identical values in both`)}),relationships:j({incomingOnlyElement1:k().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:k().describe(`Count of unique source elements sending to element2 only`),incomingShared:k().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:k().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:k().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:k().describe(`Count of unique target elements receiving from both`)})}),Dv=uv({name:`element-diff`,description:`
119
- Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
120
-
121
- Request:
122
- - element1Id: string — first element id (FQN)
123
- - element2Id: string — second element id (FQN)
124
- - project: string (optional) — project id. Defaults to "default" if omitted.
125
-
126
- Response (JSON object):
127
- - element1: object — snapshot of first element (id, kind, title, description, technology, shape, color)
128
- - element2: object — snapshot of second element
129
- - propertyDiffs: Array of { property, element1Value, element2Value } — properties that differ
130
- - tags: object
131
- - onlyInElement1: string[] — tags only in element1
132
- - onlyInElement2: string[] — tags only in element2
133
- - common: string[] — tags in both
134
- - metadata: object
135
- - onlyInElement1: Record — metadata keys only in element1
136
- - onlyInElement2: Record — metadata keys only in element2
137
- - different: Array of { key, element1Value, element2Value } — keys present in both but with different values
138
- - common: Record — metadata keys with identical values in both
139
- - relationships: object — relationship count comparison
140
- - incomingOnlyElement1/incomingOnlyElement2/incomingShared
141
- - outgoingOnlyElement1/outgoingOnlyElement2/outgoingShared
142
-
143
- Notes:
144
- - Read-only, idempotent, no side effects.
145
- - Safe to call repeatedly.
146
- - Both elements must exist in the same project.
147
- - Useful for comparing similar nodes to understand why they have different configurations.
148
-
149
- Example response:
150
- {
151
- "element1": { "id": "planner.nodeA", "kind": "cgf-node", "title": "nodeA", ... },
152
- "element2": { "id": "planner.nodeB", "kind": "cgf-node", "title": "nodeB", ... },
153
- "propertyDiffs": [
154
- { "property": "title", "element1Value": "nodeA :dwNodeTypeA", "element2Value": "nodeB :dwNodeTypeB" }
155
- ],
156
- "tags": {
157
- "onlyInElement1": ["target_asil_qm"],
158
- "onlyInElement2": ["target_asil_asil_b"],
159
- "common": ["is_in_dag", "process_camera_master"]
160
- },
161
- "metadata": {
162
- "onlyInElement1": {},
163
- "onlyInElement2": {},
164
- "different": [
165
- { "key": "target_asil", "element1Value": "QM", "element2Value": "ASIL-B" }
166
- ],
167
- "common": { "host": "machine0" }
168
- },
169
- "relationships": {
170
- "incomingOnlyElement1": 2,
171
- "incomingOnlyElement2": 1,
172
- "incomingShared": 3,
173
- "outgoingOnlyElement1": 0,
174
- "outgoingOnlyElement2": 1,
175
- "outgoingShared": 2
176
- }
177
- }
178
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:A().describe(`First element id (FQN)`),element2Id:A().describe(`Second element id (FQN)`),project:yv},outputSchema:Ev.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);P(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);P(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},ee={},te=[],ne={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?ee[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?ne[e]=t:te.push({key:e,element1Value:t,element2Value:n}))}let re=new Set([...i.incoming()].map(e=>e.source.id)),ie=new Set([...a.incoming()].map(e=>e.source.id)),ae=new Set([...i.outgoing()].map(e=>e.target.id)),oe=new Set([...a.outgoing()].map(e=>e.target.id)),se=0,_=0,ce=0;for(let e of re)ie.has(e)?se++:_++;for(let e of ie)re.has(e)||ce++;let le=0,ue=0,v=0;for(let e of ae)oe.has(e)?le++:ue++;for(let e of oe)ae.has(e)||v++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:ee,different:te,common:ne},relationships:{incomingOnlyElement1:_,incomingOnlyElement2:ce,incomingShared:se,outgoingOnlyElement1:ue,outgoingOnlyElement2:v,outgoingShared:le}}}),Ov=uv({name:`find-relationship-paths`,description:`
179
- Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
180
-
181
- Request:
182
- - sourceId: string — source element FQN
183
- - targetId: string — target element FQN
184
- - maxDepth: number (optional, default: 3, max: 5) — maximum path length (number of hops)
185
- - includeIndirect: boolean (optional, default: false) — include indirect (implied) relationships through nested elements
186
- - project: string (optional) — project id. Defaults to "default" if omitted.
187
-
188
- Algorithm:
189
- - Uses breadth-first search (BFS) to find all paths
190
- - Prevents cycles with visited set per path
191
- - Paths are sorted by length (shortest first)
192
- - Limited to 100 paths to avoid overwhelming responses
193
-
194
- Response (JSON object):
195
- - paths: Array of path objects, each with:
196
- - length: number — number of hops in the path
197
- - steps: Array<Step> — ordered sequence of relationships
198
-
199
- Step (object) fields:
200
- - source: string — source element FQN
201
- - target: string — target element FQN
202
- - relationship: object
203
- - kind: string|null — relationship kind
204
- - title: string|null — relationship title
205
- - description: string|null — relationship description
206
- - technology: string|null — relationship technology
207
- - tags: string[] — relationship tags
208
-
209
- Notes:
210
- - Read-only, idempotent, no side effects.
211
- - Safe to call repeatedly.
212
- - Returns empty paths array if no paths exist.
213
- - Rejects if source equals target.
214
- - includeIndirect=false (default): only follows direct relationships on each element.
215
- includeIndirect=true: also follows implied relationships through nested elements.
216
- - maxDepth is capped at 5 to prevent excessive computation.
217
- - Paths are discovered iteratively and sorted by length.
218
-
219
- Example response:
220
- {
221
- "paths": [
222
- {
223
- "length": 1,
224
- "steps": [
225
- {
226
- "source": "shop.frontend",
227
- "target": "shop.backend",
228
- "relationship": {
229
- "kind": "uses",
230
- "title": "Calls API",
231
- "description": null,
232
- "technology": "HTTPS",
233
- "tags": []
234
- }
235
- }
236
- ]
237
- },
238
- {
239
- "length": 2,
240
- "steps": [
241
- {
242
- "source": "shop.frontend",
243
- "target": "shop.cache",
244
- "relationship": {
245
- "kind": "uses",
246
- "title": "Reads from",
247
- "description": null,
248
- "technology": "Redis",
249
- "tags": []
250
- }
251
- },
252
- {
253
- "source": "shop.cache",
254
- "target": "shop.backend",
255
- "relationship": {
256
- "kind": "syncs-with",
257
- "title": "Updates",
258
- "description": null,
259
- "technology": null,
260
- "tags": []
261
- }
262
- }
263
- ]
264
- }
265
- ]
266
- }
267
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:A().describe(`Source element FQN`),targetId:A().describe(`Target element FQN`),maxDepth:k().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Vr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:yv},outputSchema:{paths:M(j({length:k().describe(`Number of hops in the path`),steps:M(j({source:A().describe(`Source element FQN`),target:A().describe(`Target element FQN`),relationship:j({kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);P(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);P(a,`Target element "${t.targetId}" not found in project "${n}"`),P(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}}),kv=j({id:A(),title:A(),kind:A()}),Av=j({type:Ur([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:kv,target:kv,kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`),includedInViews:bv.describe(`Views that include this relationship`),sourceLocation:vv}),jv=uv({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
268
- Find relationships between two LikeC4 elements within a project.
269
-
270
- What it does:
271
- - Finds both direct relationships (element1 ↔ element2) and indirect ones that arise via containment (e.g. via nested elements).
272
- - Returns rich metadata for each relationship and where it appears in views.
273
-
274
- Inputs:
275
- - element1: string — Element ID (FQN)
276
- - element2: string — Element ID (FQN)
277
- - project: string (optional, defaults to "default") — Project id
278
-
279
- Output:
280
- - found: Relationship[]
281
-
282
- Relationship (object) fields:
283
- - type: "direct" | "indirect" — direct is between the specified endpoints; indirect is via nested elements
284
- - source: Endpoint
285
- - target: Endpoint
286
- - kind: string|null — relationship kind from the model
287
- - title: string|null — relationship title if provided
288
- - description: string|null — relationship description text
289
- - technology: string|null — relationship technology
290
- - tags: string[] — relationship tags
291
- - includedInViews: View[] — views where this relationship appears
292
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
293
-
294
- Endpoint (object) fields:
295
- - id: string — Element ID (FQN)
296
- - title: string — element title
297
- - kind: string — element kind
298
-
299
- View (object) fields:
300
- - id: string — view identifier
301
- - title: string — view title
302
- - type: "element" | "deployment" | "dynamic"
303
-
304
- Notes:
305
- - Read-only, idempotent; does not mutate the model. May trigger UI navigation in supporting clients.
306
- - The order of results is not guaranteed.
307
-
308
- Example:
309
- Request:
310
- {
311
- "element1": "shop.frontend",
312
- "element2": "shop.backend",
313
- "project": "default"
314
- }
315
-
316
- Response:
317
- {
318
- "found": [
319
- {
320
- "type": "direct",
321
- "source": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
322
- "target": { "id": "shop.backend", "title": "Backend", "kind": "component" },
323
- "kind": "sync",
324
- "title": "Calls",
325
- "description": "Frontend calls Backend",
326
- "technology": "HTTP",
327
- "tags": ["public"],
328
- "includedInViews": [
329
- { "id": "system-overview", "title": "System Overview", "type": "element" }
330
- ],
331
- "sourceLocation": {
332
- "path": "/abs/path/project/model.c4",
333
- "range": { "start": { "line": 12, "character": 0 }, "end": { "line": 14, "character": 0 } }
334
- }
335
- }
336
- ]
337
- }
338
- `,inputSchema:{element1:A().describe(`Element ID (FQN)`),element2:A().describe(`Element ID (FQN)`),project:yv},outputSchema:{found:M(Av)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Ji(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);P(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);P(o,`Element "${t.element2}" not found in project "${n}"`);let s=Sv(e,n),c=Zc(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:xv(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),Mv=uv({name:`list-projects`,description:`
339
- List LikeC4 projects discoverable in the current workspace.
340
-
341
- Request:
342
- - No input parameters.
343
-
344
- Response (JSON object):
345
- - projects: Project[]
346
-
347
- Project (object) fields:
348
- - id: string — stable project identifier
349
- - title: string — human-readable project title
350
- - folder: string — absolute path to the project root
351
- - sources: string[] — absolute file paths of related documents
352
-
353
- Notes:
354
- - Read-only, idempotent, no side effects.
355
- - Safe to call repeatedly.
356
-
357
- Example response:
358
- {
359
- "projects": [
360
- {
361
- "id": "docs",
362
- "title": "Documentation",
363
- "folder": "/abs/path/to/workspace/docs",
364
- "sources": [
365
- "/abs/path/to/workspace/docs/model/contexts.likec4",
366
- "/abs/path/to/workspace/docs/model/relations.likec4"
367
- ]
368
- }
369
- ]
370
- }
371
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:M(j({id:A(),title:A(),folder:A(),sources:M(A())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),Nv=uv({name:`open-view`,description:`
372
- Open a LikeC4 view in the editor's preview panel.
373
-
374
- Request:
375
- - viewId: string — view id (name)
376
- - project: string (optional) — project id. Defaults to "default" if omitted.
377
-
378
- Response (JSON object):
379
- - location: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location of the view if available
380
-
381
- Notes:
382
- - Read-only and idempotent with respect to the project model. Triggers a UI action in the editor.
383
- - Only one preview panel can be open at a time.
384
-
385
- Example response:
386
- {
387
- "location": {
388
- "path": "/abs/path/project/model.c4",
389
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
390
- }
391
- }
392
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:A().describe(`View id (name)`),project:yv},outputSchema:{location:vv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:Sv(e,n)({view:r.id})}}),Pv=Ur([`exact`,`contains`,`exists`]),Fv=uv({name:`query-by-metadata`,description:`
393
- Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
394
-
395
- Request:
396
- - key: string — metadata key to filter by
397
- - value: string (optional) — metadata value to match (ignored for 'exists' mode)
398
- - matchMode: "exact" | "contains" | "exists" (optional, default: "exact")
399
- - project: string (optional) — project id. Defaults to "default" if omitted.
400
-
401
- Match Modes:
402
- - exact: Value must match exactly (case-sensitive)
403
- Example: key="owner", value="platform-team" matches only exact "platform-team"
404
- - contains: Value contains the search string (case-insensitive)
405
- Example: key="technology", value="aws" matches "AWS Lambda", "aws-s3", etc.
406
- - exists: Element has the key (value parameter is ignored)
407
- Example: key="owner" returns all elements with any "owner" metadata
408
-
409
- Response (JSON object):
410
- - results: Array of matching elements/deployment-nodes, each with:
411
- - id: string — element/node id (FQN)
412
- - name: string — element/node name
413
- - kind: string — element/node kind
414
- - title: string — human-readable title
415
- - tags: string[] — assigned tags
416
- - metadata: Record<string, string | string[]> — all element metadata
417
- - matchedValue: string — the metadata value that matched (for reference)
418
- - includedInViews: View[] — views that include this element
419
-
420
- View (object) fields:
421
- - id: string — view identifier
422
- - title: string — view title
423
- - type: "element" | "deployment" | "dynamic"
424
-
425
- Notes:
426
- - Read-only, idempotent, no side effects.
427
- - Safe to call repeatedly.
428
- - Handles both string and array metadata values.
429
- - For array values, matches if any element in the array matches.
430
- - Returns empty array if no matches found.
431
- - Limited to 50 results to avoid overwhelming responses.
432
- - Case-sensitive for exact mode, case-insensitive for contains mode.
433
-
434
- Example response:
435
- {
436
- "results": [
437
- {
438
- "id": "shop.frontend",
439
- "name": "frontend",
440
- "kind": "container",
441
- "title": "Frontend",
442
- "tags": ["public"],
443
- "metadata": {
444
- "owner": "platform-team",
445
- "tier": "critical"
446
- },
447
- "matchedValue": "platform-team",
448
- "includedInViews": [
449
- {
450
- "id": "system-overview",
451
- "title": "System Overview",
452
- "type": "element"
453
- }
454
- ]
455
- }
456
- ]
457
- }
458
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:A().describe(`Metadata key to filter by`),value:A().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Pv.optional().default(`exact`).describe(`Matching mode`),project:yv},outputSchema:{results:M(hv.extend({matchedValue:A().describe(`The metadata value that matched`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],o=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},s=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...gv(e),matchedValue:s(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...gv(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),Iv=uv({name:`query-by-tag-pattern`,description:`
459
- Search elements by tag patterns using prefix or substring matching.
460
- Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
461
-
462
- Request:
463
- - pattern: string — tag pattern to match
464
- - matchMode: "prefix" | "contains" | "suffix" (optional, default: "prefix")
465
- - prefix: matches tags starting with the pattern (e.g., "target_asil" matches "target_asil_qm", "target_asil_asil_b")
466
- - contains: matches tags containing the pattern anywhere (e.g., "asil" matches "target_asil_qm", "unit_asil_b")
467
- - suffix: matches tags ending with the pattern (e.g., "_tbc" matches "target_asil_qm__tbc")
468
- - project: string (optional) — project id. Defaults to "default" if omitted.
469
-
470
- Response (JSON object):
471
- - results: Array of matching elements, each with:
472
- - id: string — element id (FQN)
473
- - name: string — element name
474
- - kind: string — element kind
475
- - title: string — human-readable title
476
- - tags: string[] — all assigned tags
477
- - metadata: Record<string, string | string[]> — element metadata
478
- - matchedTags: string[] — the specific tags that matched the pattern
479
- - includedInViews: View[] — views that include this element
480
- - truncated: boolean — true if results were truncated due to exceeding the 50-result limit
481
- - matchedTagValues: string[] — all unique tag values that matched the pattern across all elements
482
-
483
- View (object) fields:
484
- - id: string — view identifier
485
- - title: string — view title
486
- - type: "element" | "deployment" | "dynamic"
487
-
488
- Notes:
489
- - Read-only, idempotent, no side effects.
490
- - Safe to call repeatedly.
491
- - Pattern matching is case-insensitive.
492
- - Returns empty array if no matches found.
493
- - Limited to 50 results.
494
- - matchedTagValues provides a summary of all distinct matching tag values found.
495
-
496
- Example response:
497
- {
498
- "results": [
499
- {
500
- "id": "top.planner.behaviorNode",
501
- "name": "behaviorNode",
502
- "kind": "cgf-node",
503
- "title": "behaviorNode :dwBehaviorPlannerNode",
504
- "tags": ["is_in_dag", "target_asil_qm", "process_camera_master"],
505
- "metadata": {},
506
- "matchedTags": ["target_asil_qm"],
507
- "includedInViews": []
508
- }
509
- ],
510
- "truncated": false,
511
- "matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
512
- }
513
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:A().min(1).describe(`Tag pattern to match`),matchMode:Ur([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:yv},outputSchema:{results:M(hv.extend({matchedTags:M(A()).describe(`Tags that matched the pattern`)})),truncated:Vr().describe(`True if results were truncated`),matchedTagValues:M(A()).describe(`All unique tag values matching the pattern across all elements`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),a=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},o=[],s=!1,c=new Set;for(let e of r.elements()){let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...gv(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!el(e))continue;let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...gv(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),Lv=uv({name:`query-by-tags`,description:`
514
- Advanced tag filtering with boolean logic (AND, OR, NOT).
515
-
516
- Request:
517
- - allOf: string[] (optional) — element must have ALL these tags (AND logic)
518
- - anyOf: string[] (optional) — element must have ANY of these tags (OR logic)
519
- - noneOf: string[] (optional) — element must have NONE of these tags (NOT logic)
520
- - project: string (optional) — project id. Defaults to "default" if omitted.
521
-
522
- Boolean Logic:
523
- - All three conditions are combined with AND logic
524
- - At least one condition must be specified
525
- - Tags are case-sensitive
526
-
527
- Example Queries:
528
- - Public APIs: {"allOf": ["public", "api"]}
529
- - Deprecated or legacy: {"anyOf": ["deprecated", "legacy"]}
530
- - Public but not deprecated: {"allOf": ["public"], "noneOf": ["deprecated"]}
531
- - Critical services not in migration: {"allOf": ["critical", "service"], "noneOf": ["migration", "deprecated"]}
532
-
533
- Response (JSON object):
534
- - results: Array of matching elements/deployment-nodes, each with:
535
- - id: string — element/node id (FQN)
536
- - name: string — element/node name
537
- - kind: string — element/node kind
538
- - title: string — human-readable title
539
- - tags: string[] — assigned tags (for reference)
540
- - metadata: Record<string, string | string[]> — element metadata
541
- - includedInViews: View[] — views that include this element
542
-
543
- View (object) fields:
544
- - id: string — view identifier
545
- - title: string — view title
546
- - type: "element" | "deployment" | "dynamic"
547
-
548
- Notes:
549
- - Read-only, idempotent, no side effects.
550
- - Safe to call repeatedly.
551
- - Returns empty array if no matches found.
552
- - Limited to 50 results to avoid overwhelming responses.
553
- - Conflicting conditions (e.g., allOf and noneOf with same tag) will return no results.
554
-
555
- Example response:
556
- {
557
- "results": [
558
- {
559
- "id": "shop.api",
560
- "name": "api",
561
- "kind": "container",
562
- "title": "API Gateway",
563
- "tags": ["public", "api", "critical"],
564
- "metadata": {
565
- "owner": "platform-team"
566
- },
567
- "includedInViews": [
568
- {
569
- "id": "system-overview",
570
- "title": "System Overview",
571
- "type": "element"
572
- }
573
- ]
574
- }
575
- ]
576
- }
577
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:M(A()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:M(A()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:M(A()).optional().describe(`Element must have NONE of these tags (NOT)`),project:yv},outputSchema:{results:M(hv),truncated:Vr().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{P(t.allOf&&t.allOf.length>0||t.anyOf&&t.anyOf.length>0||t.noneOf&&t.noneOf.length>0,`At least one condition (allOf, anyOf, or noneOf) must be specified with at least one tag`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,o=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}o(e.tags)&&i.push(gv(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}el(e)&&o(e.tags)&&i.push(gv(e))}return{results:i,truncated:a}}),Rv=Ur([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),zv=uv({name:`query-graph`,description:`
578
- Query element hierarchy and relationships in the architecture graph.
579
-
580
- Request:
581
- - elementId: string — element id (FQN) to query
582
- - queryType: "ancestors" | "descendants" | "siblings" | "children" | "parent" | "incomers" | "outgoers"
583
- - includeIndirect: boolean (optional, default: true) — for incomers/outgoers, include indirect relationships (through nested elements)
584
- - project: string (optional) — project id. Defaults to "default" if omitted.
585
-
586
- Query Types:
587
- - ancestors: Returns all parent elements up to the root (hierarchical)
588
- Example: shop.frontend.auth.service returns [shop.frontend.auth, shop.frontend, shop]
589
- - descendants: Returns all child elements recursively (hierarchical)
590
- Example: shop.frontend returns all nested elements like shop.frontend.auth, shop.frontend.auth.service
591
- - siblings: Returns elements at the same hierarchy level with the same parent
592
- Example: shop.frontend returns [shop.backend, shop.database] if they're siblings
593
- - children: Returns direct child elements only (not recursive)
594
- Example: shop returns [shop.frontend, shop.backend] but not shop.frontend.auth
595
- - parent: Returns the direct parent element
596
- Example: shop.frontend.auth returns shop.frontend
597
- - incomers: Returns elements that have outgoing relationships to this element (single hop, not recursive).
598
- For recursive upstream traversal, use query-incomers-graph instead.
599
- includeIndirect=true: Includes relationships to nested children
600
- Example: Elements that depend on this element
601
- - outgoers: Returns elements that receive incoming relationships from this element (single hop, not recursive).
602
- For recursive downstream traversal, use query-outgoers-graph instead.
603
- includeIndirect=true: Includes relationships from nested children
604
- Example: Elements this element depends on
605
-
606
- Response (JSON object):
607
- - results: Array of elements (max 100), each with:
608
- - id: string — element id (FQN)
609
- - name: string — element name
610
- - kind: string — element kind
611
- - title: string — human-readable title
612
- - tags: string[] — assigned tags
613
- - metadata: Record<string, string> — element metadata
614
- - includedInViews: View[] — views that include this element
615
- - truncated: boolean — true if results were truncated due to exceeding maximum limit (100)
616
-
617
- View (object) fields:
618
- - id: string — view identifier
619
- - title: string — view title
620
- - type: "element" | "deployment" | "dynamic"
621
-
622
- Notes:
623
- - Read-only, idempotent, no side effects.
624
- - Safe to call repeatedly.
625
- - For parent query on root element, returns empty array.
626
- - For hierarchical queries (ancestors, descendants, siblings, children), includeIndirect is ignored.
627
-
628
- Example response:
629
- {
630
- "results": [
631
- {
632
- "id": "shop.frontend",
633
- "name": "frontend",
634
- "kind": "container",
635
- "title": "Frontend",
636
- "tags": ["public"],
637
- "metadata": { "owner": "web-team" },
638
- "includedInViews": [
639
- {
640
- "id": "system-overview",
641
- "title": "System Overview",
642
- "type": "element"
643
- }
644
- ]
645
- }
646
- ],
647
- "truncated": false
648
- }
649
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:A().describe(`Element id (FQN) to query`),queryType:Rv.describe(`Type of graph query`),includeIndirect:Vr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:yv},outputSchema:{results:M(hv),truncated:Vr().describe(`True if results were truncated due to exceeding maximum limit`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(gv(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(gv(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(gv(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(gv(e))}break;case`parent`:{let e=r.parent;e&&i.push(gv(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(gv(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(gv(t))}break}}return{results:i,truncated:a}}),Bv=j({elementId:A().describe(`ID of the incoming element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),Vv=uv({name:`query-incomers-graph`,description:`
650
- Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
651
-
652
- This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
653
- indirectly provide input to the target element. It returns the complete subgraph in a single response,
654
- making it much more efficient than repeated individual queries.
655
-
656
- Request:
657
- - elementId: string — target element id (FQN) to start from
658
- - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
659
- - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
660
- - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
661
- - project: string (optional) — project id. Defaults to "default" if omitted.
662
-
663
- Response Structure:
664
- {
665
- "target": "element.id",
666
- "totalNodes": number,
667
- "maxDepth": number,
668
- "truncated": boolean,
669
- "nodes": {
670
- "element.id": {
671
- "id": "element.id",
672
- "name": "name",
673
- "kind": "kind",
674
- "title": "title",
675
- "tags": ["tag1", "tag2"],
676
- "metadata": {},
677
- "includedInViews": [...],
678
- "incomers": [
679
- {
680
- "elementId": "id1",
681
- "relationshipLabel": "uses",
682
- "technology": "REST"
683
- }
684
- ],
685
- "depth": number
686
- }
687
- }
688
- }
689
-
690
- Use Cases:
691
- - Find all producers/dependencies for an element
692
- - Trace data lineage upstream
693
- - Identify root causes and dependencies
694
- - Build complete dependency trees
695
- - Answer "what feeds into this?" questions
696
-
697
- Notes:
698
- - Read-only, idempotent, no side effects
699
- - Cycle detection prevents infinite loops
700
- - Result size limited to maxNodes to prevent huge responses
701
- - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
702
-
703
- Example:
704
- For a database element, this returns all services, APIs, and components that write to it,
705
- plus all their dependencies, recursively up to maxDepth levels.
706
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Vr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:yv},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Vr().describe(`True if result was truncated due to maxNodes limit`),nodes:qr(hv.extend({incomers:M(Bv).describe(`Incoming relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=_v(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Hv=j({elementId:A().describe(`ID of the outgoing element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),Uv=uv({name:`query-outgoers-graph`,description:`
707
- Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
708
-
709
- This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
710
- indirectly consume output from the target element. It returns the complete subgraph in a single response,
711
- making it much more efficient than repeated individual queries.
712
-
713
- Request:
714
- - elementId: string — target element id (FQN) to start from
715
- - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
716
- - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
717
- - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
718
- - project: string (optional) — project id. Defaults to "default" if omitted.
719
-
720
- Response Structure:
721
- {
722
- "target": "element.id",
723
- "totalNodes": number,
724
- "maxDepth": number,
725
- "truncated": boolean,
726
- "nodes": {
727
- "element.id": {
728
- "id": "element.id",
729
- "name": "name",
730
- "kind": "kind",
731
- "title": "title",
732
- "tags": ["tag1", "tag2"],
733
- "metadata": {},
734
- "includedInViews": [...],
735
- "outgoers": [
736
- {
737
- "elementId": "id1",
738
- "relationshipLabel": "sends data to",
739
- "technology": "Kafka"
740
- }
741
- ],
742
- "depth": number
743
- }
744
- }
745
- }
746
-
747
- Use Cases:
748
- - Find all consumers/dependents of an element
749
- - Trace data lineage downstream
750
- - Assess impact of changes (blast radius)
751
- - Build complete consumer trees
752
- - Answer "what depends on this?" questions
753
-
754
- Notes:
755
- - Read-only, idempotent, no side effects
756
- - Cycle detection prevents infinite loops
757
- - Result size limited to maxNodes to prevent huge responses
758
- - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
759
-
760
- Example:
761
- For an API service, this returns all clients, services, and systems that consume its output,
762
- plus all their consumers, recursively up to maxDepth levels.
763
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Vr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:yv},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Vr().describe(`True if result was truncated due to maxNodes limit`),nodes:qr(hv.extend({outgoers:M(Hv).describe(`Outgoing relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=_v(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Wv=uv({name:`read-deployment`,description:`
764
- Read details about a deployment node or a deployed instance in a LikeC4 project.
765
-
766
- What it does:
767
- - Returns metadata about a deployment entity (node or instance), including kind, tags, color/shape, children, which views include it, and its source location.
768
-
769
- Inputs:
770
- - id: string — Deployment id (FQN)
771
- - project: string (optional, defaults to "default") — Project id
772
-
773
- Output fields:
774
- - type: "deployment-node" | "deployed-instance"
775
- - id: string — Deployment id (FQN)
776
- - kind: string — Deployment node kind, or element kind for deployed instances
777
- - name: string — Name of the deployment entity
778
- - title: string — Title of the deployment entity
779
- - description: string|null — Description text
780
- - technology: string|null — Technology info, if any
781
- - tags: string[] — Tags assigned to this entity
782
- - project: string — Project id
783
- - metadata: Record<string, string>
784
- - links: Array<{ title: string|null, url: string, relative: string|null }> — external links associated with this deployment entity
785
- - shape: string — Rendered shape
786
- - color: string — Rendered color
787
- - children: string[] — Child deployment ids (empty for instances)
788
- - includedInViews: View[] — Views that include this entity
789
- - instanceof: { id: string, title: string, kind: string } | null — If type is "deployed-instance", the referenced element
790
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
791
-
792
- View (object) fields:
793
- - id: string — view identifier
794
- - title: string — view title
795
- - type: "element" | "deployment" | "dynamic"
796
-
797
- Notes:
798
- - Read-only, idempotent; does not mutate the model.
799
-
800
- Example request:
801
- { "id": "k8s.cluster.frontend", "project": "default" }
802
-
803
- Example response (deployed instance):
804
- {
805
- "type": "deployed-instance",
806
- "id": "k8s.cluster.frontend",
807
- "kind": "k8s.pod",
808
- "name": "frontend",
809
- "title": "Frontend Pod",
810
- "description": null,
811
- "technology": "Kubernetes",
812
- "tags": ["prod"],
813
- "project": "default",
814
- "metadata": {},
815
- "links": [],
816
- "shape": "rectangle",
817
- "color": "#2F80ED",
818
- "children": [],
819
- "includedInViews": [
820
- { "id": "runtime-overview", "title": "Runtime Overview", "type": "deployment" }
821
- ],
822
- "instanceof": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
823
- "sourceLocation": {
824
- "path": "/abs/path/project/model.c4",
825
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
826
- }
827
- }
828
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:A().describe(`Deployment id (FQN)`),project:yv},outputSchema:{type:Ur([`deployment-node`,`deployed-instance`]),id:A().describe(`Deployment id (FQN)`),kind:A().describe(`Deployment node kind, or element kind for deployed instances`),name:A(),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:qr(Br([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:A(),color:A(),children:M(A()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:bv.describe(`Views that include this deployment node`),instanceof:j({id:A().describe(`Element ID (FQN)`),title:A(),kind:A()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:vv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);P(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=Sv(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:xv(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),Gv=uv({name:`read-element`,description:`
829
- Read detailed information about a LikeC4 element.
830
-
831
- Request:
832
- - id: string — element id (FQN)
833
- - project: string (optional) — project id. Defaults to "default" if omitted.
834
-
835
- Response (JSON object):
836
- - id: string — element id (FQN)
837
- - name: string — element name
838
- - kind: string — element kind
839
- - title: string — human-readable title
840
- - description: string|null — optional description
841
- - technology: string|null — optional technology
842
- - tags: string[] — assigned tags
843
- - project: string — project id this element belongs to
844
- - metadata: Record<string, string> — element metadata
845
- - links: Array<{ title: string|null, url: string, relative: string|null }> — external links associated with this element
846
- - shape: string — rendered shape
847
- - color: string — rendered color
848
- - children: string[] — ids (FQNs) of direct child elements
849
- - defaultView: string|null — default view name if set
850
- - includedInViews: View[] — views that include this element
851
- - relationships: object — relationships of this element (direct and indirect)
852
- - incoming: Array<{ source: { id: string, title: string, kind: string }, kind: string|null, target: string, title: string|null, description: string|null, technology: string|null, tags: string[] }>
853
- - outgoing: Array<{ source: string, target: { id: string, title: string, kind: string }, kind: string|null, title: string|null, description: string|null, technology: string|null, tags: string[] }>
854
- - deployedInstances: string[] — deployed instance ids (Deployment FQNs)
855
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location if available
856
-
857
- View (object) fields:
858
- - id: string — view identifier
859
- - title: string — view title
860
- - type: "element" | "deployment" | "dynamic"
861
-
862
- Notes:
863
- - Read-only, idempotent, no side effects.
864
- - Safe to call repeatedly.
865
-
866
- Example response:
867
- {
868
- "id": "shop.frontend",
869
- "name": "frontend",
870
- "kind": "container",
871
- "title": "Frontend",
872
- "description": "User-facing web app",
873
- "technology": "React",
874
- "tags": ["public"],
875
- "project": "default",
876
- "metadata": { "owner": "web" },
877
- "links": [
878
- {
879
- "title": "Documentation",
880
- "url": "https://docs.example.com/frontend",
881
- "relative": null
882
- }
883
- ],
884
- "shape": "rounded-rectangle",
885
- "color": "#2F80ED",
886
- "children": ["shop.frontend.auth"],
887
- "defaultView": "frontend-overview",
888
- "includedInViews": [
889
- {
890
- "id": "frontend-overview",
891
- "title": "Frontend Overview",
892
- "type": "element"
893
- }
894
- ],
895
- "relationships": {
896
- "incoming": [
897
- {
898
- "source": { "id": "shop.api", "title": "API", "kind": "container" },
899
- "kind": "uses",
900
- "target": "shop.frontend",
901
- "title": "Calls",
902
- "description": null,
903
- "technology": "HTTPS",
904
- "tags": []
905
- }
906
- ],
907
- "outgoing": []
908
- },
909
- "deployedInstances": ["k8s.cluster.frontend"],
910
- "sourceLocation": {
911
- "path": "/abs/path/project/model.c4",
912
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
913
- }
914
- }
915
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:A().describe(`Element id (FQN)`),project:yv},outputSchema:{id:A().describe(`Element id (FQN)`),kind:A().describe(`Element kind`),name:A().describe(`Element name`),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:qr(Br([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:A(),color:A(),children:M(A()).describe(`Children of this element (Array of FQNs)`),defaultView:A().nullable().describe(`Name of the default view of this element`),includedInViews:bv.describe(`Views that include this element`),relationships:j({incoming:M(j({source:j({id:A(),title:A(),kind:A()}).describe(`Source element of this relationship`),kind:A().nullable().describe(`Relationship kind`),target:A().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:M(j({source:A().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:j({id:A(),title:A(),kind:A()}).describe(`Target element of this relationship`),kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:M(A()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:vv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);P(r,`Element "${t.id}" not found in project "${n}"`);let i=Sv(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:xv(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),Kv=uv({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
916
- Request:
917
- - project: string (optional) — project id. Defaults to "default" if omitted.
918
-
919
- Response (JSON object):
920
- - title: string — human-readable project title
921
- - folder: string — absolute path to the project root
922
- - sources: string[] — absolute file paths of model documents
923
- - config: object — project configuration
924
- - name: string — project identifier
925
- - title?: string — human-readable title
926
- - contactPerson?: string — maintainer contact
927
- - metadata?: object — custom project metadata as key-value pairs
928
- - extends?: string | string[] — style inheritance paths
929
- - exclude?: string[] — file exclusion patterns
930
- - include?: object — include configuration (paths, maxDepth, fileThreshold)
931
- - manualLayouts?: object — manual layouts config (outDir)
932
- - styles?: object — simplified styles (hasTheme, hasDefaults, hasCustomCss)
933
- - specification: object
934
- - elementKinds: string[] — all element kinds
935
- - relationshipKinds: string[] — all relationship kinds
936
- - deploymentKinds: string[] — all deployment kinds
937
- - tags: string[] — all tags
938
- - metadataKeys: string[] — used metadata keys
939
- - elements: Element[] — list of elements
940
- - deployments: Deployment[] — list of deployment entities
941
- - views: View[] — list of views defined in the model
942
-
943
- Element (object) fields:
944
- - id: string — element id (FQN)
945
- - kind: string — element kind
946
- - title: string — element title
947
- - tags: string[] — element tags
948
-
949
- Deployment (object) fields:
950
- - type = "deployment-node": { id: string, kind: string, title: string, tags: string[] }
951
- - type = "deployed-instance": { id: string, title: string, tags: string[], referencedElementId: string }
952
-
953
- View (object) fields:
954
- - id: string — view identifier
955
- - title: string — view title
956
- - type: "element" | "deployment" | "dynamic"
957
-
958
- Notes:
959
- - Read-only, idempotent, no side effects.
960
- - Safe to call repeatedly.
961
-
962
- Example response:
963
- {
964
- "title": "Cloud Boutique",
965
- "folder": "/abs/path/to/workspace/examples/cloud-system",
966
- "sources": [
967
- "/abs/path/to/workspace/examples/cloud-system/model.c4"
968
- ],
969
- "config": {
970
- "name": "cloud-boutique",
971
- "title": "Cloud Boutique",
972
- "contactPerson": "admin@example.com"
973
- },
974
- "specification": {
975
- "elementKinds": ["system", "container", "component"],
976
- "relationshipKinds": ["uses", "depends-on"],
977
- "deploymentKinds": ["node", "cluster"],
978
- "tags": ["public", "internal"],
979
- "metadataKeys": ["owner", "tier"]
980
- },
981
- "elements": [
982
- {
983
- "id": "shop.frontend",
984
- "kind": "component",
985
- "title": "Frontend",
986
- "tags": ["public"]
987
- }
988
- ],
989
- "deployments": [
990
- {
991
- "type": "deployment-node",
992
- "id": "k8s.shop.frontend",
993
- "kind": "cluster",
994
- "title": "Frontend",
995
- "tags": []
996
- }
997
- ],
998
- "views": [
999
- {
1000
- "id": "system-overview",
1001
- "title": "System Overview",
1002
- "type": "element"
1003
- }
1004
- ]
1005
- }
1006
- `,inputSchema:{project:yv},outputSchema:{title:A(),folder:A(),sources:M(A()),config:pv.describe(`Project configuration`),specification:j({elementKinds:M(A()),relationshipKinds:M(A()),deploymentKinds:M(A()),tags:M(A()),metadataKeys:M(A())}),elements:M(j({id:A(),kind:A(),title:A(),tags:M(A())})).describe(`List of elements in the project`),deployments:M(zr(`type`,[j({type:Gr(`deployment-node`),id:A().describe(`Node ID`),kind:A().describe(`Deployment node kind`),title:A().describe(`Node title`),tags:M(A())}),j({type:Gr(`deployed-instance`),id:A().describe(`Node ID`),title:A().describe(`Node title`),tags:M(A()),referencedElementId:A().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:M(j({id:A(),title:A(),type:Ur([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:mv(r.config),specification:{elementKinds:te(i.specification.elements),relationshipKinds:te(i.specification.relationships),deploymentKinds:te(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),qv=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Jv=zr(`type`,[j({type:Gr(`element`),id:A().describe(`Node ID`),elementId:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:Gr(`deployment-node`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),kind:A().describe(`Deployment kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:Gr(`deployed-instance`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),referencedElement:j({id:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Element title`)}),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())})]),Yv=uv({name:`read-view`,description:`
1007
- Read detailed information about a LikeC4 view.
1008
-
1009
- Request:
1010
- - viewId: string — view id (name)
1011
- - project: string (optional) — project id. Defaults to "default" if omitted.
1012
-
1013
- Response (JSON object):
1014
- - id: string — view id
1015
- - type: "element" | "deployment" | "dynamic" — view type
1016
- - title: string — view title (falls back to id if not set)
1017
- - description: string|null — optional description
1018
- - tags: string[] — view tags
1019
- - project: string — project id this view belongs to
1020
- - nodes: Node[] — nodes included in the view
1021
- - edges: Edge[] — relationships between nodes
1022
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location if available
1023
-
1024
- Node (discriminated union by "type"):
1025
- - type = "element": { id: string, elementId: string, kind: string, title: string, description: string|null, technology: string|null, children: string[], shape: string, color: string, tags: string[] }
1026
- - type = "deployment-node": { id: string, deploymentId: string, kind: string, title: string, description: string|null, technology: string|null, children: string[], shape: string, color: string, tags: string[] }
1027
- - type = "deployed-instance": { id: string, deploymentId: string, title: string, description: string|null, technology: string|null, referencedElement: { id: string, kind: string, title: string }, shape: string, color: string, tags: string[] }
1028
-
1029
- Edge object:
1030
- - { source: string, target: string, label: string|null, description: string|null, technology: string|null, tags: string[] }
1031
-
1032
- Notes:
1033
- - Read-only, idempotent, no side effects.
1034
-
1035
- Example response:
1036
- {
1037
- "id": "system-overview",
1038
- "type": "element",
1039
- "title": "System Overview",
1040
- "description": null,
1041
- "tags": [],
1042
- "project": "default",
1043
- "nodes": [
1044
- { "type": "logical", "id": "n1", "elementId": "shop.frontend", "kind": "container", "title": "Frontend", "description": null, "technology": "React", "children": [], "shape": "rounded-rectangle", "color": "#2F80ED", "tags": [] }
1045
- ],
1046
- "edges": [
1047
- { "source": "n1", "target": "n2", "label": "calls", "description": null, "technology": "HTTPS", "tags": [] }
1048
- ],
1049
- "sourceLocation": {
1050
- "path": "/abs/path/project/model.c4",
1051
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
1052
- }
1053
- }
1054
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:A().describe(`View id (name)`),project:yv},outputSchema:{id:A(),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`),title:A(),description:A().nullable(),tags:M(A()),project:A(),nodes:M(Jv),edges:M(j({source:A().describe(`Source node`),target:A().describe(`Target node`),label:A().nullable(),description:A().nullable(),technology:A().nullable(),tags:M(A())})).describe(`Edge represents relationship between nodes`),sourceLocation:vv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=Sv(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>qv(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),Xv=M(zr(`type`,[j({type:Gr(`element`),project:A().describe(`Project ID`),id:A().describe(`Element ID (FQN)`),name:A().describe(`Element name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:bv,metadata:qr(Br([A(),M(A())])),tags:M(A())}),j({type:Gr(`deployment-node`),project:A().describe(`Project ID`),id:A().describe(`Deployment ID (FQN)`),name:A().describe(`Deployment name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:bv,metadata:qr(Br([A(),M(A())])),tags:M(A())})])),Zv=uv({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1055
- Search LikeC4 elements and deployment nodes across all projects.
1056
-
1057
- Query syntax (case-insensitive):
1058
- - kind:<value> filters by kind
1059
- - shape:<value> filters by shape
1060
- - meta:<key> filters by having metadata with the given key
1061
- - #<value> matches assigned tags
1062
- - <value> matches id (FQN) or title
1063
-
1064
- Request:
1065
- - search: string — at least 2 characters
1066
-
1067
- Response (JSON object):
1068
- - total: number - total number of results
1069
- - found: Result[] - returns top 20 results
1070
-
1071
- Result (discriminated union by "type"):
1072
- - type = "element": { id: string, name: string, kind: string, title: string, technology: string|null, shape: string, project: string, includedInViews: View[], tags: string[], metadata: Record<string, string> }
1073
- - type = "deployment-node": { id: string, name: string, kind: string, title: string, technology: string|null, shape: string, project: string, includedInViews: View[], tags: string[], metadata: Record<string, string> }
1074
-
1075
- View (object) fields:
1076
- - id: string — view identifier
1077
- - title: string — view title
1078
- - type: "element" | "deployment" | "dynamic"
1079
-
1080
- Notes:
1081
- - Read-only, idempotent.
1082
- - Use results as input to other tools (e.g., read-element, read-view).
1083
-
1084
- Example response:
1085
- {
1086
- "total": 1,
1087
- "found": [
1088
- {
1089
- "type": "logical",
1090
- "project": "default",
1091
- "id": "shop.frontend",
1092
- "name": "frontend",
1093
- "kind": "container",
1094
- "title": "Frontend",
1095
- "technology": "React",
1096
- "shape": "rectangle",
1097
- "includedInViews": [
1098
- {
1099
- "id": "system-overview",
1100
- "title": "System Overview",
1101
- "type": "element"
1102
- }
1103
- ],
1104
- "tags": ["public"],
1105
- "metadata": {}
1106
- }
1107
- ]
1108
- }
1109
- `,inputSchema:{search:A().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:k(),found:Xv}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),lv.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),lv.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),lv.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),lv.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(lv.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of ca(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:xv(e.views())});for(let e of ca(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:xv(e.views())})}catch(e){lv.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Qv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A().describe(`Human-readable title`),depth:k().describe(`Depth relative to the root element (1 = direct child)`),tags:M(A()).describe(`Assigned tags`),metadata:qr(Br([A(),M(A())])).describe(`Element metadata`),childCount:k().describe(`Number of direct children`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),$v=uv({name:`subgraph-summary`,description:`
1110
- Get a compact, table-friendly summary of all descendants of a parent element.
1111
- Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
1112
- Much more efficient than calling read-element for each descendant individually.
1113
-
1114
- Request:
1115
- - elementId: string — parent element id (FQN) whose descendants to summarize
1116
- - maxDepth: number (optional, default: 10, max: 20) — maximum depth of descendants to include
1117
- - metadataKeys: string[] (optional) — if provided, only include these metadata keys in the response (reduces response size)
1118
- - project: string (optional) — project id. Defaults to "default" if omitted.
1119
-
1120
- Response (JSON object):
1121
- - root: object — the root element summary
1122
- - id: string — element id
1123
- - kind: string — element kind
1124
- - title: string — element title
1125
- - childCount: number — number of direct children
1126
- - descendants: Array of descendant summaries, each with:
1127
- - id: string — element id (FQN)
1128
- - name: string — element name
1129
- - kind: string — element kind
1130
- - title: string — human-readable title
1131
- - depth: number — depth relative to root (1 = direct child)
1132
- - tags: string[] — assigned tags
1133
- - metadata: Record<string, string | string[]> — element metadata (filtered by metadataKeys if provided)
1134
- - childCount: number — number of direct children
1135
- - incomingCount: number — number of incoming relationships
1136
- - outgoingCount: number — number of outgoing relationships
1137
- - totalDescendants: number — total number of descendants (may differ from array length if truncated)
1138
- - truncated: boolean — true if results were truncated due to exceeding the 200-result limit
1139
- - truncatedByDepth: boolean — true if deeper descendants exist beyond maxDepth
1140
-
1141
- Notes:
1142
- - Read-only, idempotent, no side effects.
1143
- - Safe to call repeatedly.
1144
- - Limited to 200 descendants in the response.
1145
- - Use metadataKeys to reduce response size when you only need specific metadata.
1146
- - Descendants are returned in breadth-first order (closest to root first).
1147
- - depth=1 means direct child, depth=2 means grandchild, etc.
1148
-
1149
- Example response:
1150
- {
1151
- "root": {
1152
- "id": "top.planner",
1153
- "kind": "subsystem",
1154
- "title": "Planner Subsystem",
1155
- "childCount": 5
1156
- },
1157
- "descendants": [
1158
- {
1159
- "id": "top.planner.nodeA",
1160
- "name": "nodeA",
1161
- "kind": "cgf-node",
1162
- "title": "nodeA :dwNodeTypeA",
1163
- "depth": 1,
1164
- "tags": ["is_in_dag", "target_asil_qm"],
1165
- "metadata": { "target_asil": "QM", "safety_info_unit_asil": "QM" },
1166
- "childCount": 0,
1167
- "incomingCount": 3,
1168
- "outgoingCount": 2
1169
- }
1170
- ],
1171
- "totalDescendants": 5,
1172
- "truncated": false,
1173
- "truncatedByDepth": false
1174
- }
1175
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:A().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:k().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:M(A()).optional().describe(`If provided, only include these metadata keys in the response`),project:yv},outputSchema:{root:j({id:A(),kind:A(),title:A(),childCount:k()}),descendants:M(Qv),totalDescendants:k().describe(`Total number of descendants found`),truncated:Vr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Vr().describe(`True if deeper descendants exist beyond maxDepth`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});var ey=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new Hr({name:`LikeC4`,version:fv},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1176
-
1177
- Conventions:
1178
- - All tools are read-only and idempotent.
1179
- - "project" is optional and defaults to "default".
1180
-
1181
- Available tools:
1182
- - list-projects — List all LikeC4 projects in the workspace.
1183
- - read-project-summary — Project specification, configuration, all elements, deployment nodes and views. Input: { project? }.
1184
- - search-element — Search elements and deployment nodes across all projects by id/title/kind/shape/tags/metadata. Input: { search }.
1185
- - read-element — Full element details including relationships, includedInViews, deployedInstances, metadata and sourceLocation. Input: { id, project? }.
1186
- - read-deployment — Details of a deployment node or deployed instance. Input: { id, project? }.
1187
- - read-view — Full view details (nodes/edges) and sourceLocation. Input: { viewId, project? }.
1188
- - find-relationships — Direct and indirect relationships between two elements in a project. Input: { element1, element2, project? }.
1189
- - query-graph — Query element hierarchy (ancestors, descendants, siblings, children, parent) and relationships (incomers, outgoers). Input: { elementId, queryType, includeIndirect?, project? }.
1190
- - query-incomers-graph — Get complete graph of all upstream dependencies/producers (recursive incomers). Much more efficient than repeated query-graph calls. Input: { elementId, includeIndirect?, maxDepth?, maxNodes?, project? }.
1191
- - query-outgoers-graph — Get complete graph of all downstream consumers/dependents (recursive outgoers). Much more efficient than repeated query-graph calls. Input: { elementId, includeIndirect?, maxDepth?, maxNodes?, project? }.
1192
- - query-by-metadata — Search elements by metadata key-value pairs with exact/contains/exists matching. Input: { key, value?, matchMode?, project? }.
1193
- - query-by-tags — Advanced tag filtering with boolean logic (allOf, anyOf, noneOf). Input: { allOf?, anyOf?, noneOf?, project? }.
1194
- - find-relationship-paths — Discover all paths (chains of relationships) between two elements with BFS traversal. Input: { sourceId, targetId, maxDepth?, includeIndirect?, project? }.
1195
- - batch-read-elements — Read details of multiple elements in a single call, reducing round-trips. Input: { ids, project? }.
1196
- - query-by-tag-pattern — Search elements by tag prefix/contains/suffix patterns. Input: { pattern, matchMode?, project? }.
1197
- - element-diff — Compare two elements side-by-side showing differences in properties, tags, metadata, and relationships. Input: { element1Id, element2Id, project? }.
1198
- - subgraph-summary — Compact summary of all descendants of a parent element with metadata, tags, and relationship counts. Input: { elementId, maxDepth?, metadataKeys?, project? }.
1199
- ${t?`- open-view — Opens the LikeC4 view panel in the editor. Triggers UI; at most one preview panel at a time. Input: { viewId, project? }.`:``}
1200
-
1201
- Instructions:
1202
- - Identify the project first
1203
- - Use "search-element" to find elements by id/title/kind/shape/tags/metadata and select the project
1204
- - Use "read-project-summary" to find all elements and deployment nodes inside the project, what kinds, tags, metadata keys are available
1205
- - Use "list-projects" to list all available projects
1206
- - If response returns "sourceLocation", provide link to this location in the editor
1207
-
1208
- Full documentation: https://likec4.dev/llms-full.txt
1209
- `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...Mv(this.services.likec4.LanguageServices)),n.registerTool(...Kv(this.services.likec4.LanguageServices)),n.registerTool(...Gv(this.services.likec4.LanguageServices)),n.registerTool(...Wv(this.services.likec4.LanguageServices)),n.registerTool(...Yv(this.services.likec4.LanguageServices)),n.registerTool(...Zv(this.services.likec4.LanguageServices)),n.registerTool(...jv(this.services.likec4.LanguageServices)),n.registerTool(...zv(this.services.likec4.LanguageServices)),n.registerTool(...Vv(this.services.likec4.LanguageServices)),n.registerTool(...Uv(this.services.likec4.LanguageServices)),n.registerTool(...Fv(this.services.likec4.LanguageServices)),n.registerTool(...Lv(this.services.likec4.LanguageServices)),n.registerTool(...Ov(this.services.likec4.LanguageServices)),n.registerTool(...wv(this.services.likec4.LanguageServices)),n.registerTool(...Iv(this.services.likec4.LanguageServices)),n.registerTool(...Dv(this.services.likec4.LanguageServices)),n.registerTool(...$v(this.services.likec4.LanguageServices)),t&&n.registerTool(...Nv(this.services.likec4.LanguageServices)),n.server.onerror=e=>{K.error(U(e))},n}},ty=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(lv.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new Kr,await this._mcp.connect(this.transport),lv.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{lv.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function ny(e){let t=new br;t.use(`*`,Sr({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new xr({eventStore:new Cr({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(lv.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(lv.error(U(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function ry(e){let{factory:t,port:n}=e,r=await ny(t);return new Promise((e,t)=>{let i=Jr({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var iy=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}lv.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await ry({factory:this.services.mcp.ServerFactory,port:e}),lv.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(lv.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?lv.error(`Failed to stop MCP server`,{err:e}):lv.info(`MCP server stopped`),t()})})):(lv.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function ay(e,t=33335){lv.debug(`Creating StreamableLikeC4MCPServer`);let n=new iy(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){lv.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=U(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),lv.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function oy(e){return new ty(e)}function sy(e=`sse`){return{mcpServer:t=>e===`stdio`?oy(t):ay(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new ey(e)}}var cy=class extends Un{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!Xd(e)&&!Kd(e)&&!Af(e))return super.getDocumentation(e);try{let t=fn(e);if(t.state<on.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case Xd(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Kd(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=B.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
1210
- `)}case Af(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
1211
- `):void 0}default:return e}}catch(e){q(e)}}};function ly(e,t){return[e,t]=uy(e,t)>0?[t,e]:[e,t],dy(e.range,t.range.start)}function uy(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function dy(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function fy(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:or.newLine({allowMore:!0}),oneSpace:or.oneSpace(),noSpace:or.noSpace(),indent:or.indent({allowMore:!0}),noIndent:or.noIndent()};var py=class extends $n{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Dh,(e,t)=>{let n=Dn(e.$cstNode,`values`).filter(y).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,nf,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],y)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,$f,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Pm(e)||nf(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],y)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,Au,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(bg(e)&&fy(e.$cstNode)||Sg(e)&&bg(e.$container)&&fy(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(or.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(or.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&fy(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){Qp(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(em(e)||gh(e)||ch(e)||fh(e)||oh(e)||Tp(e)||Dp(e)||kp(e)||Cp(e)||xp(e)||kp(e)||mm(e)||Mf(e)||ap(e)||Im(e)||Xm(e)||fm(e)||vm(e)||Jf(e)||yf(e)||lf(e)||Wh(e)||Rh(e)||Hd(e)||Wd(e)||Hf(e)||Df(e)||gm(e)||Qd(e)||af(e)||Jd(e)||tp(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=fy(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!ly(o,e))&&t.cst([e]).prepend(or.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(or.newLine({allowMore:!0})):i.prepend(or.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Pf)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,Kf,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,_f)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,sf)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(Bf(e)||Jm(e)||Kh(e)||wm(e)||Em(e)||uh(e)||mh(e)||zd(e)||nm(e)||Fd(e)||Rp(e)||eh(e)||Ld(e)||Om(e)||bm(e)||Pp(e)||Bp(e)||Ip(e)||nh(e)||Mm(e)||kh(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,im,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,Sm)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,Mh,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,um,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Af,(e,t)=>{let n=sn(e.$cstNode,`kind`),r=sn(e.$cstNode,`name`);r&&n&&(uy(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,rp,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,Dp,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,kp,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,Cp,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,xp,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,Wp,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,Hp,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((ch(e)||fh(e)||vh(e)||oh(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),ih(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(hp(e)||Bm(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,Xd,(e,t)=>{let n=sn(e.$cstNode,`kind`),r=sn(e.$cstNode,`name`);r&&n&&(uy(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,Kd,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Ih,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Ph(e)||Cf(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Rh,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,Wh)?.keyword(`style`).append(X.oneSpace),this.on(e,pf)?.keyword(`style`).append(X.oneSpace),this.on(e,Zf)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,dp)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(Rm(e)||pp(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Ad,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,cg,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Od(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,xd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,eg,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),yd(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Ou(e)||Bh(e)||df(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!fy(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(Zf(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&fy(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,Kp,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,Jp,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Am,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,hf,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Ou(t)||Bh(t)||df(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,ld)?.property(`value`),t??=this.on(e,Af)?.properties(`props`),t??=this.on(e,Wp)?.properties(`project`),t??=this.on(e,Pm)?.properties(`title`,`technology`),t??=this.on(e,Rh)?.properties(`title`),t??=this.on(e,Au)?.properties(`title`),t??=this.on(e,Xd)?.properties(`title`),t??=this.on(e,Kd)?.properties(`title`),t??=this.on(e,nf)?.properties(`title`,`technology`),t??=this.on(e,im)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function my(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function hy(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=my(t,e),a=my(r,e),o=i.length>0&&a.length>0?Re(Vi(ke(i),ke(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var gy=dt(),_y=t(ft(),1);function vy(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function yy(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function by(e){let t=vy([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new Qt({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=at(T(n,b(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,_y.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&T(my(o,e.nodes),Qe(e=>e.inEdges.includes(t.id)),ee(e=>{i.mergeNode(e.id),(0,_y.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,_y.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,_y.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,_y.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,gy.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:yy(vy(u)),edges:s}}function xy(e){return e.hash=ka({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:T(e.nodes,b(e=>({id:e.id,icon:y(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:qa(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),ie(({id:e,...t})=>[e,t])),edges:T(e.edges,b(e=>({source:e.source,target:e.target,label:e.label,description:qa(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),ie(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var Sy=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},Cy=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(sa(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(ye(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),sa(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=Ta(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=wa(t,e.elements),t=T(t,ca(t=>e.explicits.has(t)&&!ha(e.final,Yi(t))),ga()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=Ta(e.explicits,t),e.final=Ta(e.final,t)),e}removeElements(e){return e.elements=Ta(e.elements,this.excluded.elements),e.explicits=Ta(e.explicits,this.excluded.elements),e.final=Ta(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=Ta(n,e.explicits),e.final=Ta(e.final,n),e)}precommit(e){return e}postcommit(e){return P(Ta(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(Ta(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Lc(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},wy=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return zc([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(sa(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(sa(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(sa(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=at(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(zc([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=Ca(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=wa(e.elements,Ca(e.explicits,this.explicits)),e.final=wa(e.elements,Ca(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function Ty(e,t=`final`){let n=ia(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new E.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new E.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(kc.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var Ey=class extends Cy{};function Dy(e){if(H.isCustom(e))return Dy(e.custom.expr);if(H.isWhere(e)){let t=Dy(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n(e)}if(H.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(H.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(H.isWildcard(e))return()=>!0;if(H.isModelRef(e)){let t=B.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||Gi(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function Oy(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!_(o);T(n,S(me(Xa)),S(t),ee(t=>{t.shape=r??t.shape,t.color=i??t.color,_e(a)&&(t.icon=a),_e(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function ky(e,t){for(let n of e)!xo(n)||n.targets.length===0||Oy(n,Pe(n.targets.map(Dy)),t);return t}var Ay=class e{static kind=Ya;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},jy=class extends Cy{excludeRelations(e){return T(this.memory.connections,S(t=>Oa(t.relations,e)),ee(t=>{this.excludeConnections(t.update(wa(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=Ta(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=Ta(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},My=class extends jy{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:Ny,findConnectionsBetween:Py}=Xc;var Fy=class extends wy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!sa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Ny(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Py(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Py(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(Py(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return so.isRelationExpr(this.expression)||T(e,ee(({source:e,target:t,boundary:n})=>{T(et([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),$e(([e,t])=>e===t),Ee(1),ee(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=Ta(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},Iy=class extends Fy{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=Ta(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},Ly=class e extends Sy{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new Fy(this,e)}stageExclude(e){return new jy(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},Ry=class e extends Ly{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=vt.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new Ay(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new Ay(r,n,null));let a=vt.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new Iy(this,e)}stageExclude(e){return new My(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new Ly(t,this.scope)}};function zy(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function By(e){let{id:t,title:n,...r}=ge(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return z({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:za(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...r})}function Vy({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:Ya,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:z({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(ta).forEach(({id:e,...t})=>{let n=Gi(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=Gi(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,zy(o,r)),o.children.push(e),a=o.level+1);let c=z({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function Hy(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...Te(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function Uy(e,t){let n=T(e,qe((e,t)=>(y(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),y(t.description)&&!e.description.some(le(t.description))&&e.description.push(t.description),y(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),y(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),y(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),y(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),y(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),y(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),y(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=he(n.title)??(n.title.length>1?`[...]`:void 0),i=we(n.tags),a=z({title:r,description:he(n.description),technology:he(n.technology),kind:he(n.kind),head:he(n.head),tail:he(n.tail),color:he(n.color),line:he(n.line),navigateTo:he(n.navigateTo),...Ui(i)&&{tags:i}});if(t){let e=Hy(t);a=ot({...a,...e},y)}return v(a.title)&&y(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:Wy,findConnectionsBetween:Gy,findConnectionsWithin:Ky}=Kc;function qy(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function Jy(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function Yy(e){if(V.isWildcard(e))return()=>!0;if(V.isElementTagExpr(e)||V.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(V.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>Gi(e.id)===t:e=>e.id===t}if(V.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?Gi(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function Xy(e){return za(e.$instance)??za(e.element.$element)}function Zy(e){let t=e.id,n=e.onlyOneInstance();return z({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:C(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:za(e.$node)??void 0,tags:[...e.tags],style:ge(e.style,[`icon`,`shape`,`color`])})}function Qy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return z({id:e.id,kind:`instance`,title:e.title,description:Xy(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:C(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function $y(e){return e.isInstance()?Qy(e):Zy(e)}function eb(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(C(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Uy(n.map(e=>e.$relationship)),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function tb(e,t){let n=Vy(e.$styles,[...t.final].map($y));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=Xy(r)??null,t.technology??=r.technology,_(t.tags)&&(t.tags=[...r.tags]),(!t.links||_(t.links))&&C(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function nb(e,t){for(let n of e)!xo(n)||n.targets.length===0||Oy(n,Pe(n.targets.map(Yy)),t);return t}function rb(e){let t=new E.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new E.default(()=>new Set);for(let[e,r]of t)C(r,2)&&T(r,w(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),be(x(`group`)),Xe(),S(C(2)),ee(rt(b(x(`conn`)),Fc(`desc`),$e((e,t,n)=>t===0||e.boundary===n[t-1].boundary),ee(t=>{n.get(t).add(e)}))));return n}function ib(e){e=zc(e);let t=rb(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=wa(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=Ca(wa(n.relations.model,e.internalModelRelationships()),wa(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return T(t.entries(),ma(([e,t])=>e.update({model:t,deployment:null})),L())}function ab(e){return Bc(e,ib(e))}function ob(e){return T(e,zc,qe((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=_c.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=Wy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)Mc(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new jc(r,i,o)),t},[]))}function sb(e){return Bc(e,ob(e))}var cb=class extends wy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!sa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Wy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Gy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Gy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(Gy(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=T(e,ab,sb);return T(t,ee(({source:e,target:t,boundary:n})=>{T(et([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),$e(([e,t])=>e===t),Ee(1),ee(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},lb=class e extends Sy{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new cb(this,e)}stageExclude(e){return new Ey(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&le(this.state,t.state)}diff(e){return{added:{elements:L(Ta(e.elements,this.elements)),explicits:L(Ta(e.explicits,this.explicits)),final:L(Ta(e.final,this.final)),connections:L(Bc(e.connections,this.connections))},removed:{elements:L(Ta(this.elements,e.elements)),explicits:L(Ta(this.explicits,e.explicits)),final:L(Ta(this.final,e.final)),connections:Bc(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
1212
- `)}[Ac](e,t,n){return this.toString()}};const ub={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return Sb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return Sb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},db={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=Tb(Gy(e,[...Ab(e)],`directed`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=qy(t,e.incoming);for(let e of a){let t=Tb(Gy(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.incoming)||V.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.incoming))return Cb(pb(t,e.incoming),{stage:r,memory:n},i);if(V.isWildcard(e.incoming))return r;let a=fb(qy(t,e.incoming)),o=T(n.connections,S(a),Tb(i));return r.excludeConnections(o),r}};function fb(e){return Pe(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function pb(e,t){let n=Jy(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const mb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of Ab(e)){let n=Tb(Wy(t,e,`directed`),i);r.addConnections(n)}return r}P(V.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=qy(t,e.outgoing);for(let e of o){let t=Tb(Gy(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.outgoing)||V.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.outgoing))return Cb(gb(t,e.outgoing),{stage:r,memory:n},i);if(V.isWildcard(e.outgoing))return r;let a=hb(qy(t,e.outgoing)),o=T(n.connections,S(a),Tb(i));return r.excludeConnections(o),r}};function hb(e){return Pe(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function gb(e,t){let n=Jy(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const _b={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(V.isElementTagExpr(e)||V.isElementKindExpr(e)||V.isElementTagExpr(t)||V.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!V.isModelRef(e),`Invalid source model ref in direct relation`),P(!V.isModelRef(t),`Invalid target model ref in direct relation`);let o=V.isWildcard(e),s=V.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=T(Ky(r.instances()),Tb(a),b(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=qy(r,e),i=hb(t),o=i;if(n){let e=fb(t);o=t=>i(t)!==e(t)}l=T(t,w(e=>Gy(e,Ab(e),c)),S(o),Tb(a));break}case o&&!s:{let e=qy(r,t),i=fb(e),o=i;if(n){let t=hb(e);o=e=>t(e)!==i(e)}l=T(e,w(e=>[...Ab(e)].flatMap(t=>Wy(t,e,c))),S(o),Tb(a));break}default:{P(!o,`Inference failed - source should be a deployment ref`),P(!s,`Inference failed - target should be a deployment ref`);let n=qy(r,e),i=qy(r,t),u=hb(n),d=fb(i);l=T(n,w(e=>Gy(e,i,c)),S(e=>u(e)&&d(e)),Tb(a))}}return i.addConnections(l),V.isDeploymentRef(e)&&st(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),V.isDeploymentRef(t)&&st(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=Yy(e.target),o=Yy(e.source),s;switch(!0){case V.isWildcard(e.source)&&V.isWildcard(e.target):return r.excludeConnections(Tb(n.connections,i)),r;case V.isModelRef(e.source)&&V.isModelRef(e.target):return s=vb({source:e.source,target:e.target,expr:e,model:t}),Cb(s,{stage:r,memory:n},i);case V.isModelRef(e.source)&&V.isWildcard(e.target):return s=gb(t,e.source),Cb(s,{stage:r,memory:n},i);case V.isModelRef(e.source):return s=gb(t,e.source),Cb(s,{stage:r,memory:n},i,e=>a(e.target));case V.isModelRef(e.target):return s=pb(t,e.target),Cb(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=T(n.connections,S(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),Tb(i));return c.length===0||r.excludeConnections(c),r}}};function vb({source:e,target:t,expr:n,model:r}){let i=Jy(r,e),a=Jy(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...Qc(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const yb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.inout)){for(let e of a){let t=Db(Gy(e,[...Ab(e)],`both`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=qy(t,e.inout);for(let e of a){let t=Db(Gy(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.inout)||V.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.inout)){let a=Jy(t,e.inout);return a.length===0?r:Cb(Ca(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(V.isWildcard(e.inout))return r;let a=qy(t,e.inout),o=fb(a),s=hb(a),c=T(n.connections,S(e=>o(e)!==s(e)),Tb(i));return r.excludeConnections(c),r}},bb={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return Sb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return Sb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},xb={include:({model:e,stage:t,where:n})=>{let r=[],i=T([...e.roots()],Eb(n),b(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(Ky([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=T([...t.elements],Eb(n));return e.exclude(r),e}};function Sb(e,{expr:t,where:n,...r}){switch(!0){case V.isElementTagExpr(t):case V.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case io.isCustom(t):case V.isCustom(t):case V.isModelRef(t):return;case V.isWhere(t):return ub[e]({...r,expr:t,where:n});case io.isWhere(t):return bb[e]({...r,expr:t,where:n});case V.isDeploymentRef(t):return jb[e]({...r,expr:t,where:n});case V.isWildcard(t):return xb[e]({...r,expr:t,where:n});case io.isDirect(t):return _b[e]({...r,expr:t,where:n});case io.isInOut(t):return yb[e]({...r,expr:t,where:n});case io.isOutgoing(t):return mb[e]({...r,expr:t,where:n});case io.isIncoming(t):return db[e]({...r,expr:t,where:n});default:F(t)}}function Cb(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=T(n.connections,S(e=>i(e)),S(t=>Oa(t.relations.model,e)),b(t=>t.update({deployment:null,model:wa(t.relations.model,e)})),Tb(r),S(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function wb(e,t){return Tb(e,t).nonEmpty()}function Tb(...e){if(e.length===1)return t=>Tb(t,e[0]);let[t,n]=e;return n===null?t:se(t)?t.map(e=>Tb(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(kb(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(kb(t)(e))))})}function Eb(...e){if(e.length===1)return t=>Eb(t,e[0]);let[t,n]=e;return se(t)?t.filter(e=>Eb(e,n)):n?.(Ob(t,t))??!0}function Db(e,t){return t?T(e,S(e=>wb(e,t))):e}function Ob(e,t){if(il(e)){let n=nl(t)&&tl(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]],metadata:e.metadata}}if(rl(e))return Te(e.element,[`tags`,`kind`,`metadata`]);if(tl(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags],metadata:e.metadata};if(el(e))return Te(e,[`tags`,`kind`,`metadata`]);F(e)}function kb(e){return t=>({tags:t.tags,kind:t.kind,metadata:t.metadata,source:Ob(t.source,e.source),target:Ob(t.target,e.target)})}function Ab(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const jb={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(tl(r))return Eb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:Nb(r,e);break;case t.selector===`children`:Mb(r,e);break;case t.selector===`descendants`:Pb(r,e);break;default:Eb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=Yy(e),a=T([...n.elements],S(i),Eb(r));return t.exclude(a),t}};function Mb(e,{stage:t,where:n}){let r=Eb([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(Ky(r)),t.connectWithExisting(r),t.addExplicit(r))}function Nb(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=Eb([...e.children()],r),a=!1;for(let e of i)if(Gy(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(Ky(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function Pb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),Eb(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(Ky(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=Fb(t);T(i,S(e=>a.has(e)),ee(e=>t.addExplicit(e)))}function Fb(e){return T(e.mergedConnections(),ab,sb,qe((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Ib=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=T(e.connections,ab,sb),n=Bc(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=Ca(this.memory.elements,e.elements),n=Ca(e.final,this.memory.explicits),r=new E.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return T(Ta(t,i),ca(e=>e.isDeploymentNode()),L(),na,ee(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&ha(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=Ty(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=he([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=he(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function Lb(e,t){let n=lb.empty();for(let r of t)if(bo(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=Sb(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return Ib.for(n).commit()}function Rb(e,{docUri:t,rules:n,...r}){let i=Lb(e.deployment,n),a=tb(e,i),o=eb(i.connections);hy(a,o);let s=by({nodes:a,edges:o}),c=nb(n,s.nodes),l=Ze(n,Oo),u=Vo(c);return xy({...r,[Ha]:`computed`,[Ua]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:b(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function zb(e){return t=>Mo(t)?t.groupRules.flatMap(zb(e)):bo(t)&&`include`in t?t.include.filter(e):[]}function Bb(e,t){let n=e.flatMap(zb(H.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=it(t,v),p=z({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!ve(p),h=!ve(f),g=Dy(e);r.forEach((e,t)=>{Xa(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function Vb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.predicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Hb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.dynamicPredicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Ub(e,t){let n=new Set;for(let r of t)if(bo(r))for(let t of r.include){let r=Dy(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const Wb=e=>{if(Ao(e)){let t=[],n=[];for(let r of e.__parallel)if(jo(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return jo(e)?[...e.__series]:e};function Gb(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of w(t,Wb)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function Kb(e,t,n){let r=Zc(e,t,`directed`).flatMap(e=>[...e.relations]).sort(Sa);if(!Ui(r))return{};if(r.length===1){let e=r[0];return z({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=T(r,w(e=>e.tags),we()),a=C(i,1)?i:void 0,o=b(r,e=>e.id),s=We(r).$relationship.navigateTo;s===n&&(s=void 0),s||=T(r,w(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),we(),he());let c=T(r,qe((e,{title:t,technology:n,$relationship:r})=>(y(t)&&e.title.add(t),y(r.color)&&e.color.add(r.color),y(r.line)&&e.line.add(r.line),y(r.kind)&&e.kind.add(r.kind),y(n)&&e.technology.add(n),y(r.description)&&!e.description.some(le(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return z({tags:a??void 0,relations:o,navigateTo:s,kind:he([...c.kind]),title:he([...c.title]),color:he([...c.color]),line:he([...c.line]),technology:he([...c.technology]),description:he(c.description)})}var qb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=Hb(t,this.model.globals),a=Ub(this.model,i),o=Gb(this.model,n),s=T(Ca(wa(a,o),o,a),L(),ia),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(jo(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?to(n,t):to(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),ee=s.indexOf(g);P(ee>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:te,relations:ne,navigateTo:re,...ie}=Kb(m,g,this.view.id),ae=y(d)&&d!==this.view.id?d:re,oe=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(z({...ie,...p,...oe&&{technology:oe},id:r,source:m,target:g,navigateTo:ae,title:o??te,relations:ne??[],isBackward:h>ee})),t+1},u=1;for(let e of n){if(Ao(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=Vy(this.model.$styles,s.map(By)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:Qi(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=Gi(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of $i(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of $i(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=Bb(i,ky(i,s.map(e=>N(d.get(e.id))))),h=Ze(i,Oo),g=Vo(m);return xy({...r,[Ua]:`dynamic`,[Ha]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:b(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function Jb(e,t){return new qb(e,t).compute()}function Yb(e){switch(!0){case oo.isCustom(e):return Yb(e.customRelation.expr);case oo.isWhere(e):{let t=Yb(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind,metadata:e.source.metadata},target:{tags:e.target.tags,kind:e.target.kind,metadata:e.target.metadata},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind},...e.metadata&&{metadata:e.metadata}})}case oo.isDirect(e):{let t=Dy(e.source),n=Dy(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case oo.isInOut(e):{let t=Dy(e.inout);return e=>t(e.source)||t(e.target)}case oo.isIncoming(e):{let t=Dy(e.incoming);return e=>t(e.target)}case oo.isOutgoing(e):{let t=Dy(e.outgoing);return e=>t(e.source)}default:F(e)}}function Xb(e,t,n){let r=e.flatMap(zb(oo.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:Ka(a)}:{},c=o?{notes:Ka(o)}:{},l=it(s,v),u=Yb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...Te(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function Zb(e){return T([...e],zc,qe((e,t,n,r)=>{let i=Rc(r,t),a=Ca(...i.map(x(`relations`))),o=wa(t.relations,a);if(i.length>0&&(o=Ca(o,t.directRelations)),Nc(r,t.reversed())&&(o=Ca(o,t.directRelations)),o.size<t.relations.size){let e=r.some(Wc(t.source)),n=r.some(Wc(t.target));e&&(o=Ca(o,ga(ca(t.relations,Hc(t.source))))),n&&(o=Ca(o,ga(ca(t.relations,Uc(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var Qb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=Zb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=Ca(this.memory.elements,e.elements),n=Ca(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return T(Ta(t,r),L(),na,ee(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&ha(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=Ty(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=he([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=he(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:$b,findConnectionsBetween:ex,findConnectionsWithin:tx}=Xc;function nx(e,t){switch(!0){case H.isElementKindExpr(t):return[...ca(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case H.isElementTagExpr(t):return[...ca(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(B.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(B.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case H.isModelRef(t):return[e.element(B.flatten(t.ref))];default:F(t)}}function rx(e,t){if(t.isEmpty()||e.length===0)return e;let n=Pe(e.map(e=>Yi(e))),r=L(ca(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function ix(e,{memory:t,model:n}){let r=nx(n,e);return H.isModelRef(e)?e.selector===`descendants`?r:rx(r,t):r}const ax={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(B.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(tx(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(nx(t,e));return n.exclude(i),n}},ox={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(nx(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(tx(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(nx(t,e));return n.exclude(i),n}},sx={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(nx(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(tx(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(nx(t,e));return n.exclude(i),n}},cx=()=>!0,lx=e=>e;function ux(e){return e.reduce((e,t)=>{let n=[...t.relations];P(C(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Uy(n.map(e=>e.$relationship),he(S(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function dx(e,t){return Vy(e.$styles,[...t.final].map(By),t.groups)}const fx=H.isWildcard,px=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),mx={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=fx(e),l=fx(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==cx:{let e=T(i.relationships(),ca(o),L(),b(e=>new Gc(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==cx:u.push(...tx(r.elements));break;case c&&l:u.push(...tx(i.roots()));break;case!c&&l&&o!==cx:{let t=T(nx(i,e),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ca(o),_a(),L(),at(t=>t.source===e),([t,n])=>Ae(T(t,S(t=>!px(e,t.target)),b(t=>new Gc(e,t.target,new Set([t])))),T(n,S(t=>!px(e,t.source)),b(t=>new Gc(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=hx(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...ex(e,a,o));break}case c&&!l&&o!==cx:{let e=T(nx(i,t),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ca(o),L(),at(t=>t.target===e),([t,n])=>Ae(T(n,S(t=>!px(e,t.target)),b(t=>new Gc(e,t.target,new Set([t])))),T(t,S(t=>!px(e,t.source)),b(t=>new Gc(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=hx(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...ex(t,e,o));break}default:{P(!fx(e),`Inference failed - source must be not a wildcard`),P(!fx(t),`Inference failed - target must be not a wildcard`);let a=ix(e,{memory:r,model:i}),o=ix(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...ex(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=fx(e),c=fx(t),l;switch(!0){case s&&c:l=T(i.connections,w(rt(x(`relations`),ca(o),L())),ga());break;case!s&&c:l=T(nx(r,e),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ca(o),L())),ga());break;case s&&!c:l=T(nx(r,t),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ca(o),L())),ga());break;default:{P(!fx(e),`Inference failed - source must be not a wildcard`),P(!fx(t),`Inference failed - target must be not a wildcard`);let i=nx(r,e),a=nx(r,t),s=new Set;for(let e of i)for(let t of a)Ji(e,t)||(s=Ca(s,wa(e.allOutgoing,t.allIncoming),n?wa(t.allOutgoing,e.allIncoming):new Set));l=ga(ca(s,o))}}return a.excludeRelations(l),a}};function hx(e,{memory:t,model:n}){let r=nx(n,e);if(!C(r,1))return[[],[]];if(H.isModelRef(e)){let i=L(n.element(B.flatten(e.ref)).ascendingSiblings());return[rx(r,t),rx(i,t)]}return[r,T(r,b(e=>e.ascendingSiblings()),ua(),_a(),L(),e=>rx(e,t))]}const gx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(H.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...$b(e,t,`directed`))}else{let e=ix(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...we(e.flatMap(e=>[...e.ascendingSiblings()])));let i=_x(n,o);for(let n of t)s.push(...ex(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=nx(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function _x(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Dy(t);return t=>e(t.target)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Pe([...e.children(n)].map(e=>kc.isIncoming(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Pe([kc.isInside(n),...[...e.children(n)].map(e=>kc.isIncoming(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Pe([kc.isIncoming(e),kc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return kc.isIncoming(e)}default:F(t)}}const vx={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(H.isWildcard(e)){if(!t)return;o.push(...ex(t,t.ascendingSiblings()))}else{let t=ix(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=we(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...ex(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=nx(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(ga(a.filter(i))),r}},yx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(H.isWildcard(o)){if(!t)return;s.push(...ex(t,t.ascendingSiblings(),`directed`))}else{let e=ix(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...we(e.flatMap(e=>[...e.ascendingSiblings()])));let i=bx(n,o);for(let n of e)s.push(...ex(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=nx(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(ga(a.filter(i))),r}};function bx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Dy(t);return t=>e(t.source)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Pe([...e.children(n)].map(e=>kc.isOutgoing(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Pe([kc.isInside(n),...[...e.children(n)].map(e=>kc.isOutgoing(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Pe([kc.isOutgoing(e),kc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return kc.isOutgoing(e)}default:F(t)}}const xx={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=at(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(tx(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(ca(e.children(),i)),s=o.length>0;if(!s)if(a){if(ex(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=ga([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(ex(e,o,`directed`));s&&(n.addConnections(tx(o)),n.addExplicit(o));for(let e of o)n.addConnections(ex(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===cx?e?(n.exclude([e,...e.descendants()]),n):Ly.empty(t.scope).stageExclude(n.expression):(n.exclude(S([...t.elements],r)),n)};function Sx(e,t,n){switch(!0){case H.isCustom(e):return t===`include`?Sx(e.custom.expr,t,n):n.stage;case H.isWhere(e):{let r=vo(e.where.condition),i=e=>S(e,r);return Sx(e.where.expr,t,{...n,where:r,filterWhere:i})}case H.isModelRef(e)&&e.selector===`expanded`:return ax[t]({...n,expr:e})??n.stage;case H.isWildcard(e):return xx[t]({...n,expr:e})??n.stage;case H.isElementKindExpr(e):case H.isElementTagExpr(e):return ox[t]({...n,expr:e})??n.stage;case H.isModelRef(e):return sx[t]({...n,expr:e})??n.stage;default:F(e)}}function Cx(e,t,n){switch(!0){case oo.isCustom(e):return t===`include`?Cx(e.customRelation.expr,t,n):n.stage;case oo.isWhere(e):{let r=vo(e.where.condition),i=e=>new Set(S([...e],r)),a=e=>T(e,b(e=>new Gc(e.source,e.target,i(e.relations))),S(e=>e.nonEmpty()));return Cx(e.where.expr,t,{...n,where:r,filterWhere:a})}case oo.isInOut(e):return vx[t]({...n,expr:e})??n.stage;case oo.isDirect(e):return mx[t]({...n,expr:e})??n.stage;case oo.isOutgoing(e):return yx[t]({...n,expr:e})??n.stage;case oo.isIncoming(e):return gx[t]({...n,expr:e})??n.stage;default:F(e)}}function wx(e,t,n){let r={model:e,scope:t.scope,where:cx,filterWhere:lx};for(let i of n){if(Mo(i)){t=wx(e,Ry.enter(t,i),i.groupRules),P(t instanceof Ry,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(bo(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case so.isFqnExpr(i):n=Sx(i,e,{...r,stage:n,memory:t})??n;break;case so.isRelationExpr(i):n=Cx(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function Tx(e,t,n){return t=wx(e,t,n),Qb.for(t).commit()}function Ex(e,{docUri:t,rules:n,...r}){let i=Vb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=Tx(e,Ly.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=Ox(o);let s=dx(e,o),c=ux(o.connections);hy(s,c);let l=by({nodes:s,edges:c}),u=Bb(i,ky(i,l.nodes)),d=Ze(i,Oo),f=Vo(u),p=Dx(i,u);return xy({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:Xb(i,u,l.edges),nodes:b(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function Dx(e,t){let n=[];for(let r of e){if(!No(r)||r.targets.length===0)continue;let e=T(t,S(Pe(r.targets.map(Dy))),b(e=>e.id));C(e,1)&&n.push({type:r.rank,nodes:e})}return n}function Ox(e){if(e.groups.length===0)return e;let t=new E.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(T(ia([...e.explicitFirstSeenIn.keys()]),ee(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),T(ia([...e.lastSeenIn.keys()]),S(e=>!n.has(e)),ee(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function kx(e,t){switch(!0){case So(e):return Ex(t,e);case wo(e):return Rb(t,e);case To(e):return Jb(t,e);default:F(e)}}function Ax(e,t){try{return{isSuccess:!0,view:kx(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function jx(e){let t=new Qt({type:`directed`}),n=[];for(let r of Xe(e))t.addNode(r.id,{view:r}),Co(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,_y.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,gy.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!Co(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!So(i))return e;let a=we([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:Ui(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const Mx=e=>te(e).length,Nx=e=>Aa(e);function Px(e){let t=Fx(e),n=(e,t)=>`${e}->${t}`,r=new E.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!_(t.$data.imports))for(let[e,n]of Ke(t.$data.imports))for(let r of n){let n=Qa(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(C(i,1),`Relationships set must have at least one relationship`);let a={id:Aa(e),source:Nx(t),target:Nx(n),projectId:t,relations:b(i,x(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:we(w(i,x(`tags`)))},o=he(i);return o&&(a.label=o.title,a.description=za(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});hy(t,o);let s=by({nodes:t,edges:o});return{id:`projects-view`,[Ua]:`projects`,[Ha]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function Fx(e){let t=new Map;for(let n of e){let e=Ga(n.projectId),r={id:Nx(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${Mx(n.$data.elements)}`,`Relationships: ${Mx(n.$data.relations)}`,`Views: ${Mx(n.$data.views)}`].join(`
1213
- `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function Ix(e,t){return{...Ex(e,{id:Za(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}ir();const Lx=K.getChild(`LanguageServices`),Rx=e=>e.severity===Pn.Error;var zx=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof sv?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=T(this.services.shared.workspace.LangiumDocuments.groupedByProject(),Ke(),b(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:b(n,x(`uri`)),config:a}}));if(C(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(C(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=b(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),x(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return Oc.create({...r.$data,_stage:`layouted`,views:T(i,b(x(`diagram`)),ue(x(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Oc.EMPTY){Lx.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!C(n,1))throw Error(`No models found`);let r=Px(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return T(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),w(e=>T(e.diagnostics??[],S(Rx),b(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,n=this.services.lsp.Formatter,r=Bx(e),i=this.collectDocumentsToFormat(t,e);i.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let a=new Map;for(let e of i){let t=e.uri.toString(),i=await n.formatDocument(e,{options:r,textDocument:{uri:t}}),o=i.length===0?e.textDocument.getText():qn.applyEdits(e.textDocument,i);a.set(t,o)}return a}collectDocumentsToFormat(e,t){let n=t?.projectIds??[],r=t?.documentUris??[],i=new Map;if(n.length>0)for(let t of n)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);else if(r.length===0)for(let t of this.projectsManager.all)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);for(let t of r){if(i.has(t))continue;let n;try{n=e.getDocument(_n.parse(t))}catch{Lx.warn(`format: skipping unknown document ${t}`);continue}if(!Ng(n)){Lx.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Lx.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){Lx.error(U(e))}finally{Lx.debug(`LikeC4LanguageServices disposed`)}}};function Bx(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var Vx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(Ng(e))return e.state<on.Linked&&(K.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,e.uri,n),K.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=jg.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=j_(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};ir();const Hx=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function Ux(e,t){return an(t.feature)&&t.property===`project`&&Wp(e.node)}var Wx=class extends Cn{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Sn(t.feature):return this.completionForKeyword(e,t.feature,n);case jn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case Ux(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:Kn.Snippet,insertTextFormat:nr.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&gn(e.node,vm):n(e,{label:t.value,detail:`Insert deployment view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
1214
- `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1|${Mi.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
1215
- `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
1216
- `)});break;case t.value===`dynamic`&&gn(e.node,vm):n(e,{label:t.value,detail:`Insert dynamic view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
1217
- `)});break;case t.value===`style`&&e.node&&gn(e.node,Dp):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${Hx}|} $0\n}`});break;case t.value===`style`&&e.node&&gn(e.node,Pe([vm,kp])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${Hx}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} {\n\t\${1|${Hx}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:`extend $1 {
1218
- $0
1219
- }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:Kn.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:nr.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=_(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:Kn.Folder,insertText:n,filterText:n,textEdit:Hn.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},Gx=er(),Kx=class extends Yn{createDocumentHighlight(e){return Gx.DocumentHighlight.create(e.segment.range,Gx.DocumentHighlightKind.Read)}},qx=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!Ng(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:ar(e.parseResult.value).filter(im).map(t=>{try{let n=sn(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Fr(r))return{range:n,target:r}}catch(e){q(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Fr(t)||Nr(t))return t;if(jr(t))return Or(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Or(n.toString(),t)}relativeLink(e,t){if(Nr(t))return Mr(t);if(jr(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Mr(kr(new URL(t,r).toString(),n))}return null}};ir();const Jx=K.getChild(`DocumentSymbolProvider`);var Yx=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!Ng(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<on.Linked&&(Jx.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,e.uri,n),Jx.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return q(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(y);return n.length===0?[]:[{kind:zn.Namespace,name:`icons`,range:t.range,selectionRange:vr(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=sn(t,`name`);if(!n)return[];let r=T([...e.elements,...e.tags,...e.relationships],b(e=>{try{if(ch(e)||fh(e)||oh(e))return this.getKindSymbol(e);if(vh(e))return this.getTagSymbol(e)}catch(e){return q(e),null}F(e)}),S(y));return r.length===0?[]:[{kind:zn.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=sn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>sp(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=sn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(rp(e))return this.getExtendElementSymbol(e);if(Af(e))return this.getElementSymbol(e)}catch(e){q(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:Zg(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=sn(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=sn(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||_(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||_(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||_(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?sn(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(Xd(e))return this.getDeploymentNodeSymbol(e);if(Kd(e))return this.getDeployedInstanceSymbol(e);if($f(e))return[]}catch(e){q(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=fn(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Xx=`
1220
- ---
1221
- `;var Zx=class extends In{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(Ch(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Pf(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(ef(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Km(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(Af(e))return this.getElementHover(e);if(Xd(e))return this.getDeploymentNodeHover(e);if(Kd(e))return this.getDeployedInstanceHover(e)}catch(e){K.debug(U(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=za(n);i&&r.push(``,(i.md??i.txt).split(`
1222
- `).join(`
1223
- `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
1224
- <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
1225
- `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Xx,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=_n.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(Xx,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(st);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:Xx,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
1226
- `):void 0}getDeploymentNodeHover(e){let t=fn(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=za(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
1227
- `)}}}getDeployedInstanceHover(e){let t=fn(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=B.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${B.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
1228
- `)}}}},Qx=sr(),$x=class{getCodeActions(e,t){}};ir();const eS=K.getChild(`SemanticTokenProvider`),tS={...pr},nS={...Xn};function rS(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in nS)return t.push(nS[i]),n;if(i in tS)return()=>e(tS[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const iS=`Stop Highlighting`,aS=()=>{throw iS};var oS=class extends cr{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(Km,e=>{e.property(`name`).function()}),e(Wi(Pm,Am,nf),e=>{e.property(`kind`).function()}),e(Xp,e=>{e.property(`name`).definition.function(),aS()}),e(Wi(Sm,Wm),e=>{e.property(`value`).readonly.definition.interface()}),e(vg,e=>{e.cst().readonly.definition.variable(),aS()}),e(yp,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Th,e=>{e.cst().type()}),e(Hm,e=>{e.cst().function()}),e(ig,e=>{y(e.node.value?.$refText)&&e.property(`value`).function()}),e(Wi(Qh,og,fg),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),e(Wi(ng,Xh,gg,ig),e=>{y(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Wi(ug,mg,fg),e=>{e.property(`participant`).keyword()}),e(If,e=>{y(e.node.kind)&&e.property(`kind`).definition.type()}),e(Wi(kp,Dp),e=>{e.property(`id`).readonly.definition.variable()}),e(Ih,e=>{e.property(`style`).readonly.definition.variable()}),e(Wi(Cp,xp),e=>{e.property(`name`).readonly.definition.variable()}),e(Ph,e=>{e.property(`predicate`).readonly.definition.variable()}),e(Wf,e=>{y(e.node.tag)&&e.property(`tag`).definition.type()}),e(Wi(_p,Sh),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),e(bh,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),e(ih,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(vh,e=>{y(e.node.color)&&e.keyword(`color`).property()}),e(Wi(ch,fh,oh),e=>{e.property(`kind`).readonly.declaration.type()}),e(Ch,e=>{e.property(`name`).definition.type()}),e(Om,e=>{e.property(`value`).number()}),e(Rp,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(im,e=>{y(e.node.value)&&e.property(`value`).string()}),e(Wi(zd,Pp),e=>{y(e.node.customColor)&&e.property(`customColor`).enum(),y(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(e=>vu(e)&&!Wi(qu,Hf,Xm)(e)&&y(e.key),e=>e.property(`key`).property()),e(Wi(eh,Fd,nm,Ld,sd,Ip,Bp,xf),e=>{y(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Wi(Af,Xd,Kd)(e))return this.highlightNameAndKind(e);if(Gu(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===iS)return`prune`;eS.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Kd(e)||this.mark(e).property(`kind`).keyword(),Af(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>rS((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>rS((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>rS((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const sS=Wi(Af,rp);var cS=class extends gu{projects;langiumDocuments;documentCache;workspaceCache;logger=K.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new ht.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new gr(e.shared,on.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(on.IndexedContent,e=>{Pg(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=on.IndexedContent)}get(e){return e.state<on.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:mn.basename(e.uri),state:e.state,expect:on.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){P(Af(e)||Su(e));let t=Mg.readId(e);if(y(t))return t;let n=fn(e);return n.state<on.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:mn.basename(n.uri)}),P(Ng(n)),this.get(n),N(Mg.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return kn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return kn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new pt.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return lS(t)}))}directChildrenOf(e,t){return kn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new pt.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return lS(n)}))}uniqueDescedants(e,t){return kn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new pt.default,r=new pt.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=lS(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...aa(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(sS));if(t.length===0)return uS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new pt.default,a=new pt.default,o=new pt.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Mg.writeId(t,i),o.set(i,a),a};function l(e,t){let n=Ja(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=S(e.body?.elements??[],sS);if(!C(s,1))return[o];let u=w(s,e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=Zg(e.element),n=T(e.body?.elements??[],S(Af),w(e=>l(e,t)));if(n.length!==0)for(let e of[t,...$i(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(rp(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:mn.basename(e.uri),error:t})}return new uS(r,i,a,o,n)}};function lS(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Ri(e.name,t.name))}var uS=class e{static EMPTY=new e([],new pt.default,new pt.default,new pt.default,T_.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const dS=Wi(Su,$f);var fS=class extends cS{Names;logger=K.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(dS));if(t.length===0)return uS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new pt.default,a=new pt.default,o=new pt.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Mg.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!y(n))return[];let o=Ja(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),Kd(e))return[c];let d=S(e.body?.elements??[],dS);if(!C(d,1))return[c];let f=w(d,e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=Zg(e.deploymentNode),n=T(e.body?.elements??[],S(dS),w(e=>u(e,t)));if(n.length!==0)for(let e of[t,...$i(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if($f(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:mn.basename(e.uri),error:t})}return new uS(r,i,a,o,n)}};const pS=/^(aws|azure|gcp|tech):(.+)$/;function mS(e){if(!e)return;let t=pS.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var hS=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new pt.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;st(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Bi(n),this.projectId=he(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return K.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,ve(a)&&(a=u.title||Ki(r)),u.tags&&Ui(u.tags)&&(e=e?we([...u.tags,...e]):u.tags);let d=z({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=mS(d.icon)),z({metadata:l&&!_(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){q(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>st(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:B.flatten(e.element)};if(`element`in e)return K.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return K.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===Ki(e.id)&&t.title?t.title:i,z({...t,...a,title:i,style:z({...t.style,...r}),id:n})}catch(e){q(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>st(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},gS=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function _S(e){let t=new Map;for(let n of e)if(So(n)&&n.viewOf&&v(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=Ie(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var vS=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=we([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=we([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=we([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:C(r,1)?r:null,links:C(n,1)?n:null,...!_(i)&&{metadata:i}}}};function yS(e,t,n){let r=new hS(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=ae(r.specs.colors,e=>Pa(e.color)),a=new Set,o=new vS,s=new vS,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&te(e.metadata).forEach(e=>a.add(e))},d=T(n,w(e=>(o.merge(e.c4ExtendElements),b(e.c4Elements,r.toModelElement))),S(y),ia,qe((e,t)=>{let n=Gi(t.id);return n&&v(e[n])?(K.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=T(n,w(e=>b(e.c4Relations,r.toModelRelation)),S(e=>{if(!e)return!1;let t=B.flatten(e.source),n=B.flatten(e.target);return v(d[t])&&!$a(t)||v(d[n])&&!$a(n)?(K.debug`Invalid relation ${e.id}
1229
- source: ${t} resolved: ${!!d[t]}
1230
- target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),b(e=>{let t=M_(`extend-relation`,B.flatten(e.source),B.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=we([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=we(r),s=i;return{...e,...C(o,1)&&{tags:o},...C(s,1)&&{links:s},...!_(a)&&{metadata:a}}}),ee(u),ue(x(`id`))),p=T(n,w(e=>(s.merge(e.c4ExtendDeployments),b(e.c4Deployments,r.toDeploymentElement))),S(y),ia,qe((e,t)=>{let n=Gi(t.id);return n&&v(e[n])?(K.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=co(t)?s.applyExtended(t):t,u(e[t.id]),e)},{})),m=T(n,w(e=>b(e.c4DeploymentRelations,r.toDeploymentRelation)),S(e=>e?v(p[e.source.deployment])||v(p[e.target.deployment])?(K.debug`Invalid deployment relation ${e.id}
1231
- source: ${e.source.deployment} resolved: ${!!p[e.source.deployment]}
1232
- target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),qe((e,t)=>_e(e[t.id])?(K.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[Ua]===`element`&&v(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),v(i)&&r===`index`&&(i=`Landscape view`),{...it(s,e=>e===void 0),[Ha]:`parsed`,sourcePath:mn.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>b(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[Ha]:`parsed`,[Ua]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of g)t[Ua]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of te(d)){if(e.has(n)||$a(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[Ha]:`parsed`,[Ua]:`element`,id:r,viewOf:n,title:`Auto / ${(d[n]?.title??n).replaceAll(`
1233
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ne=T(g,ue(x(`id`)));g.some(Co)&&(ne=jx(ne));for(let e of c)l.has(e.astPath)||K.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Ha]:`parsed`,projectId:t.id,project:z({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:ae(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Ri)},customColors:i},elements:d,relations:f,globals:r.globals,views:ne,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const bS=K.getChild(`builder`);var xS=class extends gu{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new SS(e),this.onDispose(this.cache,this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=rt(Ye(),S(e=>hu(e)&&!this.projects.isExcluded(e)),b(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(on.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),bS.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=bS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,yS(this.services,n,r))}catch(t){return bS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=bS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);C(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=F_();return await this.mutex.read(async()=>(t?.isCancellationRequested&&await vn(t),this.cache.parsedModel(e,()=>{let t=bS.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?(t.debug`parseModel in ${n.pretty}`,Oc.create(r)):(t.debug`parseModel: returning EMPTY`,Oc.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=bS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Oc.EMPTY.asComputed;let i=Oc.create(r),a=[];for(let e of Xe(r.views)){let r=Ax(e,i);if(!r.isSuccess){n.warn(U(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}_S(a);let o={...r,manualLayouts:{...t?.views},[Ha]:`computed`,views:ue(a,x(`id`))};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(Oc.create(o))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=bS.getChild(e),r=F_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await vn(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Oc.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Wn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){bS.debug(`clearCache`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=se(e)?T(e,be(e=>this.projects.ownerProjectId(e)),Ke()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){bS.warn(U(e))}}},SS=class extends _r{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)})),this.toDispose.push(e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=we(b(n,t.ownerProjectId.bind(t)));for(let e of r)this.clear(e)}}))}parsedData(e,t){return super.get(e,`parsed-data`,t)}parsedJoinedData(e,t){return super.get(e,`parsed-joined-data`,t)}parsedModel(e,t){return super.get(e,`parsed-model`,t)}computedModel(e,t,n){return super.get(e,`computed-model-${t?.hash??``}`,n)}};const{findNodeForKeyword:CS,findNodeForProperty:wS}=pn,{getDocument:TS,streamAllContents:ES}=En,DS=K.getChild(`locator`);var OS=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=de(t)?this.projects.ensureProjectId():j_(t)),de(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=TS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return DS.debug(U(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=eo(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Pm(r)&&!nf(r))continue;let i=r.kind?wS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?wS(r.$cstNode,`dotKind`):void 0,i??=CS(r.$cstNode,`->`),i??=wS(r.$cstNode,`title`),i??=wS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Gu(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?wS(r.$cstNode,`name`):void 0;return i??=CS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<on.Linked&&(DS.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,n.uri,t));let r=j_(n);DS.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??zo.DEFAULT;if(!e)return DS.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=T(ES(n.parseResult.value),ca(e=>Ch(e)||Th(e)),L(),w(n=>{let r,i;try{Ch(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return P(a,`Tag ${r} not found in merged specification`),P(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:Ch(n)}}catch(e){return DS.warn(`Fail on tag ${r}`,{err:e}),[]}}));return DS.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return DS.warn(U(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!_f(n)||!n.body)return DS.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!Au(i))return DS.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?wS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?wS(i.$cstNode,`dotKind`):void 0,a??=CS(i.$cstNode,`->`),a??=CS(i.$cstNode,`<-`),a??=wS(i.$cstNode,`title`),a??=wS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const kS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);oe(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),K.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:AS}=En,jS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;kS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=j_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},MS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;kS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=j_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},NS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=AS(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){K.warn(U(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(B.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(B.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(B.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(B.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Ji(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},PS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!Xd(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),FS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=Xg(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=Xg(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},IS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;Sg(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=Xg(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},LS=e=>Z((e,t)=>{if(_(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}gn(e,yf)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:RS}=En,zS=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}kS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=RS(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(j_(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},BS=e=>Z((e,t)=>{t_(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:VS}=En,HS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=j_(VS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},US=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),WS=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Rp(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Hf(n)&&Mf(n.$container)&&n.$container.props.some(e=>Rp(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},GS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||de(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=ce(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!ce(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!ce(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!ce(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),ce(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),de(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)},KS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(fn(e)),i=N_(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=N_(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}B.isImportRef(i)&&(B.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Ji(B.flatten(i),B.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},qS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),JS=e=>{let t=e.likec4.ModelParser,n=new gr(e.shared,on.Linked),r=({source:e,target:t,kind:n,title:r})=>M_(`extend-relation`,B.flatten(e),B.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(T(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),w(e=>e.c4Relations??[]),b(e=>r(e)))))}return Z((e,n)=>{let a=fn(e),o=t.forDocument(a),s=N_(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=N_(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!B.isModelRef(s)&&!B.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!B.isModelRef(c)&&!B.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=j_(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},YS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),XS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),ZS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),QS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{kS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=j_(e),i=t.projectElements(r,Nf).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==fn(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},$S=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{kS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=j_(e),i=t.projectElements(r,$d).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==fn(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},eC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=j_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==fn(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},tC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{kS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=j_(e);t.projectElements(r,Gm).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},nC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=j_(e),i=t.projectElements(r,Sp),a=t.projectElements(r,bp);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},rC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=j_(e);t.projectElements(r,Ap).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},iC=/@likec4-generated/,aC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=hn(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&iC.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;kS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=j_(e);t.projectElements(i,Wu).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function oC(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const sC=e=>Z((e,t)=>{let n=oC(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(yp),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!cC(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function cC(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:cC(e.parent,t.parent)}const lC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=Wg(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(fn(r)),o=V.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case V.isWildcard(o)&&i:case V.isElementKindExpr(o)&&i:case V.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case V.isWildcard(o):case V.isModelRef(o):case V.isDeploymentRef(o):return;case V.isElementKindExpr(o):case V.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},uC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(fn(e)).parseFqnRefExpr(e),i=Wg(e),a=Yg(e)&&!gn(e,e=>pf(e)||Wh(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!gn(e,Qu)){if(V.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(V.isDeploymentRef(r)&&B.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}y(e.selector)&&!Xd(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case V.isElementKindExpr(r):case V.isElementTagExpr(r):case V.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},dC=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!Jp(e.$container)&&v(On(e,Kf)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),fC=e=>Z((e,t)=>{if(Wg(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=On(e,Kf);n&&v(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),pC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=On(e,df);if(!r||r.isInclude!==!0)return;let i=fn(e),a=t.forDocument(i),o=io.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(io.isDirect(o)){(V.isModelRef(o.source)||V.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=io.isIncoming(o)?o.incoming:io.isOutgoing(o)?o.outgoing:o.inout,V.isModelRef(c)){n(`error`,s,{node:e});return}})},mC=e=>Z((e,t)=>{let n=Wg(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var hC=class extends fr{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};ir();const gC=Wi(Wp,Hp,Tp,Cp,xp,Dp,kp,hp,Bm,Ru,Qu,Df,bg,Sg,Tu,df,Pu,Qu,yp,pd,dd,Dh,hd,Ou,Gu,_d,Kd,Xd,nf,ad,xf,fm,qu,Pm,Im,Mu,ld,Sm,Af,Mf,Hf,Rf,rp,ap,$f,tp,sp,lp,ch,fh,oh,vh,ih,gh,Zf,bu),_C=e=>{let t=e;for(;t&&!Qp(t);){if(gC(t))return t;t=t.$container}};function vC(e){let t=e.state>=on.Validated?e.diagnostics?.filter(e=>e.severity===Pn.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(v(e)||n.has(e))continue;n.add(e);let t=_C(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function yC(e){K.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:MS(e),DeploymentNodeKind:$S(e),DeploymentNode:jS(e),DeploymentRelation:NS(e),ExtendDeployment:PS(e),ExtendRelation:JS(e),FqnRefExpr:uC(e),RelationExpr:pC(e),OpacityProperty:US(e),IconProperty:WS(e),SpecificationRule:YS(e),Model:XS(e),Globals:ZS(e),GlobalPredicateGroup:nC(e),GlobalDynamicPredicateGroup:nC(e),GlobalStyleId:rC(e),DynamicStepSingle:FS(e),DynamicStepChain:IS(e),LikeC4View:aC(e),Element:zS(e),ElementRef:BS(e),ElementKind:QS(e),Relation:KS(e),RelationBody:qS(e),Tag:eC(e),FqnExprWith:lC(e),RelationExprWith:mC(e),RelationshipKind:tC(e),IncomingRelationExpr:dC(e),OutgoingRelationExpr:fC(e),ImportsFromPoject:HS(e),ColorLiteral:GS(e),DynamicViewDisplayVariantProperty:LS(e),ViewRuleRank:sC(e)});let t=e.shared.lsp.Connection;t&&xa(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)K.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>K.error(U(e)))})})}const bC=K.getChild(`parser`);function xC(e){if(e==null)return;let t=SC(e);return de(t)?t.split(`
1234
- `).join(` `):`md`in t?{md:t.md.split(`
1235
- `).join(` `)}:{txt:t.txt.split(`
1236
- `).join(` `)}}function SC(e){if(e!=null)switch(!0){case de(e):return Yr(e).trim();case om(e)&&de(e.markdown):return{md:Yr(e.markdown).trim()};case om(e)&&de(e.text):return{txt:Yr(e.text).trim()};case om(e):return{txt:``};default:return}}var CC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=vC(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(dr(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?bC.getChild(n).debug(r):bC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return w(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(Hp(e)){let t=j_(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Qa(t,n)}return rp(e)?Zg(e.element):$f(e)?Zg(e.deploymentNode):Su(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||_(e.props))return;let t=e=>{if(om(e)){let t=SC(e);if(!t)return[];if(typeof t==`string`)return y(t)?[t]:[];{let e=t.md||t.txt;return y(e)?[e]:[]}}else if(cm(e))return e.values.map(e=>SC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(y);return[]},n=T(e.props,w(e=>e.value?t(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),S(([e,t])=>y(t)));if(_(n))return;let r=T(n,be(([e])=>e),ae(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return _(i)?void 0:i}parseMarkdownOrString(e){if(om(e))return SC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(y)),t=t.prev;return Ui(n)?we(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,S(e.props,im),e=>{let t=e.value;if(ve(t))return;let n=y(e.title)?xC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return z({url:t,title:n,relative:r&&r!==t?r:void 0})});return Ui(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Fr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&jr(n):return Or(this.doc.uri.toString(),`../`,n);case n&&Nr(n):return Pr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){bC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Pr(i,r):i;return Pr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(Mp(e))return`#${e.hex}`;if(Qm(e)){let t=ce(e.alpha)?e.alpha:void 0;return de(e.alpha)&&(t=Ig(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(se(e)){let t=this.parseStyleProps(e.find(Hf)?.props);try{let n=this.parseIconProperty(e.find(Rp));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case Ld(n):y(n.value)&&(t.border=n.value);break;case zd(n):{let e=Vg(n);y(e)&&(t.color=e);break}case eh(n):y(n.value)&&(t.shape=n.value);break;case Rp(n):{let e=this.parseIconProperty(n);y(e)&&(t.icon=e);break}case Pp(n):{let e=Vg(n);y(e)&&(t.iconColor=e);break}case Bp(n):y(n.value)&&(t.iconSize=Rg(n));break;case Ip(n):y(n.value)&&(t.iconPosition=zg(n));break;case Om(n):t.opacity=Lg(n);break;case bm(n):t.multiple=ye(n.value)?n.value:!1;break;case nh(n):y(n.value)&&(t.size=Rg(n));break;case Mm(n):y(n.value)&&(t.padding=Rg(n));break;case kh(n):y(n.value)&&(t.textSize=Rg(n));break;default:F(n)}}catch(e){this.logError(e,n)}return z(t)}parseBaseProps(e,t){let n=SC(t?.title??Fg(e.title)),r=t?.description?{txt:SC(t.description)}:this.parseMarkdownOrString(e.description);return z({title:n,summary:t?.summary?{txt:SC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:xC(t?.technology)??SC(Fg(e.technology))})}};function*wC(e){let t=_t.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(nf(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function TC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of wC(e))try{switch(!0){case nf(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Kd(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case Xd(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case $f(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(qu)),c=T(e.body?.props??[],S(t),S(Bf),ie(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return z({id:n,kind:r,title:l??Ki(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qu)),s=T(e.body?.props??[],S(t),S(Bf),ie(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return z({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qu)),r=this.parseLinks(e.body);return!t&&_(n??{})&&!r?null:z({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(_e(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(B.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(B.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(qu)),l=T(e.body?.props??[],S(Jm),S(e=>y(e.value)),ie(e=>[e.key,e.value])),u=T(e.body?.props??[],S(Wm),We())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Xm);return z({id:M_(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...Bg(f?.props,t),navigateTo:u,astPath:n})}}}function EC(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+M_(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(T(n,S(Kh),ie(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return jg.writeId(e,i),{[Ua]:`deployment`,id:i,astPath:r,title:xC(a)??null,description:o,tags:s,links:Ui(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(df(e))return this.parseDeploymentViewRulePredicate(e);if(Mh(e))return Hg(e);if(pf(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;st(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){q(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(dd)),n=SC(Fg(e.props.find(wm)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const DC=({operator:e,not:t},n)=>e?.startsWith(`!=`)?{neq:n}:e?.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n},OC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function kC(e){return!ug(e)&&!mg(e)&&!fg(e)?null:e.participant}function AC(e){switch(!0){case Md(e):{let t=e.value.tag.ref?.name,n=kC(e);P(t,`Expected tag name`);let r={tag:OC(e,t)};return n?{participant:n,operator:r}:r}case wd(e):{let t=e.value?.ref?.name,n=kC(e);P(t,`Expected kind name`);let r={kind:OC(e,t)};return n?{participant:n,operator:r}:r}case Ed(e):{let t=e.key,n=kC(e);P(t,`Expected metadata key`);let r={metadata:{key:t,...e.value==null?{}:{value:DC(e,String(e.value))}}};return n?{participant:n,operator:r}:r}case eg(e)||cg(e):return{not:AC(e.value)};case Jh(e):{let t=AC(e.left),n=AC(e.right);return jC(e.operator.toLowerCase(),t,n)}default:F(e)}}function jC(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[go(t)?t.and:t,go(n)?n.and:n].flat();return P(Ui(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[_o(t)?t.or:t,_o(n)?n.or:n].flat();return P(Ui(e),`Expected non-empty array`),{or:e}}default:F(e)}}function MC(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(Hp(t)){let e={project:j_(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Af(t)){let n=e_(e);if(n){let e={project:j_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=$g(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Su(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(Hu(e))return this.parseFqnExprOrWith(e);if(nd(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(hp(e))return this.parseFqnExprWith(e);if(Bu(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(Sm(t)){let n=t.value.view.$refText;return y(n)&&(e.custom.navigateTo=n),e}if(Em(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Bf(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=SC(Fg(t.value));return n&&(e.custom[t.key]=n),e}if(Rp(t)){let n=this.parseIconProperty(t);return _e(n)&&(e.custom[t.key]=n),e}if(zd(t)){let n=Vg(t);return _e(n)&&(e.custom[t.key]=n),e}if(eh(t)||Ld(t))return _e(t.value)&&(e.custom[t.key]=t.value),e;if(Om(t))return _e(t.value)&&(e.custom[t.key]=Lg(t)),e;if(Pp(t)){let n=Vg(t);return _e(n)&&(e.custom[t.key]=n),e}if(wm(t)){let n=y(t.value)?SC(Fg(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(bm(t))return ye(t.value)&&(e.custom[t.key]=t.value),e;if(nh(t)||kh(t)||Mm(t)||Bp(t))return y(t.value)&&(e.custom[t.key]=Rg(t)),e;if(Ip(t))return y(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(pp(e))return this.parseFqnExprWhere(e);if(Ru(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!pp(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?AC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(vg(e))return{wildcard:!0};if(If(e))return P(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Wf(e))return P(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(yp(e))return this.parseFqnRefExpr(e);F(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{st(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(Bm(e))return this.parseRelationExprWith(e);if(ed(e))return this.parseRelationExprOrWhere(e);F(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(Em(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(Jm(t)||wm(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=SC(Fg(t.value));return n&&(e[t.key]=n),e}if(Fd(t))return y(t.value)&&(e[t.key]=t.value),e;if(zd(t)){let n=Vg(t);return y(n)&&(e[t.key]=n),e}if(nm(t))return y(t.value)&&(e[t.key]=t.value),e;if(Wm(t)){let n=t.value.view.ref?.name;return y(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(Rm(e))return this.parseRelationExprWhere(e);if(Qu(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!Rm(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?AC(e.where):null,a;return a=i&&r?jC(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:F(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function NC(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!y(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!y(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);C(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Cp(e)){let r=this.parseGlobalPredicateGroup(e);C(r,1)&&(n.predicates[t]=r);return}if(xp(e)){let r=this.parseGlobalDynamicPredicateGroup(e);C(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Dp(e))return[this.parseViewRuleStyle(e)];if(kp(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}function PC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*FC(e){let t=_t.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Pm(r)){n.push(r);continue}if(sp(r)){n.push(r);continue}if(r.body?.elements&&C(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function IC(e){return class extends e{parseModel(){let e=this.doc;for(let t of FC(e))try{if(Af(t)){e.c4Elements.push(this.parseElement(t));continue}if(Pm(t)){e.c4Relations.push(this.parseRelation(t));continue}if(rp(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(sp(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qu)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=T(e.body?.props??[],S(t),S(Bf),ie(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return z({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qu)),r=this.parseLinks(e.body);if(!t&&ve(n)&&!r)return null;let i=this.getAstNodePath(e);return z({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(B.isModelRef(t)||B.isImportRef(t),`Source must be a model reference`),P(B.isModelRef(n)||B.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(qu)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&_(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return z({id:M_(`extend-relation`,B.flatten(t),B.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(_e(e.source)){let t=this.parseFqnRef(e.source);return P(B.isModelRef(t)||B.isImportRef(t),`Relation source must be a model reference`),t}if(Mf(e.$container)||ap(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(qu)),c=this.getAstNodePath(e),l=T(e.body?.props??[],S(Jm),S(e=>y(e.value)),ie(e=>[e.key,e.value])),u=T(e.body?.props??[],S(Wm),b(e=>e.value.view.ref?.name),S(y),We()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Xm);return z({id:M_(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...Bg(m?.props,t)})}}}function LC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(hp(e))return this.parseFqnExprWith(e);if(Bu(e))return this.parseFqnExprOrWhere(e);F(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function RC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!y(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=T(n.filter(mh)??[],S(e=>this.isValid(e)&&st(e.value)),ie(e=>[e.key,SC(Fg(e.value))]),it(v));t.relationships[r]={...i,...Bg(n.filter(ad),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}y(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!y(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(Hf)),o=this.parseLinks(e),s=T(n.filter(uh)??[],S(e=>this.isValid(e)),ie(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=SC(Fg(s.notation));return{[r]:z({...c,notation:l,tags:i??void 0,...o&&Ui(o)&&{links:o},style:a})}}}}function zC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!_(t.folder.trim())?xC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Kf(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case _f(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case sf(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=Xg(e.viewOf),n=t&&N_(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+M_(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(T(n.props,S(e=>this.isValid(e)),S(Kh),ie(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Ua]:`element`,id:a,astPath:r,title:xC(o)??null,description:s,tags:c,links:Ui(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(jg.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(Bh(e))return this.parseViewRulePredicate(e);if(Ph(e))return this.parseViewRuleGlobalPredicateRef(e);if(_d(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Mh(e))return Hg(e);if(Rh(e))return this.parseViewRuleGroup(e);if(Hh(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(Wh(e))return this.parseViewRuleStyle(e);if(Ih(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Bh(n)){t.push(this.parseViewRulePredicate(n));continue}if(Rh(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){this.logError(e,n,`views`)}return{title:xC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>so.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>so.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(dd)),r=SC(Fg(e.props.find(wm)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+M_(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(T(i,S(Kh),ie(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);jg.writeId(e,o);let d=Ie(i,xf)?.value;return{[Ua]:`dynamic`,id:o,astPath:a,title:xC(s)??null,description:c,tags:l,links:Ui(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>Df(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(Tf(e))return this.parseDynamicViewIncludePredicate(e);if(Cf(e))return this.parseViewRuleGlobalPredicateRef(e);if(_d(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Mh(e))return Hg(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Hu(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=BC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return P(Ui(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(Sg(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(Ui(t),`Dynamic step chain must have at least one step`),{seriesId:BC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(Sg(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!Ui(n)||!this.isValid(e))return[];let r=Re(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=Xg(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=Xg(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:BC(e)},r=SC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Wm(t):{let e=t.value.view.ref?.name;y(e)&&(n.navigateTo=e);break}case Jm(t):case wm(t):if(_e(t.value))if(t.key===`description`){let e=SC(t.value);e&&(n.description=e)}else n[t.key]=SC(Fg(t.value))??``;break;case Em(t):_e(t.value)&&(n[t.key]=SC(t.value));break;case Fd(t):_e(t.value)&&(n[t.key]=t.value);break;case zd(t):{let e=Vg(t);_e(e)&&(n[t.key]=e);break}case nm(t):_e(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function BC(e){let t=e,n=[];for(;!yf(t);)ce(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}ir();const VC=T(CC,MC,PC,IC,TC,EC,LC,RC,zC,NC);var HC=class extends VC{};const UC=K.getChild(`parser`),WC=e=>e.severity===Pn.Error;var GC=class{cachedParsers=new ht.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Linked,async e=>{this.cachedParsers.has(e)&&(UC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:mn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(on.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){q(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Validated,async e=>{e.diagnostics?.some(WC)&&this.cachedParsers.has(e)&&(UC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:mn.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){P(Ng(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=mn.relative(t.folderUri,e.uri);e.likec4ProjectId?UC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):UC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<on.Linked&&UC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new pt.default(Set)};e=Object.assign(e,r);let i=new HC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},KC=class extends xn{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),dn.convertString(t)):super.runConverter(e,t,n)}};ir();const{findNodeForKeyword:qC}=pn,JC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...Ke(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},YC=(e,t)=>n=>{if(!Wh(n)&&!pf(n))return!1;let r=n.targets.value;if(!r||y(n.targets.prev)||r.$type!==`FqnRefExpr`||y(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function XC(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=Re(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=S(n.body.rules,e=>Wh(e)||pf(e)),u=t[Ua]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Ze(l,YC(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>JC(e,i,s));h.push(Hn.insert(o,`
1237
- `+e.join(`
1238
- `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Re(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;P(t,`RuleCstNode not found`);for(let[n,r]of Ke(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(Hn.replace({start:e,end:t},n+` `+i));continue}let o=qC(t,`{`)?.range.end;P(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(Hn.insert(o,`
1239
- `+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}ir();const{findNodeForKeyword:ZC}=pn;function QC(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=Ug(r.direction),o=Ze(n.body.rules,Mh),s=`autoLayout ${a}`;if(ce(r.rankSep)&&(s+=` ${r.rankSep}`,ce(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Hn.replace(o.$cstNode.range,s);let c=ZC(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Hn.insert(c,l)}ir();const $C=K.getChild(`model-changes`);var ew=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);$C.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?(await n.DocumentBuilder.update([s.doc.uri],[]),{success:!0,location:{uri:c.uri,range:u}}):(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=U(ts(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return $C.warn(n),{success:!1,error:n}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return XC(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=QC(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},tw=class extends ln{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(bn(e))return e.name;if(Hp(e))return e.imported.$refText;if(Kd(e))return e.target.modelElement.value.$refText}getNameNode(e){if(bn(e))return super.getNameNode(e);if(Hp(e))return e.imported.$refNode;if(Kd(e))return e.target.modelElement.value.$refNode}};function nw(e){return T(e,be(e=>`${e.type}.${e.name}`),Ke(),w(([e,t])=>t.length===1?t:[]))}var rw=class extends Tn{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){q(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(v(r)||r.length===0))for(let e of r)try{y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}exportGlobals(e,t,n){if(!(v(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}}exportModel(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Af(r)&&y(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportLibrary(e,t,n){if(!v(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportSpecification(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case oh(r):case ch(r):y(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case vh(r):y(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case fh(r):y(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case ih(r):y(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){q(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(v(r)||r.length===0))for(let e of r)try{Xd(e)&&y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new un;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){q(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){q(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){q(e)}nw(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new un,i=[];for(let a of e.elements){if(Pm(a))continue;let e;if(Af(a)?(y(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):rp(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){q(e)}}i.length&&T(i,S(e=>!r.has(e.name)),be(e=>e.name),pe((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new un,i=[];for(let a of e.elements){if(nf(a))continue;let e=a.body;if(!$f(a)){let i=this.nameProvider.getName(a);if(y(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){q(e)}}i.length&&T(i,S(e=>!r.has(e.name)),be(e=>e.name),pe((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:iw}=En;var aw=class extends mr{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=j_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(_p(r))return new hr(this.streamForFqnRef(t,r,e));if(Sh(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==kf)return this.getProjectScope(t,n,e);if(Hp(r)){let e=j_(r);return new hr(this.fqnIndex.rootElements(e))}if(bh(r)&&e.property===`el`){let i=r.parent;return i?new hr(this.fqnIndex.directChildrenOf(t,Zg(i))):this.getProjectScope(t,n,e)}return new hr(kn(this.computeScope(t,e)))}catch(r){return q(r),this.getProjectScope(t,n,e)}}catch(e){return q(e),wn}}*genUniqueDescedants(e){if(!e)return;let t=j_(e);if(Af(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(Xd(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(Xg(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(Xg(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new hr(this.deploymentsIndex.directChildrenOf(e,Zg(r)).filter(e=>this.reflection.isSubtype(e.type,Yd))):this.getProjectScope(e,Yd,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&Xd(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return kn(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return An;if(Hp(i))return kn(this.genUniqueDescedants(i.imported.ref));if(Xd(i))return kn(this.genUniqueDescedants(i));if(Kd(i)){let e=i.target.modelElement.value.ref,t=Hp(e)?e.imported.ref:Af(e)?e:void 0;return kn(this.genUniqueDescedants(t))}return Af(i)?kn(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){gn(t,Rf)||Jg(t)?yield*this.computeScope(e,n,kf):qg(t)?(yield*this.computeScope(e,n,kf),yield*this.computeScope(e,n,Yd),yield*this.computeScope(e,n,Gd)):(yield*this.computeScope(e,n,Yd),yield*this.computeScope(e,n,Gd),gn(t,lf)&&(yield*this.computeScope(e,n,kf)));let r=iw(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Vp)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,kf),i=this.reflection.isSubtype(n,xu),a=iw(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&tp(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&ap(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Jf(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Yp?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new cn(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Yp)return super.getGlobalScope(e,t);let n=j_(t.container);return this.getProjectScope(n,e,t)}},ow=Qn();let sw;(function(e){e.type=new ow.NotificationType(`likec4/onDidChangeModel`)})(sw||={});let cw;(function(e){e.type=new ow.NotificationType0(`likec4/onDidChangeProjects`)})(cw||={});let lw;(function(e){e.type=new ow.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(lw||={});let uw;(function(e){e.type=new ow.NotificationType(`likec4/onRequestOpenView`)})(uw||={});let dw;(function(e){e.req=new ow.RequestType(`likec4/fetchComputedModel`)})(dw||={});let fw;(function(e){e.req=new ow.RequestType0(`likec4/fetchViewsFromAllProjects`)})(fw||={});let pw;(function(e){e.req=new ow.RequestType(`likec4/fetchLayoutedModel`)})(pw||={});let mw;(function(e){e.req=new ow.RequestType(`likec4/layout-view`)})(mw||={});let hw;(function(e){e.req=new ow.RequestType(`likec4/validate-layout`)})(hw||={});let gw;(function(e){e.req=new ow.RequestType0(`likec4/reload-projects`)})(gw||={});let _w;(function(e){e.req=new ow.RequestType0(`likec4/fetch-projects`)})(_w||={});let vw;(function(e){e.req=new ow.RequestType(`likec4/register-project`)})(vw||={});let yw;(function(e){e.req=new ow.RequestType(`likec4/build`)})(yw||={});let bw;(function(e){e.req=new ow.RequestType(`likec4/locate`)})(bw||={});let xw;(function(e){e.req=new ow.RequestType(`likec4/change-view`)})(xw||={});let Sw;(function(e){e.req=new ow.RequestType0(`likec4/metrics`)})(Sw||={});let Cw;(function(e){e.req=new ow.RequestType(`likec4/document-tags`)})(Cw||={});let ww;(function(e){e.req=new ow.RequestType0(`likec4/fetch-projects-overview`)})(ww||={});const Q=K.getChild(`rpc`);var Tw=class extends gu{constructor(e){super(),this.services=e}init=re(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=t=>{Q.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(sw.type,{projectId:t}).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},o=Se(e=>{if(typeof e==`string`){a(e);return}for(let t of e)a(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),s=Se(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(cw.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),c=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>o.call(e)),n.ProjectsManager.onProjectsUpdate(()=>s.call(1)),e.onRequest(dw.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===Oc.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(lw.type,async e=>{let t=_n.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};Q.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(pw.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:ue(i,e=>e.id)}}}),e.onRequest(mw.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(hw.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:l((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(_w.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:ae(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:b(e,e=>e.uri.toString())}})})),e.onRequest(gw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(vw.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(_n.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(fw.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await vn(e);try{let n=await t.Views.computedViews(i,e);r.push(...T(n,b(e=>({id:e.id,title:e.title??e.id,projectId:i})),De((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(yw.req,async({docs:t},n)=>{let a=t.map(e=>_n.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>mn.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
1240
- changed (total ${a.length}):${t.map(e=>`
1241
- - `+e).join(``)}
1242
- deleted (total ${o.length}):${o.map(e=>`
1243
- - `+e.toString()).join(`
1244
- `)}`),!c&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),c=!1,await vn(n),await i.update(a,o,n)}),e.onRequest(bw.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:F(e)}}),e.onRequest(xw.req,async e=>(Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Sw.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Oc.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=te(n.specification.elements).length,r.deploymentKinds+=te(n.specification.deployments).length,r.relationshipKinds+=te(n.specification.relationships).length,r.tags+=te(n.specification.tags).length,r.customColors+=te(n.specification.customColors??{}).length,r.elements+=te(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=te(n.$data.relations).length,r.views+=te(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await vn(e),{metrics:r}}),e.onRequest(Cw.req,async({documentUri:e},r)=>{let i=_n.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(ww.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Wn.create(()=>{o.cancel()}));function l(e){return T(e,S(e=>!!e.hasLayoutDrift),b(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Qx.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(uw.type,e)}};ir();var Ew=class{constructor(e){this.services=e}getSymbolKind(e){let t=dr(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(kf,np,Yd,Gd,Vp):return zn.Constructor;case n(pm,_m,hm,wp,hh):return zn.Namespace;case n(Wu):return zn.Class;case n(`Tag`,Yp,Bd,_h):return zn.EnumMember;case n(Gm,dh):return zn.Event;case n(Nf,$d,sh,ah):return zn.TypeParameter}return zn.Field}getCompletionItemKind(e){let t=dr(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Bd):return Kn.Color;case n(kf,Yd,Gd,np,Vp):return Kn.Constructor;case n(pm,_m,hm,wp,hh):return Kn.Module;case n(Wu):return Kn.Class;case n(`Tag`,Yp,Bd,_h):return Kn.EnumMember;case n(Gm,dh):return Kn.Event;case n(Nf,sh,$d,ah):return Kn.TypeParameter;default:return Kn.Reference}}},Dw=class extends tr{};const Ow=K.getChild(`views`);var kw=class{#e;#t=new E.default(e=>new Aw({projectId:e,storage:Xr(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Zr(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Ow.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Xe((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Xe(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=Ow.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(o.length>0){let e=F_();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.trace`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await vn(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=Ow.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let s=this.projectStorage(n);try{let e={view:a,styles:i.$styles},n=await s.getOrExecute(e);return y(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=U(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Xe(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):q(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Ow.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Ix(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Ow.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Wa]===`manual`?(Ow.error(`View ${e.id} already has manual layout, this should not happen`),e):Yo(e,r):Qo(e,r):e}projectStorage(e){return this.#t.get(e)}},Aw=class{#e;#t;#n;#r;constructor(e){this.#e=Ow.getChild(e.projectId),this.#t=e.projectId,this.#n=e.storage,this.#r=e.layouter}async get(e){let t=jw(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,Mw(e.view,n);K.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=jw(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,Mw(e.view,n);K.trace`cache miss for ${e.view.id}`;let r=F_(),i=await this.#r(e);return K.trace(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#n.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=jw(e);return t&&(this.#n.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#n.has(n).then(e=>{e||(this.#n.set(n,`true`),t())})}resetViewError(e){this.#n.del(`error-${e.id}`)}};function jw(e){return`${e.view.hash}-${e.styles.fingerprint}`}function Mw(e,t){return{dot:t.dot,diagram:Bo(e,t.diagram)}}const Nw={graphviz(){return new ac}};function Pw(e){return{graphviz(){return e}}}function Fw(e){return{lsp:{NodeKindProvider:e=>new Ew(e),WorkspaceSymbolProvider:e=>new Dw(e)},workspace:{Cache:e=>new gr(e,on.Validated),IndexManager:e=>new r_(e),LangiumDocuments:e=>new o_(e),ProjectsManager:e=>new T_(e),WorkspaceManager:e=>new A_(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function Iw(e){return{documentation:{DocumentationProvider:$(cy)},validation:{DocumentValidator:$(hC)},Rpc:$(Tw),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(zx),Graphviz:t=>e.graphviz(t),Layouter:e=>new uc({graphviz:e.likec4.Graphviz}),Views:$(kw),DeploymentsIndex:$(fS),ModelChanges:$(ew),FqnIndex:$(cS),ModelParser:$(GC),ModelBuilder:$(xS),ModelLocator:$(OS),LastSeen:$(gS)},lsp:{CompletionProvider:$(Wx),DocumentHighlightProvider:$(Kx),DocumentSymbolProvider:$(Yx),SemanticTokenProvider:$(oS),HoverProvider:$(Zx),CodeLensProvider:$(Vx),DocumentLinkProvider:$(qx),Formatter:$(py),CodeActionProvider:$($x)},workspace:{AstNodeDescriptionProvider:$(n_)},references:{NameProvider:$(tw),ScopeComputation:$(rw),ScopeProvider:$(aw)},parser:{ValueConverter:$(KC)}}}function Lw(e={},t,n,r){let i=Rw(e),a=Mn([Gn({shared:i}),kg,Iw({...ov,...$_,...ev,...Nw,...e}),t,n,r].reduce(zw,{}));return i.ServiceRegistry.register(a),yC(a),e.connection?xa(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function Rw(e={}){let t={...ov,...$_,...ev,...e};return Mn(Nn(t),Og,Fw(t))}function zw(e,t){if(t)for(let[n,r]of Object.entries(t)){if(n===`__proto__`||n===`constructor`||n===`prototype`||r===void 0)continue;let t=Object.hasOwn(e,n),i=e[n];t&&i!==null&&r!==null&&typeof i==`object`&&typeof r==`object`?e[n]=zw(i,r):e[n]=r}return e}const Bw=e=>e.severity===1;var Vw=class{langium;logger;constructor(e,t=hs){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
1245
- ${e.map(e=>` - ${e.folder.fsPath}`).join(`
1246
- `)}
1247
-
1248
- Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}projects(){return b(this.languageServices.projects(),x(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(Bw)??[]).map(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(Bw))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let n=t.diagnostics?.filter(Bw)??[];if(!C(n,1))continue;e=!0;let r=T(n,w(e=>{let t=e.range.start.line,n=e.message.split(`
1249
- `);return n.length>5&&(n.length=5,n.push(`...`)),n.map((e,n)=>n===0?` `+ei.dim(`Line ${t}: `)+ei.red(e):` `.repeat(10)+ei.red(e))}),Le(`
1250
- `));this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async format(e){let{projects:t,...n}=e??{},r={...n,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(r)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Hw={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,mcp:!1,configureLogger:!1,logLevel:void 0},Uw=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
1251
- `)}`);async function Ww(e,t=hs,n){let r=new Vw(e,t);return(n?.throwIfInvalid??Hw.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(Uw(r))):((n?.printErrors??Hw.printErrors)&&r.hasErrors()&&r.printErrors(),r)}function Gw(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`||e?.mcp===`stdio`){ll({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}ll({colors:fi,logLevel:e?.logLevel})}}function Kw(e){let t=hs.getChild(`lang`),n=bt(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`,mcp:!1}),r=n.graphviz===`binary`;t.info(`${ei.dim(`layout`)} ${r?`binary`:`wasm`}`);let i=Lw({...n.useFileSystem?{...iv(n.watch),...n.manualLayouts?H_:ev}:{...$_,...ev},...n.mcp?sy(n.mcp===`stdio`?`stdio`:n.mcp):{},...Pw(r?new sl:new ac)});return typeof n.mcp==`object`&&n.mcp.port&&i.likec4.mcp.Server.start(n.mcp.port).catch(e=>{t.error(U(e))}),n.mcp===`stdio`&&i.likec4.mcp.Server.start().catch(e=>{t.error(U(e))}),i}async function qw(e,t){let n=Qr(e),r=Ir(di(n).toString()),i=hs.getChild(`lang`),a=bt(t,{...Hw,useFileSystem:!0,manualLayouts:!0,watch:!1,mcp:!1});Gw(a);let o=Kw(a),s={name:$r(n),uri:r},c=o.shared.workspace.WorkspaceManager;i.info(`${ei.dim(`workspace:`)} ${n}`),c.initialize({capabilities:{},processId:null,rootUri:null,workspaceFolders:[s]}),await c.initializeWorkspace([s]);let l=o.shared.workspace.LangiumDocuments.userDocuments.toArray();if(l.length===0&&(i.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw Error(`no LikeC4 sources found`);return i.info(`${ei.dim(`workspace:`)} found ${l.length} source files`),Ww(o,hs,t)}ti(ni({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},graphviz:{type:`enum`,options:[`binary`,`wasm`],description:`use binary or wasm graphviz`,default:`wasm`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`},logLevel:{type:`enum`,options:[`trace`,`debug`,`info`,`warning`,`error`],description:`change log level`,required:!1}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;ll({useStdErr:t,colors:ei.isColorSupported,logLevel:e.logLevel}),process.on(`uncaughtException`,e=>{hs.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{hs.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=ai(e.workspace||`.`);hs.info`Loading LikeC4 from workspace: ${r}`,e.watch&&hs.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`,await qw(r,{graphviz:e.graphviz,mcp:t?`stdio`:{port:n},configureLogger:!1,watch:e.watch})}})).catch(e=>{hs.error(e),process.exit(1)});export{};
2
+ import{n as e,t}from"./_chunks/src.mjs";import"./_chunks/libs/@radix-ui/colors.mjs";import"./_chunks/libs/remeda.mjs";import"./_chunks/libs/natural-compare-lite.mjs";import"./_chunks/libs/@mantine/colors-generator.mjs";import"./_chunks/libs/graphology-dag.mjs";import"./_chunks/libs/mnemonist.mjs";import"./_chunks/libs/ohash.mjs";import"./_chunks/libs/defu.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import"./_chunks/libs/hast-util-sanitize.mjs";import"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import"./_chunks/libs/remark-gfm.mjs";import"./_chunks/libs/remark-github-blockquote-alert.mjs";import"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/is-plain-obj.mjs";import"./_chunks/libs/trough.mjs";import"./_chunks/libs/unified.mjs";import"./_chunks/libs/immer.mjs";import"./_chunks/libs/@logtape/logtape.mjs";import"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import"./_chunks/libs/safe-stringify.mjs";import"./_chunks/libs/@lume/kiwi.mjs";import"./_chunks/libs/ts-graphviz.mjs";import"./_chunks/libs/word-wrap.mjs";import"./_chunks/libs/khroma.mjs";import"./_chunks/libs/graphology.mjs";import"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/eventemitter3.mjs";import"./_chunks/libs/p-queue.mjs";import"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import"./_chunks/libs/which.mjs";import"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import"./_chunks/libs/json5.mjs";import"./_chunks/libs/@hono/mcp.mjs";import"./_chunks/libs/fdir.mjs";import"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/parse-ms.mjs";import"./_chunks/libs/pretty-ms.mjs";import"./_chunks/libs/pathe.mjs";import"./_chunks/libs/ufo.mjs";import"./_chunks/libs/p-timeout.mjs";import"./_chunks/libs/fast-equals.mjs";import"./_chunks/libs/strip-indent.mjs";import"./_chunks/libs/destr.mjs";import"./_chunks/libs/unstorage.mjs";import"./_chunks/libs/tinyrainbow.mjs";import"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import"./_chunks/libs/@hono/node-server.mjs";export{t as initLikeC4MCP,e as startLikeC4MCP};