likec4 1.49.0 → 1.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/__app__/src/likec4.js +33 -62
  2. package/__app__/src/main.js +2 -56
  3. package/__app__/src/routes/index.js +81 -16
  4. package/__app__/src/routes/single.js +43 -23
  5. package/__app__/src/style.css +1 -1
  6. package/__app__/src/vendors.js +17891 -17752
  7. package/config/schema.json +16 -0
  8. package/dist/THIRD-PARTY-LICENSES.md +192 -62
  9. package/dist/_chunks/LikeC4.mjs +1 -0
  10. package/dist/_chunks/filesystem.mjs +1230 -0
  11. package/dist/_chunks/index.d.mts +11 -12
  12. package/dist/_chunks/index2.d.mts +173 -84
  13. package/dist/_chunks/libs/@chevrotain/cst-dts-gen.mjs +30 -0
  14. package/dist/_chunks/libs/@chevrotain/regexp-to-ast.mjs +8 -8
  15. package/dist/_chunks/libs/@chevrotain/types.d.mts +1 -0
  16. package/dist/_chunks/libs/@chevrotain/utils.mjs +1 -1
  17. package/dist/_chunks/libs/@hono/mcp.mjs +8 -8
  18. package/dist/_chunks/libs/@hono/node-server.mjs +1 -1
  19. package/dist/_chunks/libs/@logtape/logtape.mjs +3 -3
  20. package/dist/_chunks/libs/@lume/kiwi.mjs +1 -1
  21. package/dist/_chunks/libs/@modelcontextprotocol/sdk.d.mts +114 -14
  22. package/dist/_chunks/libs/@modelcontextprotocol/sdk.mjs +7 -7
  23. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -1
  24. package/dist/_chunks/libs/@nanostores/react.d.mts +61 -1
  25. package/dist/_chunks/libs/@nanostores/react.mjs +1 -1
  26. package/dist/_chunks/libs/@smithy/is-array-buffer.mjs +1 -0
  27. package/dist/_chunks/libs/@smithy/util-base64.mjs +1 -1
  28. package/dist/_chunks/libs/ajv.mjs +1 -1
  29. package/dist/_chunks/libs/ansi-align.mjs +2 -0
  30. package/dist/_chunks/libs/ansi-regex.mjs +1 -0
  31. package/dist/_chunks/libs/ansi-styles.mjs +1 -0
  32. package/dist/_chunks/libs/atomically.mjs +1 -1
  33. package/dist/_chunks/libs/birpc.mjs +1 -1
  34. package/dist/_chunks/libs/boxen.d.mts +1 -0
  35. package/dist/_chunks/libs/boxen.mjs +22 -0
  36. package/dist/_chunks/libs/chevrotain-allstar.mjs +2 -2
  37. package/dist/_chunks/libs/chevrotain.mjs +35 -35
  38. package/dist/_chunks/libs/conf.mjs +1 -1
  39. package/dist/_chunks/libs/defu.mjs +1 -1
  40. package/dist/_chunks/libs/esm-env.mjs +1 -1
  41. package/dist/_chunks/libs/eventemitter3.mjs +1 -1
  42. package/dist/_chunks/libs/fast-equals.mjs +1 -1
  43. package/dist/_chunks/libs/find-up-simple.mjs +1 -1
  44. package/dist/_chunks/libs/get-port.mjs +1 -1
  45. package/dist/_chunks/libs/is-docker.mjs +1 -1
  46. package/dist/_chunks/libs/is-error-instance.mjs +1 -1
  47. package/dist/_chunks/libs/is-inside-container.mjs +1 -1
  48. package/dist/_chunks/libs/is-plain-obj.mjs +1 -1
  49. package/dist/_chunks/libs/isexe.mjs +1 -1
  50. package/dist/_chunks/libs/json5.mjs +10 -10
  51. package/dist/_chunks/libs/khroma.mjs +1 -1
  52. package/dist/_chunks/libs/ky.mjs +2 -2
  53. package/dist/_chunks/libs/langium.d.mts +5 -4
  54. package/dist/_chunks/libs/langium.mjs +20 -19
  55. package/dist/_chunks/libs/merge-error-cause.mjs +2 -2
  56. package/dist/_chunks/libs/p-limit.mjs +1 -1
  57. package/dist/_chunks/libs/p-queue.mjs +1 -1
  58. package/dist/_chunks/libs/package-manager-detector.mjs +1 -1
  59. package/dist/_chunks/libs/package-up.mjs +1 -1
  60. package/dist/_chunks/libs/pako.mjs +1 -0
  61. package/dist/_chunks/libs/parse-ms.mjs +1 -1
  62. package/dist/_chunks/libs/pathe.mjs +1 -1
  63. package/dist/_chunks/libs/picomatch.mjs +1 -1
  64. package/dist/_chunks/libs/pretty-ms.mjs +1 -1
  65. package/dist/_chunks/libs/remeda.mjs +2 -1
  66. package/dist/_chunks/libs/safe-stringify.mjs +1 -1
  67. package/dist/_chunks/libs/strip-indent.mjs +1 -1
  68. package/dist/_chunks/libs/tinyrainbow.mjs +1 -1
  69. package/dist/_chunks/libs/ts-graphviz.mjs +3 -3
  70. package/dist/_chunks/libs/ufo.mjs +1 -1
  71. package/dist/_chunks/libs/vscode-languageserver.mjs +1 -0
  72. package/dist/_chunks/libs/which.mjs +1 -1
  73. package/dist/_chunks/libs/word-wrap.mjs +2 -2
  74. package/dist/_chunks/rolldown-runtime.mjs +1 -1
  75. package/dist/_chunks/sequence.mjs +1 -0
  76. package/dist/_chunks/src.mjs +15 -0
  77. package/dist/_chunks/src2.mjs +499 -0
  78. package/dist/cli/index.mjs +84 -231
  79. package/dist/config/index.mjs +1 -1
  80. package/dist/index.d.mts +810 -4
  81. package/dist/index.mjs +1 -1
  82. package/dist/model/index.mjs +1 -1
  83. package/dist/vite-plugin/index.d.mts +3 -0
  84. package/dist/vite-plugin/index.mjs +1 -1
  85. package/dist/vite-plugin/internal.d.mts +1 -2
  86. package/dist/vite-plugin/internal.mjs +1 -1
  87. package/package.json +28 -29
  88. package/react/index.d.mts +2 -2
  89. package/react/index.mjs +52 -76
  90. package/vite-plugin-modules.d.ts +5 -0
  91. package/dist/_chunks/GraphvizBinaryAdapter.mjs +0 -72
  92. package/dist/_chunks/filenames.mjs +0 -14
  93. package/dist/_chunks/libs/@chevrotain/gast.mjs +0 -1
  94. package/dist/_chunks/libs/@logtape/logtape.d.mts +0 -741
  95. package/dist/_chunks/libs/nanostores.d.mts +0 -63
  96. package/dist/_chunks/libs/nanostores.mjs +0 -1
  97. package/dist/_chunks/node.mjs +0 -481
  98. package/dist/_chunks/plugin.mjs +0 -322
  99. package/dist/_chunks/sequence-view.mjs +0 -1
@@ -0,0 +1,1230 @@
1
+ import{s as e}from"./rolldown-runtime.mjs";import{$ as t,A as n,B as r,C as i,D as a,E as o,F as s,G as c,H as l,J as u,K as d,M as f,N as p,O as m,P as h,Q as g,R as _,S as v,T as ee,V as te,W as ne,X as re,Y as y,Z as b,_ as ie,a as ae,b as x,c as oe,d as se,et as ce,g as le,h as ue,i as de,j as fe,k as pe,l as me,m as he,n as ge,nt as _e,o as ve,p as ye,q as S,r as be,s as xe,t as Se,tt as Ce,u as we,v as Te,w as Ee,x as De,y as Oe,z as ke}from"./libs/remeda.mjs";import{a as Ae,i as je,n as Me,r as Ne,t as Pe}from"./libs/@logtape/logtape.mjs";import{n as Fe,t as Ie}from"./libs/merge-error-cause.mjs";import{t as Le}from"./libs/safe-stringify.mjs";import{t as Re}from"./libs/defu.mjs";import{n as ze}from"./libs/pathe.mjs";import{n as Be}from"./libs/tinyrainbow.mjs";import{t as Ve}from"./libs/json5.mjs";import{J as He,i as Ue,n as We,r as Ge,t as Ke}from"./libs/@hono/mcp.mjs";import{c as qe,d as Je,l as Ye,o as Xe,s as Ze,u as Qe}from"./src.mjs";import{$ as $e,A as et,B as C,C as tt,D as nt,E as rt,F as it,G as at,H as ot,I as st,J as ct,K as w,L as lt,M as ut,N as dt,O as ft,P as pt,Q as mt,R as ht,S as gt,T as _t,U as vt,V as T,W as yt,X as bt,Y as xt,Z as St,_ as Ct,_t as wt,at as Tt,b as Et,c as Dt,ct as Ot,d as kt,dt as At,et as jt,f as Mt,ft as Nt,g as Pt,gt as Ft,h as It,ht as Lt,it as Rt,j as zt,k as Bt,l as Vt,lt as Ht,m as Ut,mt as Wt,nt as Gt,o as Kt,ot as qt,p as Jt,pt as Yt,q as Xt,rt as Zt,s as Qt,st as $t,tt as en,u as tn,ut as nn,v as rn,vt as an,w as on,x as sn,y as cn,z as E}from"./libs/langium.mjs";import{t as ln}from"./libs/fast-equals.mjs";import{t as un}from"./sequence.mjs";import{n as dn,r as fn,t as D}from"./libs/ts-graphviz.mjs";import{t as pn}from"./libs/word-wrap.mjs";import{n as mn,r as hn,t as gn}from"./libs/khroma.mjs";import{t as _n}from"./libs/p-limit.mjs";import{t as vn}from"./libs/p-queue.mjs";import{t as yn}from"./libs/which.mjs";import{A as bn,C as xn,D as Sn,E as O,O as k,S as Cn,T as A,b as j,k as wn,n as Tn,t as En,w as Dn,x as On}from"./libs/@modelcontextprotocol/sdk.mjs";import{t as kn}from"./libs/picomatch.mjs";import{a as An,d as jn,f as Mn,i as Nn,l as Pn,n as Fn,o as In,p as Ln,r as Rn,t as zn,u as Bn}from"./libs/ufo.mjs";import{t as Vn}from"./libs/pretty-ms.mjs";import{t as Hn}from"./libs/@hono/node-server.mjs";import{t as Un}from"./libs/@msgpack/msgpack.mjs";import{t as Wn}from"./libs/@smithy/util-base64.mjs";import{t as Gn}from"./libs/strip-indent.mjs";import{LikeC4Model as Kn,isDeploymentNodeModel as qn,modelConnection as Jn}from"@likec4/core/model";import*as Yn from"@likec4/core";import{Fqn as Xn,FqnExpr as Zn,FqnRef as M,GlobalFqn as Qn,LikeC4Styles as $n,LinkedList as er,RelationExpr as tr,RichText as nr,_layout as rr,_stage as ir,_type as ar,ancestorsFqn as or,applyManualLayout as sr,calcDriftsFromSnapshot as cr,exact as lr,extractStep as ur,invariant as N,isAncestor as dr,isAndOperator as fr,isAnyOf as pr,isAutoLayoutDirection as mr,isDeploymentNode as hr,isDeploymentView as gr,isDynamicView as _r,isElementView as vr,isGlobalFqn as yr,isNonEmptyArray as br,isOrOperator as xr,isSameHierarchy as Sr,nameFromFqn as Cr,nonNullable as wr,nonexhaustive as P,preferSummary as Tr,splitGlobalFqn as Er}from"@likec4/core";import{LikeC4Styles as Dr,ThemeColors as Or,assignTagColors as kr,computeColorValues as Ar}from"@likec4/core/styles";import{Fqn as jr,FqnExpr as Mr,FqnRef as F,_stage as Nr,_type as Pr,exact as Fr,isAnyOf as Ir,isExtendsElementView as Lr}from"@likec4/core/types";import{DefaultMap as Rr,DefaultWeakMap as zr,MultiMap as Br,ancestorsFqn as Vr,compareFqnHierarchically as Hr,compareNatural as Ur,compareNaturalHierarchically as Wr,delay as Gr,hierarchyDistance as Kr,ifilter as qr,invariant as I,isNonEmptyArray as Jr,isSameHierarchy as Yr,isString as Xr,memoizeProp as Zr,nameFromFqn as Qr,nonNullable as $r,nonexhaustive as ei,objectHash as ti,onNextTick as ni,parentFqn as ri,promiseNextTick as ii,sortNaturalByFqn as ai,sortParentsFirst as oi,stringHash as si,toArray as ci}from"@likec4/core/utils";import{BBox as li,Vector as ui}from"@likec4/core/geometry";import{Graph as di}from"@likec4/core/utils/graphology";import{Graphviz as fi}from"@hpcc-js/wasm-graphviz";import pi,{SubprocessError as mi}from"nano-spawn";import hi from"node:os";import{isColorSupported as gi,isDevelopment as _i}from"std-env";import{bundleRequire as vi}from"bundle-require";import{formatMessagesSync as yi}from"esbuild";import*as bi from"node:fs/promises";import{unlink as xi,writeFile as Si}from"node:fs/promises";import{basename as Ci,dirname as wi,resolve as Ti}from"node:path";import{fdir as Ei}from"fdir";import{mkdirSync as Di,statSync as Oi}from"node:fs";import ki from"chokidar";import{computeAdhocView as Ai,computeProjectsView as ji,computeView as Mi,resolveRulesExtendedViews as Ni}from"@likec4/core/compute-view";const Pi=e=>e.split(`
2
+ `).map(e=>e.trim().replace(`file://`,``));function Fi(e,t=2){e=Array.isArray(e)?e:e.split(`
3
+ `);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
4
+ `)}function L(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=Ie(e);if(t.stack){let e=Pi(t.stack);return t.message+`
5
+ `+Fi(e.slice(1))}return t.message}return Le(e,{indentation:` `})}function Ii(e,t){return Fe(e,t)}function Li(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=Ie(t);return e.stack&&=Pi(e.stack).join(`
6
+ `),[e]}return e===`error`||e===`err`?[Error(L(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function Ri(e){let t=Li(e);return t&&typeof e.rawMessage==`string`?Fe(t,e.rawMessage+`
7
+ `):t}function zi(e,t=!1){let n=Li(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
8
+ `+Fi(n.stack.split(`
9
+ `).slice(1))),t&&(r=`${Gi.red}${r}${Wi}`),{...e,message:e.message+`
10
+ `+Fi(r)}}return e}const Bi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function Vi(){return Ui({format:({message:e})=>e})}const Hi=e=>Bi[e];function Ui(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return je({timestamp:`time`,level:Hi,category:`.`,...e,format:e=>t(zi(e))})}const Wi=`\x1B[0m`,Gi={red:`\x1B[31m`};function Ki(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return Ne({timestamp:`time`,level:Hi,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(zi(e,!0))})}function qi(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 Ji(e){return Me({formatter:qi(),...e})}function Yi(e){let t=e?.formatter??qi();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const Xi=Ae(`likec4`);function Zi(e){return Xi.getChild(e)}function Qi(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:Ji(),...t};Pe({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)}}en();var $i=class{langium;logger;constructor(e,t=Xi){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:
11
+ ${e.map(e=>` - ${e.folder.fsPath}`).join(`
12
+ `)}
13
+
14
+ 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 x(this.languageServices.projects(),we(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return this.LangiumDocuments.all.toArray().flatMap(e=>(e.diagnostics??[]).filter(e=>e.severity===Xt.Error).map(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.all.some(e=>e.diagnostics?.some(e=>e.severity===Xt.Error)??!1)}printErrors(){let e=!1;for(let t of this.LangiumDocuments.all){let n=t.diagnostics?.filter(e=>e.severity===1);if(n&&n.length>0){e=!0;let r=n.flatMap(e=>{let t=e.range.start.line,n=e.message.split(`
15
+ `);return n.length>10&&(n.length=10,n.push(`...`)),n.map((e,n)=>n===0?` `+Be.dim(`Line ${t}: `)+Be.red(e):` `.repeat(10)+Be.red(e))}).join(`
16
+ `);this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}}return e}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const ea={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,mcp:!1,configureLogger:!1,logLevel:void 0},ta=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
17
+ `)}`);async function na(e,t=Xi,n){let r=new $i(e,t);return(n?.throwIfInvalid??ea.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(ta(r))):((n?.printErrors??ea.printErrors)&&r.hasErrors()&&r.printErrors(),r)}async function ra(e,t,n,r){let i=T.from({scheme:`virtual`,path:`/workspace`}),a={name:`virtual`,uri:i.toString()},o=e.shared.workspace.WorkspaceManager;o.initialize({capabilities:{},processId:null,rootUri:a.uri,workspaceFolders:[a]}),await o.initializeWorkspace([a]);let s=e.shared.ServiceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),[c,l]=ye(u(n),([e])=>Ze(e));for(let[n,r]of c){let a=C.joinPath(i,n);try{await e.shared.workspace.ProjectsManager.registerProject({configUri:a,config:Ye.parse(r)})}catch(e){t.error(L(e))}}let d=b(l,x(([t,n])=>{s.includes(ze(t))||(t+=`.c4`);let r=C.joinPath(i,t);return e.shared.workspace.LangiumDocuments.createDocument(r,n)}));return await e.shared.workspace.DocumentBuilder.build(d,{validation:!0}),na(e,t,r)}const ia={top:50,right:40,bottom:40,left:40};function aa(e,t){let n=e.nodes.map(e=>{let n=t.nodes[e.id];if(!n)return e;let{x:r,y:i,width:a,height:o}=n;return{...e,width:a,height:o,x:r,y:i}}),r=e.edges.map(e=>{let n=t.edges[e.id];return n?{...e,...n}:e});return{...e,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},nodes:n,edges:r}}function oa(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(e.hash===t.hash||da(e,t))return la(e.nodes.filter(e=>!e.parent),n,t),aa(e,t);e.hasLayoutDrift=!0;let r=li.merge(...e.nodes.map(e=>t.nodes[e.id]).filter(e=>!!e));return e.nodes.filter(e=>e.parent==null).reduce((e,r)=>sa(r,e,n,t),{x:r.x,y:r.y+r.height+100}),e.edges.filter(e=>!t.edges[e.id]).forEach(e=>ca(e,t)),aa(e,t)}function sa(e,t,n,r){let i=r.nodes[e.id],a=i?.isCompound??!1,o=!i,s=o?t:{x:i.x,y:i.y},c=e.children.map(e=>r.nodes[e]).filter(e=>!!e),l=c.length>0&&li.merge(...c),u=a&&l?{x:l.x,y:l.y+l.height+100}:{x:s.x+ia.left,y:s.y+ia.top};return e.children.map(e=>n.get(e)).reduce((e,t)=>sa(t,e,n,r),u),i=e.children.length>0?ua(e,r):r.nodes[e.id]??{isCompound:!1,width:e.width,height:e.height,x:s.x,y:s.y},r.nodes[e.id]=i,o?{x:i.x+i.width+100,y:i.y}:t}function ca(e,t){let n=t.nodes[e.source],r=t.nodes[e.target],i=fa(li.center(n)),a=fa(li.center(r)),o=a.subtract(i),{x:s,y:c}=o.divide(2).add(i),l={...e?.labelBBox??{width:0,height:0},x:s,y:c},u=o.multiply(.7).add(i),d=o.multiply(.3).add(i);t.edges[e.id]={points:[[i.x,i.y],[d.x,d.y],[u.x,u.y],[a.x,a.y]],labelBBox:l,controlPoints:[u]}}function la(e,t,n){e.filter(e=>e.children.length>0).forEach(e=>{la(e.children.map(e=>t.get(e)).filter(e=>!!e),t,n),n.nodes[e.id]=ua(e,n)})}function ua(e,t){let n=li.merge(...e.children.map(e=>t.nodes[e]));return{isCompound:!0,x:n.x-ia.left,y:n.y-ia.top,width:n.width+ia.left+ia.right,height:n.height+ia.top+ia.bottom}}function da(e,t){let n=e=>e.children.length>0;return ln(e.autoLayout,t.autoLayout)&&e.nodes.every(e=>{let r=t.nodes[e.id];return!!r&&n(e)===r.isCompound})&&e.edges.every(e=>!!t.edges[e.id])}function fa({x:e,y:t}){return new ui(e,t)}function pa(e){return e.children.length>0}function ma(e){switch(e){case`open`:return`vee`;default:return e}}function ha(e){return Array.isArray(e)?[ha(e[0]),ha(e[1])]:(I(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const ga=e=>(I(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),R=e=>Math.ceil(e/72*1e3)/1e3,_a=e=>Math.ceil(e);_a(40).toString();function va(e,t){return hn(gn(e,{l:-35-5*t,s:-15-5*t}))}function ya(e){return hn(mn(e,.3))}var ba=e(pn(),1);function xa(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Sa(e,{maxchars:t,maxLines:n,sanitize:r=s()}){let i=(0,ba.default)(e,{width:t,indent:``,escape:r}).split(`
18
+ `);return fe(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Ca({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Sa(e,{maxchars:t,maxLines:r,sanitize:xa}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${_a(n)}"${s}>${o}</FONT>`}function wa(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:ei(e)}}function Ta(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),a=t.colors(e.color).elements,o=[`sm`,`xs`].includes(n),s=i(e.icon),c=e.style.iconPosition??`left`,l=s&&(c===`left`||c===`right`),u=[Ca({text:e.title,fontsize:r.textSize,maxchars:wa(n),maxLines:o?1:3})];if(n!==`xs`){i(e.technology?.trim())&&u.push(Ca({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:l?35:45,maxLines:1,color:a.loContrast}));let t=nr.from(e.description).text;t&&u.push(Ca({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:l?35:45,maxLines:o?3:5,color:a.loContrast}))}if(u.length===1&&s===!1)return`<${u[0]}>`;let d=l?(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),c===`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>`,f=u.map(d).join(``);if(s&&(c===`top`||c===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;f=c===`top`?`${e}${f}`:`${f}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${f}</TABLE>>`}function Ea(e,t){let n=Ca({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 Da=`BGCOLOR="${$n.DEFAULT.relationshipColors.labelBg}A0"`;function Oa({label:e,technology:t}){let n=[];return i(e?.trim())&&n.push(Ca({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),i(t?.trim())&&n.push(Ca({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Da}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function ka(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Da}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${_a(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return i(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Da} CELLPADDING="3">`,Ca({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Aa=`dashed`,ja=`Arial`,Ma=Zi(`dot`),Na=50.1;var Pa=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new di({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(pa).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=Kr(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(pa(e))t(e,i);else{let t=$r(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(pa(t))a(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 fn(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=dn({[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]:R(e.nodeSep??110),[D.ranksep]:R(e.rankSep??120),[D.pad]:R(15),[D.fontname]:ja});return t.attributes.graph.apply({[D.fontsize]:_a(this.styles.fontSize()),[D.labeljust]:e.direction===`RL`?`r`:`l`,[D.labelloc]:e.direction===`BT`?`b`:`t`,[D.margin]:Na}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[D.fontname]:ja,[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]:ja,[D.fontsize]:_a(14),[D.penwidth]:_a(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=pa(e),n=Qr(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=Qr(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){I(pa(e),`node should be compound`),I(o(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,i=ya(r.loContrast);return t.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.likec4_depth]:e.depth,[D.fillcolor]:va(r.fill,e.depth),[D.color]:va(r.stroke,e.depth),[D.style]:`filled`,[D.margin]:_a(e.children.length>1?40:32)}),n(e.title.trim())||t.set(D.label,Ea(e,i)),t}elementToNode(e,t){I(!pa(e),`node should not be compound`);let n=i(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:a,sizes:{width:o,height:s}}}=this.styles.nodeSizes(e.style),c=n?8:a;switch(t.attributes.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.label]:Ta(e,this.styles),[D.margin]:`${R(c)},${R(a)}`}),t.attributes.set(D.width,R(o)),t.attributes.set(D.height,R(s)),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]:`${R(c)},${R(0)}`,[D.penwidth]:_a(2),[D.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[D.margin]:`${R(n?c:c+4)},${R(a+6)}`});break;case`mobile`:t.attributes.apply({[D.margin]:`${R(n?c:c+4)},${R(a)}`});break;case`queue`:t.attributes.apply({[D.width]:R(o),[D.height]:R(s-8),[D.margin]:`${R(n?c:c+4)},${R(a)}`});break;case`component`:t.attributes.apply({[D.width]:R(o+10),[D.margin]:`${R(c+20)},${R(a)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!pa(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return pa(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 $r(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]:(I(pa(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,I(i,`subgraph ${e} not found`),n=$r(t(this.leafElements(e)),`leaf element in ${e} not found`),r=$r(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 b(this.descendants(e),l(e=>g(e.inEdges,e.outEdges)),be(),re(g(t.inEdges,t.outEdges)),x(e=>this.view.edges.find(t=>t.id===e)),S(i))}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=b(this.view.nodes,S(pa),x(e=>e.id),ve(Hr),xe(),x(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),ae(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=$r(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=$r(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){Ma.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=R(i.center.x)+n,o=R(e-i.center.y);i.fixedsize?t.attributes.apply({[D.pos]:`${a},${o}!`,[D.pin]:!0,[D.width]:R(i.fixedsize.width),[D.height]:R(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}},Fa=class extends Pa{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(D.TBbalance),e.apply({[D.nodesep]:R(t.nodeSep??130),[D.ranksep]:R(t.rankSep??130)}),e}postBuild(e){b(this.view.nodes,x(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),_(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Se(),x(e=>e),te(t=>{t.length<2||e.subgraph({[D.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node($r(n).id)})}),de(()=>{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,_a(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>De(e)),[s,c,l]=this.edgeEndpoint(r,ne),u=m(l)||m(o),d=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Aa});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=Oa(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[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return h===`none`&&g===`none`?(d.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[D.arrowhead]:ma(h),[D.arrowtail]:ma(e.tail??h),[D.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(D.constraint,!1),d):(h&&d.attributes.set(D.arrowhead,ma(h)),g!==`none`&&d.attributes.set(D.arrowtail,ma(g)),d)}},Ia=class extends Pa{postBuild(e){e.delete(D.TBbalance),e.set(D.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,a]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[o,s,c]=this.edgeEndpoint(r,e=>De(e)),[l,u,d]=this.edgeEndpoint(a,ne),f=t.edge([s,u],{[D.likec4_id]:e.id,[D.style]:e.line??Aa});if(d&&f.attributes.set(D.lhead,d),c&&f.attributes.set(D.ltail,c),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 p=[e.label?.trim(),e.technology?.trim()].filter(i).join(`
19
+ `),m=ka(ur(e.id),p);f.attributes.set(D.label,m);let h=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===a)<h&&e.dir!==`back`&&f.attributes.apply({[D.minlen]:0});let[g,_]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(f.attributes.apply({[D.arrowtail]:ma(g),[D.dir]:`back`}),_!==`none`&&f.attributes.apply({[D.arrowhead]:ma(_),[D.minlen]:0}),f):g===`none`&&_===`none`||g!==`none`&&_!==`none`?(f.attributes.apply({[D.arrowhead]:ma(g),[D.arrowtail]:ma(_),[D.dir]:`both`}),f):g===`none`?(f.attributes.delete(D.arrowhead),f.attributes.apply({[D.arrowtail]:ma(_),[D.minlen]:0,[D.dir]:`back`}),f):(f.attributes.set(D.arrowhead,ma(g)),f)}};const La=Zi(`dot.rank`);var Ra=class extends Pa{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(pa(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=b(e.children,S(e=>!this.compoundIds.has(e)),x(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=$r(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;ce(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,La.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=>De(e)),[s,c,l]=this.edgeEndpoint(r,ne),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Aa});l&&f.attributes.set(D.lhead,l),o&&f.attributes.set(D.ltail,o);let p=m(l)||m(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(D.weight,d.weight);let h=Oa(e);if(h&&f.attributes.set(p?D.xlabel:D.label,h),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[g,_]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[D.arrowtail]:ma(g),[D.dir]:`back`}),_!==`none`&&f.attributes.apply({[D.arrowhead]:ma(_),[D.dir]:`both`,[D.minlen]:0}),f;if(g===`none`&&_===`none`)return f.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`,[D.minlen]:0,[D.constraint]:!1}),f;if(g!==`none`&&_!==`none`)return f.attributes.apply({[D.arrowhead]:ma(g),[D.arrowtail]:ma(_),[D.dir]:`both`}),f;if(f.attributes.set(D.arrowhead,ma(g)),_!==`none`&&f.attributes.set(D.arrowtail,ma(_)),this.view.edges.length===1)return f;let v;return v=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 pa(n)||pa(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)),v.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(D.minlen,0),f}};function za(e){let[t,n,r,i]=e?e.split(`,`).map(e=>ha(+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 Ba(e){try{let[t,n]=e.split(`,`);return{x:ha(parseFloat(t)),y:ha(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function Va(e){let{x:t,y:n}=Ba(e.pos),r=ga(parseFloat(e.width)),i=ga(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function Ha(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=ha(c.size);continue}if(c.op===`T`){let e=ha(c.pt[0])-t,l=ha(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=ha(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return Xi.warn(`Failed on parsing label draw ops:
20
+ {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 Ua({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);I(y(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&Xi.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>ha(e));return I(y(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 Wa(e,{id:t,source:n,target:r,dir:a,label:o,description:s,...c},l){let u=Ha(e._ldraw_??e._tldraw_??e._hldraw_),d=e.dir===`back`||a===`back`;return o=o&&u?Sa(o,{maxchars:40,maxLines:5}).join(`
21
+ `):null,{id:t,source:n,target:r,label:o,...i(s)&&{description:s},points:Ua(e,l),labelBBox:u,...d?{dir:`back`}:{},...c}}function Ga(e,t){let n=za(e.bb),{nodes:r,edges:i,hasManualLayout:a,manualLayout:o,...s}=t,c=[],l=[],u;if(u=s._type===`dynamic`?{...s,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[ir]:`layouted`,bounds:n,nodes:c,edges:l}:{...s,[ir]:`layouted`,bounds:n,nodes:c,edges:l},a){let e=u;e[rr]=`auto`}let d=e.objects??[];for(let e of r){let t=d.find(t=>t.likec4_id===e.id);I(t,`View ${s.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?za(t.bb):Va(t),o=[n,r];c.push({...e,x:n,y:r,width:i,height:a,labelBBox:Ha(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 f=e.edges??[];for(let e of i){let t=f.find(t=>t.likec4_id===e.id);if(!t){Xi.warn`View ${s.id} edge ${e.id} not found in graphviz output, skipping`;continue}l.push(Wa(t,e,s.id))}return u}function Ka(e,t){return Ga(e,t)}var qa=class e extends Pa{static toDot(t){return new e(t).print()}constructor(e){super(e,Dr.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[D.nodesep]:R(100),[D.ranksep]:R(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=$r(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=$r(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??Aa});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(D.weight,i.weight);let o=Oa(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 Ja=_n(1);var Ya=class e{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){fi.unload()}[Symbol.dispose](){this.dispose()}async attempt(t,n,r){return await Ja(async()=>{let i=Xi.getChild([`graphviz`,`wasm`,t,me(4)]);try{i.trace`execute`;let t=await r();return++e.opsCount>=20&&(e.opsCount=0,i.trace`reached 20 operations, unloading wasm`,fi.unload()),t}catch(t){i.debug(`FAILED DOT`,{dot:n}),i.error(L(t)),e.opsCount=0,fi.unload()}i.warn(`Retrying...`);try{return await Gr(30,300),await r()}catch(e){return i.error(L(e)),Promise.reject(e)}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await fi.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 fi.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await fi.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await fi.load()).layout(e,`svg`))}};const Xa=({view:e,styles:t})=>{switch(!0){case _r(e):return new Ia(e,t);case gr(e):return new Fa(e,t);case vr(e):return new Ra(e,t);default:ei(e)}},Za=Xi.getChild(`layouter`);var Qa=class{graphviz;constructor(e){this.graphviz=e??new Ya,Za.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,Za.trace`change port to ${this.graphviz.name}`}async dotToJson(e){let t=Za.getChild([`dotToJson`,me(3)]),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(L(n)),t.error`Failed to convert DOT to JSON:\n${e}`,n}try{return JSON.parse(n)}catch(r){throw t.error(L(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=Za.getChild([`layout`,me(3)]);try{t.debug`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=Ga(await this.dotToJson(n),r);return r.manualLayout&&(i=oa(i,r.manualLayout)),_r(i)&&Object.assign(i,{sequenceLayout:un(i)}),n=n.split(`
22
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Na}`))).join(`
23
+ `),t.debug`layouting view ${e.view.id} done`,{dot:n,diagram:i}}catch(n){throw t.warn(L(n)),Ii(n,`Error during layout: ${e.view.id}`)}}async svg(e){let t=await this.dot(e);return t=t.split(`
24
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Na}`))).join(`
25
+ `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=Za.getChild([`dot`,me(3)]);t.trace`generating dot for view ${e.view.id}`;let n=Xa(e).print();if(!vr(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=Za.getChild([`layoutProjectsView`,me(3)]);t.debug`layouting projects overview...`;let n=new qa(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`,Ka(r,e)}};const $a=Xi.getChild([`layouter-queue`]);var eo=class extends Qa{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new vn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=$a.getChild([`run`,me(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await ii(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),$a.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,$a.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=$a.getChild([`batch`,me(3)]);if(this.isProcessingBatch)return t.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await ii(),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 ii(),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=$a){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()}},to=e(yn(),1);const no=Xi.getChild([`graphviz`,`binary`]);var ro=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,hi.availableParallelism()-2)}get dotpath(){return this._dotpath??Zr(this,`_dotpath`,()=>{let e=to.default.sync(`dot`);return no.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??Zr(this,`_unflattenpath`,()=>{let e=to.default.sync(`unflatten`);return no.debug`Found ${e}`,e})}async unflatten(e){let t,r=no.getChild([`unflatten`,me(4)]);try{let i=await pi(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=i.stdout,n(i.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:i.command,durationMs:Math.round(i.durationMs)}):r.warn(`{command} has stderr:
26
+ `+i.stderr,{command:i.command})}catch(i){r.debug(`FAILED DOT`,{dot:e}),r.error(L(i)),i instanceof mi&&!n(i.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
27
+ {stderr}`,{command:i.command,exitCode:i.exitCode,stderr:i.stderr}),t=i.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=no.getChild([`layoutJson`,me(4)]),r;try{let i=await pi(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=i.stdout,n(i.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:i.command,durationMs:Math.round(i.durationMs)}):t.warn(`{command} has stderr:
28
+ `+i.stderr,{command:i.command})}catch(i){if(t.debug(`FAILED DOT`,{dot:e}),t.error(L(i)),i instanceof mi&&!n(i.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
29
+ {stderr}`,{command:i.command,exitCode:i.exitCode,stderr:i.stderr}),r=i.stdout;else throw i}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=no.getChild([`svg`,me(4)]),r;try{let i=await pi(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=i.stdout,n(i.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:i.command,durationMs:Math.round(i.durationMs)}):t.warn(`{command} has stderr:
30
+ `+i.stderr,{command:i.command})}catch(i){if(t.debug(`FAILED DOT`,{dot:e}),t.error(L(i)),i instanceof mi&&!n(i.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
31
+ {stderr}`,{command:i.command,exitCode:i.exitCode,stderr:i.stderr}),r=i.stdout;else throw i}return r}};const z=Xi.getChild(`server`);function B(e){z.warn(L(e))}function io(e){let t=Vi();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=Ri(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 ao({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=_i?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!_i;Qi({reset:!0,sinks:{console:n?Yi({formatter:Ui()}):Ji({formatter:a?Ki():Ui(),nonBlocking:i}),...o&&{telemetry:io(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),z.trace(`logger configured`)}const oo=Qe.pick({extends:!0,styles:!0}).loose(),so=e=>e?Array.isArray(e)?e:[e]:[],co=async e=>{let t=await bi.readFile(e,`utf-8`),n;try{n=Ve.parse(t.trim()||`{}`)}catch(t){throw Ii(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=oo.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+He.prettifyError(r.error));return r.data},lo=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 co(e),r=so(n.extends),i=[...t,e],a=[];for(let t of r){let n=Ti(wi(e),t);a.push(...await lo(n,i))}return[...a,n]};async function uo(e){e=typeof e==`string`?e:e.fsPath,Xi.getChild(`config`).debug`Loading config: ${e}`;let t=wi(e),n=Ci(e),r={name:Ci(t)};if(Ze(n)){let t=await lo(Ti(e),[]);N(y(t,1),`Expect at least one config`);let n=ie(De(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(m),a=i.length>0?Re({},...i.reverse()):void 0;return Je({...r,...n,...a?{styles:a}:{}})}N(qe(n),`Invalid name for config file: ${e}`);let{mod:i}=await vi({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=yi(e.errors,{kind:`error`});for(let e of t)Xi.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
32
+ // Mock implementation to allow loading config files without bundling @likec4/config
33
+ function mock(x) { return x }
34
+ export {
35
+ mock as defineConfig,
36
+ mock as defineGenerators,
37
+ mock as defineStyle,
38
+ mock as defineTheme,
39
+ mock as defineThemeColor,
40
+ }`,loader:`js`}))}}]}});return Je(Object.assign(r,i?.default??i))}const fo=[`likec4lib {`,` icons {`,...[...Object.entries({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(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
41
+ `),po=`likec4builtin`,mo=`${po}:///likec4/lib/icons.c4`;function ho(e){return(`uri`in e?e.uri:e).scheme===po}function go(e){return!ho(e)}en();const _o=z.getChild(`manual-layouts`),vo=e=>e.endsWith(`.likec4.snap`);function yo(e){return`${e}.likec4.snap`}function bo(e){return C.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const xo={manualLayouts:e=>new Co(e)},So=`file://./`;var Co=class{cache;constructor(e){this.services=e,this.cache=new Bt,ni(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async read(e){return await this.cache.get(e.id,async()=>{let t=_o.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=bo(e),i=[];try{let a=await n.scanDirectory(r,vo);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=Ve.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.debug`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=h(i,we(`id`));return{hash:ti(a),views:a}})}async write(e,t){this.cache.delete(e.id);let n=_o.getChild(e.id),r=bo(e),i=C.joinPath(r,yo(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=Ve.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:bt.create(xt.create(0,0),xt.create(a.split(`
42
+ `).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+`
43
+ `)}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=_o.getChild(e.id),r=bo(e),i=C.joinPath(r,yo(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:bt.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}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){_o.trace`clear caches`,this.cache.clear()}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=T.parse(e.icon),r=C.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${So}${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(So)){let n=e.icon.substring(9),r=C.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const wo=`AnyProperty`;function To(e){return H.isInstance(e,wo)}const Eo=`ColorLiteral`;function Do(e){return H.isInstance(e,Eo)}const Oo=`DeploymentElement`;function ko(e){return H.isInstance(e,Oo)}const Ao=`DeploymentNodeOrElementKind`,jo=`DeploymentViewRule`;function Mo(e){return H.isInstance(e,jo)}const No=`DynamicViewProperty`,Po=`DynamicViewRule`;function Fo(e){return H.isInstance(e,Po)}const Io=`DynamicViewStep`;function Lo(e){return H.isInstance(e,Io)}const Ro=`ElementProperty`;function zo(e){return H.isInstance(e,Ro)}const Bo=`ExpressionV2`;function Vo(e){return H.isInstance(e,Bo)}const Ho=`ExtendElementProperty`,Uo=`ExtendRelationProperty`,Wo=`FqnExpr`;function Go(e){return H.isInstance(e,Wo)}const Ko=`FqnExprOrWhere`;function qo(e){return H.isInstance(e,Ko)}const Jo=`FqnExprOrWith`;function Yo(e){return H.isInstance(e,Jo)}const Xo=`FqnReferenceable`,Zo=`LikeC4View`;function Qo(e){return H.isInstance(e,Zo)}const $o=`MetadataProperty`;function es(e){return H.isInstance(e,$o)}const ts=`MetadataValue`,ns=`ModelReferenceable`,rs=`Referenceable`,is=`RelationExpr`;function as(e){return H.isInstance(e,is)}const os=`RelationExprOrWhere`;function ss(e){return H.isInstance(e,os)}const cs=`RelationExprOrWith`;function ls(e){return H.isInstance(e,cs)}const us=`RelationProperty`,ds=`RelationshipStyleProperty`;function fs(e){return H.isInstance(e,ds)}const ps=`SizeProperty`;function ms(e){return H.isInstance(e,ps)}const hs=`StringProperty`;function gs(e){return H.isInstance(e,hs)}const _s=`StyleProperty`;function vs(e){return H.isInstance(e,_s)}const ys=`ViewProperty`;function bs(e){return H.isInstance(e,ys)}const xs=`ViewRule`;function Ss(e){return H.isInstance(e,xs)}const Cs=`ViewRuleStyleOrGlobalRef`;function ws(e){return H.isInstance(e,Cs)}const Ts=`WhereElement`;function Es(e){return H.isInstance(e,Ts)}const Ds=`WhereElementExpression`;function Os(e){return H.isInstance(e,Ds)}const ks=`WhereExpression`,As=`WhereKindEqual`;function js(e){return H.isInstance(e,As)}const Ms=`WhereRelation`;function Ns(e){return H.isInstance(e,Ms)}const Ps=`WhereRelationExpression`;function Fs(e){return H.isInstance(e,Ps)}const Is=`WhereTagEqual`;function Ls(e){return H.isInstance(e,Is)}const Rs=`AbstractDynamicStep`,zs=`ArrowProperty`;function Bs(e){return H.isInstance(e,zs)}const Vs=`BorderProperty`;function Hs(e){return H.isInstance(e,Vs)}const Us=`ColorProperty`;function Ws(e){return H.isInstance(e,Us)}const Gs=`CustomColor`,Ks=`CustomElementProperties`;function qs(e){return H.isInstance(e,Ks)}const Js=`CustomRelationProperties`;function Ys(e){return H.isInstance(e,Js)}const Xs=`DeployedInstance`;function Zs(e){return H.isInstance(e,Xs)}const Qs=`DeployedInstanceBody`;function $s(e){return H.isInstance(e,Qs)}const ec=`DeploymentNode`;function tc(e){return H.isInstance(e,ec)}const nc=`DeploymentNodeBody`;function rc(e){return H.isInstance(e,nc)}const ic=`DeploymentNodeKind`;function ac(e){return H.isInstance(e,ic)}const oc=`DeploymentRelation`;function sc(e){return H.isInstance(e,oc)}const cc=`DeploymentRelationBody`;function lc(e){return H.isInstance(e,cc)}const uc=`DeploymentView`;function dc(e){return H.isInstance(e,uc)}const fc=`DeploymentViewBody`;function pc(e){return H.isInstance(e,fc)}const mc=`DeploymentViewRulePredicate`;function hc(e){return H.isInstance(e,mc)}const gc=`DeploymentViewRuleStyle`;function _c(e){return H.isInstance(e,gc)}const vc=`DirectedRelationExpr`;function yc(e){return H.isInstance(e,vc)}const bc=`DynamicView`;function xc(e){return H.isInstance(e,bc)}const Sc=`DynamicViewBody`;function Cc(e){return H.isInstance(e,Sc)}const wc=`DynamicViewDisplayVariantProperty`;function Tc(e){return H.isInstance(e,wc)}const Ec=`DynamicViewGlobalPredicateRef`;function Dc(e){return H.isInstance(e,Ec)}const Oc=`DynamicViewIncludePredicate`;function kc(e){return H.isInstance(e,Oc)}const Ac=`DynamicViewParallelSteps`;function jc(e){return H.isInstance(e,Ac)}const Mc=`DynamicViewRef`,Nc=`Element`;function V(e){return H.isInstance(e,Nc)}const Pc=`ElementBody`;function Fc(e){return H.isInstance(e,Pc)}const Ic=`ElementKind`;function Lc(e){return H.isInstance(e,Ic)}const Rc=`ElementKindExpression`;function zc(e){return H.isInstance(e,Rc)}const Bc=`ElementRef`;function Vc(e){return H.isInstance(e,Bc)}const Hc=`ElementStringProperty`;function Uc(e){return H.isInstance(e,Hc)}const Wc=`ElementStyleProperty`;function Gc(e){return H.isInstance(e,Wc)}const Kc=`ElementTagExpression`;function qc(e){return H.isInstance(e,Kc)}const Jc=`ElementView`;function Yc(e){return H.isInstance(e,Jc)}const Xc=`ElementViewBody`;function Zc(e){return H.isInstance(e,Xc)}const Qc=`ElementViewRef`,$c=`Expressions`;function el(e){return H.isInstance(e,$c)}const tl=`ExtendDeployment`;function nl(e){return H.isInstance(e,tl)}const rl=`ExtendDeploymentBody`;function il(e){return H.isInstance(e,rl)}const al=`ExtendElement`;function ol(e){return H.isInstance(e,al)}const sl=`ExtendElementBody`;function cl(e){return H.isInstance(e,sl)}const ll=`ExtendRelation`;function ul(e){return H.isInstance(e,ll)}const dl=`ExtendRelationBody`;function fl(e){return H.isInstance(e,dl)}const pl=`FqnExpressions`;function ml(e){return H.isInstance(e,pl)}const hl=`FqnExprWhere`;function gl(e){return H.isInstance(e,hl)}const _l=`FqnExprWith`;function vl(e){return H.isInstance(e,_l)}const yl=`FqnRef`;function bl(e){return H.isInstance(e,yl)}const xl=`FqnRefExpr`;function Sl(e){return H.isInstance(e,xl)}const Cl=`GlobalDynamicPredicateGroup`;function wl(e){return H.isInstance(e,Cl)}const Tl=`GlobalPredicateGroup`;function El(e){return H.isInstance(e,Tl)}const Dl=`Globals`;function Ol(e){return H.isInstance(e,Dl)}const kl=`GlobalStyle`;function Al(e){return H.isInstance(e,kl)}const jl=`GlobalStyleGroup`;function Ml(e){return H.isInstance(e,jl)}const Nl=`GlobalStyleId`,Pl=`HexColor`;function Fl(e){return H.isInstance(e,Pl)}const Il=`IconColorProperty`;function Ll(e){return H.isInstance(e,Il)}const Rl=`IconPositionProperty`;function zl(e){return H.isInstance(e,Rl)}const Bl=`IconProperty`;function Vl(e){return H.isInstance(e,Bl)}const Hl=`IconSizeProperty`;function Ul(e){return H.isInstance(e,Hl)}const Wl=`Imported`;function Gl(e){return H.isInstance(e,Wl)}const Kl=`ImportsFromPoject`;function ql(e){return H.isInstance(e,Kl)}const Jl=`IncomingRelationExpr`;function Yl(e){return H.isInstance(e,Jl)}const Xl=`InOutRelationExpr`;function Zl(e){return H.isInstance(e,Xl)}const Ql=`LibIcon`;function $l(e){return H.isInstance(e,Ql)}const eu=`LikeC4Grammar`;function tu(e){return H.isInstance(e,eu)}const nu=`LikeC4Lib`;function ru(e){return H.isInstance(e,nu)}const iu=`LineProperty`;function au(e){return H.isInstance(e,iu)}const ou=`LinkProperty`;function su(e){return H.isInstance(e,ou)}const cu=`MarkdownOrString`;function lu(e){return H.isInstance(e,cu)}const uu=`MetadataArray`;function du(e){return H.isInstance(e,uu)}const fu=`MetadataAttribute`;function pu(e){return H.isInstance(e,fu)}const mu=`MetadataBody`;function hu(e){return H.isInstance(e,mu)}const gu=`Model`;function _u(e){return H.isInstance(e,gu)}const vu=`ModelDeployments`;function yu(e){return H.isInstance(e,vu)}const bu=`ModelViews`;function xu(e){return H.isInstance(e,bu)}const Su=`MultipleProperty`;function Cu(e){return H.isInstance(e,Su)}const wu=`NavigateToProperty`;function Tu(e){return H.isInstance(e,wu)}const Eu=`NotationProperty`;function Du(e){return H.isInstance(e,Eu)}const Ou=`NotesProperty`;function ku(e){return H.isInstance(e,Ou)}const Au=`OpacityProperty`;function ju(e){return H.isInstance(e,Au)}const Mu=`OutgoingRelationExpr`;function Nu(e){return H.isInstance(e,Mu)}const Pu=`PaddingSizeProperty`;function Fu(e){return H.isInstance(e,Pu)}const Iu=`Relation`;function Lu(e){return H.isInstance(e,Iu)}const Ru=`RelationBody`;function zu(e){return H.isInstance(e,Ru)}const Bu=`RelationExprWhere`;function Vu(e){return H.isInstance(e,Bu)}const Hu=`RelationExprWith`;function Uu(e){return H.isInstance(e,Hu)}const Wu=`RelationKindDotRef`;function Gu(e){return H.isInstance(e,Wu)}const Ku=`RelationNavigateToProperty`;function qu(e){return H.isInstance(e,Ku)}const Ju=`RelationshipKind`;function Yu(e){return H.isInstance(e,Ju)}const Xu=`RelationStringProperty`;function Zu(e){return H.isInstance(e,Xu)}const Qu=`RelationStyleProperty`;function $u(e){return H.isInstance(e,Qu)}const ed=`RGBAColor`;function td(e){return H.isInstance(e,ed)}const nd=`ShapeProperty`;function rd(e){return H.isInstance(e,nd)}const id=`ShapeSizeProperty`;function ad(e){return H.isInstance(e,id)}const od=`SpecificationColor`;function sd(e){return H.isInstance(e,od)}const cd=`SpecificationDeploymentNodeKind`;function ld(e){return H.isInstance(e,cd)}const ud=`SpecificationElementKind`;function dd(e){return H.isInstance(e,ud)}const fd=`SpecificationElementStringProperty`;function pd(e){return H.isInstance(e,fd)}const md=`SpecificationRelationshipKind`;function hd(e){return H.isInstance(e,md)}const gd=`SpecificationRelationshipStringProperty`;function _d(e){return H.isInstance(e,gd)}const vd=`SpecificationRule`;function yd(e){return H.isInstance(e,vd)}const bd=`SpecificationTag`;function xd(e){return H.isInstance(e,bd)}const Sd=`StrictFqnElementRef`;function Cd(e){return H.isInstance(e,Sd)}const wd=`StrictFqnRef`;function Td(e){return H.isInstance(e,wd)}function Ed(e){return H.isInstance(e,`Tag`)}const Dd=`TagRef`;function Od(e){return H.isInstance(e,Dd)}const kd=`Tags`;function Ad(e){return H.isInstance(e,kd)}const jd=`TextSizeProperty`;function Md(e){return H.isInstance(e,jd)}const Nd=`ViewRef`,Pd=`ViewRuleAutoLayout`;function Fd(e){return H.isInstance(e,Pd)}const Id=`ViewRuleGlobalPredicateRef`;function Ld(e){return H.isInstance(e,Id)}const Rd=`ViewRuleGlobalStyle`;function zd(e){return H.isInstance(e,Rd)}const Bd=`ViewRuleGroup`;function Vd(e){return H.isInstance(e,Bd)}const Hd=`ViewRulePredicate`;function Ud(e){return H.isInstance(e,Hd)}const Wd=`ViewRuleRank`;function Gd(e){return H.isInstance(e,Wd)}const Kd=`ViewRuleStyle`;function qd(e){return H.isInstance(e,Kd)}const Jd=`ViewStringProperty`;function Yd(e){return H.isInstance(e,Jd)}const Xd=`WhereBinaryExpression`;function Zd(e){return H.isInstance(e,Xd)}const Qd=`WhereElementKind`;function $d(e){return H.isInstance(e,Qd)}const ef=`WhereElementNegation`;function tf(e){return H.isInstance(e,ef)}const nf=`WhereElementTag`;function rf(e){return H.isInstance(e,nf)}const af=`WhereRelationKind`;function of(e){return H.isInstance(e,af)}const sf=`WhereRelationNegation`;function cf(e){return H.isInstance(e,sf)}const lf=`WhereRelationParticipantKind`;function uf(e){return H.isInstance(e,lf)}const df=`WhereRelationParticipantTag`;function ff(e){return H.isInstance(e,df)}const pf=`WhereRelationTag`;function mf(e){return H.isInstance(e,pf)}const hf=`WildcardExpression`;function gf(e){return H.isInstance(e,hf)}const _f=`DynamicStepChain`;function vf(e){return H.isInstance(e,_f)}const yf=`DynamicStepSingle`;function bf(e){return H.isInstance(e,yf)}var xf=class extends wt{getAllTypes(){return[Rs,wo,zs,Vs,Eo,Us,Gs,Ks,Js,Xs,Qs,Oo,ec,nc,ic,Ao,oc,cc,uc,fc,jo,mc,gc,vc,_f,yf,bc,Sc,wc,Ec,Oc,Ac,No,Mc,Po,Io,Nc,Pc,Ic,Rc,Ro,Bc,Hc,Wc,Kc,Jc,Xc,Qc,Bo,$c,tl,rl,al,sl,Ho,ll,dl,Uo,Wo,Ko,Jo,hl,_l,pl,yl,xl,Xo,Cl,Tl,kl,jl,Nl,Dl,Pl,Il,Rl,Bl,Hl,Wl,Kl,Xl,Jl,Ql,eu,nu,Zo,iu,ou,cu,uu,fu,mu,$o,ts,gu,vu,ns,bu,Su,wu,Eu,Ou,Au,Mu,Pu,ed,rs,Iu,Ru,is,os,cs,Bu,Hu,Wu,Ku,us,Xu,Qu,Ju,ds,nd,id,ps,od,cd,ud,fd,md,gd,vd,bd,Sd,wd,hs,_s,`Tag`,Dd,kd,jd,ys,Nd,xs,Pd,Id,Rd,Bd,Hd,Wd,Kd,Cs,Jd,Xd,Ts,Ds,Qd,ef,nf,ks,As,Ms,Ps,af,sf,lf,df,pf,Is,hf]}computeIsSubtype(e,t){switch(e){case zs:case iu:return this.isSubtype(ds,t);case Vs:case Il:case Rl:case Su:case Au:case nd:return this.isSubtype(_s,t);case Us:return this.isSubtype(ds,t)||this.isSubtype(_s,t);case Xs:case ec:return this.isSubtype(Oo,t)||this.isSubtype(rs,t);case ic:case Ic:return this.isSubtype(Ao,t);case uc:case bc:case Jc:return this.isSubtype(Zo,t);case mc:case gc:return this.isSubtype(jo,t);case vc:case Jl:case Xl:case Mu:return this.isSubtype(is,t);case _f:case yf:return this.isSubtype(Rs,t)||this.isSubtype(Io,t);case wc:return this.isSubtype(No,t);case Ec:case Oc:return this.isSubtype(Po,t);case No:case Ro:case wu:case us:case ds:case hs:case _s:return this.isSubtype(wo,t);case Nc:return this.isSubtype(Xo,t)||this.isSubtype(ns,t)||this.isSubtype(rs,t);case Rc:case Kc:case xl:case hf:return this.isSubtype(Wo,t);case Hc:return this.isSubtype(Ro,t)||this.isSubtype(hs,t);case Wc:return this.isSubtype(Ro,t);case tl:case al:case rs:return this.isSubtype(Xo,t);case Wo:case hl:return this.isSubtype(Ko,t);case Ko:case _l:return this.isSubtype(Jo,t);case Jo:case cs:return this.isSubtype(Bo,t);case Pl:case ed:return this.isSubtype(Eo,t);case Bl:return this.isSubtype(Ro,t)||this.isSubtype(_s,t);case Hl:case Pu:case id:case jd:return this.isSubtype(ps,t)||this.isSubtype(_s,t);case Wl:return this.isSubtype(ns,t)||this.isSubtype(rs,t);case ou:return this.isSubtype(Ro,t)||this.isSubtype(Ho,t)||this.isSubtype(Uo,t)||this.isSubtype(us,t)||this.isSubtype(ys,t);case cu:case uu:return this.isSubtype(ts,t);case fu:case fd:case gd:return this.isSubtype(hs,t);case mu:return this.isSubtype($o,t);case $o:return this.isSubtype(Ro,t)||this.isSubtype(Ho,t)||this.isSubtype(Uo,t)||this.isSubtype(us,t);case Eu:case Ou:return this.isSubtype(wo,t)||this.isSubtype(hs,t);case is:case Bu:return this.isSubtype(os,t);case os:case Hu:return this.isSubtype(cs,t);case Ku:case Qu:return this.isSubtype(us,t);case Xu:return this.isSubtype(us,t)||this.isSubtype(hs,t);case ys:return this.isSubtype(wo,t)||this.isSubtype(No,t);case Pd:return this.isSubtype(jo,t)||this.isSubtype(Po,t)||this.isSubtype(xs,t);case Id:case Bd:case Hd:case Wd:return this.isSubtype(xs,t);case Rd:case Kd:return this.isSubtype(Cs,t);case Cs:return this.isSubtype(Po,t)||this.isSubtype(xs,t);case Jd:return this.isSubtype(hs,t)||this.isSubtype(ys,t);case Xd:return this.isSubtype(Ds,t)||this.isSubtype(Ps,t);case Ts:case ef:return this.isSubtype(Ds,t);case Ds:case Ps:return this.isSubtype(ks,t);case Qd:return this.isSubtype(Ts,t)||this.isSubtype(As,t);case nf:return this.isSubtype(Ts,t)||this.isSubtype(Is,t);case Ms:case sf:return this.isSubtype(Ps,t);case af:case lf:return this.isSubtype(As,t)||this.isSubtype(Ms,t);case df:case pf:return this.isSubtype(Ms,t)||this.isSubtype(Is,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 Ju;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Gs;case`DeploymentNode:kind`:return ic;case`DynamicViewGlobalPredicateRef:predicate`:return Cl;case`DynamicViewRef:view`:return bc;case`Element:kind`:case`ElementKindExpression:kind`:return Ic;case`ElementViewRef:view`:return Jc;case`FqnRef:value`:case`StrictFqnRef:value`:return rs;case`IconProperty:libicon`:return Ql;case`Imported:imported`:case`StrictFqnElementRef:el`:return Nc;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Zo;case`ViewRuleGlobalPredicateRef:predicate`:return Tl;case`ViewRuleGlobalStyle:style`:return Nl;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Ao;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Rs:return{name:Rs,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case zs:return{name:zs,properties:[{name:`key`},{name:`value`}]};case Vs:return{name:Vs,properties:[{name:`key`},{name:`value`}]};case Us:return{name:Us,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Gs:return{name:Gs,properties:[{name:`name`}]};case Ks:return{name:Ks,properties:[{name:`props`,defaultValue:[]}]};case Js:return{name:Js,properties:[{name:`props`,defaultValue:[]}]};case Xs:return{name:Xs,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Qs:return{name:Qs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ec:return{name:ec,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case nc:return{name:nc,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ic:return{name:ic,properties:[{name:`name`}]};case oc:return{name:oc,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case cc:return{name:cc,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case uc:return{name:uc,properties:[{name:`body`},{name:`name`}]};case fc:return{name:fc,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case mc:return{name:mc,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case gc:return{name:gc,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case vc:return{name:vc,properties:[{name:`source`},{name:`target`}]};case bc:return{name:bc,properties:[{name:`body`},{name:`name`}]};case Sc:return{name:Sc,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case wc:return{name:wc,properties:[{name:`key`},{name:`value`}]};case Ec:return{name:Ec,properties:[{name:`predicate`}]};case Oc:return{name:Oc,properties:[{name:`exprs`}]};case Ac:return{name:Ac,properties:[{name:`steps`,defaultValue:[]}]};case Mc:return{name:Mc,properties:[{name:`view`}]};case Nc:return{name:Nc,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Pc:return{name:Pc,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Ic:return{name:Ic,properties:[{name:`name`}]};case Rc:return{name:Rc,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Bc:return{name:Bc,properties:[{name:`modelElement`}]};case Hc:return{name:Hc,properties:[{name:`key`},{name:`value`}]};case Wc:return{name:Wc,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Kc:return{name:Kc,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Jc:return{name:Jc,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Xc:return{name:Xc,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Qc:return{name:Qc,properties:[{name:`view`}]};case $c:return{name:$c,properties:[{name:`prev`},{name:`value`}]};case tl:return{name:tl,properties:[{name:`body`},{name:`deploymentNode`}]};case rl:return{name:rl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case al:return{name:al,properties:[{name:`body`},{name:`element`}]};case sl:return{name:sl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ll:return{name:ll,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case dl:return{name:dl,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case pl:return{name:pl,properties:[{name:`prev`},{name:`value`}]};case hl:return{name:hl,properties:[{name:`subject`},{name:`where`}]};case _l:return{name:_l,properties:[{name:`custom`},{name:`subject`}]};case yl:return{name:yl,properties:[{name:`parent`},{name:`value`}]};case xl:return{name:xl,properties:[{name:`ref`},{name:`selector`}]};case Cl:return{name:Cl,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Tl:return{name:Tl,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Dl:return{name:Dl,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case kl:return{name:kl,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case jl:return{name:jl,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Nl:return{name:Nl,properties:[{name:`name`}]};case Pl:return{name:Pl,properties:[{name:`hex`}]};case Il:return{name:Il,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Rl:return{name:Rl,properties:[{name:`key`},{name:`value`}]};case Bl:return{name:Bl,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Hl:return{name:Hl,properties:[{name:`key`},{name:`value`}]};case Wl:return{name:Wl,properties:[{name:`imported`},{name:`prev`}]};case Kl:return{name:Kl,properties:[{name:`imports`},{name:`project`}]};case Jl:return{name:Jl,properties:[{name:`to`}]};case Xl:return{name:Xl,properties:[{name:`inout`}]};case Ql:return{name:Ql,properties:[{name:`name`}]};case eu:return{name:eu,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case nu:return{name:nu,properties:[{name:`icons`,defaultValue:[]}]};case iu:return{name:iu,properties:[{name:`key`},{name:`value`}]};case ou:return{name:ou,properties:[{name:`key`},{name:`title`},{name:`value`}]};case cu:return{name:cu,properties:[{name:`markdown`},{name:`text`}]};case uu:return{name:uu,properties:[{name:`values`,defaultValue:[]}]};case fu:return{name:fu,properties:[{name:`key`},{name:`value`}]};case mu:return{name:mu,properties:[{name:`props`,defaultValue:[]}]};case gu:return{name:gu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case vu:return{name:vu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case bu:return{name:bu,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Su:return{name:Su,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case wu:return{name:wu,properties:[{name:`key`},{name:`value`}]};case Eu:return{name:Eu,properties:[{name:`key`},{name:`value`}]};case Ou:return{name:Ou,properties:[{name:`key`},{name:`value`}]};case Au:return{name:Au,properties:[{name:`key`},{name:`value`}]};case Mu:return{name:Mu,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Pu:return{name:Pu,properties:[{name:`key`},{name:`value`}]};case Iu:return{name:Iu,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Ru:return{name:Ru,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Bu:return{name:Bu,properties:[{name:`subject`},{name:`where`}]};case Hu:return{name:Hu,properties:[{name:`custom`},{name:`subject`}]};case Wu:return{name:Wu,properties:[{name:`kind`}]};case Ku:return{name:Ku,properties:[{name:`key`},{name:`value`}]};case Ju:return{name:Ju,properties:[{name:`name`}]};case Xu:return{name:Xu,properties:[{name:`key`},{name:`value`}]};case Qu:return{name:Qu,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case ed:return{name:ed,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case nd:return{name:nd,properties:[{name:`key`},{name:`value`}]};case id:return{name:id,properties:[{name:`key`},{name:`value`}]};case od:return{name:od,properties:[{name:`color`},{name:`name`}]};case cd:return{name:cd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case ud:return{name:ud,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case fd:return{name:fd,properties:[{name:`key`},{name:`value`}]};case md:return{name:md,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case gd:return{name:gd,properties:[{name:`key`},{name:`value`}]};case vd:return{name:vd,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case bd:return{name:bd,properties:[{name:`color`},{name:`tag`}]};case Sd:return{name:Sd,properties:[{name:`el`},{name:`parent`}]};case wd:return{name:wd,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Dd:return{name:Dd,properties:[{name:`tag`}]};case kd:return{name:kd,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case jd:return{name:jd,properties:[{name:`key`},{name:`value`}]};case Nd:return{name:Nd,properties:[{name:`view`}]};case Pd:return{name:Pd,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Id:return{name:Id,properties:[{name:`predicate`}]};case Rd:return{name:Rd,properties:[{name:`style`}]};case Bd:return{name:Bd,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Hd:return{name:Hd,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Wd:return{name:Wd,properties:[{name:`targets`},{name:`value`}]};case Kd:return{name:Kd,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Jd:return{name:Jd,properties:[{name:`key`},{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Qd:return{name:Qd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`value`}]};case nf:return{name:nf,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case af:return{name:af,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case sf:return{name:sf,properties:[{name:`value`}]};case lf:return{name:lf,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case df:return{name:df,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case pf:return{name:pf,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case hf:return{name:hf,properties:[{name:`isWildcard`,defaultValue:!1}]};case _f:return{name:_f,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case yf:return{name:yf,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const H=new xf;let Sf;const Cf=()=>Sf??=Et(`{"$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@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"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@160"},"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@164"},"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@164"},"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@164"},"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@163"},"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@164"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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@162"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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@157"},"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@157"},"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@148"},"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@162"},"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@185"},"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@164"},"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@164"},"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@149"},"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@149"},"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@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"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@162"},"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@128"},"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@150"},"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@185"},"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@128"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@150"},"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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@128"},"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@162"},"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@148"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"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@162"},"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@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"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@185"},"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@117"},"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@164"},"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@164"},"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@153"},"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@128"},"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@162"},"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@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"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@185"},"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@150"},"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@150"},"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@123"},"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@124"},"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@144"},"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@125"},"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@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@162"},"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@162"},"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@144"},"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@148"},"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@102"},"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@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"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@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"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@104"},"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@104"},"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@105"},"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@105"},"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@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"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@102"},"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@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"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@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"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@115"},"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@114"},"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@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@115/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@115/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@150"},"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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@116"},"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@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"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@119"},"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@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"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@144"},"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@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"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@188"},"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@188"},"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@188"},"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@125"},"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@144"},"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@125"},"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@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@183"},"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@171"},"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@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"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@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@140"},"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@135"},"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@155"},"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@151"},"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@138"},"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@140"},"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@140"},"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@140"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"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@144"},"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@151"},"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@152"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"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@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"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@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"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@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"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@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"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@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"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][-\\\\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@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$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@117"}}]}},{"$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@148"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}}]}},{"$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@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/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@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$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@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"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@150"}}},{"$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":[]}`),wf={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Tf={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Ef={AstReflection:()=>new xf},Df={Grammar:()=>Cf(),LanguageMetaData:()=>wf,parser:{ParserConfig:()=>Tf}};function Of(e){return wf.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function kf(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const Af=Wr(`/`);function jf(e,t){return Af(e.uri.path,t.uri.path)}const Mf=z.getChild(`chokidar`),Nf={fileSystemWatcher:e=>new Ff(e)},Pf=e=>{let t=Ci(e);return Of(t)||Xe(t)||vo(t)};var Ff=class{watcher;queue=new vn({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Mf.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){Mf.debug`create watcher for folder: ${e}`;let t=ki.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!Pf(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},r=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,r).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){Mf.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Mf.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=Ci(e),r=T.file(e);switch(!0){case Xe(n):Mf.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case Of(n):Mf.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case vo(n):{Mf.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.ownerProjectId(r);await t.ProjectsManager.rebuildProject(n);break}default:Mf.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=Ci(e),r=T.file(e);switch(!0){case Xe(n):Mf.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case Of(n):Mf.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case vo(n):{Mf.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.ownerProjectId(r);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuildProject(n);break}default:Mf.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Mf.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},If=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(ho(e))return Promise.resolve(fo);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.`)}},Lf=class{watch(){}dispose(){return Promise.resolve()}},Rf=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const zf={fileSystemWatcher:()=>new Lf},Bf={fileSystemProvider:()=>new If,...zf},Vf={manualLayouts:()=>new Rf},Hf=z.getChild(`filesystem`);function Uf(e,t=!1){return!t&&Xe(Ci(e))}function Wf(e,t=!1){return!t&&Of(Ci(e))}const Gf=(e=!0)=>({fileSystemProvider:()=>new Kf,...e?Nf:zf});var Kf=class extends Kt{async readFile(e){if(ho(e))return Promise.resolve(fo);try{return await super.readFile(e)}catch(t){return Hf.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 Ei().withSymlinks({resolvePaths:!1}).exclude(kf).withFullPaths().filter(Wf);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:T.file(e)})}catch(t){Hf.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(jf)}async scanProjectFiles(e){return await this.scanDirectory(e,Uf)}async scanDirectory(e,t){let n=[];try{let r=await new Ei().withSymlinks({resolvePaths:!1}).exclude(kf).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:T.file(e)})}catch(t){Hf.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await uo(e)}async writeFile(e,t){let n=wi(e.fsPath),r=Oi(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Hf.debug(`creating directory {path}`,{path:n}),Di(n,{recursive:!0})),Hf.debug(`writing file {path}`,{path:e.fsPath}),await Si(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=Oi(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await xi(t),Hf.debug(`deleted file {path}`,{path:t}),!0):(Hf.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Hf.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const qf={mcpServer:()=>new Jf,mcpServerFactory:()=>new Yf};var Jf=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()}},Yf=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const U=z.getChild(`mcp`);function W(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},Xf(n,e,t)]}function Xf(e,t,n){let r=n.bind(null,t);return(async function t(n,i){U.debug(`Calling tool {name}, args: {args}`,{name:e,args:n});try{let e=await r.call(null,n,i);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return U.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:L(t)}],isError:!0}}})}var Zf=`1.51.0`,Qf=class extends rt{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=Ot(e);let r=super.createDescription(e,t,n);return ho(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},$f=class extends on{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 Ft(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const ep=Symbol.for(`idattr`),tp={writeId(e,t){return e[ep]=t,e},readId(e){return e[ep]}},np={writeId(e,t){return a(t)?e[ep]=void 0:e[ep]=t,e},readId(e){return e[ep]}};function rp(e){return e?.textDocument.languageId===wf.languageId}function ip(e){return e?.markdown||e?.text}function ap(e){let n=parseFloat(e);return isNaN(n)?100:t(n,{min:0,max:100})}function op({value:e}){return ap(e)}function sp({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:ei(e)}}function cp({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:ei(e)}}function lp(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Ws(r):{let e=up(r);i(e)&&(n.color=e);break}case au(r):n.line=r.value;break;case Bs(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:ei(r)}break;default:ei(r)}return n}function up(e){return e?.themeColor??e?.customColor?.$refText}function dp(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:ei(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function fp(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:ei(e)}}function pp(e){return $t(e,e=>Ud(e)||hc(e)||kc(e))}const mp=e=>_u(e)||Fc(e)||cl(e)||Zc(e)||Cc(e)||Vc(e),hp=e=>yu(e)||pc(e)||rc(e)||il(e)||$s(e);function gp(e){for(;;){if(hp(e)||mp(e))return!1;if(Ol(e)||xu(e))return!0;if(e.$container)e=e.$container;else return!1}}function _p(e){for(;;){if(hp(e))return!1;if(mp(e))return!0;if(e.$container)e=e.$container;else return!1}}function vp(e){for(;;){if(mp(e))return!1;if(hp(e))return!0;if(e.$container)e=e.$container;else return!1}}const yp=Wr(`/`),bp=(e,t)=>yp(e.uri.path,t.uri.path),xp=e=>rp(e)&&go(e);var Sp=class extends ht{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(bp);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);xp(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return xp(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return Ft(this.documentMap.values()).filter(e=>xp(e)&&!this.projectsManager.isExcluded(e))}get all(){return Ft(this.documentMap.values()).map(e=>(xp(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return Ft(this.documentMap.values()).filter(n=>xp(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return b(this.userDocuments.toArray(),x(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),_(we(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,xp(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},Cp=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){B(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function wp(e){try{let t=Cd(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 Tp(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 Ep(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function Dp(e){let t;for(;t=e.value?.ref;){if(tc(t))return null;if(Zs(t))return t;if(a(e.parent))return null;e=e.parent}return null}function Op(e){let t=Ep(e);return t?.$type===`Imported`?t:null}function kp(e){let t;for(;t=e.value?.ref;){if(ko(t))return!0;if(a(e.parent))return!1;e=e.parent}return!1}function G(e){if(Gl(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;N(ql(e))}if(ql(e))return e.project;let t=an(e)?Ot(e):e;return t.likec4ProjectId?t.likec4ProjectId:(z.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Qp.DefaultProjectId)}function Ap(...e){return si(e.length>1?e.join(`:::`):e[0])}function jp(e){try{return e()}catch(e){z.trace(`Safe call failed`,{error:e});return}}function Mp(){try{return globalThis.performance.now()}catch{return Date.now()}}function Np(){let e=Mp();return{get ms(){return Mp()-e},get pretty(){return Vn(Mp()-e)}}}var Pp=e(kn(),1);const K=z.getChild(`projects`);function Fp(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function Ip(e){return Fp(e)?e.uri.toString():typeof e==`string`?Rn(e,{acceptRelative:!1,strict:!0})?e:T.file(e).toString():e.toString()}const Lp=Wr(`/`,!0),Rp=(e,t)=>Lp(Ln(e.path),Ln(t.path));function zp(e){return t=>e.startsWith(Xr(t)?t:t.folder)}function Bp(e,t){let n=Xr(e)?e:e.folder,r=Xr(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function Vp(...e){return _e(Bp,e)}function Hp(e,t){return t.startsWith(e.folder)||e.includePaths?.some(zp(t))?!Up(e,t):!1}function Up(e,t){return e.exclude?.(Mn(t))??!1}function Wp(...e){return _e(Hp,e)}function Gp(...e){return _e(Up,e)}function Kp(e){return e=Ip(e),Pn(e)}const qp=(e,t)=>Rp(e.folderUri,t.folderUri);function Jp(e){return e.sort(qp)}const Yp={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,Pp.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function Xp(e){return Yp.exclude(Mn(e))}function Zp(e){if(`configUri`in e){I(!pe(e.configUri),`configUri is emptyish`);let t=T.isUri(e.configUri)?e.configUri:T.parse(Ip(e.configUri)),n=Kp(C.dirname(t));return{configUri:t,folder:n,folderUri:T.parse(n)}}I(!pe(e.folderUri),`folderUri is emptyish`);let t=Kp(e.folderUri),n=T.parse(t);return{configUri:C.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Qp=class e{static DefaultProjectId=Yp.id;#e=[];#t=void 0;#n=[];#r=new Rr(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=C.joinPath(e,`likec4.config.json`),r=Kp(e);return{id:t,config:Yp.config,folder:r,folderUri:T.parse(r),configUri:n,exclude:Yp.exclude,includeConfig:{...Yp.includeConfig}}}return $r(this.#n.find(e=>e.id===t),`Project ${t} not found`)});#i=new Rr(e=>{let t=Ip(e),n=this.#a.get(t);return n?Gp(n,t)?!this.#n.some(Wp(t)):!1:Xp(t)});#a=new Rr(e=>{let t=zp(e);return this.#n.find(t)??this.#n.find(Wp(e))??null});constructor(e){this.services=e,K.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#n.length>1))return y(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){K.debug`reset default project ID`;return}I(this.#n.find(e=>e.id===t),`Project "${t}" not found`),K.debug`set default project ID to ${t}`,this.#t=t}}get default(){return this.#r.get(this.defaultProjectId??e.DefaultProjectId)}get all(){if(y(this.#n,1)){let e=[...x(this.#n,we(`id`)),Yp.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[Yp.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#r.get(t)}findOverlaped(e){let t=Vp(Kp(e)),n=e=>t(e)||!!e.includePaths&&!!d(e.includePaths,t);return this.#n.filter(n)}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(I(this.#n.some(e=>t===e.id),`Project ID ${t} is not registered`),t):$r(this.defaultProjectId,()=>`Specify exact project, known: [${x(this.#n,we(`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 Fp(t)&&ho(t)?!0:e.length===1?this.#i.get(Ip(t)):Gp(this.#r.get(e[0]),Ip(t))}isIncluded(t,n){let r=Ip(n);return y(this.#n,1)?t===e.DefaultProjectId?!this.#a.get(r)&&!Xp(r):Wp(this.#r.get(t),Ip(n)):!Xp(r)}async registerConfigFile(e,t){if(Xp(Ip(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${Yp.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(!vt(t))throw Ii(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Ye.validate(e.config),{configUri:r,folder:i,folderUri:a}=Zp(e),o=Ye.normalizeInclude(n.include),s=this.#n.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(K.info`project name changed from ${s.config.name} to ${n.name}`,K.info`unregistering ${s.id}`,s.id=this.uniqueProjectId(n.name),K.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=Jp([...this.#n,s]),K.info`register ${s.id}`),jp(()=>this.updateIncludesExcludes(s)),this.#o?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>vt(e)?Promise.reject(e):(K.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#a.get(Ip(t))?.id??this.#t??e.DefaultProjectId}#o=null;async reloadProjects(e){return this.#o?(K.debug`reload projects is already in progress, waiting`,await this.#o.catch(()=>{})):(K.debug`schedule reload projects`,this.#o=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(vt(e)||K.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){K.warn(`Failed to reloadProjects, no workspace folders found`);return}K.debug`start reload projects`;let n=[];for(let e of t){let t=T.parse(e.uri);K.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)K.debug`found config ${C.relative(t,r.uri)}`,n.push(r.uri)}catch(e){K.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#n.length===0){K.warning(`No config files found`);return}K.warning(`no config files found, but {count} projects were registered before`,{count:this.#n.length}),K.warning(`reset`)}n.sort(Rp);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){K.warn(L(t));let n=r.get(e.toString());n&&(K.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{K.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(x(this.#n,we(`id`))),n=e;if(!t.has(n))return n;K.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){K.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?K.info`Rebuilding all documents `:K.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=K.getChild(r.id),a=e=>Wp(r,Ip(e)),o=this.services.workspace.LangiumDocuments.userDocuments.filter(a).map(e=>e.uri).toArray();if(o.length===0){i.debug`no documents found for project ${r.id}, skipping rebuild`;return}i.info(`rebuild project documents: {docs}`,{docs:o.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(o,[],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),_t.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 K.warn(`Failed to get workspace URI, using default folder`,{error:e}),T.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){K.warn(L(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case a(t.exclude):e.exclude=Yp.exclude;break;case t.exclude&&y(t.exclude,1):e.exclude=(0,Pp.default)(x(t.exclude,t=>(!Nn(t)&&!t.startsWith(`**`)&&(t=In(`**`,t)),zn(An(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!y(n,1))return e;e.includePaths=x(n,t=>{let n=C.resolvePath(e.folderUri,t);return{uri:n,folder:Kp(n)}}),K.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&&(Vp(t,n)&&K.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=>{Vp(t,r)&&K.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]=x([e.configUri,t],C.basename);n!==r&&K.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}},$p=class extends tt{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=T.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){B(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){B(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(fo,T.parse(mo)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{z.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&&z.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){z.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of ge(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){z.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?z.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.`):z.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=C.basename(t.uri);return t.isDirectory?!kf(r):t.isFile?(n.fileExtensions.includes(C.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&y(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();z.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 N(e,`Workspace not initialized`),T.parse(e.uri)}get workspaceURL(){let e=this.workspace();return N(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),_t.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};const em=O({name:k().describe(`Project identifier`),title:k().optional().describe(`Human-readable project title`),contactPerson:k().optional().describe(`Maintainer contact information`),metadata:Sn(k(),bn()).optional().describe(`Custom project metadata as key-value pairs`),extends:wn([k(),j(k())]).optional().describe(`Style inheritance paths`),exclude:j(k()).optional().describe(`File exclusion patterns`),include:O({paths:j(k()).describe(`Include paths`),maxDepth:A().describe(`Maximum directory depth`),fileThreshold:A().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:O({outDir:k().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:O({hasTheme:On().describe(`Whether theme customization is defined`),hasDefaults:On().describe(`Whether default style values are defined`),hasCustomCss:On().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function tm(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 nm=O({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k(),tags:j(k()),metadata:Sn(wn([k(),j(k())])),includedInViews:j(O({id:k().describe(`View id`),title:k().describe(`View title`),type:xn([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function rm(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:sm(e.views())}}function im(e,t,n,r,i,a){N(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]={...rm(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 am=O({path:k().describe(`Path to the file`),range:O({start:O({line:A(),character:A()}),end:O({line:A(),character:A()})}).describe(`Range in the file`)}).nullable(),q=k().refine(e=>!0).optional().default(Qp.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),om=j(O({id:k().describe(`View id`),title:k().describe(`View title`),type:xn([`element`,`deployment`,`dynamic`]).describe(`View type`)})),sm=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),cm=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:T.parse(r.uri).fsPath,range:r.range}:null}catch(e){return U.debug(`Failed to locate {params}`,{error:e,params:n}),null}},lm=nm.extend({description:k().nullable().describe(`Element description`),technology:k().nullable().describe(`Element technology`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),children:j(k()).describe(`Direct child element ids`),incomingCount:A().describe(`Number of incoming relationships`),outgoingCount:A().describe(`Number of outgoing relationships`)}),um=W({name:`batch-read-elements`,description:`
44
+ Read details of multiple elements in a single call, reducing round-trips.
45
+ Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
46
+
47
+ Request:
48
+ - ids: string[] — array of element ids (FQNs) to read (max 50)
49
+ - project: string (optional) — project id. Defaults to "default" if omitted.
50
+
51
+ Response (JSON object):
52
+ - elements: Array of element details, each with:
53
+ - id: string — element id (FQN)
54
+ - name: string — element name
55
+ - kind: string — element kind
56
+ - title: string — human-readable title
57
+ - description: string|null — optional description
58
+ - technology: string|null — optional technology
59
+ - tags: string[] — assigned tags
60
+ - metadata: Record<string, string | string[]> — element metadata
61
+ - shape: string — rendered shape
62
+ - color: string — rendered color
63
+ - children: string[] — direct child element ids
64
+ - incomingCount: number — number of incoming relationships
65
+ - outgoingCount: number — number of outgoing relationships
66
+ - includedInViews: View[] — views that include this element
67
+ - notFound: string[] — ids that were not found in the project
68
+
69
+ View (object) fields:
70
+ - id: string — view identifier
71
+ - title: string — view title
72
+ - type: "element" | "deployment" | "dynamic"
73
+
74
+ Notes:
75
+ - Read-only, idempotent, no side effects.
76
+ - Safe to call repeatedly.
77
+ - Maximum 50 element ids per call.
78
+ - Elements not found are listed in notFound array (not an error).
79
+ - More efficient than multiple read-element calls when you need summary data for many elements.
80
+
81
+ Example response:
82
+ {
83
+ "elements": [
84
+ {
85
+ "id": "shop.frontend",
86
+ "name": "frontend",
87
+ "kind": "container",
88
+ "title": "Frontend",
89
+ "description": "User-facing web app",
90
+ "technology": "React",
91
+ "tags": ["public"],
92
+ "metadata": { "owner": "web-team" },
93
+ "shape": "browser",
94
+ "color": "#2F80ED",
95
+ "children": ["shop.frontend.auth"],
96
+ "incomingCount": 2,
97
+ "outgoingCount": 3,
98
+ "includedInViews": [
99
+ { "id": "system-overview", "title": "System Overview", "type": "element" }
100
+ ]
101
+ }
102
+ ],
103
+ "notFound": []
104
+ }
105
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:j(k()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:q},outputSchema:{elements:j(lm),notFound:j(k()).describe(`Element ids that were not found`)}},async(e,t)=>{N(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({...rm(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}}),dm=O({id:k(),kind:k(),title:k(),description:k().nullable(),technology:k().nullable(),shape:k(),color:k()}),fm=O({element1:dm,element2:dm,propertyDiffs:j(O({property:k().describe(`Property name`),element1Value:k().nullable().describe(`Value in element1`),element2Value:k().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:O({onlyInElement1:j(k()).describe(`Tags present only in element1`),onlyInElement2:j(k()).describe(`Tags present only in element2`),common:j(k()).describe(`Tags present in both elements`)}),metadata:O({onlyInElement1:Sn(wn([k(),j(k())])).describe(`Metadata keys only in element1`),onlyInElement2:Sn(wn([k(),j(k())])).describe(`Metadata keys only in element2`),different:j(O({key:k(),element1Value:wn([k(),j(k())]),element2Value:wn([k(),j(k())])})).describe(`Metadata keys present in both but with different values`),common:Sn(wn([k(),j(k())])).describe(`Metadata keys with identical values in both`)}),relationships:O({incomingOnlyElement1:A().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:A().describe(`Count of unique source elements sending to element2 only`),incomingShared:A().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:A().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:A().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:A().describe(`Count of unique target elements receiving from both`)})}),pm=W({name:`element-diff`,description:`
106
+ Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
107
+
108
+ Request:
109
+ - element1Id: string — first element id (FQN)
110
+ - element2Id: string — second element id (FQN)
111
+ - project: string (optional) — project id. Defaults to "default" if omitted.
112
+
113
+ Response (JSON object):
114
+ - element1: object — snapshot of first element (id, kind, title, description, technology, shape, color)
115
+ - element2: object — snapshot of second element
116
+ - propertyDiffs: Array of { property, element1Value, element2Value } — properties that differ
117
+ - tags: object
118
+ - onlyInElement1: string[] — tags only in element1
119
+ - onlyInElement2: string[] — tags only in element2
120
+ - common: string[] — tags in both
121
+ - metadata: object
122
+ - onlyInElement1: Record — metadata keys only in element1
123
+ - onlyInElement2: Record — metadata keys only in element2
124
+ - different: Array of { key, element1Value, element2Value } — keys present in both but with different values
125
+ - common: Record — metadata keys with identical values in both
126
+ - relationships: object — relationship count comparison
127
+ - incomingOnlyElement1/incomingOnlyElement2/incomingShared
128
+ - outgoingOnlyElement1/outgoingOnlyElement2/outgoingShared
129
+
130
+ Notes:
131
+ - Read-only, idempotent, no side effects.
132
+ - Safe to call repeatedly.
133
+ - Both elements must exist in the same project.
134
+ - Useful for comparing similar nodes to understand why they have different configurations.
135
+
136
+ Example response:
137
+ {
138
+ "element1": { "id": "planner.nodeA", "kind": "cgf-node", "title": "nodeA", ... },
139
+ "element2": { "id": "planner.nodeB", "kind": "cgf-node", "title": "nodeB", ... },
140
+ "propertyDiffs": [
141
+ { "property": "title", "element1Value": "nodeA :dwNodeTypeA", "element2Value": "nodeB :dwNodeTypeB" }
142
+ ],
143
+ "tags": {
144
+ "onlyInElement1": ["target_asil_qm"],
145
+ "onlyInElement2": ["target_asil_asil_b"],
146
+ "common": ["is_in_dag", "process_camera_master"]
147
+ },
148
+ "metadata": {
149
+ "onlyInElement1": {},
150
+ "onlyInElement2": {},
151
+ "different": [
152
+ { "key": "target_asil", "element1Value": "QM", "element2Value": "ASIL-B" }
153
+ ],
154
+ "common": { "host": "machine0" }
155
+ },
156
+ "relationships": {
157
+ "incomingOnlyElement1": 2,
158
+ "incomingOnlyElement2": 1,
159
+ "incomingShared": 3,
160
+ "outgoingOnlyElement1": 0,
161
+ "outgoingOnlyElement2": 1,
162
+ "outgoingShared": 2
163
+ }
164
+ }
165
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:k().describe(`First element id (FQN)`),element2Id:k().describe(`Second element id (FQN)`),project:q},outputSchema:fm.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);N(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);N(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={},_={},v=[],ee={};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?_[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?ee[e]=t:v.push({key:e,element1Value:t,element2Value:n}))}let te=new Set([...i.incoming()].map(e=>e.source.id)),ne=new Set([...a.incoming()].map(e=>e.source.id)),re=new Set([...i.outgoing()].map(e=>e.target.id)),y=new Set([...a.outgoing()].map(e=>e.target.id)),b=0,ie=0,ae=0;for(let e of te)ne.has(e)?b++:ie++;for(let e of ne)te.has(e)||ae++;let x=0,oe=0,se=0;for(let e of re)y.has(e)?x++:oe++;for(let e of y)re.has(e)||se++;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:_,different:v,common:ee},relationships:{incomingOnlyElement1:ie,incomingOnlyElement2:ae,incomingShared:b,outgoingOnlyElement1:oe,outgoingOnlyElement2:se,outgoingShared:x}}}),mm=W({name:`find-relationship-paths`,description:`
166
+ Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
167
+
168
+ Request:
169
+ - sourceId: string — source element FQN
170
+ - targetId: string — target element FQN
171
+ - maxDepth: number (optional, default: 3, max: 5) — maximum path length (number of hops)
172
+ - includeIndirect: boolean (optional, default: false) — include indirect (implied) relationships through nested elements
173
+ - project: string (optional) — project id. Defaults to "default" if omitted.
174
+
175
+ Algorithm:
176
+ - Uses breadth-first search (BFS) to find all paths
177
+ - Prevents cycles with visited set per path
178
+ - Paths are sorted by length (shortest first)
179
+ - Limited to 100 paths to avoid overwhelming responses
180
+
181
+ Response (JSON object):
182
+ - paths: Array of path objects, each with:
183
+ - length: number — number of hops in the path
184
+ - steps: Array<Step> — ordered sequence of relationships
185
+
186
+ Step (object) fields:
187
+ - source: string — source element FQN
188
+ - target: string — target element FQN
189
+ - relationship: object
190
+ - kind: string|null — relationship kind
191
+ - title: string|null — relationship title
192
+ - description: string|null — relationship description
193
+ - technology: string|null — relationship technology
194
+ - tags: string[] — relationship tags
195
+
196
+ Notes:
197
+ - Read-only, idempotent, no side effects.
198
+ - Safe to call repeatedly.
199
+ - Returns empty paths array if no paths exist.
200
+ - Rejects if source equals target.
201
+ - includeIndirect=false (default): only follows direct relationships on each element.
202
+ includeIndirect=true: also follows implied relationships through nested elements.
203
+ - maxDepth is capped at 5 to prevent excessive computation.
204
+ - Paths are discovered iteratively and sorted by length.
205
+
206
+ Example response:
207
+ {
208
+ "paths": [
209
+ {
210
+ "length": 1,
211
+ "steps": [
212
+ {
213
+ "source": "shop.frontend",
214
+ "target": "shop.backend",
215
+ "relationship": {
216
+ "kind": "uses",
217
+ "title": "Calls API",
218
+ "description": null,
219
+ "technology": "HTTPS",
220
+ "tags": []
221
+ }
222
+ }
223
+ ]
224
+ },
225
+ {
226
+ "length": 2,
227
+ "steps": [
228
+ {
229
+ "source": "shop.frontend",
230
+ "target": "shop.cache",
231
+ "relationship": {
232
+ "kind": "uses",
233
+ "title": "Reads from",
234
+ "description": null,
235
+ "technology": "Redis",
236
+ "tags": []
237
+ }
238
+ },
239
+ {
240
+ "source": "shop.cache",
241
+ "target": "shop.backend",
242
+ "relationship": {
243
+ "kind": "syncs-with",
244
+ "title": "Updates",
245
+ "description": null,
246
+ "technology": null,
247
+ "tags": []
248
+ }
249
+ }
250
+ ]
251
+ }
252
+ ]
253
+ }
254
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:k().describe(`Source element FQN`),targetId:k().describe(`Target element FQN`),maxDepth:A().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:On().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:q},outputSchema:{paths:j(O({length:A().describe(`Number of hops in the path`),steps:j(O({source:k().describe(`Source element FQN`),target:k().describe(`Target element FQN`),relationship:O({kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).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);N(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);N(a,`Target element "${t.targetId}" not found in project "${n}"`),N(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}}),hm=O({id:k(),title:k(),kind:k()}),gm=O({type:xn([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:hm,target:hm,kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`),includedInViews:om.describe(`Views that include this relationship`),sourceLocation:am}),_m=W({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
255
+ Find relationships between two LikeC4 elements within a project.
256
+
257
+ What it does:
258
+ - Finds both direct relationships (element1 ↔ element2) and indirect ones that arise via containment (e.g. via nested elements).
259
+ - Returns rich metadata for each relationship and where it appears in views.
260
+
261
+ Inputs:
262
+ - element1: string — Element ID (FQN)
263
+ - element2: string — Element ID (FQN)
264
+ - project: string (optional, defaults to "default") — Project id
265
+
266
+ Output:
267
+ - found: Relationship[]
268
+
269
+ Relationship (object) fields:
270
+ - type: "direct" | "indirect" — direct is between the specified endpoints; indirect is via nested elements
271
+ - source: Endpoint
272
+ - target: Endpoint
273
+ - kind: string|null — relationship kind from the model
274
+ - title: string|null — relationship title if provided
275
+ - description: string|null — relationship description text
276
+ - technology: string|null — relationship technology
277
+ - tags: string[] — relationship tags
278
+ - includedInViews: View[] — views where this relationship appears
279
+ - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
280
+
281
+ Endpoint (object) fields:
282
+ - id: string — Element ID (FQN)
283
+ - title: string — element title
284
+ - kind: string — element kind
285
+
286
+ View (object) fields:
287
+ - id: string — view identifier
288
+ - title: string — view title
289
+ - type: "element" | "deployment" | "dynamic"
290
+
291
+ Notes:
292
+ - Read-only, idempotent; does not mutate the model. May trigger UI navigation in supporting clients.
293
+ - The order of results is not guaranteed.
294
+
295
+ Example:
296
+ Request:
297
+ {
298
+ "element1": "shop.frontend",
299
+ "element2": "shop.backend",
300
+ "project": "default"
301
+ }
302
+
303
+ Response:
304
+ {
305
+ "found": [
306
+ {
307
+ "type": "direct",
308
+ "source": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
309
+ "target": { "id": "shop.backend", "title": "Backend", "kind": "component" },
310
+ "kind": "sync",
311
+ "title": "Calls",
312
+ "description": "Frontend calls Backend",
313
+ "technology": "HTTP",
314
+ "tags": ["public"],
315
+ "includedInViews": [
316
+ { "id": "system-overview", "title": "System Overview", "type": "element" }
317
+ ],
318
+ "sourceLocation": {
319
+ "path": "/abs/path/project/model.c4",
320
+ "range": { "start": { "line": 12, "character": 0 }, "end": { "line": 14, "character": 0 } }
321
+ }
322
+ }
323
+ ]
324
+ }
325
+ `,inputSchema:{element1:k().describe(`Element ID (FQN)`),element2:k().describe(`Element ID (FQN)`),project:q},outputSchema:{found:j(gm)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Yr(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);I(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);I(o,`Element "${t.element2}" not found in project "${n}"`);let s=cm(e,n),c=Jn.findConnection(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:sm(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),vm=W({name:`list-projects`,description:`
326
+ List LikeC4 projects discoverable in the current workspace.
327
+
328
+ Request:
329
+ - No input parameters.
330
+
331
+ Response (JSON object):
332
+ - projects: Project[]
333
+
334
+ Project (object) fields:
335
+ - id: string — stable project identifier
336
+ - title: string — human-readable project title
337
+ - folder: string — absolute path to the project root
338
+ - sources: string[] — absolute file paths of related documents
339
+
340
+ Notes:
341
+ - Read-only, idempotent, no side effects.
342
+ - Safe to call repeatedly.
343
+
344
+ Example response:
345
+ {
346
+ "projects": [
347
+ {
348
+ "id": "docs",
349
+ "title": "Documentation",
350
+ "folder": "/abs/path/to/workspace/docs",
351
+ "sources": [
352
+ "/abs/path/to/workspace/docs/model/contexts.likec4",
353
+ "/abs/path/to/workspace/docs/model/relations.likec4"
354
+ ]
355
+ }
356
+ ]
357
+ }
358
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:j(O({id:k(),title:k(),folder:k(),sources:j(k())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),ym=W({name:`open-view`,description:`
359
+ Open a LikeC4 view in the editor's preview panel.
360
+
361
+ Request:
362
+ - viewId: string — view id (name)
363
+ - project: string (optional) — project id. Defaults to "default" if omitted.
364
+
365
+ Response (JSON object):
366
+ - location: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location of the view if available
367
+
368
+ Notes:
369
+ - Read-only and idempotent with respect to the project model. Triggers a UI action in the editor.
370
+ - Only one preview panel can be open at a time.
371
+
372
+ Example response:
373
+ {
374
+ "location": {
375
+ "path": "/abs/path/project/model.c4",
376
+ "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
377
+ }
378
+ }
379
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:k().describe(`View id (name)`),project:q},outputSchema:{location:am}},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:cm(e,n)({view:r.id})}}),bm=xn([`exact`,`contains`,`exists`]),xm=W({name:`query-by-metadata`,description:`
380
+ Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
381
+
382
+ Request:
383
+ - key: string — metadata key to filter by
384
+ - value: string (optional) — metadata value to match (ignored for 'exists' mode)
385
+ - matchMode: "exact" | "contains" | "exists" (optional, default: "exact")
386
+ - project: string (optional) — project id. Defaults to "default" if omitted.
387
+
388
+ Match Modes:
389
+ - exact: Value must match exactly (case-sensitive)
390
+ Example: key="owner", value="platform-team" matches only exact "platform-team"
391
+ - contains: Value contains the search string (case-insensitive)
392
+ Example: key="technology", value="aws" matches "AWS Lambda", "aws-s3", etc.
393
+ - exists: Element has the key (value parameter is ignored)
394
+ Example: key="owner" returns all elements with any "owner" metadata
395
+
396
+ Response (JSON object):
397
+ - results: Array of matching elements/deployment-nodes, each with:
398
+ - id: string — element/node id (FQN)
399
+ - name: string — element/node name
400
+ - kind: string — element/node kind
401
+ - title: string — human-readable title
402
+ - tags: string[] — assigned tags
403
+ - metadata: Record<string, string | string[]> — all element metadata
404
+ - matchedValue: string — the metadata value that matched (for reference)
405
+ - includedInViews: View[] — views that include this element
406
+
407
+ View (object) fields:
408
+ - id: string — view identifier
409
+ - title: string — view title
410
+ - type: "element" | "deployment" | "dynamic"
411
+
412
+ Notes:
413
+ - Read-only, idempotent, no side effects.
414
+ - Safe to call repeatedly.
415
+ - Handles both string and array metadata values.
416
+ - For array values, matches if any element in the array matches.
417
+ - Returns empty array if no matches found.
418
+ - Limited to 50 results to avoid overwhelming responses.
419
+ - Case-sensitive for exact mode, case-insensitive for contains mode.
420
+
421
+ Example response:
422
+ {
423
+ "results": [
424
+ {
425
+ "id": "shop.frontend",
426
+ "name": "frontend",
427
+ "kind": "container",
428
+ "title": "Frontend",
429
+ "tags": ["public"],
430
+ "metadata": {
431
+ "owner": "platform-team",
432
+ "tier": "critical"
433
+ },
434
+ "matchedValue": "platform-team",
435
+ "includedInViews": [
436
+ {
437
+ "id": "system-overview",
438
+ "title": "System Overview",
439
+ "type": "element"
440
+ }
441
+ ]
442
+ }
443
+ ]
444
+ }
445
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:k().describe(`Metadata key to filter by`),value:k().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:bm.optional().default(`exact`).describe(`Matching mode`),project:q},outputSchema:{results:j(nm.extend({matchedValue:k().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({...rm(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({...rm(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),Sm=W({name:`query-by-tag-pattern`,description:`
446
+ Search elements by tag patterns using prefix or substring matching.
447
+ Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
448
+
449
+ Request:
450
+ - pattern: string — tag pattern to match
451
+ - matchMode: "prefix" | "contains" | "suffix" (optional, default: "prefix")
452
+ - prefix: matches tags starting with the pattern (e.g., "target_asil" matches "target_asil_qm", "target_asil_asil_b")
453
+ - contains: matches tags containing the pattern anywhere (e.g., "asil" matches "target_asil_qm", "unit_asil_b")
454
+ - suffix: matches tags ending with the pattern (e.g., "_tbc" matches "target_asil_qm__tbc")
455
+ - project: string (optional) — project id. Defaults to "default" if omitted.
456
+
457
+ Response (JSON object):
458
+ - results: Array of matching elements, each with:
459
+ - id: string — element id (FQN)
460
+ - name: string — element name
461
+ - kind: string — element kind
462
+ - title: string — human-readable title
463
+ - tags: string[] — all assigned tags
464
+ - metadata: Record<string, string | string[]> — element metadata
465
+ - matchedTags: string[] — the specific tags that matched the pattern
466
+ - includedInViews: View[] — views that include this element
467
+ - truncated: boolean — true if results were truncated due to exceeding the 50-result limit
468
+ - matchedTagValues: string[] — all unique tag values that matched the pattern across all elements
469
+
470
+ View (object) fields:
471
+ - id: string — view identifier
472
+ - title: string — view title
473
+ - type: "element" | "deployment" | "dynamic"
474
+
475
+ Notes:
476
+ - Read-only, idempotent, no side effects.
477
+ - Safe to call repeatedly.
478
+ - Pattern matching is case-insensitive.
479
+ - Returns empty array if no matches found.
480
+ - Limited to 50 results.
481
+ - matchedTagValues provides a summary of all distinct matching tag values found.
482
+
483
+ Example response:
484
+ {
485
+ "results": [
486
+ {
487
+ "id": "top.planner.behaviorNode",
488
+ "name": "behaviorNode",
489
+ "kind": "cgf-node",
490
+ "title": "behaviorNode :dwBehaviorPlannerNode",
491
+ "tags": ["is_in_dag", "target_asil_qm", "process_camera_master"],
492
+ "metadata": {},
493
+ "matchedTags": ["target_asil_qm"],
494
+ "includedInViews": []
495
+ }
496
+ ],
497
+ "truncated": false,
498
+ "matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
499
+ }
500
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:k().min(1).describe(`Tag pattern to match`),matchMode:xn([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:q},outputSchema:{results:j(nm.extend({matchedTags:j(k()).describe(`Tags that matched the pattern`)})),truncated:On().describe(`True if results were truncated`),matchedTagValues:j(k()).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({...rm(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!qn(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({...rm(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),Cm=W({name:`query-by-tags`,description:`
501
+ Advanced tag filtering with boolean logic (AND, OR, NOT).
502
+
503
+ Request:
504
+ - allOf: string[] (optional) — element must have ALL these tags (AND logic)
505
+ - anyOf: string[] (optional) — element must have ANY of these tags (OR logic)
506
+ - noneOf: string[] (optional) — element must have NONE of these tags (NOT logic)
507
+ - project: string (optional) — project id. Defaults to "default" if omitted.
508
+
509
+ Boolean Logic:
510
+ - All three conditions are combined with AND logic
511
+ - At least one condition must be specified
512
+ - Tags are case-sensitive
513
+
514
+ Example Queries:
515
+ - Public APIs: {"allOf": ["public", "api"]}
516
+ - Deprecated or legacy: {"anyOf": ["deprecated", "legacy"]}
517
+ - Public but not deprecated: {"allOf": ["public"], "noneOf": ["deprecated"]}
518
+ - Critical services not in migration: {"allOf": ["critical", "service"], "noneOf": ["migration", "deprecated"]}
519
+
520
+ Response (JSON object):
521
+ - results: Array of matching elements/deployment-nodes, each with:
522
+ - id: string — element/node id (FQN)
523
+ - name: string — element/node name
524
+ - kind: string — element/node kind
525
+ - title: string — human-readable title
526
+ - tags: string[] — assigned tags (for reference)
527
+ - metadata: Record<string, string | string[]> — element metadata
528
+ - includedInViews: View[] — views that include this element
529
+
530
+ View (object) fields:
531
+ - id: string — view identifier
532
+ - title: string — view title
533
+ - type: "element" | "deployment" | "dynamic"
534
+
535
+ Notes:
536
+ - Read-only, idempotent, no side effects.
537
+ - Safe to call repeatedly.
538
+ - Returns empty array if no matches found.
539
+ - Limited to 50 results to avoid overwhelming responses.
540
+ - Conflicting conditions (e.g., allOf and noneOf with same tag) will return no results.
541
+
542
+ Example response:
543
+ {
544
+ "results": [
545
+ {
546
+ "id": "shop.api",
547
+ "name": "api",
548
+ "kind": "container",
549
+ "title": "API Gateway",
550
+ "tags": ["public", "api", "critical"],
551
+ "metadata": {
552
+ "owner": "platform-team"
553
+ },
554
+ "includedInViews": [
555
+ {
556
+ "id": "system-overview",
557
+ "title": "System Overview",
558
+ "type": "element"
559
+ }
560
+ ]
561
+ }
562
+ ]
563
+ }
564
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:j(k()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:j(k()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:j(k()).optional().describe(`Element must have NONE of these tags (NOT)`),project:q},outputSchema:{results:j(nm),truncated:On().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{N(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(rm(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}qn(e)&&o(e.tags)&&i.push(rm(e))}return{results:i,truncated:a}}),wm=xn([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Tm=W({name:`query-graph`,description:`
565
+ Query element hierarchy and relationships in the architecture graph.
566
+
567
+ Request:
568
+ - elementId: string — element id (FQN) to query
569
+ - queryType: "ancestors" | "descendants" | "siblings" | "children" | "parent" | "incomers" | "outgoers"
570
+ - includeIndirect: boolean (optional, default: true) — for incomers/outgoers, include indirect relationships (through nested elements)
571
+ - project: string (optional) — project id. Defaults to "default" if omitted.
572
+
573
+ Query Types:
574
+ - ancestors: Returns all parent elements up to the root (hierarchical)
575
+ Example: shop.frontend.auth.service returns [shop.frontend.auth, shop.frontend, shop]
576
+ - descendants: Returns all child elements recursively (hierarchical)
577
+ Example: shop.frontend returns all nested elements like shop.frontend.auth, shop.frontend.auth.service
578
+ - siblings: Returns elements at the same hierarchy level with the same parent
579
+ Example: shop.frontend returns [shop.backend, shop.database] if they're siblings
580
+ - children: Returns direct child elements only (not recursive)
581
+ Example: shop returns [shop.frontend, shop.backend] but not shop.frontend.auth
582
+ - parent: Returns the direct parent element
583
+ Example: shop.frontend.auth returns shop.frontend
584
+ - incomers: Returns elements that have outgoing relationships to this element (single hop, not recursive).
585
+ For recursive upstream traversal, use query-incomers-graph instead.
586
+ includeIndirect=true: Includes relationships to nested children
587
+ Example: Elements that depend on this element
588
+ - outgoers: Returns elements that receive incoming relationships from this element (single hop, not recursive).
589
+ For recursive downstream traversal, use query-outgoers-graph instead.
590
+ includeIndirect=true: Includes relationships from nested children
591
+ Example: Elements this element depends on
592
+
593
+ Response (JSON object):
594
+ - results: Array of elements (max 100), each with:
595
+ - id: string — element id (FQN)
596
+ - name: string — element name
597
+ - kind: string — element kind
598
+ - title: string — human-readable title
599
+ - tags: string[] — assigned tags
600
+ - metadata: Record<string, string> — element metadata
601
+ - includedInViews: View[] — views that include this element
602
+ - truncated: boolean — true if results were truncated due to exceeding maximum limit (100)
603
+
604
+ View (object) fields:
605
+ - id: string — view identifier
606
+ - title: string — view title
607
+ - type: "element" | "deployment" | "dynamic"
608
+
609
+ Notes:
610
+ - Read-only, idempotent, no side effects.
611
+ - Safe to call repeatedly.
612
+ - For parent query on root element, returns empty array.
613
+ - For hierarchical queries (ancestors, descendants, siblings, children), includeIndirect is ignored.
614
+
615
+ Example response:
616
+ {
617
+ "results": [
618
+ {
619
+ "id": "shop.frontend",
620
+ "name": "frontend",
621
+ "kind": "container",
622
+ "title": "Frontend",
623
+ "tags": ["public"],
624
+ "metadata": { "owner": "web-team" },
625
+ "includedInViews": [
626
+ {
627
+ "id": "system-overview",
628
+ "title": "System Overview",
629
+ "type": "element"
630
+ }
631
+ ]
632
+ }
633
+ ],
634
+ "truncated": false
635
+ }
636
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:k().describe(`Element id (FQN) to query`),queryType:wm.describe(`Type of graph query`),includeIndirect:On().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:q},outputSchema:{results:j(nm),truncated:On().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);N(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(rm(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(rm(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(rm(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(rm(e))}break;case`parent`:{let e=r.parent;e&&i.push(rm(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(rm(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(rm(t))}break}}return{results:i,truncated:a}}),Em=O({elementId:k().describe(`ID of the incoming element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),Dm=W({name:`query-incomers-graph`,description:`
637
+ Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
638
+
639
+ This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
640
+ indirectly provide input to the target element. It returns the complete subgraph in a single response,
641
+ making it much more efficient than repeated individual queries.
642
+
643
+ Request:
644
+ - elementId: string — target element id (FQN) to start from
645
+ - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
646
+ - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
647
+ - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
648
+ - project: string (optional) — project id. Defaults to "default" if omitted.
649
+
650
+ Response Structure:
651
+ {
652
+ "target": "element.id",
653
+ "totalNodes": number,
654
+ "maxDepth": number,
655
+ "truncated": boolean,
656
+ "nodes": {
657
+ "element.id": {
658
+ "id": "element.id",
659
+ "name": "name",
660
+ "kind": "kind",
661
+ "title": "title",
662
+ "tags": ["tag1", "tag2"],
663
+ "metadata": {},
664
+ "includedInViews": [...],
665
+ "incomers": [
666
+ {
667
+ "elementId": "id1",
668
+ "relationshipLabel": "uses",
669
+ "technology": "REST"
670
+ }
671
+ ],
672
+ "depth": number
673
+ }
674
+ }
675
+ }
676
+
677
+ Use Cases:
678
+ - Find all producers/dependencies for an element
679
+ - Trace data lineage upstream
680
+ - Identify root causes and dependencies
681
+ - Build complete dependency trees
682
+ - Answer "what feeds into this?" questions
683
+
684
+ Notes:
685
+ - Read-only, idempotent, no side effects
686
+ - Cycle detection prevents infinite loops
687
+ - Result size limited to maxNodes to prevent huge responses
688
+ - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
689
+
690
+ Example:
691
+ For a database element, this returns all services, APIs, and components that write to it,
692
+ plus all their dependencies, recursively up to maxDepth levels.
693
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query incomers for`),includeIndirect:On().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:A().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:A().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:q},outputSchema:{target:k().describe(`Target element id`),totalNodes:A().describe(`Total number of nodes in the graph`),maxDepth:A().describe(`Maximum depth reached`),truncated:On().describe(`True if result was truncated due to maxNodes limit`),nodes:Sn(nm.extend({incomers:j(Em).describe(`Incoming relationships with details`),depth:A().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);N(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=im(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}}),Om=O({elementId:k().describe(`ID of the outgoing element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),km=W({name:`query-outgoers-graph`,description:`
694
+ Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
695
+
696
+ This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
697
+ indirectly consume output from the target element. It returns the complete subgraph in a single response,
698
+ making it much more efficient than repeated individual queries.
699
+
700
+ Request:
701
+ - elementId: string — target element id (FQN) to start from
702
+ - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
703
+ - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
704
+ - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
705
+ - project: string (optional) — project id. Defaults to "default" if omitted.
706
+
707
+ Response Structure:
708
+ {
709
+ "target": "element.id",
710
+ "totalNodes": number,
711
+ "maxDepth": number,
712
+ "truncated": boolean,
713
+ "nodes": {
714
+ "element.id": {
715
+ "id": "element.id",
716
+ "name": "name",
717
+ "kind": "kind",
718
+ "title": "title",
719
+ "tags": ["tag1", "tag2"],
720
+ "metadata": {},
721
+ "includedInViews": [...],
722
+ "outgoers": [
723
+ {
724
+ "elementId": "id1",
725
+ "relationshipLabel": "sends data to",
726
+ "technology": "Kafka"
727
+ }
728
+ ],
729
+ "depth": number
730
+ }
731
+ }
732
+ }
733
+
734
+ Use Cases:
735
+ - Find all consumers/dependents of an element
736
+ - Trace data lineage downstream
737
+ - Assess impact of changes (blast radius)
738
+ - Build complete consumer trees
739
+ - Answer "what depends on this?" questions
740
+
741
+ Notes:
742
+ - Read-only, idempotent, no side effects
743
+ - Cycle detection prevents infinite loops
744
+ - Result size limited to maxNodes to prevent huge responses
745
+ - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
746
+
747
+ Example:
748
+ For an API service, this returns all clients, services, and systems that consume its output,
749
+ plus all their consumers, recursively up to maxDepth levels.
750
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:On().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:A().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:A().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:q},outputSchema:{target:k().describe(`Target element id`),totalNodes:A().describe(`Total number of nodes in the graph`),maxDepth:A().describe(`Maximum depth reached`),truncated:On().describe(`True if result was truncated due to maxNodes limit`),nodes:Sn(nm.extend({outgoers:j(Om).describe(`Outgoing relationships with details`),depth:A().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);N(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=im(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}}),Am=W({name:`read-deployment`,description:`
751
+ Read details about a deployment node or a deployed instance in a LikeC4 project.
752
+
753
+ What it does:
754
+ - Returns metadata about a deployment entity (node or instance), including kind, tags, color/shape, children, which views include it, and its source location.
755
+
756
+ Inputs:
757
+ - id: string — Deployment id (FQN)
758
+ - project: string (optional, defaults to "default") — Project id
759
+
760
+ Output fields:
761
+ - type: "deployment-node" | "deployed-instance"
762
+ - id: string — Deployment id (FQN)
763
+ - kind: string — Deployment node kind, or element kind for deployed instances
764
+ - name: string — Name of the deployment entity
765
+ - title: string — Title of the deployment entity
766
+ - description: string|null — Description text
767
+ - technology: string|null — Technology info, if any
768
+ - tags: string[] — Tags assigned to this entity
769
+ - project: string — Project id
770
+ - metadata: Record<string, string>
771
+ - links: Array<{ title: string|null, url: string, relative: string|null }> — external links associated with this deployment entity
772
+ - shape: string — Rendered shape
773
+ - color: string — Rendered color
774
+ - children: string[] — Child deployment ids (empty for instances)
775
+ - includedInViews: View[] — Views that include this entity
776
+ - instanceof: { id: string, title: string, kind: string } | null — If type is "deployed-instance", the referenced element
777
+ - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
778
+
779
+ View (object) fields:
780
+ - id: string — view identifier
781
+ - title: string — view title
782
+ - type: "element" | "deployment" | "dynamic"
783
+
784
+ Notes:
785
+ - Read-only, idempotent; does not mutate the model.
786
+
787
+ Example request:
788
+ { "id": "k8s.cluster.frontend", "project": "default" }
789
+
790
+ Example response (deployed instance):
791
+ {
792
+ "type": "deployed-instance",
793
+ "id": "k8s.cluster.frontend",
794
+ "kind": "k8s.pod",
795
+ "name": "frontend",
796
+ "title": "Frontend Pod",
797
+ "description": null,
798
+ "technology": "Kubernetes",
799
+ "tags": ["prod"],
800
+ "project": "default",
801
+ "metadata": {},
802
+ "links": [],
803
+ "shape": "rectangle",
804
+ "color": "#2F80ED",
805
+ "children": [],
806
+ "includedInViews": [
807
+ { "id": "runtime-overview", "title": "Runtime Overview", "type": "deployment" }
808
+ ],
809
+ "instanceof": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
810
+ "sourceLocation": {
811
+ "path": "/abs/path/project/model.c4",
812
+ "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
813
+ }
814
+ }
815
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:k().describe(`Deployment id (FQN)`),project:q},outputSchema:{type:xn([`deployment-node`,`deployed-instance`]),id:k().describe(`Deployment id (FQN)`),kind:k().describe(`Deployment node kind, or element kind for deployed instances`),name:k(),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:Sn(wn([k(),j(k())])),links:j(O({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:k(),color:k(),children:j(k()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:om.describe(`Views that include this deployment node`),instanceof:O({id:k().describe(`Element ID (FQN)`),title:k(),kind:k()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:am}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);N(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=cm(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:sm(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),jm=W({name:`read-element`,description:`
816
+ Read detailed information about a LikeC4 element.
817
+
818
+ Request:
819
+ - id: string — element id (FQN)
820
+ - project: string (optional) — project id. Defaults to "default" if omitted.
821
+
822
+ Response (JSON object):
823
+ - id: string — element id (FQN)
824
+ - name: string — element name
825
+ - kind: string — element kind
826
+ - title: string — human-readable title
827
+ - description: string|null — optional description
828
+ - technology: string|null — optional technology
829
+ - tags: string[] — assigned tags
830
+ - project: string — project id this element belongs to
831
+ - metadata: Record<string, string> — element metadata
832
+ - links: Array<{ title: string|null, url: string, relative: string|null }> — external links associated with this element
833
+ - shape: string — rendered shape
834
+ - color: string — rendered color
835
+ - children: string[] — ids (FQNs) of direct child elements
836
+ - defaultView: string|null — default view name if set
837
+ - includedInViews: View[] — views that include this element
838
+ - relationships: object — relationships of this element (direct and indirect)
839
+ - 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[] }>
840
+ - 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[] }>
841
+ - deployedInstances: string[] — deployed instance ids (Deployment FQNs)
842
+ - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location if available
843
+
844
+ View (object) fields:
845
+ - id: string — view identifier
846
+ - title: string — view title
847
+ - type: "element" | "deployment" | "dynamic"
848
+
849
+ Notes:
850
+ - Read-only, idempotent, no side effects.
851
+ - Safe to call repeatedly.
852
+
853
+ Example response:
854
+ {
855
+ "id": "shop.frontend",
856
+ "name": "frontend",
857
+ "kind": "container",
858
+ "title": "Frontend",
859
+ "description": "User-facing web app",
860
+ "technology": "React",
861
+ "tags": ["public"],
862
+ "project": "default",
863
+ "metadata": { "owner": "web" },
864
+ "links": [
865
+ {
866
+ "title": "Documentation",
867
+ "url": "https://docs.example.com/frontend",
868
+ "relative": null
869
+ }
870
+ ],
871
+ "shape": "rounded-rectangle",
872
+ "color": "#2F80ED",
873
+ "children": ["shop.frontend.auth"],
874
+ "defaultView": "frontend-overview",
875
+ "includedInViews": [
876
+ {
877
+ "id": "frontend-overview",
878
+ "title": "Frontend Overview",
879
+ "type": "element"
880
+ }
881
+ ],
882
+ "relationships": {
883
+ "incoming": [
884
+ {
885
+ "source": { "id": "shop.api", "title": "API", "kind": "container" },
886
+ "kind": "uses",
887
+ "target": "shop.frontend",
888
+ "title": "Calls",
889
+ "description": null,
890
+ "technology": "HTTPS",
891
+ "tags": []
892
+ }
893
+ ],
894
+ "outgoing": []
895
+ },
896
+ "deployedInstances": ["k8s.cluster.frontend"],
897
+ "sourceLocation": {
898
+ "path": "/abs/path/project/model.c4",
899
+ "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
900
+ }
901
+ }
902
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:k().describe(`Element id (FQN)`),project:q},outputSchema:{id:k().describe(`Element id (FQN)`),kind:k().describe(`Element kind`),name:k().describe(`Element name`),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:Sn(wn([k(),j(k())])),links:j(O({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:k(),color:k(),children:j(k()).describe(`Children of this element (Array of FQNs)`),defaultView:k().nullable().describe(`Name of the default view of this element`),includedInViews:om.describe(`Views that include this element`),relationships:O({incoming:j(O({source:O({id:k(),title:k(),kind:k()}).describe(`Source element of this relationship`),kind:k().nullable().describe(`Relationship kind`),target:k().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:j(O({source:k().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:O({id:k(),title:k(),kind:k()}).describe(`Target element of this relationship`),kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:j(k()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:am}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);N(r,`Element "${t.id}" not found in project "${n}"`);let i=cm(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:sm(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})}}),Mm=W({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
903
+ Request:
904
+ - project: string (optional) — project id. Defaults to "default" if omitted.
905
+
906
+ Response (JSON object):
907
+ - title: string — human-readable project title
908
+ - folder: string — absolute path to the project root
909
+ - sources: string[] — absolute file paths of model documents
910
+ - config: object — project configuration
911
+ - name: string — project identifier
912
+ - title?: string — human-readable title
913
+ - contactPerson?: string — maintainer contact
914
+ - metadata?: object — custom project metadata as key-value pairs
915
+ - extends?: string | string[] — style inheritance paths
916
+ - exclude?: string[] — file exclusion patterns
917
+ - include?: object — include configuration (paths, maxDepth, fileThreshold)
918
+ - manualLayouts?: object — manual layouts config (outDir)
919
+ - styles?: object — simplified styles (hasTheme, hasDefaults, hasCustomCss)
920
+ - specification: object
921
+ - elementKinds: string[] — all element kinds
922
+ - relationshipKinds: string[] — all relationship kinds
923
+ - deploymentKinds: string[] — all deployment kinds
924
+ - tags: string[] — all tags
925
+ - metadataKeys: string[] — used metadata keys
926
+ - elements: Element[] — list of elements
927
+ - deployments: Deployment[] — list of deployment entities
928
+ - views: View[] — list of views defined in the model
929
+
930
+ Element (object) fields:
931
+ - id: string — element id (FQN)
932
+ - kind: string — element kind
933
+ - title: string — element title
934
+ - tags: string[] — element tags
935
+
936
+ Deployment (object) fields:
937
+ - type = "deployment-node": { id: string, kind: string, title: string, tags: string[] }
938
+ - type = "deployed-instance": { id: string, title: string, tags: string[], referencedElementId: string }
939
+
940
+ View (object) fields:
941
+ - id: string — view identifier
942
+ - title: string — view title
943
+ - type: "element" | "deployment" | "dynamic"
944
+
945
+ Notes:
946
+ - Read-only, idempotent, no side effects.
947
+ - Safe to call repeatedly.
948
+
949
+ Example response:
950
+ {
951
+ "title": "Cloud Boutique",
952
+ "folder": "/abs/path/to/workspace/examples/cloud-system",
953
+ "sources": [
954
+ "/abs/path/to/workspace/examples/cloud-system/model.c4"
955
+ ],
956
+ "config": {
957
+ "name": "cloud-boutique",
958
+ "title": "Cloud Boutique",
959
+ "contactPerson": "admin@example.com"
960
+ },
961
+ "specification": {
962
+ "elementKinds": ["system", "container", "component"],
963
+ "relationshipKinds": ["uses", "depends-on"],
964
+ "deploymentKinds": ["node", "cluster"],
965
+ "tags": ["public", "internal"],
966
+ "metadataKeys": ["owner", "tier"]
967
+ },
968
+ "elements": [
969
+ {
970
+ "id": "shop.frontend",
971
+ "kind": "component",
972
+ "title": "Frontend",
973
+ "tags": ["public"]
974
+ }
975
+ ],
976
+ "deployments": [
977
+ {
978
+ "type": "deployment-node",
979
+ "id": "k8s.shop.frontend",
980
+ "kind": "cluster",
981
+ "title": "Frontend",
982
+ "tags": []
983
+ }
984
+ ],
985
+ "views": [
986
+ {
987
+ "id": "system-overview",
988
+ "title": "System Overview",
989
+ "type": "element"
990
+ }
991
+ ]
992
+ }
993
+ `,inputSchema:{project:q},outputSchema:{title:k(),folder:k(),sources:j(k()),config:em.describe(`Project configuration`),specification:O({elementKinds:j(k()),relationshipKinds:j(k()),deploymentKinds:j(k()),tags:j(k()),metadataKeys:j(k())}),elements:j(O({id:k(),kind:k(),title:k(),tags:j(k())})).describe(`List of elements in the project`),deployments:j(Cn(`type`,[O({type:Dn(`deployment-node`),id:k().describe(`Node ID`),kind:k().describe(`Deployment node kind`),title:k().describe(`Node title`),tags:j(k())}),O({type:Dn(`deployed-instance`),id:k().describe(`Node ID`),title:k().describe(`Node title`),tags:j(k()),referencedElementId:k().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:j(O({id:k(),title:k(),type:xn([`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:tm(r.config),specification:{elementKinds:v(i.specification.elements),relationshipKinds:v(i.specification.relationships),deploymentKinds:v(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}))}}),Nm=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Pm=Cn(`type`,[O({type:Dn(`element`),id:k().describe(`Node ID`),elementId:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),O({type:Dn(`deployment-node`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),kind:k().describe(`Deployment kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),O({type:Dn(`deployed-instance`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),referencedElement:O({id:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Element title`)}),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())})]),Fm=W({name:`read-view`,description:`
994
+ Read detailed information about a LikeC4 view.
995
+
996
+ Request:
997
+ - viewId: string — view id (name)
998
+ - project: string (optional) — project id. Defaults to "default" if omitted.
999
+
1000
+ Response (JSON object):
1001
+ - id: string — view id
1002
+ - type: "element" | "deployment" | "dynamic" — view type
1003
+ - title: string — view title (falls back to id if not set)
1004
+ - description: string|null — optional description
1005
+ - tags: string[] — view tags
1006
+ - project: string — project id this view belongs to
1007
+ - nodes: Node[] — nodes included in the view
1008
+ - edges: Edge[] — relationships between nodes
1009
+ - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null — source location if available
1010
+
1011
+ Node (discriminated union by "type"):
1012
+ - type = "element": { id: string, elementId: string, kind: string, title: string, description: string|null, technology: string|null, children: string[], shape: string, color: string, tags: string[] }
1013
+ - 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[] }
1014
+ - 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[] }
1015
+
1016
+ Edge object:
1017
+ - { source: string, target: string, label: string|null, description: string|null, technology: string|null, tags: string[] }
1018
+
1019
+ Notes:
1020
+ - Read-only, idempotent, no side effects.
1021
+
1022
+ Example response:
1023
+ {
1024
+ "id": "system-overview",
1025
+ "type": "element",
1026
+ "title": "System Overview",
1027
+ "description": null,
1028
+ "tags": [],
1029
+ "project": "default",
1030
+ "nodes": [
1031
+ { "type": "logical", "id": "n1", "elementId": "shop.frontend", "kind": "container", "title": "Frontend", "description": null, "technology": "React", "children": [], "shape": "rounded-rectangle", "color": "#2F80ED", "tags": [] }
1032
+ ],
1033
+ "edges": [
1034
+ { "source": "n1", "target": "n2", "label": "calls", "description": null, "technology": "HTTPS", "tags": [] }
1035
+ ],
1036
+ "sourceLocation": {
1037
+ "path": "/abs/path/project/model.c4",
1038
+ "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
1039
+ }
1040
+ }
1041
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:k().describe(`View id (name)`),project:q},outputSchema:{id:k(),type:xn([`element`,`deployment`,`dynamic`]).describe(`View type`),title:k(),description:k().nullable(),tags:j(k()),project:k(),nodes:j(Pm),edges:j(O({source:k().describe(`Source node`),target:k().describe(`Target node`),label:k().nullable(),description:k().nullable(),technology:k().nullable(),tags:j(k())})).describe(`Edge represents relationship between nodes`),sourceLocation:am}},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=cm(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=>Nm(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})}}),Im=j(Cn(`type`,[O({type:Dn(`element`),project:k().describe(`Project ID`),id:k().describe(`Element ID (FQN)`),name:k().describe(`Element name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:om,metadata:Sn(wn([k(),j(k())])),tags:j(k())}),O({type:Dn(`deployment-node`),project:k().describe(`Project ID`),id:k().describe(`Deployment ID (FQN)`),name:k().describe(`Deployment name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:om,metadata:Sn(wn([k(),j(k())])),tags:j(k())})])),Lm=W({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1042
+ Search LikeC4 elements and deployment nodes across all projects.
1043
+
1044
+ Query syntax (case-insensitive):
1045
+ - kind:<value> filters by kind
1046
+ - shape:<value> filters by shape
1047
+ - meta:<key> filters by having metadata with the given key
1048
+ - #<value> matches assigned tags
1049
+ - <value> matches id (FQN) or title
1050
+
1051
+ Request:
1052
+ - search: string — at least 2 characters
1053
+
1054
+ Response (JSON object):
1055
+ - total: number - total number of results
1056
+ - found: Result[] - returns top 20 results
1057
+
1058
+ Result (discriminated union by "type"):
1059
+ - 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> }
1060
+ - 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> }
1061
+
1062
+ View (object) fields:
1063
+ - id: string — view identifier
1064
+ - title: string — view title
1065
+ - type: "element" | "deployment" | "dynamic"
1066
+
1067
+ Notes:
1068
+ - Read-only, idempotent.
1069
+ - Use results as input to other tools (e.g., read-element, read-view).
1070
+
1071
+ Example response:
1072
+ {
1073
+ "total": 1,
1074
+ "found": [
1075
+ {
1076
+ "type": "logical",
1077
+ "project": "default",
1078
+ "id": "shop.frontend",
1079
+ "name": "frontend",
1080
+ "kind": "container",
1081
+ "title": "Frontend",
1082
+ "technology": "React",
1083
+ "shape": "rectangle",
1084
+ "includedInViews": [
1085
+ {
1086
+ "id": "system-overview",
1087
+ "title": "System Overview",
1088
+ "type": "element"
1089
+ }
1090
+ ],
1091
+ "tags": ["public"],
1092
+ "metadata": {}
1093
+ }
1094
+ ]
1095
+ }
1096
+ `,inputSchema:{search:k().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:A(),found:Im}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),U.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),U.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),U.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),U.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(U.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 qr(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:sm(e.views())});for(let e of qr(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:sm(e.views())})}catch(e){U.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Rm=O({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k().describe(`Human-readable title`),depth:A().describe(`Depth relative to the root element (1 = direct child)`),tags:j(k()).describe(`Assigned tags`),metadata:Sn(wn([k(),j(k())])).describe(`Element metadata`),childCount:A().describe(`Number of direct children`),incomingCount:A().describe(`Number of incoming relationships`),outgoingCount:A().describe(`Number of outgoing relationships`)}),zm=W({name:`subgraph-summary`,description:`
1097
+ Get a compact, table-friendly summary of all descendants of a parent element.
1098
+ Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
1099
+ Much more efficient than calling read-element for each descendant individually.
1100
+
1101
+ Request:
1102
+ - elementId: string — parent element id (FQN) whose descendants to summarize
1103
+ - maxDepth: number (optional, default: 10, max: 20) — maximum depth of descendants to include
1104
+ - metadataKeys: string[] (optional) — if provided, only include these metadata keys in the response (reduces response size)
1105
+ - project: string (optional) — project id. Defaults to "default" if omitted.
1106
+
1107
+ Response (JSON object):
1108
+ - root: object — the root element summary
1109
+ - id: string — element id
1110
+ - kind: string — element kind
1111
+ - title: string — element title
1112
+ - childCount: number — number of direct children
1113
+ - descendants: Array of descendant summaries, each with:
1114
+ - id: string — element id (FQN)
1115
+ - name: string — element name
1116
+ - kind: string — element kind
1117
+ - title: string — human-readable title
1118
+ - depth: number — depth relative to root (1 = direct child)
1119
+ - tags: string[] — assigned tags
1120
+ - metadata: Record<string, string | string[]> — element metadata (filtered by metadataKeys if provided)
1121
+ - childCount: number — number of direct children
1122
+ - incomingCount: number — number of incoming relationships
1123
+ - outgoingCount: number — number of outgoing relationships
1124
+ - totalDescendants: number — total number of descendants (may differ from array length if truncated)
1125
+ - truncated: boolean — true if results were truncated due to exceeding the 200-result limit
1126
+ - truncatedByDepth: boolean — true if deeper descendants exist beyond maxDepth
1127
+
1128
+ Notes:
1129
+ - Read-only, idempotent, no side effects.
1130
+ - Safe to call repeatedly.
1131
+ - Limited to 200 descendants in the response.
1132
+ - Use metadataKeys to reduce response size when you only need specific metadata.
1133
+ - Descendants are returned in breadth-first order (closest to root first).
1134
+ - depth=1 means direct child, depth=2 means grandchild, etc.
1135
+
1136
+ Example response:
1137
+ {
1138
+ "root": {
1139
+ "id": "top.planner",
1140
+ "kind": "subsystem",
1141
+ "title": "Planner Subsystem",
1142
+ "childCount": 5
1143
+ },
1144
+ "descendants": [
1145
+ {
1146
+ "id": "top.planner.nodeA",
1147
+ "name": "nodeA",
1148
+ "kind": "cgf-node",
1149
+ "title": "nodeA :dwNodeTypeA",
1150
+ "depth": 1,
1151
+ "tags": ["is_in_dag", "target_asil_qm"],
1152
+ "metadata": { "target_asil": "QM", "safety_info_unit_asil": "QM" },
1153
+ "childCount": 0,
1154
+ "incomingCount": 3,
1155
+ "outgoingCount": 2
1156
+ }
1157
+ ],
1158
+ "totalDescendants": 5,
1159
+ "truncated": false,
1160
+ "truncatedByDepth": false
1161
+ }
1162
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:k().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:A().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:j(k()).optional().describe(`If provided, only include these metadata keys in the response`),project:q},outputSchema:{root:O({id:k(),kind:k(),title:k(),childCount:A()}),descendants:j(Rm),totalDescendants:A().describe(`Total number of descendants found`),truncated:On().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:On().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);N(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 Bm=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new Tn({name:`LikeC4`,version:Zf},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1163
+
1164
+ Conventions:
1165
+ - All tools are read-only and idempotent.
1166
+ - "project" is optional and defaults to "default".
1167
+
1168
+ Available tools:
1169
+ - list-projects — List all LikeC4 projects in the workspace.
1170
+ - read-project-summary — Project specification, configuration, all elements, deployment nodes and views. Input: { project? }.
1171
+ - search-element — Search elements and deployment nodes across all projects by id/title/kind/shape/tags/metadata. Input: { search }.
1172
+ - read-element — Full element details including relationships, includedInViews, deployedInstances, metadata and sourceLocation. Input: { id, project? }.
1173
+ - read-deployment — Details of a deployment node or deployed instance. Input: { id, project? }.
1174
+ - read-view — Full view details (nodes/edges) and sourceLocation. Input: { viewId, project? }.
1175
+ - find-relationships — Direct and indirect relationships between two elements in a project. Input: { element1, element2, project? }.
1176
+ - query-graph — Query element hierarchy (ancestors, descendants, siblings, children, parent) and relationships (incomers, outgoers). Input: { elementId, queryType, includeIndirect?, project? }.
1177
+ - 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? }.
1178
+ - 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? }.
1179
+ - query-by-metadata — Search elements by metadata key-value pairs with exact/contains/exists matching. Input: { key, value?, matchMode?, project? }.
1180
+ - query-by-tags — Advanced tag filtering with boolean logic (allOf, anyOf, noneOf). Input: { allOf?, anyOf?, noneOf?, project? }.
1181
+ - find-relationship-paths — Discover all paths (chains of relationships) between two elements with BFS traversal. Input: { sourceId, targetId, maxDepth?, includeIndirect?, project? }.
1182
+ - batch-read-elements — Read details of multiple elements in a single call, reducing round-trips. Input: { ids, project? }.
1183
+ - query-by-tag-pattern — Search elements by tag prefix/contains/suffix patterns. Input: { pattern, matchMode?, project? }.
1184
+ - element-diff — Compare two elements side-by-side showing differences in properties, tags, metadata, and relationships. Input: { element1Id, element2Id, project? }.
1185
+ - subgraph-summary — Compact summary of all descendants of a parent element with metadata, tags, and relationship counts. Input: { elementId, maxDepth?, metadataKeys?, project? }.
1186
+ ${t?`- open-view — Opens the LikeC4 view panel in the editor. Triggers UI; at most one preview panel at a time. Input: { viewId, project? }.`:``}
1187
+
1188
+ Instructions:
1189
+ - Identify the project first
1190
+ - Use "search-element" to find elements by id/title/kind/shape/tags/metadata and select the project
1191
+ - Use "read-project-summary" to find all elements and deployment nodes inside the project, what kinds, tags, metadata keys are available
1192
+ - Use "list-projects" to list all available projects
1193
+ - If response returns "sourceLocation", provide link to this location in the editor
1194
+
1195
+ Full documentation: https://likec4.dev/llms-full.txt
1196
+ `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...vm(this.services.likec4.LanguageServices)),n.registerTool(...Mm(this.services.likec4.LanguageServices)),n.registerTool(...jm(this.services.likec4.LanguageServices)),n.registerTool(...Am(this.services.likec4.LanguageServices)),n.registerTool(...Fm(this.services.likec4.LanguageServices)),n.registerTool(...Lm(this.services.likec4.LanguageServices)),n.registerTool(..._m(this.services.likec4.LanguageServices)),n.registerTool(...Tm(this.services.likec4.LanguageServices)),n.registerTool(...Dm(this.services.likec4.LanguageServices)),n.registerTool(...km(this.services.likec4.LanguageServices)),n.registerTool(...xm(this.services.likec4.LanguageServices)),n.registerTool(...Cm(this.services.likec4.LanguageServices)),n.registerTool(...mm(this.services.likec4.LanguageServices)),n.registerTool(...um(this.services.likec4.LanguageServices)),n.registerTool(...Sm(this.services.likec4.LanguageServices)),n.registerTool(...pm(this.services.likec4.LanguageServices)),n.registerTool(...zm(this.services.likec4.LanguageServices)),t&&n.registerTool(...ym(this.services.likec4.LanguageServices)),n.server.onerror=e=>{z.error(L(e))},n}},Vm=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||(U.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new En,await this._mcp.connect(this.transport),U.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{U.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 Hm(e){let t=new Ue;t.use(`*`,Ge({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 We({eventStore:new Ke({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(U.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)=>(U.error(L(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function Um(e){let{factory:t,port:n}=e,r=await Hm(t);return new Promise((e,t)=>{let i=Hn({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var Wm=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()}U.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await Um({factory:this.services.mcp.ServerFactory,port:e}),U.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(U.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?U.error(`Failed to stop MCP server`,{err:e}):U.info(`MCP server stopped`),t()})})):(U.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function Gm(e,t=33335){U.debug(`Creating StreamableLikeC4MCPServer`);let n=new Wm(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){U.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=L(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),U.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function Km(e){return new Vm(e)}function qm(e=`sse`){return{mcpServer:t=>e===`stdio`?Km(t):Gm(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new Bm(e)}}var Jm=class extends gt{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!tc(e)&&!Zs(e)&&!V(e))return super.getDocumentation(e);try{let t=Ot(e);if(t.state<E.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case tc(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Zs(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=M.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(`
1197
+ `)}case V(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
1198
+ `):void 0}default:return e}}catch(e){B(e)}}};function Ym(e,t){return[e,t]=Xm(e,t)>0?[t,e]:[e,t],Zm(e.range,t.range.start)}function Xm(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 Zm(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 Qm(e){return!!e&&e.range.start.line!=e.range.end.line}const J={newLine:Dt.newLine({allowMore:!0}),oneSpace:Dt.oneSpace(),noSpace:Dt.noSpace(),indent:Dt.indent({allowMore:!0}),noIndent:Dt.noIndent()};var $m=class extends Qt{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,Ad,(e,t)=>{let n=Rt(e.$cstNode,`values`).filter(i).slice(1);t.cst(n).prepend(J.oneSpace),t.keywords(`,`).prepend(J.noSpace).append(J.oneSpace)})}formatDeploymentRelation(e){this.on(e,sc,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(J.oneSpace),t.keywords(`]->`).prepend(J.noSpace),t.keywords(`-[`).append(J.noSpace),t.nodes(...S([e.target,e.tags],i)).prepend(J.oneSpace),t.properties(`title`,`description`,`technology`).prepend(J.oneSpace)})}formatExtendDeployment(e){this.on(e,nl,(e,t)=>{t.keywords(`extend`).append(J.oneSpace)})}formatRelation(e){this.on(e,e=>Lu(e)||sc(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(J.oneSpace),t.keywords(`]->`).prepend(J.noSpace),t.keywords(`-[`).append(J.noSpace),t.nodes(...S([e.target,e.tags],i)).prepend(J.oneSpace),t.properties(`title`,`description`,`technology`).prepend(J.oneSpace)}),this.on(e,Lo,(e,t)=>{t.keywords(`->`,`<-`).surround(J.oneSpace),t.property(`dotKind`).prepend(J.oneSpace).append(J.oneSpace),t.keywords(`]->`).prepend(J.noSpace).append(J.oneSpace),t.keywords(`-[`).prepend(J.oneSpace).append(J.noSpace),t.properties(`title`).prepend(J.oneSpace),(vf(e)&&Qm(e.$cstNode)||bf(e)&&vf(e.$container)&&Qm(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(Dt.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(Dt.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&Qm(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){tu(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(J.noIndent)}indentContentInBraces(e){if(ru(e)||yd(e)||dd(e)||hd(e)||ld(e)||Ol(e)||Al(e)||Ml(e)||El(e)||wl(e)||Ml(e)||_u(e)||Fc(e)||cl(e)||zu(e)||$u(e)||hu(e)||xu(e)||Zc(e)||Cc(e)||pc(e)||qd(e)||Vd(e)||qs(e)||Ys(e)||Gc(e)||jc(e)||yu(e)||rc(e)||lc(e)||$s(e)||il(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(J.noIndent).prepend(J.oneSpace);let r=Qm(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(J.oneSpace);continue}(!o||!Ym(o,e))&&t.cst([e]).prepend(Dt.newLine({allowMore:!0})).prepend(J.indent),o=e}r?i.prepend(J.noIndent).prepend(Dt.newLine({allowMore:!0})):i.prepend(Dt.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Lc)?.keywords(`element`).append(J.oneSpace)}formatView(e){this.on(e,Yc,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(J.oneSpace),t.keywords(`of`,`extends`).surround(J.oneSpace)}),this.on(e,xc)?.keywords(`dynamic`,`view`).append(J.oneSpace),this.on(e,dc)?.keywords(`deployment`,`view`).append(J.oneSpace)}formatLeafProperty(e){if(Uc(e)||Zu(e)||Yd(e)||Du(e)||ku(e)||pd(e)||_d(e)||Ws(e)||au(e)||Bs(e)||Vl(e)||rd(e)||Hs(e)||ju(e)||Cu(e)||Ll(e)||Ul(e)||zl(e)||ad(e)||Fu(e)||Md(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(J.oneSpace):n.prepend(J.noSpace).append(J.oneSpace),t.keyword(`;`).prepend(J.noSpace).append(J.newLine)}}formatLinkProperty(e){this.on(e,su,(e,t)=>{t.keyword(`link`).append(J.oneSpace),t.property(`value`).append(J.oneSpace),t.keyword(`:`).prepend(J.noSpace).append(J.oneSpace),t.keyword(`;`).prepend(J.noSpace).append(J.newLine)})}formatNavigateToProperty(e){this.on(e,Tu)?.property(`key`).append(J.oneSpace)}formatAutolayoutProperty(e){this.on(e,Fd,(e,t)=>{t.keyword(`autoLayout`).append(J.oneSpace),t.property(`rankSep`).prepend(J.oneSpace),t.property(`nodeSep`).prepend(J.oneSpace)})}formatMetadataProperty(e){this.on(e,pu,(e,t)=>{t.property(`key`).append(J.oneSpace),t.keyword(`:`).prepend(J.noSpace).append(J.oneSpace),t.keyword(`;`).prepend(J.noSpace).append(J.newLine)})}formatElementDeclaration(e){this.on(e,V,(e,t)=>{let n=Zt(e.$cstNode,`kind`),r=Zt(e.$cstNode,`name`);r&&n&&(Xm(r,n)>0?t.cst([n]).append(J.oneSpace):(t.cst([r]).append(J.oneSpace),t.cst([n]).prepend(J.oneSpace))),t.properties(`props`).prepend(J.oneSpace)})}formatExtendElement(e){this.on(e,ol,(e,t)=>{t.keywords(`extend`).append(J.oneSpace)})}formatGlobals(e){this.on(e,Al,(e,t)=>{t.keyword(`style`).append(J.oneSpace),t.property(`id`).append(J.oneSpace)}),this.on(e,Ml,(e,t)=>{t.keyword(`styleGroup`).append(J.oneSpace)}),this.on(e,El,(e,t)=>{t.keyword(`predicateGroup`).append(J.oneSpace)}),this.on(e,wl,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(J.oneSpace)})}formatImports(e){this.on(e,ql,(e,t)=>{t.keyword(`import`).append(J.oneSpace),t.keywords(`{`,`}`,`from`).surround(J.oneSpace)}),this.on(e,Gl,(e,t)=>{t.keywords(`,`).prepend(J.noSpace).append(J.oneSpace)})}formatSpecificationRule(e){if((dd(e)||hd(e)||xd(e)||ld(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(J.oneSpace),sd(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(J.oneSpace),t.property(`name`).append(J.oneSpace)}}formatWithPredicate(e){(vl(e)||Uu(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(J.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,tc,(e,t)=>{let n=Zt(e.$cstNode,`kind`),r=Zt(e.$cstNode,`name`);r&&n&&(Xm(r,n)>0?t.cst([n]).append(J.oneSpace):(t.cst([r]).append(J.oneSpace),t.cst([n]).prepend(J.oneSpace))),t.properties(`title`).prepend(J.oneSpace)})}formatDeployedInstance(e){this.on(e,Zs,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(J.oneSpace),t.keyword(`instanceOf`).append(J.oneSpace),t.property(`title`).prepend(J.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,zd,(e,t)=>{t.keywords(`global`,`style`).append(J.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Ld(e)||Dc(e))&&t.keywords(`global`,`predicate`).append(J.oneSpace)}formatViewRuleGroup(e){this.on(e,Vd,(e,t)=>{t.keyword(`group`).append(J.oneSpace)})}formatViewRuleStyle(e){this.on(e,qd)?.keyword(`style`).append(J.oneSpace),this.on(e,_c)?.keyword(`style`).append(J.oneSpace),this.on(e,el)?.keyword(`,`).prepend(J.noSpace).append(J.oneSpace),this.on(e,ml)?.keyword(`,`).prepend(J.noSpace).append(J.oneSpace)}formatWhereExpression(e){(Vu(e)||gl(e))&&this.getNodeFormatter(e).keyword(`where`).append(J.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Fs,(e,t)=>{t.property(`operator`).surround(J.oneSpace)}),this.on(e,cf,(e,t)=>{t.keyword(`not`).append(J.oneSpace)}),Ns(e)||mf(e)||of(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(J.oneSpace),t.property(`not`).surround(J.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Os,(e,t)=>{t.property(`operator`).surround(J.oneSpace)}),this.on(e,tf,(e,t)=>{t.keyword(`not`).append(J.oneSpace)}),Es(e)||rf(e)||$d(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(J.oneSpace),t.property(`not`).surround(J.oneSpace)}}formatIncludeExcludeExpressions(e){if(Fo(e)||Ud(e)||hc(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!Qm(e.$cstNode))&&t.keywords(`include`,`exclude`).append(J.oneSpace)}if(el(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&Qm(n?.$cstNode);r&&t.property(`value`).prepend(J.indent),t.keyword(`,`).prepend(J.noSpace).append(r?J.newLine:J.oneSpace)}}formatRelationExpression(e){this.on(e,Yl,(e,t)=>{t.keyword(`->`).append(J.oneSpace)}),this.on(e,Zl,(e,t)=>{t.keyword(`->`).prepend(J.oneSpace)}),this.on(e,Nu,(e,t)=>{t.keywords(`->`,`<->`).prepend(J.oneSpace),t.keywords(`-[`).prepend(J.oneSpace).append(J.noSpace),t.keywords(`]->`).prepend(J.noSpace).append(J.oneSpace),t.property(`dotKind`).prepend(J.oneSpace).append(J.oneSpace)}),this.on(e,yc,(e,t)=>{t.property(`target`).prepend(J.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Fo(t)||Ud(t)||hc(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:P(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,gs)?.property(`value`),t??=this.on(e,V)?.properties(`props`),t??=this.on(e,ql)?.properties(`project`),t??=this.on(e,Lu)?.properties(`title`,`technology`),t??=this.on(e,Vd)?.properties(`title`),t??=this.on(e,Lo)?.properties(`title`),t??=this.on(e,tc)?.properties(`title`),t??=this.on(e,Zs)?.properties(`title`),t??=this.on(e,sc)?.properties(`title`,`technology`),t??=this.on(e,su)?.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`}}}};en();const eh=z.getChild(`LanguageServices`),th=e=>e.severity===Xt.Error;var nh=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 Jf?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=b(this.services.shared.workspace.LangiumDocuments.groupedByProject(),u(),x(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:x(n,we(`uri`)),config:a}}));if(y(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(y(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=x(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),we(`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 Kn.create({...r.$data,_stage:`layouted`,views:b(i,x(we(`diagram`)),h(we(`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===Kn.EMPTY){eh.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!y(n,1))throw Error(`No models found`);let r=ji(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return b(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),l(e=>b(e.diagnostics??[],S(th),x(({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:P(e)}}async dispose(){try{eh.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){eh.error(L(e))}finally{eh.debug(`LikeC4LanguageServices disposed`)}}},rh=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(rp(e))return e.state<E.Linked&&(z.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),z.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=tp.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=G(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`}}})}};en();const ih=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function ah(e,t){return Yt(t.feature)&&t.property===`project`&&ql(e.node)}var oh=class extends Pt{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Nt(t.feature):return this.completionForKeyword(e,t.feature,n);case At(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case ah(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:w.Snippet,insertTextFormat:ct.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&Ht(e.node,xu):n(e,{label:t.value,detail:`Insert deployment view`,kind:w.Class,insertTextFormat:ct.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
1199
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:w.Property,insertTextFormat:ct.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:w.Property,insertTextFormat:ct.Snippet,insertText:`${t.value} \${1|${Or.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:w.Property,insertTextFormat:ct.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:w.Module,insertTextFormat:ct.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:w.Module,insertTextFormat:ct.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
1200
+ `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:w.Module,insertTextFormat:ct.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
1201
+ `)});break;case t.value===`dynamic`&&Ht(e.node,xu):n(e,{label:t.value,detail:`Insert dynamic view`,kind:w.Class,insertTextFormat:ct.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
1202
+ `)});break;case t.value===`style`&&e.node&&Ht(e.node,Al):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:w.Module,insertTextFormat:ct.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${ih}|} $0\n}`});break;case t.value===`style`&&e.node&&Ht(e.node,Ce([xu,Ml])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:w.Module,insertTextFormat:ct.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${ih}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:w.Module,insertTextFormat:ct.Snippet,insertText:`${t.value} {\n\t\${1|${ih}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:w.Class,insertTextFormat:ct.Snippet,insertText:`extend $1 {
1203
+ $0
1204
+ }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:w.Property,insertTextFormat:ct.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:w.Property,insertTextFormat:ct.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:w.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:ct.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,i=e.document.textDocument,a={start:i.positionAt(e.tokenOffset),end:i.positionAt(e.tokenEndOffset)},o=i.getText(a),s=n(o)?`'`:o.substring(0,1);for(let n of r.all){let r=s+n+s;t(e,{label:n,kind:w.Folder,insertText:r,filterText:r,textEdit:jt.replace(a,r),detail:`Project`,sortText:`0_`+n})}}},sh=Ct(),ch=class extends It{createDocumentHighlight(e){return sh.DocumentHighlight.create(e.segment.range,sh.DocumentHighlightKind.Read)}},lh=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!rp(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:nn(e.parseResult.value).filter(su).map(t=>{try{let n=Zt(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Rn(r))return{range:n,target:r}}catch(e){B(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Rn(t)||Fn(t))return t;if(Nn(t))return An(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return An(n.toString(),t)}relativeLink(e,t){if(Fn(t))return jn(t);if(Nn(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return jn(Bn(new URL(t,r).toString(),n))}return null}};en();const uh=z.getChild(`DocumentSymbolProvider`);var dh=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(!rp(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<E.Linked&&(uh.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),uh.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 B(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(i);return n.length===0?[]:[{kind:$e.Namespace,name:`icons`,range:t.range,selectionRange:Gt(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=Zt(t,`name`);if(!n)return[];let r=b([...e.elements,...e.tags,...e.relationships],x(e=>{try{if(dd(e)||hd(e)||ld(e))return this.getKindSymbol(e);if(xd(e))return this.getTagSymbol(e)}catch(e){return B(e),null}P(e)}),S(i));return r.length===0?[]:[{kind:$e.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=Zt(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>ul(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=Zt(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(ol(e))return this.getExtendElementSymbol(e);if(V(e))return this.getElementSymbol(e)}catch(e){B(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:Tp(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=Zt(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=Zt(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||n(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||n(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||n(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?Zt(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(tc(e))return this.getDeploymentNodeSymbol(e);if(Zs(e))return this.getDeployedInstanceSymbol(e);if(nl(e))return[]}catch(e){B(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=Ot(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 fh=`
1205
+ ---
1206
+ `;var ph=class extends Ut{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(Ed(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Lc(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(ac(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Yu(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(V(e))return this.getElementHover(e);if(tc(e))return this.getDeploymentNodeHover(e);if(Zs(e))return this.getDeployedInstanceHover(e)}catch(e){z.debug(L(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=Tr(n);i&&r.push(``,(i.md??i.txt).split(`
1207
+ `).join(`
1208
+ `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
1209
+ <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
1210
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(fh,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=T.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(fh,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(m);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:fh,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
1211
+ `):void 0}getDeploymentNodeHover(e){let t=Ot(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=Tr(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
1212
+ `)}}}getDeployedInstanceHover(e){let t=Ot(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=M.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 \`${M.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
1213
+ `)}}}},mh=rn(),hh=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:mh.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[mh.TextEdit.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};en();const gh=z.getChild(`SemanticTokenProvider`),_h={...mt},vh={...St};function yh(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in vh)return t.push(vh[i]),n;if(i in _h)return()=>e(_h[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const bh=`Stop Highlighting`,xh=()=>{throw bh};var Sh=class extends Jt{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(Yu,e=>{e.property(`name`).function()}),e(Ir(Lu,Nu,sc),e=>{e.property(`kind`).function()}),e($l,e=>{e.property(`name`).definition.function(),xh()}),e(Ir(Tu,qu),e=>{e.property(`value`).readonly.definition.interface()}),e(gf,e=>{e.cst().readonly.definition.variable(),xh()}),e(Sl,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Od,e=>{e.cst().type()}),e(Gu,e=>{e.cst().function()}),e(of,e=>{i(e.node.value?.$refText)&&e.property(`value`).function()}),e(Ir(Es,Ns),e=>{i(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Ir(uf,ff),e=>{e.property(`participant`).keyword()}),e(zc,e=>{i(e.node.kind)&&e.property(`kind`).definition.type()}),e(Ir(Ml,Al),e=>{e.property(`id`).readonly.definition.variable()}),e(zd,e=>{e.property(`style`).readonly.definition.variable()}),e(Ir(El,wl),e=>{e.property(`name`).readonly.definition.variable()}),e(Ld,e=>{e.property(`predicate`).readonly.definition.variable()}),e(qc,e=>{i(e.node.tag)&&e.property(`tag`).definition.type()}),e(Ir(bl,Td),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(Cd,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),e(sd,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(xd,e=>{i(e.node.color)&&e.keyword(`color`).property()}),e(Ir(dd,hd,ld),e=>{e.property(`kind`).readonly.declaration.type()}),e(Ed,e=>{e.property(`name`).definition.type()}),e(ju,e=>{e.property(`value`).number()}),e(Vl,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(su,e=>{i(e.node.value)&&e.property(`value`).string()}),e(Ir(Ws,Ll),e=>{i(e.node.customColor)&&e.property(`customColor`).enum(),i(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(e=>To(e)&&!Ir(es,Gc,$u)(e)&&i(e.key),e=>e.property(`key`).property()),e(Ir(rd,Bs,au,Hs,ms,zl,Ul,Tc),e=>{i(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Ir(V,tc,Zs)(e))return this.highlightNameAndKind(e);if(Qo(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===bh)return`prune`;gh.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Zs(e)||this.mark(e).property(`kind`).keyword(),V(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){let t=t=>yh((n,r)=>this.highlightToken({range:$r(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),n=t=>yh((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),r=(t,n)=>yh((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}));return{node:e,cst:t,keyword:n,property:r}}};const Ch=Ir(V,ol);var wh=class extends Cp{projects;langiumDocuments;documentCache;workspaceCache;logger=z.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new zr(e=>this.createDocumentIndex(e)),this.workspaceCache=new et(e.shared,E.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.IndexedContent,e=>{rp(e)&&go(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=E.IndexedContent)}get(e){return e.state<E.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:C.basename(e.uri),state:e.state,expect:E.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){N(V(e)||ko(e));let t=np.readId(e);if(i(t))return t;let n=Ot(e);return n.state<E.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:C.basename(n.uri)}),N(rp(n)),this.get(n),wr(np.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return Ft(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return Ft(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new Br;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return Th(t)}))}directChildrenOf(e,t){return Ft(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new Br;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return Th(n)}))}uniqueDescedants(e,t){return Ft(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new Br,r=new Br;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=Th(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...ai(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Ch));if(t.length===0)return Eh.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new Br,a=new Br,o=new Br,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return np.writeId(t,i),o.set(i,a),a};function u(e,t){let n=jr(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=S(e.body?.elements??[],Ch);if(!y(s,1))return[o];let l=s.flatMap(e=>u(e,n));for(let e of l)a.set(n,e);return[o,...l]}function d(e){let t=Tp(e.element),n=b(e.body?.elements??[],S(V),l(e=>u(e,t)));if(n.length!==0)for(let e of[t,...Vr(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(ol(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:C.basename(e.uri),error:t})}return new Eh(r,i,a,o,n)}};function Th(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Ur(e.name,t.name))}var Eh=class e{static EMPTY=new e([],new Br,new Br,new Br,Qp.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 Dh=pr(ko,nl);var Oh=class extends wh{Names;logger=z.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(Dh));if(t.length===0)return Eh.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],a=new Br,o=new Br,s=new Br,c=this.Names,u=this.services.workspace.AstNodeDescriptionProvider,d=(t,r,i)=>{let a={...u.createDescription(t,r,e),id:i,likec4ProjectId:n};return np.writeId(t,i),s.set(i,a),a};function f(e,t){let n=c.getName(e);if(!i(n))return[];let s=Xn(n,t),l=d(e,n,s);if(t?a.set(t,l):r.push(l),Zs(e))return[l];let u=S(e.body?.elements??[],Dh);if(!y(u,1))return[l];let p=u.flatMap(e=>f(e,s));for(let e of p)o.set(s,e);return[l,...p]}function p(e){let t=Tp(e.deploymentNode),n=b(e.body?.elements??[],S(Dh),l(e=>f(e,t)));if(n.length!==0)for(let e of[t,...or(t)])for(let t of n)o.set(e,t)}for(let n of t)try{if(nl(n)){p(n);continue}f(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:C.basename(e.uri),error:t})}return new Eh(r,a,o,s,n)}};const kh=/^(aws|azure|gcp|tech):(.+)$/;function Ah(e){if(!e)return;let t=kh.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var jh=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new Br(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;m(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=kr(n),this.projectId=he(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:i,kind:a,title:o,description:s,technology:c,summary:l,metadata:u})=>{try{let d=this.specs.elements[a];if(!d)return z.warn`No kind '${a}' found for ${i}`,null;c??=d.technology,s??=d.description,l??=d.summary,t??=d.links,pe(o)&&(o=d.title||Qr(i)),d.tags&&Jr(d.tags)&&(e=e?be([...d.tags,...e]):d.tags);let f=Fr({...d.style,...r});return!c&&this.inferTechFromIcon&&(c=Ah(f.icon)),Fr({metadata:u&&!n(u)?u:void 0,notation:d.notation,style:f,links:t,tags:e,summary:l,technology:c,description:s,title:o,kind:a,id:i})}catch(e){B(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>m(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:F.flatten(e.element)};if(`element`in e)return z.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return z.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===Qr(e.id)&&t.title?t.title:i,Fr({...t,...a,title:i,style:Fr({...t.style,...r}),id:n})}catch(e){B(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>m(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}},Mh=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 Nh(e){let t=new Map;for(let n of e)if(vr(n)&&n.viewOf&&a(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=d(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:Ph}=qt;function Fh({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:mr(n)?{direction:n}:n,nodes:Te(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:Te(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function Ih(e){return e.includes(`@likec4-generated`)}function Lh(e){if(!Ih(e))throw Error(`Not a likec4-generated comment: ${e}`);return Fh(Un(Wn(e.trim().split(`
1214
+ `).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function Rh(e){let t=Wt(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!Ih(t.text)))try{return Lh(t.text)}catch(n){let r=Ph(e);B(n),z.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}var zh=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=be([...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=be([...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 r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let i=t.tags;e.tags&&e.tags.length>0&&(i=be([...e.tags,...i]));let a=t.metadata;return e.metadata&&(a=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:y(i,1)?i:null,links:y(r,1)?r:null,...!n(a)&&{metadata:a}}}};function Bh(e,t,r){let o=new jh(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});o.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(o);let s=Te(o.specs.colors,e=>Ar(e.color)),c=new Set,u=new zh,d=new zh,f=r.flatMap(e=>e.c4ExtendRelations),p=new Set,m=e=>{e?.metadata&&v(e.metadata).forEach(e=>c.add(e))},g=b(r,l(e=>(u.merge(e.c4ExtendElements),x(e.c4Elements,o.toModelElement))),S(i),oi,oe((e,t)=>{let n=ri(t.id);return n&&a(e[n])?(z.debug`No parent found for ${t.id}`,e):(e[t.id]=u.applyExtended(t),m(e[t.id]),e)},{})),_=b(r,l(e=>x(e.c4Relations,o.toModelRelation)),S(e=>{if(!e)return!1;let t=F.flatten(e.source),n=F.flatten(e.target);return a(g[t])&&!yr(t)||a(g[n])&&!yr(n)?(z.debug`Invalid relation ${e.id}
1215
+ source: ${t} resolved: ${!!g[t]}
1216
+ target: ${n} resolved: ${!!g[n]}\n`,!1):!0}),x(e=>{let t=Ap(`extend-relation`,F.flatten(e.source),F.flatten(e.target),e.kind??`default`,e.title??``),r=f.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>p.add(e.astPath));let i=e.tags?[...e.tags]:[],a=e.links?[...e.links]:[],o=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&i.push(...e.tags),e.links)for(let t of e.links)a.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||a.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=o[t];if(e===void 0)o[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],a=be([...r,...i]);o[t]=a.length===1?a[0]:a}}}let s=be(i),c=a;return{...e,...y(s,1)&&{tags:s},...y(c,1)&&{links:c},...!n(o)&&{metadata:o}}}),te(m),h(we(`id`))),ee=b(r,l(e=>(d.merge(e.c4ExtendDeployments),x(e.c4Deployments,o.toDeploymentElement))),S(i),oi,oe((e,t)=>{let n=ri(t.id);return n&&a(e[n])?(z.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=hr(t)?d.applyExtended(t):t,m(e[t.id]),e)},{})),ne=b(r,l(e=>x(e.c4DeploymentRelations,o.toDeploymentRelation)),S(e=>e?a(ee[e.source.deployment])||a(ee[e.target.deployment])?(z.debug`Invalid deployment relation ${e.id}
1217
+ source: ${e.source.deployment} resolved: ${!!ee[e.source.deployment]}
1218
+ target: ${e.target.deployment} resolved: ${!!ee[e.target.deployment]}\n`,!1):!0:!1),oe((e,t)=>fe(e[t.id])?(z.debug`Duplicate deployment relation ${t.id}`,e):(m(t),e[t.id]=t,e),{}));function re(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:o,astPath:s,...c}=e;return e[Pr]===`element`&&a(i)&&`viewOf`in e&&(i=g[e.viewOf]?.title??null),a(i)&&r===`index`&&(i=`Landscape view`),{...le(c,e=>e===void 0),[Nr]:`parsed`,sourcePath:C.relative(t.folderUri,n),docUri:n,description:o,title:i,id:r}}}let ie=r.flatMap(e=>x(e.c4Views,re(e)));if(ie.some(e=>e.id===`index`)||ie.unshift({[Nr]:`parsed`,[Pr]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews!==!1){let e=new Set;for(let t of ie)t[Pr]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(ie.map(e=>e.id));for(let n of v(g)){if(e.has(n)||yr(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),ie.push({[Nr]:`parsed`,[Pr]:`element`,id:r,viewOf:n,title:`Auto / ${(g[n]?.title??n).replaceAll(`
1219
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ae=b(ie,h(we(`id`)));ie.some(Lr)&&(ae=Ni(ae));for(let e of f)p.has(e.astPath)||z.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Nr]:`parsed`,projectId:t.id,project:Fr({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:o.tags,elements:o.specs.elements,relationships:Te(o.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:o.specs.deployments,...c.size>0&&{metadataKeys:[...c].sort(Ur)},customColors:s},elements:g,relations:_,globals:o.globals,views:ae,deployments:{elements:ee,relations:ne},imports:{}},imports:o.imports}}const Vh=e=>`parsed-without-imports-${e}`,Hh=e=>`parsed-model-${e}`,Uh=e=>`computed-model-${e}`,Wh=z.getChild(`builder`);var Gh=class extends Cp{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.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let t=se(s(),S(e=>go(e)&&!this.projects.isExcluded(e)),x(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(E.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),Wh.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=Vh(e);return t.get(n,()=>{let t=Wh.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`,Bh(this.services,n,r))}catch(t){return Wh.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=Wh.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]??[]);y(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=Wh.getChild(e),r=this.cache,i=Np();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await ot(t);let a=Hh(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,Kn.create(t)):(n.debug`parseModel: returning EMPTY`,Kn.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=Uh(e)+(t?.hash??``);return n.get(r,()=>{let n=Wh.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Kn.EMPTY.asComputed;let i=Kn.create(r),a=[];for(let e of Se(r.views)){let r=Mi(e,i);if(!r.isSuccess){n.warn(L(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}Nh(a);let o=Oe(a,t=>{let n=Kh(e,t.id),r=this.previousViews[n],i=r&&ln(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[ir]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(Kn.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=Wh.getChild(e),r=Np();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await ot(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Kn.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),_t.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Wh.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){Wh.warn(L(e))}}};function Kh(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:qh,findNodeForProperty:Jh}=Tt,{getDocument:Yh,streamAllContents:Xh}=qt,Zh=z.getChild(`locator`);var Qh=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=Ee(t)?this.projects.ensureProjectId():G(t)),Ee(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=Yh(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Zh.debug(L(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=Er(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(!Lu(r)&&!sc(r))continue;let i=r.kind?Jh(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Jh(r.$cstNode,`dotKind`):void 0,i??=qh(r.$cstNode,`->`),i??=Jh(r.$cstNode,`title`),i??=Jh(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(Qo(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?Jh(r.$cstNode,`name`):void 0;return i??=qh(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<E.Linked&&(Zh.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,n.uri,t));let r=G(n);Zh.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)??Dr.DEFAULT;if(!e)return Zh.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=b(Xh(n.parseResult.value),qr(e=>Ed(e)||Od(e)),ci(),l(n=>{let r,i;try{Ed(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return I(a,`Tag ${r} not found in merged specification`),I(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:Ed(n)}}catch(e){return Zh.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Zh.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Zh.warn(L(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!xc(n)||!n.body)return Zh.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||!Lo(i))return Zh.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Jh(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Jh(i.$cstNode,`dotKind`):void 0,a??=qh(i.$cstNode,`->`),a??=qh(i.$cstNode,`<-`),a??=Jh(i.$cstNode,`title`),a??=Jh(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const $h=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Y(e){return async function t(n,r,i){try{let t=e(n,r,i);ee(t)&&await t;return}catch(e){let t=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${t}`,{node:n}),z.debug(`Validation failed: ${t}`,{error:e})}}}const{getDocument:eg}=qt,tg=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Y((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=wr(n.getNameNode(e),`name CstNode not found`).range;$h.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=G(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},ng=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Y((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=wr(n.getNameNode(e),`name CstNode not found`).range;$h.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=G(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},rg=e=>{let t=e.likec4.ModelParser;return Y((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=eg(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){z.warn(L(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(M.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(M.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(M.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(M.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Sr(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},ig=e=>Y((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!tc(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),ag=e=>{let t=e.likec4.FqnIndex;return Y((e,n)=>{let r=wp(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=wp(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(dr(i,o)||dr(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},og=e=>{let t=e.likec4.FqnIndex;return Y((e,n)=>{let r=e.source;bf(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=wp(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},sg=e=>Y((e,t)=>{if(n(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}Ht(e,Cc)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:cg}=qt,lg=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Y((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}$h.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=cg(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(G(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`}]}})}})},ug=e=>Y((e,t)=>{kp(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:dg}=qt,fg=e=>{let t=e.shared.workspace.ProjectsManager;return Y((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=G(dg(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},pg=e=>Y((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`})}),mg=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Vl(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Gc(n)&&Fc(n.$container)&&n.$container.props.some(e=>Vl(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`})},hg=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||Ee(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=o(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((!o(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!o(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!o(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),o(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),Ee(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}P(e)},gg=e=>{let t=e.likec4.ModelParser;return Y((e,n)=>{let r=t.forDocument(Ot(e)),i=jp(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=jp(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}M.isImportRef(i)&&(M.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`})),Sr(M.flatten(i),M.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},_g=e=>Y((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),vg=e=>{let t=e.likec4.ModelParser,n=new et(e.shared,E.Linked),r=({source:e,target:t,kind:n,title:r})=>Ap(`extend-relation`,M.flatten(e),M.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(b(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),l(e=>e.c4Relations??[]),x(e=>r(e)))))}return Y((e,n)=>{let a=Ot(e),o=t.forDocument(a),s=jp(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=jp(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!M.isModelRef(s)&&!M.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!M.isModelRef(c)&&!M.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=G(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})})},yg=e=>Y((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),bg=e=>Y((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),xg=e=>Y((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),Sg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{$h.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=G(e),i=t.projectElements(r,Ic).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==Ot(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`}]}})}})},Cg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{$h.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=G(e),i=t.projectElements(r,ic).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==Ot(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`}]}})}})},wg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{let r=e.name,i=G(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==Ot(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`}]}})}})},Tg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{$h.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=G(e);t.projectElements(r,Ju).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},Eg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{let r=G(e),i=t.projectElements(r,Tl),a=t.projectElements(r,Cl);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`})})},Dg=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{let r=G(e);t.projectElements(r,Nl).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Og=e=>{let t=e.shared.workspace.IndexManager;return Y((e,n)=>{let r=Wt(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Ih(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;$h.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=G(e);t.projectElements(i,Zo).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function kg(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const Ag=e=>Y((e,t)=>{let n=kg(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(Sl),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!jg(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function jg(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:jg(e.parent,t.parent)}const Mg=e=>{let t=e.likec4.ModelParser;return Y((e,n)=>{let r=pp(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(Ot(r)),o=Mr.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case Mr.isWildcard(o)&&i:case Mr.isElementKindExpr(o)&&i:case Mr.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case Mr.isWildcard(o):case Mr.isModelRef(o):case Mr.isDeploymentRef(o):return;case Mr.isElementKindExpr(o):case Mr.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:ei(o)}})},Ng=e=>{let t=e.likec4.ModelParser;return Y((e,n)=>{let r=t.forDocument(Ot(e)).parseFqnRefExpr(e),a=pp(e),o=vp(e)&&!Ht(e,e=>_c(e)||qd(e));if(a?.$type===`DeploymentViewRulePredicate`||o){if(!Ht(e,as)){if(Mr.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(Mr.isDeploymentRef(r)&&F.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}i(e.selector)&&!tc(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(a?.$type===`DynamicViewIncludePredicate`)switch(!0){case Mr.isElementKindExpr(r):case Mr.isElementTagExpr(r):case Mr.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},Pg=e=>Y((e,t)=>{e.to.$type===`WildcardExpression`&&!Zl(e.$container)&&a($t(e,Yc)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),Fg=e=>Y((e,t)=>{if(pp(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=$t(e,Yc);n&&a(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),Ig=e=>{let t=e.likec4.ModelParser;return Y((e,n)=>{let r=$t(e,hc);if(!r||r.isInclude!==!0)return;let i=Ot(e),a=t.forDocument(i),o=tr.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(tr.isDirect(o)){(Zn.isModelRef(o.source)||Zn.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=tr.isIncoming(o)?o.incoming:tr.isOutgoing(o)?o.outgoing:o.inout,Zn.isModelRef(c)){n(`error`,s,{node:e});return}})},Lg=e=>Y((e,t)=>{let n=pp(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var Rg=class extends nt{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)}};en();const zg=Ir(ql,Gl,Ol,El,wl,Al,Ml,vl,Uu,Go,as,jc,vf,bf,Mo,hc,Vo,as,Sl,bs,vs,Ad,Ss,Fo,Qo,ws,Zs,tc,sc,fs,Tc,hu,es,Lu,zu,zo,gs,Tu,V,Fc,Gc,Vc,ol,cl,nl,il,ul,fl,dd,hd,ld,xd,sd,yd,el,Do),Bg=e=>{let t=e;for(;t&&!tu(t);){if(zg(t))return t;t=t.$container}};function Vg(e){let t=e.state>=E.Validated?e.diagnostics?.filter(e=>e.severity===Xt.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(a(e)||n.has(e))continue;n.add(e);let t=Bg(e);t&&n.add(t)}let r=e=>!n.has(e);return{isValid:r,invalidNodes:n}}function Hg(e){z.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:ng(e),DeploymentNodeKind:Cg(e),DeploymentNode:tg(e),DeploymentRelation:rg(e),ExtendDeployment:ig(e),ExtendRelation:vg(e),FqnRefExpr:Ng(e),RelationExpr:Ig(e),OpacityProperty:pg(e),IconProperty:mg(e),SpecificationRule:yg(e),Model:bg(e),Globals:xg(e),GlobalPredicateGroup:Eg(e),GlobalDynamicPredicateGroup:Eg(e),GlobalStyleId:Dg(e),DynamicStepSingle:ag(e),DynamicStepChain:og(e),LikeC4View:Og(e),Element:lg(e),ElementRef:ug(e),ElementKind:Sg(e),Relation:gg(e),RelationBody:_g(e),Tag:wg(e),FqnExprWith:Mg(e),RelationExprWith:Lg(e),RelationshipKind:Tg(e),IncomingRelationExpr:Pg(e),OutgoingRelationExpr:Fg(e),ImportsFromPoject:fg(e),ColorLiteral:hg(e),DynamicViewDisplayVariantProperty:sg(e),ViewRuleRank:Ag(e)});let t=e.shared.lsp.Connection;t&&ni(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)z.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>z.error(L(e)))})})}const Ug=z.getChild(`parser`);function Wg(e){if(e==null)return;let t=X(e);return Ee(t)?t.split(`
1220
+ `).join(` `):`md`in t?{md:t.md.split(`
1221
+ `).join(` `)}:{txt:t.txt.split(`
1222
+ `).join(` `)}}function X(e){if(e!=null)switch(!0){case Ee(e):return Gn(e).trim();case lu(e)&&Ee(e.markdown):return{md:Gn(e.markdown).trim()};case lu(e)&&Ee(e.text):return{txt:Gn(e.text).trim()};case lu(e):return{txt:``};default:return}}var Gg=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=Vg(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(an(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`?Ug.getChild(n).debug(r):Ug.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 l(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(Gl(e)){let t=G(e),n=this.resolveFqn(wr(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Qn(t,n)}return ol(e)?Tp(e.element):nl(e)?Tp(e.deploymentNode):ko(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)||n(e.props))return;let t=e=>{if(lu(e)){let t=X(e);if(!t)return[];if(typeof t==`string`)return i(t)?[t]:[];{let e=t.md||t.txt;return i(e)?[e]:[]}}else if(du(e))return e.values.map(e=>X(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(i);return[]},r=b(e.props,l(e=>t(e.value).map(t=>[e.key,t])),S(([e,t])=>i(t)));if(n(r))return;let a=b(r,_(([e])=>e),Te(e=>e.map(([e,t])=>t))),o={};for(let[e,t]of Object.entries(a))t&&t.length>0&&(o[e]=t.length===1?t[0]:t);return n(o)?void 0:o}parseMarkdownOrString(e){if(lu(e))return X(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=>wr(e.tag.ref,`Tag reference is not resolved`).name).filter(i)),t=t.prev;return br(n)?be(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,su),e=>{let t=e.value;if(pe(t))return;let n=i(e.title)?Wg(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return lr({url:t,title:n,relative:r&&r!==t?r:void 0})});return br(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&&Rn(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&&Nn(n):return An(this.doc.uri.toString(),`../`,n);case n&&Fn(n):return In(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){Ug.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?In(i,r):i;return In(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(Fl(e))return`#${e.hex}`;if(td(e)){let t=o(e.alpha)?e.alpha:void 0;return Ee(e.alpha)&&(t=ap(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}P(e)}}parseElementStyle(e){if(!e)return{};if(p(e)){let t=this.parseStyleProps(e.find(Gc)?.props);try{let n=this.parseIconProperty(e.find(Vl));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 Hs(n):i(n.value)&&(t.border=n.value);break;case Ws(n):{let e=up(n);i(e)&&(t.color=e);break}case rd(n):i(n.value)&&(t.shape=n.value);break;case Vl(n):{let e=this.parseIconProperty(n);i(e)&&(t.icon=e);break}case Ll(n):{let e=up(n);i(e)&&(t.iconColor=e);break}case Ul(n):i(n.value)&&(t.iconSize=sp(n));break;case zl(n):i(n.value)&&(t.iconPosition=cp(n));break;case ju(n):t.opacity=op(n);break;case Cu(n):t.multiple=f(n.value)?n.value:!1;break;case ad(n):i(n.value)&&(t.size=sp(n));break;case Fu(n):i(n.value)&&(t.padding=sp(n));break;case Md(n):i(n.value)&&(t.textSize=sp(n));break;default:P(n)}}catch(e){this.logError(e,n)}return lr(t)}parseBaseProps(e,t){let n=X(t?.title??ip(e.title)),r=t?.description?{txt:X(t.description)}:this.parseMarkdownOrString(e.description);return lr({title:n,summary:t?.summary?{txt:X(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:Wg(t?.technology)??X(ip(e.technology))})}};function*Kg(e){let t=er.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(sc(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 qg(e){return class t extends e{parseDeployment(){let e=this.doc;for(let t of Kg(e))try{switch(!0){case sc(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Zs(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case tc(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case nl(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:P(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=wr(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(es)),c=b(e.body?.props??[],S(t),S(Uc),Oe(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return lr({id:n,kind:r,title:l??Cr(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);N(M.isModelRef(r)||M.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(es)),s=b(e.body?.props??[],S(t),S(Uc),Oe(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return lr({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(es)),i=this.parseLinks(e.body);return!t&&n(r??{})&&!i?null:lr({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:r,tags:t,links:i})}_resolveDeploymentRelationSource(e){if(fe(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);N(M.isDeploymentRef(r),`Invalid source for deployment relation`);let a=this.parseFqnRef(e.target);N(M.isDeploymentRef(a),`Invalid target for deployment relation`);let o=this.convertTags(e)??this.convertTags(e.body)??void 0,s=this.convertLinks(e.body),c=(e.kind??e.dotKind?.kind)?.ref?.name,l=this.getMetadata(e.body?.props.find(es)),u=b(e.body?.props??[],S(Zu),S(e=>i(e.value)),Oe(e=>[e.key,e.value])),d=b(e.body?.props??[],S(qu),ne())?.value.view.ref?.name,f=this.parseBaseProps(u,{title:e.title}),p=e.body?.props.find($u);return lr({id:Ap(`deployment`,n,r.deployment,a.deployment),source:r,target:a,...f,metadata:l,kind:c,tags:o,links:s,...lp(p?.props,t),navigateTo:d,astPath:n})}}}function Jg(e){return class t extends e{parseDeploymentView(e){let t=e.body;N(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+Ap(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(b(n,S(Yd),Oe(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);tp.writeId(e,i);let l=Rh(e);return{[Yn._type]:`deployment`,id:i,astPath:r,title:Wg(a)??null,description:o,tags:s,links:br(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e)),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(hc(e))return this.parseDeploymentViewRulePredicate(e);if(Fd(e))return dp(e);if(_c(e))return this.parseDeploymentViewRuleStyle(e);P(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;m(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){B(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(vs)),n=X(ip(e.props.find(Du)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const Yg=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function Xg(e){return!uf(e)&&!ff(e)?null:e.participant}function Zg(e){switch(!0){case Ls(e):{let t=e.value.tag.ref?.name,n=Xg(e);N(t,`Expected tag name`);let r={tag:Yg(e,t)};return n?{participant:n,operator:r}:r}case js(e):{let t=e.value?.ref?.name,n=Xg(e);N(t,`Expected kind name`);let r={kind:Yg(e,t)};return n?{participant:n,operator:r}:r}case tf(e)||cf(e):return{not:Zg(e.value)};case Zd(e):{let t=Zg(e.left),n=Zg(e.right);return Qg(e.operator.toLowerCase(),t,n)}default:P(e)}}function Qg(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[fr(t)?t.and:t,fr(n)?n.and:n].flat();return N(br(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[xr(t)?t.or:t,xr(n)?n.or:n].flat();return N(br(e),`Expected non-empty array`),{or:e}}default:P(e)}}function $g(e){return class t extends e{parseFqnRef(e){let t=wr(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(Gl(t)){let e={project:G(t),model:this.resolveFqn(wr(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(V(t)){let n=Op(e);if(n){let e={project:G(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=Dp(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(ko(t))return{deployment:this.resolveFqn(t)};P(t)}parseExpressionV2(e){if(Yo(e))return this.parseFqnExprOrWith(e);if(ls(e))return this.parseRelationExprOrWith(e);P(e)}parseFqnExprOrWith(e){if(vl(e))return this.parseFqnExprWith(e);if(qo(e))return this.parseFqnExprOrWhere(e);P(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(Tu(t)){let n=t.value.view.$refText;return i(n)&&(e.custom.navigateTo=n),e}if(ku(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Uc(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=X(ip(t.value));return n&&(e.custom[t.key]=n),e}if(Vl(t)){let n=this.parseIconProperty(t);return fe(n)&&(e.custom[t.key]=n),e}if(Ws(t)){let n=up(t);return fe(n)&&(e.custom[t.key]=n),e}if(rd(t)||Hs(t))return fe(t.value)&&(e.custom[t.key]=t.value),e;if(ju(t))return fe(t.value)&&(e.custom[t.key]=op(t)),e;if(Ll(t)){let n=up(t);return fe(n)&&(e.custom[t.key]=n),e}if(Du(t)){let n=i(t.value)?X(ip(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(Cu(t))return f(t.value)&&(e.custom[t.key]=t.value),e;if(ad(t)||Md(t)||Fu(t)||Ul(t))return i(t.value)&&(e.custom[t.key]=sp(t)),e;if(zl(t))return i(t.value)&&(e.custom[t.key]=t.value),e;P(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(gl(e))return this.parseFqnExprWhere(e);if(Go(e))return this.parseFqnExpr(e);P(e)}parseFqnExprWhere(e){return N(!gl(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?Zg(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(gf(e))return{wildcard:!0};if(zc(e))return N(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(qc(e))return N(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(Sl(e))return this.parseFqnRefExpr(e);P(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{m(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(Uu(e))return this.parseRelationExprWith(e);if(ss(e))return this.parseRelationExprOrWhere(e);P(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(ku(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(Zu(t)||Du(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=X(ip(t.value));return n&&(e[t.key]=n),e}if(Bs(t))return i(t.value)&&(e[t.key]=t.value),e;if(Ws(t)){let n=up(t);return i(n)&&(e[t.key]=n),e}if(au(t))return i(t.value)&&(e[t.key]=t.value),e;if(qu(t)){let n=t.value.view.ref?.name;return i(n)&&(e[t.key]=n),e}P(t)},{})}parseRelationExprOrWhere(e){if(Vu(e))return this.parseRelationExprWhere(e);if(as(e))return this.parseRelationExpr(e);P(e)}parseRelationExprWhere(e){N(!Vu(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?Zg(e.where):null,a;return a=i&&r?Qg(`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:P(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 e_(e){return class t extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),a=r.flatMap(e=>e.predicates.filter(n));for(let e of a)try{let n=e.name;if(!i(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 o=r.flatMap(e=>e.styles.filter(n));for(let e of o)try{let n=e.id.name;if(!i(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);y(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(El(e)){let r=this.parseGlobalPredicateGroup(e);y(r,1)&&(n.predicates[t]=r);return}if(wl(e)){let r=this.parseGlobalDynamicPredicateGroup(e);y(r,1)&&(n.dynamicPredicates[t]=r);return}P(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Al(e))return[this.parseViewRuleStyle(e)];if(Ml(e))return e.styles.map(e=>this.parseViewRuleStyle(e));P(e)}}}function t_(e){return class t 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(wr(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*n_(e){let t=er.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Lu(r)){n.push(r);continue}if(ul(r)){n.push(r);continue}if(r.body?.elements&&y(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function r_(e){return class t extends e{parseModel(){let e=this.doc;for(let t of n_(e))try{if(V(t)){e.c4Elements.push(this.parseElement(t));continue}if(Lu(t)){e.c4Relations.push(this.parseRelation(t));continue}if(ol(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(ul(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}P(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=wr(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(es)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=b(e.body?.props??[],S(t),S(Uc),Oe(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return Fr({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(es)),r=this.parseLinks(e.body);if(!t&&pe(n)&&!r)return null;let i=this.getAstNodePath(e);return Fr({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);N(F.isModelRef(t)||F.isImportRef(t),`Source must be a model reference`),N(F.isModelRef(r)||F.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body),a=this.getMetadata(e.body?.props.find(es)),o=this.getAstNodePath(e),s=this.parseLinks(e.body);if(!i&&n(a??{})&&!s)return null;let c=(e.kind??e.dotKind?.kind)?.ref?.name,{title:l=``}=this.parseBaseProps({},{title:e.title});return Fr({id:Ap(`extend-relation`,F.flatten(t),F.flatten(r),c??`default`,l),astPath:o,metadata:a,tags:i,links:s})}_resolveRelationSource(e){if(fe(e.source)){let t=this.parseFqnRef(e.source);return N(F.isModelRef(t)||F.isImportRef(t),`Relation source must be a model reference`),t}if(Fc(e.$container)||cl(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);N(F.isModelRef(r)||F.isImportRef(r),`Target must be a model reference`);let a=this.parseTags(e)??this.parseTags(e.body)??void 0,o=this.parseLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(es)),l=this.getAstNodePath(e),u=b(e.body?.props??[],S(Zu),S(e=>i(e.value)),Oe(e=>[e.key,e.value])),d=b(e.body?.props??[],S(qu),x(e=>e.value.view.ref?.name),S(i),ne()),{title:f=``,description:p,technology:m}=this.parseBaseProps(u,{title:e.title,description:e.description,technology:e.technology}),h=e.body?.props.find($u);return Fr({id:Ap(l,n.model,r.model),astPath:l,source:n,target:r,title:f,metadata:c,kind:s,tags:a,links:o,navigateTo:d,description:p,technology:m,...lp(h?.props,t)})}}}function i_(e){return class t extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(vl(e))return this.parseFqnExprWith(e);if(qo(e))return this.parseFqnExprOrWhere(e);P(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 a_(e){return class t 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(!i(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let o=b(n.filter(_d)??[],S(e=>this.isValid(e)&&m(e.value)),Oe(e=>[e.key,X(ip(e.value))]),le(a));t.relationships[r]={...o,...lp(n.filter(fs),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let o=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of o)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),a=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}i(n)&&(t.tags[n]={astPath:r,...a?{color:a}:{}})}catch(t){this.logError(t,e,`specification`)}let s=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of s)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:$r(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(!i(r))throw Error(`DeploymentNodeKind name is not resolved`);let a=this.parseTags(e),o=this.parseElementStyle(n.find(Gc)),s=this.parseLinks(e),c=b(n.filter(pd)??[],S(e=>this.isValid(e)),Oe(e=>[e.key,e.value])),l=this.parseBaseProps(c),u=X(ip(c.notation));return{[r]:lr({...l,notation:u,tags:a??void 0,...s&&Yn.isNonEmptyArray(s)&&{links:s},style:o})}}}}function o_(e){return class t extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),i=t.folder&&!n(t.folder.trim())?Wg(t.folder):null;for(let n of t.views)try{if(!e(n))continue;switch(!0){case Yc(n):this.doc.c4Views.push(this.parseElementView(n,r));break;case xc(n):this.doc.c4Views.push(this.parseDynamicElementView(n,r));break;case dc(n):this.doc.c4Views.push(this.parseDeploymentView(n));break;default:P(n)}if(i){let e=this.doc.c4Views.at(-1);e.title=i+` / `+(e.title||e.id)}}catch(e){this.logError(e,n,`views`)}}}parseElementView(e,t){let n=e.body;N(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=wp(e.viewOf),n=t&&jp(()=>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_`+Ap(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(b(n.props,S(e=>this.isValid(e)),S(Yd),Oe(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=Rh(e),d={[Yn._type]:`element`,id:a,astPath:r,title:Wg(o)??null,description:s,tags:c,links:br(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i},...u&&{manualLayout:u}};if(tp.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return N(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(Ud(e))return this.parseViewRulePredicate(e);if(Ld(e))return this.parseViewRuleGlobalPredicateRef(e);if(ws(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Fd(e))return dp(e);if(Vd(e))return this.parseViewRuleGroup(e);if(Gd(e))return this.parseViewRuleRank(e);P(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(qd(e))return this.parseViewRuleStyle(e);if(zd(e))return this.parseViewRuleGlobalStyle(e);P(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Ud(n)){t.push(this.parseViewRulePredicate(n));continue}if(Vd(n)){t.push(this.parseViewRuleGroup(n));continue}P(n)}catch(e){this.logError(e,n,`views`)}return{title:Wg(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Yn.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Yn.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(vs)),r=X(ip(e.props.find(Du)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;N(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+Ap(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(b(i,S(Yd),Oe(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);tp.writeId(e,o);let f=Rh(e),p=d(i,Tc)?.value;return{[Yn._type]:`dynamic`,id:o,astPath:a,title:Wg(s)??null,description:c,tags:l,links:br(u)?u:null,variant:p,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>jc(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e)),...f&&{manualLayout:f}}}parseDynamicViewRule(e){if(kc(e))return this.parseDynamicViewIncludePredicate(e);if(Dc(e))return this.parseViewRuleGlobalPredicateRef(e);if(ws(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Fd(e))return dp(e);P(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Yo(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=s_(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return N(br(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(bf(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return N(br(t),`Dynamic step chain must have at least one step`),{seriesId:s_(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(bf(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(!br(n)||!this.isValid(e))return[];let r=De(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=wp(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=wp(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:s_(e)},r=X(e.title);r&&(n.title=r);let a=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;a&&(n.kind=a);for(let t of e.custom?.props??[])try{switch(!0){case qu(t):{let e=t.value.view.ref?.name;i(e)&&(n.navigateTo=e);break}case Zu(t):case Du(t):if(fe(t.value))if(t.key===`description`){let e=X(t.value);e&&(n.description=e)}else n[t.key]=X(ip(t.value))??``;break;case ku(t):fe(t.value)&&(n[t.key]=X(t.value));break;case Bs(t):fe(t.value)&&(n[t.key]=t.value);break;case Ws(t):{let e=up(t);fe(e)&&(n[t.key]=e);break}case au(t):fe(t.value)&&(n[t.key]=t.value);break;default:P(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function s_(e){let t=e,n=[];for(;!Cc(t);)o(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}en();const c_=b(Gg,$g,t_,r_,qg,Jg,i_,a_,o_,e_);var l_=class extends c_{};const u_=z.getChild(`parser`),d_=e=>e.severity===Xt.Error;var f_=class{cachedParsers=new zr(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Linked,async e=>{this.cachedParsers.has(e)&&(u_.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:C.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(E.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){B(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Validated,async e=>{e.diagnostics?.some(d_)&&this.cachedParsers.has(e)&&(u_.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:C.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){I(rp(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=C.relative(t.folderUri,e.uri);e.likec4ProjectId?u_.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):u_.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<E.Linked&&u_.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 Br(Set)};e=Object.assign(e,r);let i=new l_(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}},p_=class extends yt{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),at.convertString(t)):super.runConverter(e,t,n)}};en();const{findNodeForKeyword:m_}=Tt,h_=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...u(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},g_=(e,t)=>n=>{if(!qd(n)&&!_c(n))return!1;let r=n.targets.value;if(!r||i(n.targets.prev)||r.$type!==`FqnRefExpr`||i(r.selector))return!1;let a=r.ref?.value?.ref;return(a?t.resolve(a):null)===e};function __(e,{view:t,viewAst:n,targets:r,style:i}){N(n.body,`View ${t.id} has no body`);let a=n.$cstNode;N(a,`viewCstNode`);let o=De(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;N(o,`insertPos is not defined`);let s=a.range.start.character+2,l=e.likec4.FqnIndex,d=S(n.body.rules,e=>qd(e)||_c(e)),f=t[ar]===`element`?t.viewOf??null:null,p=[],m=[];r.forEach(e=>{let t=c(d,g_(e,l)),n=f&&dr(f,e)?e.substring(f.length+1):e;t?p.push({fqn:n,rule:t}):m.push({fqn:n})});let h={start:o,end:o},g=e=>{e.start.line<=h.start.line&&(e.start.line==h.start.line?h.start.character=Math.min(e.start.character,h.start.character):h.start=e.start),e.end.line>=h.end.line&&(e.end.line==h.end.line?h.end.character=Math.max(e.end.character,h.end.character):h.end=e.end)},_=[];if(m.length>0){let e=m.flatMap(({fqn:e})=>h_(e,i,s));_.push(jt.insert(o,`
1223
+ `+e.join(`
1224
+ `))),h.start={line:o.line+1,character:s},h.end={line:o.line+e.length,character:De(e)?.length??0}}if(p.length>0)for(let{rule:e}of p){let t=e.$cstNode;N(t,`RuleCstNode not found`);for(let[n,r]of u(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;g({start:e,end:t}),_.push(jt.replace({start:e,end:t},n+` `+i));continue}let o=m_(t,`{`)?.range.end;N(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;_.push(jt.insert(o,`
1225
+ `+c)),g({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:h,edits:_}}en();const{findNodeForKeyword:v_}=Tt;function y_(e,{view:t,viewAst:n,layout:r}){N(n.body,`View ${t.id} has no body`);let i=n.$cstNode;N(i,`viewCstNode`);let a=fp(r.direction),s=c(n.body.rules,Fd),l=`autoLayout ${a}`;if(o(r.rankSep)&&(l+=` ${r.rankSep}`,o(r.nodeSep)&&(l+=` ${r.nodeSep}`)),s&&s.$cstNode)return jt.replace(s.$cstNode.range,l);let u=v_(n.body.$cstNode,`}`)?.range.start;N(u,`Closing brace not found`);let d=`\t${l}\n\t`;return jt.insert(u,d)}en();async function b_(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;N(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;N(r,`LSP Connection not available`);let i=Wt(n,[`BLOCK_COMMENT`]);return i&&Ih(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[jt.del(i.range)]}}})).applied:!1}en();const x_=z.getChild(`model-changes`);var S_=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);x_.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 N(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&t&&await b_(this.services,{lookup:s}).catch(e=>{x_.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&t&&await b_(this.services,{lookup:s}).catch(e=>{x_.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};N(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?{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=L(Ii(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return x_.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return __(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=y_(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:P(t)}}},C_=class extends st{constructor(e){super(),this.services=e}getNameStrict(e){return wr(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(lt(e))return e.name;if(Gl(e))return e.imported.$refText;if(Zs(e))return e.target.modelElement.value.$refText}getNameNode(e){if(lt(e))return super.getNameNode(e);if(Gl(e))return e.imported.$refNode;if(Zs(e))return e.target.modelElement.value.$refNode}};function w_(e){return b(e,_(e=>`${e.type}.${e.name}`),u(),l(([e,t])=>t.length===1?t:[]))}var T_=class extends pt{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){B(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(a(r)||r.length===0))for(let e of r)try{i(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){B(e)}}exportGlobals(e,t,n){if(!(a(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;i(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){B(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;i(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){B(e)}}}exportModel(e,t,n){if(!(a(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{V(r)&&i(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){B(e)}}exportLibrary(e,t,n){if(!a(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){B(e)}}exportSpecification(e,t,n){if(!(a(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 ld(r):case dd(r):i(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case xd(r):i(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case hd(r):i(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case sd(r):i(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:P(r)}}catch(e){B(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(a(r)||r.length===0))for(let e of r)try{tc(e)&&i(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){B(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new it;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){B(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){B(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){B(e)}w_(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let a=new it,o=[];for(let r of e.elements){if(Lu(r))continue;let e;if(V(r)?(i(r.name)&&a.add(r.name,this.descriptions.createDescription(r,r.name,n)),e=r.body,e&&(t.add(e,this.descriptions.createDescription(r,`this`,n)),t.add(e,this.descriptions.createDescription(r,`it`,n)))):ol(r)&&(e=r.body),e&&e.elements.length>0)try{o.push(...this.processContainer(e,t,n))}catch(e){B(e)}}o.length&&b(o,S(e=>!a.has(e.name)),_(e=>e.name),r((e,t)=>{e.length===1&&a.add(t,e[0])}));let s=[...a.values()];return t.addAll(e,s),s}processDeployments(e,t,n){let a=new it,o=[];for(let r of e.elements){if(sc(r))continue;let e=r.body;if(!nl(r)){let o=this.nameProvider.getName(r);if(i(o)){let e=this.descriptions.createDescription(r,o,n);a.add(o,e)}e&&(t.add(e,this.descriptions.createDescription(r,`this`,n)),t.add(e,this.descriptions.createDescription(r,`it`,n)))}if(e)try{o.push(...this.processDeployments(e,t,n))}catch(e){B(e)}}o.length&&b(o,S(e=>!a.has(e.name)),_(e=>e.name),r((e,t)=>{e.length===1&&a.add(t,e[0])}));let s=[...a.values()];return t.addAll(e,s),s}};const{getDocument:E_}=qt;var D_=class extends ft{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=G(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(bl(r))return new dt(this.streamForFqnRef(t,r,e));if(Td(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Nc)return this.getProjectScope(t,n,e);if(Gl(r)){let e=G(r);return new dt(this.fqnIndex.rootElements(e))}if(Cd(r)&&e.property===`el`){let i=r.parent;return i?new dt(this.fqnIndex.directChildrenOf(t,Tp(i))):this.getProjectScope(t,n,e)}return new dt(Ft(this.computeScope(t,e)))}catch(r){return B(r),this.getProjectScope(t,n,e)}}catch(e){return B(e),zt}}*genUniqueDescedants(e){if(!e)return;let t=G(e);if(V(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(tc(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(wp(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(wp(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 dt(this.deploymentsIndex.directChildrenOf(e,Tp(r)).filter(e=>this.reflection.isSubtype(e.type,ec))):this.getProjectScope(e,ec,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&tc(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return Ft(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return Lt;if(Gl(i))return Ft(this.genUniqueDescedants(i.imported.ref));if(tc(i))return Ft(this.genUniqueDescedants(i));if(Zs(i)){let e=i.target.modelElement.value.ref,t=Gl(e)?e.imported.ref:V(e)?e:void 0;return Ft(this.genUniqueDescedants(t))}return V(i)?Ft(this.genUniqueDescedants(i)):P(i)}*genScopeForParentlessFqnRef(e,t,n){Ht(t,Vc)||_p(t)?yield*this.computeScope(e,n,Nc):gp(t)?(yield*this.computeScope(e,n,Nc),yield*this.computeScope(e,n,ec),yield*this.computeScope(e,n,Xs)):(yield*this.computeScope(e,n,ec),yield*this.computeScope(e,n,Xs),Ht(t,pc)&&(yield*this.computeScope(e,n,Nc)));let r=E_(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Wl)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Nc),i=this.reflection.isSubtype(n,Oo),a=E_(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&&il(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&cl(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Zc(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Ql?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new ut(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Ql)return super.getGlobalScope(e,t);let n=G(t.container);return this.getProjectScope(n,e,t)}},Z=cn();let O_;(function(e){e.type=new Z.NotificationType(`likec4/onDidChangeModel`)})(O_||={});let k_;(function(e){e.type=new Z.NotificationType0(`likec4/onDidChangeProjects`)})(k_||={});let A_;(function(e){e.type=new Z.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(A_||={});let j_;(function(e){e.type=new Z.NotificationType(`likec4/onRequestOpenView`)})(j_||={});let M_;(function(e){e.req=new Z.RequestType(`likec4/fetchComputedModel`)})(M_||={});let N_;(function(e){e.req=new Z.RequestType0(`likec4/fetchViewsFromAllProjects`)})(N_||={});let P_;(function(e){e.req=new Z.RequestType(`likec4/fetchLayoutedModel`)})(P_||={});let F_;(function(e){e.req=new Z.RequestType(`likec4/layout-view`)})(F_||={});let I_;(function(e){e.req=new Z.RequestType(`likec4/validate-layout`)})(I_||={});let L_;(function(e){e.req=new Z.RequestType0(`likec4/reload-projects`)})(L_||={});let R_;(function(e){e.req=new Z.RequestType0(`likec4/fetch-projects`)})(R_||={});let z_;(function(e){e.req=new Z.RequestType(`likec4/register-project`)})(z_||={});let B_;(function(e){e.req=new Z.RequestType(`likec4/build`)})(B_||={});let V_;(function(e){e.req=new Z.RequestType(`likec4/locate`)})(V_||={});let H_;(function(e){e.req=new Z.RequestType(`likec4/change-view`)})(H_||={});let U_;(function(e){e.req=new Z.RequestType0(`likec4/metrics`)})(U_||={});let W_;(function(e){e.req=new Z.RequestType(`likec4/document-tags`)})(W_||={});let G_;(function(e){e.req=new Z.RequestType0(`likec4/fetch-projects-overview`)})(G_||={});const Q=z.getChild(`rpc`);var K_=class extends Cp{constructor(e){super(),this.services=e}init=ue(()=>{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=ke(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(O_.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=ke(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(k_.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(M_.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===Kn.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(A_.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest(P_.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:h(i,e=>e.id)}}}),e.onRequest(F_.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(I_.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(R_.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:Te(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:x(e,e=>e.uri.toString())}})})),e.onRequest(L_.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(z_.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(T.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(N_.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await ot(e);try{let n=await t.Views.computedViews(i,e);r.push(...b(n,x(e=>({id:e.id,title:e.title??e.id,projectId:i})),ve((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(B_.req,async({docs:t},n)=>{let a=t.map(e=>T.parse(e)),o=e=>!a.some(t=>C.equals(t,e)),c=r.userDocuments.map(e=>e.uri).filter(o).toArray();Q.debug(`[ServerRpc] received request to build:
1226
+ changed (total ${a.length}):${t.map(e=>`
1227
+ - `+e).join(``)}
1228
+ deleted (total ${c.length}):${c.map(e=>`
1229
+ - `+e.toString()).join(`
1230
+ `)}`),!s&&a.length+c.length>0&&await Promise.allSettled([...a,...c].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}`)}})),s=!1,await ot(n),await i.update(a,c,n)}),e.onRequest(V_.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:P(e)}}),e.onRequest(H_.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(U_.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Kn.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+=v(n.specification.elements).length,r.deploymentKinds+=v(n.specification.deployments).length,r.relationshipKinds+=v(n.specification.relationships).length,r.tags+=v(n.specification.tags).length,r.customColors+=v(n.specification.customColors??{}).length,r.elements+=v(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=v(n.$data.relations).length,r.views+=v(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await ot(e),{metrics:r}}),e.onRequest(W_.req,async({documentUri:e},r)=>{let i=T.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(G_.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),_t.create(()=>{a.cancel()}));function c(e){return b(e,S(e=>!!e.hasLayoutDrift),x(e=>{let n=t.ModelLocator.locateView(e.id);return N(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:mh.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(j_.type,e)}};en();var q_=class{constructor(e){this.services=e}getSymbolKind(e){let t=an(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Nc,al,ec,Xs,Wl):return $e.Constructor;case n(gu,bu,vu,Dl,vd):return $e.Namespace;case n(Zo):return $e.Class;case n(`Tag`,Ql,Gs,bd):return $e.EnumMember;case n(Ju,md):return $e.Event;case n(Ic,ic,ud,cd):return $e.TypeParameter}return $e.Field}getCompletionItemKind(e){let t=an(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Gs):return w.Color;case n(Nc,ec,Xs,al,Wl):return w.Constructor;case n(gu,bu,vu,Dl,vd):return w.Module;case n(Zo):return w.Class;case n(`Tag`,Ql,Gs,bd):return w.EnumMember;case n(Ju,md):return w.Event;case n(Ic,ud,ic,cd):return w.TypeParameter;default:return w.Reference}}},J_=class extends kt{};const Y_=z.getChild(`views`);var X_=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Se((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Se(e.$data.views);if(n.length===0)return[];let r=Np(),i=e.project.id,a=Y_.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await ot(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,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 a=await this.ModelBuilder.computeModel(n,r),o=a.findView(e)?.$view;n=a.project.id;let s=Y_.getChild(n);if(!o){s.warn`layoutView ${e} not found`;let t=a.findManualLayout(e);if(t){s.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=Np(),r=this.cache.get(o)??await this.layouter.layout({view:o,styles:a.$styles});return this.cache.has(o)?s.debug`layout ${e} from cache`:(this.viewSucceed(o,a,r),s.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),i(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,a,t)}:r}catch(e){let t=L(e);return s.warn(t),this.reportViewError(o,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=Se(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):B(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){Y_.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Ai(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Y_.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[rr]===`manual`?(Y_.error(`View ${e.id} already has manual layout, this should not happen`),e):sr(e,r):cr(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};const Z_={graphviz(){return new Ya}};function Q_(e){return{graphviz(){return e}}}function $_(e){return{lsp:{NodeKindProvider:e=>new q_(e),WorkspaceSymbolProvider:e=>new J_(e)},workspace:{Cache:e=>new et(e,E.Validated),IndexManager:e=>new $f(e),LangiumDocuments:e=>new Sp(e),ProjectsManager:e=>new Qp(e),WorkspaceManager:e=>new $p(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function ev(e){return{documentation:{DocumentationProvider:$(Jm)},validation:{DocumentValidator:$(Rg)},Rpc:$(K_),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(nh),Graphviz:t=>e.graphviz(t),Layouter:e=>new eo({graphviz:e.likec4.Graphviz}),Views:$(X_),DeploymentsIndex:$(Oh),ModelChanges:$(S_),FqnIndex:$(wh),ModelParser:$(f_),ModelBuilder:$(Gh),ModelLocator:$(Qh),LastSeen:$(Mh)},lsp:{CompletionProvider:$(oh),DocumentHighlightProvider:$(ch),DocumentSymbolProvider:$(dh),SemanticTokenProvider:$(Sh),HoverProvider:$(ph),CodeLensProvider:$(rh),DocumentLinkProvider:$(lh),Formatter:$($m),CodeActionProvider:$(hh)},workspace:{AstNodeDescriptionProvider:$(Qf)},references:{NameProvider:$(C_),ScopeComputation:$(T_),ScopeProvider:$(D_)},parser:{ValueConverter:$(p_)}}}function tv(e={},t,n,r){let i=nv(e),a=sn([Vt({shared:i}),Df,ev({...qf,...Bf,...Vf,...Z_,...e}),t,n,r].reduce(rv,{}));return i.ServiceRegistry.register(a),Hg(a),e.connection?ni(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function nv(e={}){let t={...qf,...Bf,...Vf,...e};return sn(tn(t),Ef,$_(t))}function rv(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=rv(t,r):e[n]=r}}return e}function iv(){try{return to.default.sync(`dot`)}catch(e){return z.error(`Error checking for native Graphviz:`,{error:e}),null}}const av={likec4:{Layouter(e){z.debug(`Creating ConfigurableLayouter`);let t=e.likec4.Graphviz,r=new eo({graphviz:t});return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(t=>{if(z.debug(`Configuration update: {update}`,{update:t}),t.section!==e.LanguageMetaData.languageId){z.debug(`Ignoring configuration update as it is not for ${e.LanguageMetaData.languageId}`);return}try{let{mode:i,path:a}=t.configuration.graphviz??{mode:`wasm`,path:``};if(i!==`wasm`){let t=n(a)?iv():a;if(!n(t)){r.changePort(new ro(t)),z.info`use graphviz binary: ${t}`;return}z.warn(`No Graphviz binaries found on PATH, use graphviz wasm`),e.shared.lsp.Connection?.window.showWarningMessage(`No Graphviz binaries found on PATH, set path to binaries in settings.`)}r.changePort(new Ya),z.info(`use graphviz wasm`)}catch(e){z.error(`Failed to update configuration`,{error:e})}}),r}}};function ov(e){let t=e?.connection,n=Re(e,{enableWatcher:!0,enableMCP:`sse`,enableManualLayouts:!0,graphviz:`wasm`,configureLogger:!1});n.configureLogger!==!1&&(n.configureLogger===`stderr`||n.enableMCP===`stdio`?ao({lspConnection:t,enableTelemetry:!1,useStdErr:!0}):n.configureLogger===`console`&&ao({lspConnection:t})),t?z.info(`Starting LikeC4 language server`):z.warn(`Starting LikeC4 language server (headless - no LSP connection)`);let r=tv({...t&&{connection:t},...Gf(n.enableWatcher),...!!n.enableMCP&&qm(n.enableMCP),...n.enableManualLayouts&&xo,...Q_(n.graphviz===`binary`?new ro:new Ya)},t?{likec4:{...av.likec4}}:void 0);return Mt(r.shared),r}function sv(e){let t=e?.configureLogger??`console`;if(t!==!1){if(t===`stderr`||e?.mcp===`stdio`){ao({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}ao({colors:gi,logLevel:e?.logLevel})}}export{Xi as _,qm as a,qi as b,Vf as c,ro as d,Ya as f,Qi as g,ea as h,Q_ as i,xo as l,na as m,ov as n,Gf as o,ra as p,tv as r,Bf as s,sv as t,ao as u,Ji as v,L as x,Ki as y};