@likec4/language-server 1.48.0 → 1.50.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 (75) hide show
  1. package/browser/package.json +2 -2
  2. package/browser-worker/package.json +2 -2
  3. package/dist/THIRD-PARTY-LICENSES.md +178 -0
  4. package/dist/_chunks/ConfigurableLayouter.mjs +1 -1956
  5. package/dist/_chunks/LikeC4FileSystem.mjs +3 -0
  6. package/dist/_chunks/WithMCPServer.mjs +1154 -0
  7. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -805
  8. package/dist/_chunks/libs/eventemitter3.mjs +1 -243
  9. package/dist/_chunks/libs/fast-equals.mjs +1 -446
  10. package/dist/_chunks/libs/p-queue.mjs +1 -449
  11. package/dist/_chunks/libs/parse-ms.mjs +1 -36
  12. package/dist/_chunks/libs/picomatch.mjs +1 -1673
  13. package/dist/_chunks/libs/pretty-ms.mjs +1 -80
  14. package/dist/_chunks/libs/remeda.mjs +2 -482
  15. package/dist/_chunks/libs/strip-indent.mjs +1 -15
  16. package/dist/_chunks/libs/ufo.mjs +1 -166
  17. package/dist/_chunks/likec4lib.mjs +2 -9
  18. package/dist/_chunks/{LikeC4LanguageServices.d.mts → module.d.mts} +2101 -732
  19. package/dist/_chunks/module.mjs +34 -28
  20. package/dist/_chunks/noop.mjs +1 -0
  21. package/dist/_chunks/protocol.d.mts +6 -2
  22. package/dist/_chunks/rolldown-runtime.mjs +1 -42
  23. package/dist/_chunks/utils.mjs +1 -0
  24. package/dist/_chunks/workspace.mjs +1 -0
  25. package/dist/browser/index.d.mts +15 -0
  26. package/dist/browser/index.mjs +1 -0
  27. package/dist/browser/worker.mjs +1 -0
  28. package/dist/bundled.d.mts +1 -2
  29. package/dist/bundled.mjs +1 -51
  30. package/dist/filesystem/index.d.mts +2 -3
  31. package/dist/filesystem/index.mjs +1 -3
  32. package/dist/index.d.mts +1 -2
  33. package/dist/index.mjs +1 -48
  34. package/dist/likec4lib.d.mts +10 -3
  35. package/dist/likec4lib.mjs +1 -4
  36. package/dist/mcp/index.d.mts +2 -3
  37. package/dist/mcp/index.mjs +1 -3
  38. package/dist/module.d.mts +2 -3
  39. package/dist/module.mjs +1 -3
  40. package/dist/protocol.mjs +1 -3
  41. package/filesystem/package.json +4 -0
  42. package/mcp/package.json +4 -0
  43. package/module/package.json +4 -0
  44. package/package.json +79 -56
  45. package/LICENSE +0 -21
  46. package/dist/LikeC4LanguageServices.d.mts +0 -4
  47. package/dist/LikeC4LanguageServices.mjs +0 -3
  48. package/dist/_chunks/LikeC4LanguageServices.mjs +0 -725
  49. package/dist/_chunks/ast.d.mts +0 -1444
  50. package/dist/_chunks/ast.mjs +0 -2375
  51. package/dist/_chunks/ast2.mjs +0 -176
  52. package/dist/_chunks/filesystem.mjs +0 -58
  53. package/dist/_chunks/grammar.mjs +0 -8
  54. package/dist/_chunks/icons.mjs +0 -5211
  55. package/dist/_chunks/libs/@hono/node-server.mjs +0 -436
  56. package/dist/_chunks/libs/hono.mjs +0 -1829
  57. package/dist/_chunks/mcp.mjs +0 -33
  58. package/dist/_chunks/module2.mjs +0 -6576
  59. package/dist/_chunks/protocol.mjs +0 -78
  60. package/dist/ast.d.mts +0 -4
  61. package/dist/ast.mjs +0 -4
  62. package/dist/browser-worker.mjs +0 -6
  63. package/dist/browser.d.mts +0 -11
  64. package/dist/browser.mjs +0 -27
  65. package/dist/common-exports.d.mts +0 -4
  66. package/dist/common-exports.mjs +0 -5
  67. package/dist/generated/ast.d.mts +0 -2
  68. package/dist/generated/ast.mjs +0 -3
  69. package/dist/generated/grammar.d.mts +0 -6
  70. package/dist/generated/grammar.mjs +0 -3
  71. package/dist/generated/module.d.mts +0 -14
  72. package/dist/generated/module.mjs +0 -3
  73. package/dist/generated-lib/icons.d.mts +0 -4
  74. package/dist/generated-lib/icons.mjs +0 -3
  75. /package/dist/{browser-worker.d.mts → browser/worker.d.mts} +0 -0
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime.mjs";import{a as t,i as n,n as r,r as i}from"./likec4lib.mjs";import{B as a,Bt as o,Ct as s,Er as c,I as ee,J as te,N as ne,Tr as l,Tt as re,U as ie,X as ae,at as oe,cn as u,en as se,ln as ce,mt as le,n as ue,nr as de,nt as d,o as fe,sn as pe,ut as me,yt as f}from"./utils.mjs";import{B as p,I as m,S as h,U as g,V as he,b as _,g as ge,i as _e,k as ve,n as ye,o as v,p as y,z as b}from"./libs/remeda.mjs";import{t as x}from"./libs/picomatch.mjs";import{a as S,d as C,i as w,o as T,r as E,s as D,t as O,u as k}from"./libs/ufo.mjs";import{AstUtils as A,DefaultAstNodeDescriptionProvider as j,DefaultIndexManager as M,DefaultLangiumDocuments as N,DefaultWorkspaceManager as P,Disposable as F,URI as I,UriUtils as L,isOperationCancelled as R,stream as z}from"langium";import{DefaultMap as B,compareNaturalHierarchically as V,invariant as H,isString as U,nonNullable as W,nonexhaustive as G}from"@likec4/core/utils";import{loggable as K,wrapError as be}from"@likec4/log";import{invariant as q}from"@likec4/core";import{LikeC4ProjectConfigOps as J}from"@likec4/config";import{URI as Y}from"vscode-uri";const X=Symbol.for(`idattr`),xe={writeId(e,t){return e[X]=t,e},readId(e){return e[X]}},Se={writeId(e,t){return _(t)?e[X]=void 0:e[X]=t,e},readId(e){return e[X]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===fe.languageId}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:he(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({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:G(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:G(e)}}function toRelationshipStyle(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case ee(r):{let e=toColor(r);ge(e)&&(n.color=e);break}case se(r):n.line=r.value;break;case ne(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:G(r)}break;default:G(r)}return n}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(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:G(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:G(e)}}function getViewRulePredicateContainer(e){return A.getContainerOfType(e,e=>de(e)||ae(e)||oe(e))}const _isModel=e=>pe(e)||me(e)||re(e)||f(e)||d(e)||le(e),_isDeployment=e=>u(e)||te(e)||ie(e)||s(e)||a(e);function isFqnRefInsideGlobals(e){for(;;){if(_isDeployment(e)||_isModel(e))return!1;if(o(e)||ce(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(_isDeployment(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(_isDeployment(e))return!0;if(e.$container)e=e.$container;else return!1}}const Ce={mcpServer:()=>new NoopLikeC4MCPServer,mcpServerFactory:()=>new NoopLikeC4MCPServerFactory};var NoopLikeC4MCPServer=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()}},NoopLikeC4MCPServerFactory=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}},AstNodeDescriptionProvider=class extends j{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=A.getDocument(e);let r=super.createDescription(e,t,n);return i(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},IndexManager=class extends M{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 z(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const we=V(`/`),ensureOrder=(e,t)=>we(e.uri.path,t.uri.path),isLikeC4UserDocument=e=>isLikeC4LangiumDocument(e)&&n(e);var LangiumDocuments=class extends N{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(ensureOrder);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return z(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return z(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return z(this.documentMap.values()).filter(n=>isLikeC4UserDocument(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return p(this.userDocuments.toArray(),y(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),ve(v(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},Z=e(x(),1);const Q=c.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?E(e)?e:I.file(e).toString():e.toString()}const Te=V(`/`,!0),compareUri=(e,t)=>Te(C(e.path),C(t.path));function isParentFolderFor(e){return t=>e.startsWith(U(t)?t:t.folder)}function _overlaps(e,t){let n=U(e)?e:e.folder,r=U(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function overlaps(...e){return g(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _excludes(e,t){return e.exclude?.(k(t))??!1}function includes(...e){return g(_includes,e)}function excludes(...e){return g(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),D(e)}const $={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,Z.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return $.exclude(k(e))}function parseRegisterOptions(e){if(`configUri`in e){H(!h(e.configUri),`configUri is emptyish`);let t=I.isUri(e.configUri)?e.configUri:I.parse(normalizeUri(e.configUri)),n=ProjectFolder(L.dirname(t));return{configUri:t,folder:n,folderUri:I.parse(n)}}H(!h(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),n=I.parse(t);return{configUri:L.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Ee=class ProjectsManager{static DefaultProjectId=$.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new B(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),n=L.joinPath(t,`.likec4rc`),r=ProjectFolder(t);return{id:e,config:$.config,folder:r,folderUri:I.parse(r),configUri:n,exclude:$.exclude,includeConfig:$.includeConfig}}return W(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new B(e=>{let t=normalizeUri(e),n=this.#o.get(t);return n?excludes(n,t)?!this.#r.some(includes(t)):!1:isExcludedByDefault(t)});#o=new B(e=>{let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??null});constructor(e){this.services=e,Q.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return b(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#n=void 0,!e||e===ProjectsManager.DefaultProjectId){Q.debug`reset default project ID`,this.#t=void 0;return}H(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Q.debug`set default project ID to ${e}`,this.#t=e}}get default(){if(!this.#n){let e=this.defaultProjectId??ProjectsManager.DefaultProjectId;this.#n=this.#i.get(e)}return this.#n}get all(){if(b(this.#r,1)){let e=[...y(this.#r,v(`id`)),$.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[$.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId||this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){let t=overlaps(ProjectFolder(e));return this.#r.filter(e=>t(e)||!!e.includePaths&&!!m(e.includePaths,t))}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(H(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):W(this.defaultProjectId,()=>`Specify exact project, known: [${y(this.#r,v(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return isLangiumDocument(t)&&i(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let n=normalizeUri(t);return b(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(n)&&!isExcludedByDefault(n):includes(this.#i.get(e),normalizeUri(t)):!isExcludedByDefault(n)}async registerConfigFile(e,t){if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${$.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(!R(t))throw be(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=J.validate(e.config),{configUri:r,folder:i,folderUri:a}=parseRegisterOptions(e),o=J.normalizeInclude(n.include),s=this.#r.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(s.id=this.uniqueProjectId(n.name),Q.info`re-register ${s.id}`),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.#r=p([...this.#r,s],_e((e,t)=>compareUri(e.folderUri,t.folderUri))),Q.info`register ${s.id}`),this.updateIncludesExcludes(s),this.resetCaches(),this.#s?s:(this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>R(e)?Promise.reject(e):(Q.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}#s=null;async reloadProjects(e){return this.#s?(Q.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Q.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(R(e)||Q.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Q.warn(`Failed to reloadProjects, no workspace folders found`);return}Q.debug`start reload projects`;let n=[];for(let e of t){let t=I.parse(e.uri);Q.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)Q.debug`found config ${L.relative(t,r.uri)}`,n.push(r.uri)}catch(e){Q.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#r.length===0){Q.warning(`No config files found`);return}Q.warning(`No config files found, but {count} projects were registered before`,{count:this.#r.length})}n.sort(compareUri);let r=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){Q.warn(K(t));let n=r.get(e.toString());n&&(Q.debug`Update failed, restore project ${n.id}`,await this.registerProject(n))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(y(this.#r,v(`id`))),n=e;if(!t.has(n))return n;Q.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){Q.trace(`resetCaches`),this.#n=void 0,this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(e,t){let n=this.#r.find(t=>t.id===e);if(!n)return e===ProjectsManager.DefaultProjectId?Q.info`Rebuilding all documents `:Q.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let r=Q.getChild(n.id),i=this.services.workspace.LangiumDocuments.resetProjectIds().filter(e=>includes(n,normalizeUri(e)));i.length!==0&&(r.info(`rebuild project documents: {docs}`,{docs:i.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(i,[],t).catch(e=>{r.warn(`Failed to rebuild project`,{error:e})}))}getAllIncludePaths(){let e=[];for(let t of this.#r)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),F.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 Q.warn(`Failed to get workspace URI, using default folder`,{error:e}),I.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){Q.warn(K(e))}}updateIncludesExcludes(e){let t=e.config;switch(!0){case _(t.exclude):e.exclude=$.exclude;break;case t.exclude&&b(t.exclude,1):e.exclude=(0,Z.default)(y(t.exclude,t=>(!w(t)&&!t.startsWith(`**`)&&(t=T(`**`,t)),O(S(e.folderUri.path,t)))),{contains:!0,dot:!0});break;default:delete e.exclude}let n=e.includeConfig.paths;if(!b(n,1))return delete e.includePaths,e;e.includePaths=y(n,t=>{let n=L.resolvePath(e.folderUri,t);return{uri:n,folder:ProjectFolder(n)}}),Q.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.#r)n.id!==e.id&&(overlaps(t,n)&&Q.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=>{overlaps(t,r)&&Q.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}},LikeC4WorkspaceManager=class extends P{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=Y.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){l(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){l(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,n){n(this.documentFactory.fromString(t,Y.parse(r)));let i=this.services.workspace.ProjectsManager.getAllIncludePaths(),a=0,o=[];for(let{projectId:e,includePath:t,includeConfig:n}of i)try{c.debug`scanning include path ${t.fsPath} for project ${e}`;let r=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:n.maxDepth});o.push(...r),r.length===0&&c.debug`loaded ${r.length} files from include path ${t.fsPath}`}catch(e){c.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of ye(o,e=>e.uri.path))try{n(await this.langiumDocuments.getOrCreateDocument(e.uri)),a++}catch(t){c.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(i.length>0&&a>0){let e=Math.min(...i.map(e=>e.includeConfig.fileThreshold));a>e?c.warn(`Loaded ${a} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):c.info`loaded ${a} total files from ${i.length} include paths`}}includeEntry(e,t,n){let r=L.basename(t.uri);return t.isDirectory?!ue(r):t.isFile?(n.fileExtensions.includes(L.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&b(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();c.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 q(e,`Workspace not initialized`),Y.parse(e.uri)}get workspaceURL(){let e=this.workspace();return q(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),F.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};export{toRelationshipStyle as C,toColor as S,parseAstPercent as _,AstNodeDescriptionProvider as a,toAstViewLayoutDirection as b,Se as c,isFqnRefInsideDeployment as d,isFqnRefInsideGlobals as f,parseAstOpacityProperty as g,parseAstIconPositionValue as h,IndexManager as i,xe as l,isLikeC4LangiumDocument as m,Ee as n,Ce as o,isFqnRefInsideModel as p,LangiumDocuments as r,NoopLikeC4MCPServer as s,LikeC4WorkspaceManager as t,getViewRulePredicateContainer as u,parseAstSizeValue as v,toAutoLayout as x,parseMarkdownAsString as y};
@@ -0,0 +1,15 @@
1
+ import { B as ProjectsManager, D as NoFileSystem, F as LikeC4ManualLayouts, I as LikeC4ManualLayoutsModuleContext, M as FileSystemProvider, N as FileSystemWatcher, O as NoFileSystemWatcher, P as FileSystemWatcherModuleContext, R as Project, _ as LikeC4ModelBuilder, a as createLanguageServices, b as LangiumDocuments, c as LikeC4LanguageServices, f as LikeC4Views, g as ViewLocateResult, h as LikeC4ModelLocator, i as LikeC4SharedServices, j as FileSystemModuleContext, k as NoLikeC4ManualLayouts, l as DocumentParser, m as NoMCPServer, n as LikeC4AddedServices, r as LikeC4Services, t as LanguageServicesContext, u as LikeC4ModelParser, v as FqnIndex, y as LikeC4WorkspaceManager, z as ProjectData } from "../_chunks/module.mjs";
2
+ import "../_chunks/protocol.mjs";
3
+
4
+ //#region src/browser/index.d.ts
5
+ /**
6
+ * Starts the LikeC4 language server in the browser, connected via the given port (e.g. a worker).
7
+ * @param port - MessagePort or DedicatedWorkerGlobalScope for LSP communication.
8
+ * @returns Shared and LikeC4-specific services after the connection is initialized.
9
+ */
10
+ declare function startLanguageServer(port: MessagePort | DedicatedWorkerGlobalScope): {
11
+ shared: LikeC4SharedServices;
12
+ likec4: LikeC4Services;
13
+ };
14
+ //#endregion
15
+ export { DocumentParser, FileSystemModuleContext, FileSystemProvider, FileSystemWatcher, FileSystemWatcherModuleContext, FqnIndex, LangiumDocuments, LanguageServicesContext, LikeC4AddedServices, LikeC4LanguageServices, LikeC4ManualLayouts, LikeC4ManualLayoutsModuleContext, LikeC4ModelBuilder, LikeC4ModelLocator, LikeC4ModelParser, LikeC4Services, LikeC4SharedServices, LikeC4Views, LikeC4WorkspaceManager, NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts, NoMCPServer, Project, ProjectData, ProjectsManager, ViewLocateResult, createLanguageServices, startLanguageServer };
@@ -0,0 +1 @@
1
+ import"../_chunks/likec4lib.mjs";import{n as e,r as t,t as n}from"../_chunks/noop.mjs";import"../_chunks/utils.mjs";import"../_chunks/libs/remeda.mjs";import{o as r}from"../_chunks/workspace.mjs";import{t as i}from"../_chunks/module.mjs";import"../_chunks/libs/picomatch.mjs";import"../_chunks/libs/ufo.mjs";import"../_chunks/libs/parse-ms.mjs";import"../_chunks/libs/pretty-ms.mjs";import"../_chunks/libs/fast-equals.mjs";import"../_chunks/libs/@msgpack/msgpack.mjs";import"../_chunks/libs/strip-indent.mjs";import"../_chunks/common-exports.mjs";import{configureLogger as a,getConsoleSink as o,getTextFormatter as s}from"@likec4/log";import{startLanguageServer as c}from"langium/lsp";import{BrowserMessageReader as l,BrowserMessageWriter as u,createConnection as d}from"vscode-languageserver/browser";function startLanguageServer(e){let t=d(new l(e),new u(e));a({sinks:{console:o({formatter:s({format:({level:e,category:t,message:n})=>`${e} ${t} ${n}`})})},loggers:[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]});let n=i({connection:t});return c(n.shared),n}export{n as NoFileSystem,e as NoFileSystemWatcher,t as NoLikeC4ManualLayouts,r as NoMCPServer,i as createLanguageServices,startLanguageServer};
@@ -0,0 +1 @@
1
+ import"../_chunks/likec4lib.mjs";import"../_chunks/noop.mjs";import"../_chunks/utils.mjs";import"../_chunks/libs/remeda.mjs";import"../_chunks/workspace.mjs";import"../_chunks/module.mjs";import"../_chunks/libs/picomatch.mjs";import"../_chunks/libs/ufo.mjs";import"../_chunks/libs/parse-ms.mjs";import"../_chunks/libs/pretty-ms.mjs";import"../_chunks/libs/fast-equals.mjs";import"../_chunks/libs/@msgpack/msgpack.mjs";import"../_chunks/libs/strip-indent.mjs";import"../_chunks/common-exports.mjs";import{startLanguageServer as e}from"./index.mjs";function errToString(e){switch(!0){case e instanceof Error:return e.message;case typeof e==`object`&&!!e:try{return JSON.stringify(e)}catch{return`[unserializable value]`}case typeof e==`string`:return e;case e==null:return``;case typeof e==`number`||typeof e==`boolean`:return String(e);case typeof e==`symbol`:return e.toString();default:return`unknown`}}const log=(e,t)=>{let n=t==null?e:`${e} ${errToString(t)}`;try{console.error(`[LikeC4 LSP worker]`,n)}catch{}};self.onerror=e=>(log(`Uncaught error`,e.message??e.error),!1),self.onunhandledrejection=e=>{log(`Unhandled rejection`,e.reason)};try{e(self)}catch(e){throw log(`Failed to start language server`,e),e}
@@ -1,5 +1,4 @@
1
- import "./_chunks/ast.mjs";
2
- import { X as LikeC4Services, Z as LikeC4SharedServices } from "./_chunks/LikeC4LanguageServices.mjs";
1
+ import { i as LikeC4SharedServices, r as LikeC4Services } from "./_chunks/module.mjs";
3
2
  import "./_chunks/protocol.mjs";
4
3
 
5
4
  //#region src/bundled.d.ts
package/dist/bundled.mjs CHANGED
@@ -1,51 +1 @@
1
- import { o as logger$1, r as getLspConnectionSink } from "./_chunks/LikeC4LanguageServices.mjs";
2
- import "./_chunks/libs/eventemitter3.mjs";
3
- import { i as WithLikeC4ManualLayouts, n as WithMCPServer, r as WithFileSystem, t as ConfigurableLayouter } from "./_chunks/ConfigurableLayouter.mjs";
4
- import { t as createLanguageServices } from "./_chunks/module2.mjs";
5
- import "./_chunks/libs/@hono/node-server.mjs";
6
- import "./_chunks/libs/hono.mjs";
7
- import { configureLogger, getConsoleStderrSink } from "@likec4/log";
8
- import { defu } from "defu";
9
- import { startLanguageServer as startLanguageServer$1 } from "langium/lsp";
10
- import { isDevelopment } from "std-env";
11
- import { ProposedFeatures, createConnection } from "vscode-languageserver/node";
12
-
13
- //#region src/bundled.ts
14
- /**
15
- * This is used as `bin` entry point to start the language server.
16
- */
17
- function startLanguageServer(options) {
18
- const opts = defu(options, {
19
- enableMCP: true,
20
- enableManualLayouts: true
21
- });
22
- const connection = createConnection(ProposedFeatures.all);
23
- configureLogger({
24
- sinks: {
25
- lsp: getLspConnectionSink(connection),
26
- console: getConsoleStderrSink()
27
- },
28
- loggers: [{
29
- category: ["likec4"],
30
- sinks: ["console", "lsp"],
31
- lowestLevel: isDevelopment ? "trace" : "debug"
32
- }]
33
- });
34
- process.on("uncaughtException", (err) => {
35
- logger$1.error("uncaughtException", { err });
36
- });
37
- process.on("unhandledRejection", (err) => {
38
- logger$1.error("unhandledRejection", { err });
39
- });
40
- const services = createLanguageServices({
41
- connection,
42
- ...WithFileSystem(false),
43
- ...opts.enableMCP !== false && WithMCPServer(opts.enableMCP === true ? "sse" : opts.enableMCP),
44
- ...opts.enableManualLayouts && WithLikeC4ManualLayouts
45
- }, ConfigurableLayouter);
46
- startLanguageServer$1(services.shared);
47
- return services;
48
- }
49
-
50
- //#endregion
51
- export { startLanguageServer };
1
+ import"./_chunks/likec4lib.mjs";import"./_chunks/noop.mjs";import{Cr as e,Er as t}from"./_chunks/utils.mjs";import"./_chunks/libs/eventemitter3.mjs";import"./_chunks/libs/p-queue.mjs";import"./_chunks/libs/remeda.mjs";import{r as n,t as r}from"./_chunks/LikeC4FileSystem.mjs";import"./_chunks/workspace.mjs";import{t as i}from"./_chunks/module.mjs";import"./_chunks/libs/picomatch.mjs";import"./_chunks/libs/ufo.mjs";import"./_chunks/libs/parse-ms.mjs";import"./_chunks/libs/pretty-ms.mjs";import"./_chunks/libs/fast-equals.mjs";import"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/strip-indent.mjs";import{t as a}from"./_chunks/WithMCPServer.mjs";import{t as o}from"./_chunks/ConfigurableLayouter.mjs";import{configureLogger as s,getConsoleStderrSink as c}from"@likec4/log";import{startLanguageServer as l}from"langium/lsp";import{defu as u}from"defu";import{isDevelopment as d}from"std-env";import{ProposedFeatures as f,createConnection as p}from"vscode-languageserver/node";function startLanguageServer(m){let h=u(m,{enableMCP:!0,enableManualLayouts:!0}),g=p(f.all);s({sinks:{lsp:e(g),console:c()},loggers:[{category:[`likec4`],sinks:[`console`,`lsp`],lowestLevel:d?`trace`:`debug`}]}),process.on(`uncaughtException`,e=>{t.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{t.error(`unhandledRejection`,{err:e})});let _=i({connection:g,...r(!1),...h.enableMCP!==!1&&a(h.enableMCP===!0?`sse`:h.enableMCP),...h.enableManualLayouts&&n},o);return l(_.shared),_}export{startLanguageServer};
@@ -1,4 +1,3 @@
1
- import "../_chunks/ast.mjs";
2
- import { _t as LikeC4ManualLayoutsModuleContext, ct as NoFileSystem, dt as FileNode, ft as FileSystemModuleContext, gt as LikeC4ManualLayouts, ht as FileSystemWatcherModuleContext, lt as NoFileSystemWatcher, mt as FileSystemWatcher, pt as FileSystemProvider, ut as NoLikeC4ManualLayouts } from "../_chunks/LikeC4LanguageServices.mjs";
1
+ import { A as FileNode, D as NoFileSystem, E as WithFileSystem, F as LikeC4ManualLayouts, I as LikeC4ManualLayoutsModuleContext, L as ManualLayoutsSnapshot, M as FileSystemProvider, N as FileSystemWatcher, O as NoFileSystemWatcher, P as FileSystemWatcherModuleContext, T as WithChokidarWatcher, j as FileSystemModuleContext, k as NoLikeC4ManualLayouts, w as WithLikeC4ManualLayouts } from "../_chunks/module.mjs";
3
2
  import "../_chunks/protocol.mjs";
4
- export { FileNode, FileSystemModuleContext, FileSystemProvider, FileSystemWatcher, FileSystemWatcherModuleContext, LikeC4ManualLayouts, LikeC4ManualLayoutsModuleContext, NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts };
3
+ export { FileNode, FileSystemModuleContext, FileSystemProvider, FileSystemWatcher, FileSystemWatcherModuleContext, LikeC4ManualLayouts, LikeC4ManualLayoutsModuleContext, ManualLayoutsSnapshot, NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts, WithChokidarWatcher, WithFileSystem, WithLikeC4ManualLayouts };
@@ -1,3 +1 @@
1
- import { n as NoFileSystemWatcher, r as NoLikeC4ManualLayouts, t as NoFileSystem } from "../_chunks/filesystem.mjs";
2
-
3
- export { NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts };
1
+ import"../_chunks/likec4lib.mjs";import{n as e,r as t,t as n}from"../_chunks/noop.mjs";import"../_chunks/utils.mjs";import"../_chunks/libs/eventemitter3.mjs";import"../_chunks/libs/p-queue.mjs";import"../_chunks/libs/remeda.mjs";import{n as r,r as i,t as a}from"../_chunks/LikeC4FileSystem.mjs";export{n as NoFileSystem,e as NoFileSystemWatcher,t as NoLikeC4ManualLayouts,r as WithChokidarWatcher,a as WithFileSystem,i as WithLikeC4ManualLayouts};
package/dist/index.d.mts CHANGED
@@ -1,4 +1,3 @@
1
- import "./_chunks/ast.mjs";
2
- import { J as LanguageServicesContext, Q as createLanguageServices, X as LikeC4Services, Y as LikeC4AddedServices, Z as LikeC4SharedServices, _t as LikeC4ManualLayoutsModuleContext, a as startLanguageServer, bt as ProjectsManager, c as WithFileSystem, ct as NoFileSystem, d as LikeC4ModelBuilder, f as FqnIndex, ft as FileSystemModuleContext, gt as LikeC4ManualLayouts, ht as FileSystemWatcherModuleContext, i as LikeC4ModelParser, l as LikeC4ModelLocator, lt as NoFileSystemWatcher, mt as FileSystemWatcher, n as LikeC4LanguageServices, nt as NoMCPServer, o as WithMCPServer, ot as LikeC4WorkspaceManager, pt as FileSystemProvider, r as DocumentParser, s as WithLikeC4ManualLayouts, st as LangiumDocuments, tt as LikeC4Views, u as ViewLocateResult, ut as NoLikeC4ManualLayouts, vt as Project, yt as ProjectData } from "./_chunks/LikeC4LanguageServices.mjs";
1
+ import { B as ProjectsManager, D as NoFileSystem, E as WithFileSystem, F as LikeC4ManualLayouts, I as LikeC4ManualLayoutsModuleContext, M as FileSystemProvider, N as FileSystemWatcher, O as NoFileSystemWatcher, P as FileSystemWatcherModuleContext, R as Project, _ as LikeC4ModelBuilder, a as createLanguageServices, b as LangiumDocuments, c as LikeC4LanguageServices, d as startLanguageServer, f as LikeC4Views, g as ViewLocateResult, h as LikeC4ModelLocator, i as LikeC4SharedServices, j as FileSystemModuleContext, k as NoLikeC4ManualLayouts, l as DocumentParser, m as NoMCPServer, n as LikeC4AddedServices, p as WithMCPServer, r as LikeC4Services, t as LanguageServicesContext, u as LikeC4ModelParser, v as FqnIndex, w as WithLikeC4ManualLayouts, y as LikeC4WorkspaceManager, z as ProjectData } from "./_chunks/module.mjs";
3
2
  import "./_chunks/protocol.mjs";
4
3
  export { DocumentParser, FileSystemModuleContext, FileSystemProvider, FileSystemWatcher, FileSystemWatcherModuleContext, FqnIndex, LangiumDocuments, LanguageServicesContext, LikeC4AddedServices, LikeC4LanguageServices, LikeC4ManualLayouts, LikeC4ManualLayoutsModuleContext, LikeC4ModelBuilder, LikeC4ModelLocator, LikeC4ModelParser, LikeC4Services, LikeC4SharedServices, LikeC4Views, LikeC4WorkspaceManager, NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts, NoMCPServer, Project, ProjectData, ProjectsManager, ViewLocateResult, WithFileSystem, WithLikeC4ManualLayouts, WithMCPServer, createLanguageServices, startLanguageServer };
package/dist/index.mjs CHANGED
@@ -1,48 +1 @@
1
- import { i as getTelemetrySink, o as logger$1 } from "./_chunks/LikeC4LanguageServices.mjs";
2
- import "./_chunks/libs/eventemitter3.mjs";
3
- import { i as WithLikeC4ManualLayouts, n as WithMCPServer, r as WithFileSystem, t as ConfigurableLayouter } from "./_chunks/ConfigurableLayouter.mjs";
4
- import { n as NoFileSystemWatcher, r as NoLikeC4ManualLayouts, t as NoFileSystem } from "./_chunks/filesystem.mjs";
5
- import { t as createLanguageServices } from "./_chunks/module2.mjs";
6
- import "./_chunks/libs/@hono/node-server.mjs";
7
- import "./_chunks/libs/hono.mjs";
8
- import { t as NoMCPServer } from "./_chunks/mcp.mjs";
9
- import { configureLogger, getConsoleSink, getConsoleStderrSink, getTextFormatter } from "@likec4/log";
10
- import { defu } from "defu";
11
- import { startLanguageServer as startLanguageServer$1 } from "langium/lsp";
12
- import { isDevelopment } from "std-env";
13
-
14
- //#region src/index.ts
15
- function startLanguageServer(options) {
16
- const connection = options?.connection;
17
- const opts = defu(options, {
18
- enableWatcher: true,
19
- enableMCP: "sse",
20
- enableTelemetry: !!connection,
21
- enableManualLayouts: true
22
- });
23
- const enableTelemetry = !!connection && opts.enableTelemetry && !isDevelopment;
24
- configureLogger({
25
- sinks: {
26
- console: opts.enableMCP === "stdio" || connection ? getConsoleStderrSink({ formatter: getTextFormatter() }) : getConsoleSink({ formatter: getTextFormatter() }),
27
- ...enableTelemetry && { telemetry: getTelemetrySink(connection) }
28
- },
29
- loggers: [{
30
- category: ["likec4"],
31
- sinks: ["console", ...enableTelemetry ? ["telemetry"] : []],
32
- lowestLevel: isDevelopment ? "trace" : "debug"
33
- }]
34
- });
35
- if (connection) logger$1.info("Starting LikeC4 language server");
36
- else logger$1.warn("Starting LikeC4 language server (headless - no LSP connection)");
37
- const services = createLanguageServices({
38
- ...connection && { connection },
39
- ...WithFileSystem(opts.enableWatcher),
40
- ...!!opts.enableMCP && WithMCPServer(opts.enableMCP),
41
- ...opts.enableManualLayouts && WithLikeC4ManualLayouts
42
- }, connection ? { likec4: { ...ConfigurableLayouter.likec4 } } : void 0);
43
- startLanguageServer$1(services.shared);
44
- return services;
45
- }
46
-
47
- //#endregion
48
- export { NoFileSystem, NoFileSystemWatcher, NoLikeC4ManualLayouts, NoMCPServer, WithFileSystem, WithLikeC4ManualLayouts, WithMCPServer, createLanguageServices, startLanguageServer };
1
+ import"./_chunks/likec4lib.mjs";import{n as e,r as t,t as n}from"./_chunks/noop.mjs";import{Er as r,wr as i}from"./_chunks/utils.mjs";import"./_chunks/libs/eventemitter3.mjs";import"./_chunks/libs/p-queue.mjs";import"./_chunks/libs/remeda.mjs";import{r as a,t as o}from"./_chunks/LikeC4FileSystem.mjs";import{o as s}from"./_chunks/workspace.mjs";import{t as c}from"./_chunks/module.mjs";import"./_chunks/libs/picomatch.mjs";import"./_chunks/libs/ufo.mjs";import"./_chunks/libs/parse-ms.mjs";import"./_chunks/libs/pretty-ms.mjs";import"./_chunks/libs/fast-equals.mjs";import"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/strip-indent.mjs";import"./_chunks/common-exports.mjs";import{t as l}from"./_chunks/WithMCPServer.mjs";import"./mcp/index.mjs";import{t as u}from"./_chunks/ConfigurableLayouter.mjs";import{configureLogger as d,getConsoleSink as f,getConsoleStderrSink as p,getTextFormatter as m}from"@likec4/log";import{startLanguageServer as h}from"langium/lsp";import{defu as g}from"defu";import{isDevelopment as _}from"std-env";function startLanguageServer(e){let t=e?.connection,n=g(e,{enableWatcher:!0,enableMCP:`sse`,enableTelemetry:!!t,enableManualLayouts:!0}),s=!!t&&n.enableTelemetry&&!_;d({sinks:{console:n.enableMCP===`stdio`||t?p({formatter:m()}):f({formatter:m()}),...s&&{telemetry:i(t)}},loggers:[{category:[`likec4`],sinks:[`console`,...s?[`telemetry`]:[]],lowestLevel:_?`trace`:`debug`}]}),t?r.info(`Starting LikeC4 language server`):r.warn(`Starting LikeC4 language server (headless - no LSP connection)`);let v=c({...t&&{connection:t},...o(n.enableWatcher),...!!n.enableMCP&&l(n.enableMCP),...n.enableManualLayouts&&a},t?{likec4:{...u.likec4}}:void 0);return h(v.shared),v}export{n as NoFileSystem,e as NoFileSystemWatcher,t as NoLikeC4ManualLayouts,s as NoMCPServer,o as WithFileSystem,a as WithLikeC4ManualLayouts,l as WithMCPServer,c as createLanguageServices,startLanguageServer};
@@ -1,9 +1,16 @@
1
- import { LibIcons } from "./generated-lib/icons.mjs";
2
1
  import { URI } from "vscode-uri";
3
2
 
3
+ //#region src/generated-lib/icons.d.ts
4
+ declare const LibIcons: string;
5
+ //#endregion
4
6
  //#region src/likec4lib.d.ts
5
7
  declare const Scheme = "likec4builtin";
6
8
  declare const Uri: "likec4builtin:///likec4/lib/icons.c4";
7
- declare function isLikeC4Builtin(uri: URI): boolean;
9
+ declare function isLikeC4Builtin(uri: URI | {
10
+ uri: URI;
11
+ }): boolean;
12
+ declare function isNotLikeC4Builtin(uri: URI | {
13
+ uri: URI;
14
+ }): boolean;
8
15
  //#endregion
9
- export { LibIcons as Content, Scheme, Uri, isLikeC4Builtin };
16
+ export { LibIcons as Content, Scheme, Uri, isLikeC4Builtin, isNotLikeC4Builtin };
@@ -1,4 +1 @@
1
- import { t as LibIcons } from "./_chunks/icons.mjs";
2
- import { n as Uri, r as isLikeC4Builtin, t as Scheme } from "./_chunks/likec4lib.mjs";
3
-
4
- export { LibIcons as Content, Scheme, Uri, isLikeC4Builtin };
1
+ import{a as e,i as t,n,r,t as i}from"./_chunks/likec4lib.mjs";export{e as Content,i as Scheme,n as Uri,r as isLikeC4Builtin,t as isNotLikeC4Builtin};
@@ -1,4 +1,3 @@
1
- import "../_chunks/ast.mjs";
2
- import { at as LikeC4MCPServerModuleContext, it as LikeC4MCPServerFactory, nt as NoMCPServer, rt as LikeC4MCPServer } from "../_chunks/LikeC4LanguageServices.mjs";
1
+ import { C as LikeC4MCPServerModuleContext, S as LikeC4MCPServerFactory, m as NoMCPServer, p as WithMCPServer, x as LikeC4MCPServer } from "../_chunks/module.mjs";
3
2
  import "../_chunks/protocol.mjs";
4
- export { LikeC4MCPServer, LikeC4MCPServerFactory, LikeC4MCPServerModuleContext, NoMCPServer };
3
+ export { LikeC4MCPServer, LikeC4MCPServerFactory, LikeC4MCPServerModuleContext, NoMCPServer, WithMCPServer };
@@ -1,3 +1 @@
1
- import { t as NoMCPServer } from "../_chunks/mcp.mjs";
2
-
3
- export { NoMCPServer };
1
+ import"../_chunks/likec4lib.mjs";import"../_chunks/utils.mjs";import"../_chunks/libs/remeda.mjs";import{o as e}from"../_chunks/workspace.mjs";import"../_chunks/libs/picomatch.mjs";import"../_chunks/libs/ufo.mjs";import{t}from"../_chunks/WithMCPServer.mjs";export{e as NoMCPServer,t as WithMCPServer};
package/dist/module.d.mts CHANGED
@@ -1,4 +1,3 @@
1
- import "./_chunks/ast.mjs";
2
- import { $ as createLikeC4Module, J as LanguageServicesContext, Q as createLanguageServices, X as LikeC4Services, Y as LikeC4AddedServices, Z as LikeC4SharedServices, et as createSharedServices } from "./_chunks/LikeC4LanguageServices.mjs";
1
+ import { D as NoFileSystem, a as createLanguageServices, i as LikeC4SharedServices, k as NoLikeC4ManualLayouts, m as NoMCPServer, n as LikeC4AddedServices, o as createLikeC4Module, r as LikeC4Services, s as createSharedServices, t as LanguageServicesContext } from "./_chunks/module.mjs";
3
2
  import "./_chunks/protocol.mjs";
4
- export { LanguageServicesContext, LikeC4AddedServices, LikeC4Services, LikeC4SharedServices, createLanguageServices, createLikeC4Module, createSharedServices };
3
+ export { LanguageServicesContext, LikeC4AddedServices, LikeC4Services, LikeC4SharedServices, NoFileSystem, NoLikeC4ManualLayouts, NoMCPServer, createLanguageServices, createLikeC4Module, createSharedServices };
package/dist/module.mjs CHANGED
@@ -1,3 +1 @@
1
- import { n as createLikeC4Module, r as createSharedServices, t as createLanguageServices } from "./_chunks/module2.mjs";
2
-
3
- export { createLanguageServices, createLikeC4Module, createSharedServices };
1
+ import"./_chunks/likec4lib.mjs";import{r as e,t}from"./_chunks/noop.mjs";import"./_chunks/utils.mjs";import"./_chunks/libs/remeda.mjs";import{o as n}from"./_chunks/workspace.mjs";import{n as r,r as i,t as a}from"./_chunks/module.mjs";import"./_chunks/libs/picomatch.mjs";import"./_chunks/libs/ufo.mjs";import"./_chunks/libs/parse-ms.mjs";import"./_chunks/libs/pretty-ms.mjs";import"./_chunks/libs/fast-equals.mjs";import"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/strip-indent.mjs";export{t as NoFileSystem,e as NoLikeC4ManualLayouts,n as NoMCPServer,a as createLanguageServices,r as createLikeC4Module,i as createSharedServices};
package/dist/protocol.mjs CHANGED
@@ -1,3 +1 @@
1
- import { _ as ReloadProjects, a as DidChangeSnapshotNotification, c as FetchLayoutedModel, d as FetchTelemetryMetrics, f as FetchViewsFromAllProjects, g as RegisterProject, h as Locate, i as DidChangeProjectsNotification, l as FetchProjects, m as LayoutView, n as ChangeView, o as DidRequestOpenViewNotification, p as GetDocumentTags, r as DidChangeModelNotification, s as FetchComputedModel, t as BuildDocuments, u as FetchProjectsOverview, v as ValidateLayout } from "./_chunks/protocol.mjs";
2
-
3
- export { BuildDocuments, ChangeView, DidChangeModelNotification, DidChangeProjectsNotification, DidChangeSnapshotNotification, DidRequestOpenViewNotification, FetchComputedModel, FetchLayoutedModel, FetchProjects, FetchProjectsOverview, FetchTelemetryMetrics, FetchViewsFromAllProjects, GetDocumentTags, LayoutView, Locate, RegisterProject, ReloadProjects, ValidateLayout };
1
+ import{NotificationType as e,NotificationType0 as t,RequestType as n,RequestType0 as r}from"vscode-jsonrpc";let i;(function(t){t.type=new e(`likec4/onDidChangeModel`)})(i||={});let a;(function(e){e.type=new t(`likec4/onDidChangeProjects`)})(a||={});let o;(function(t){t.type=new e(t.Method=`likec4/onDidChangeSnapshot`)})(o||={});let s;(function(t){t.type=new e(`likec4/onRequestOpenView`)})(s||={});let c;(function(e){e.req=new n(`likec4/fetchComputedModel`)})(c||={});let l;(function(e){e.req=new r(`likec4/fetchViewsFromAllProjects`)})(l||={});let u;(function(e){e.req=new n(`likec4/fetchLayoutedModel`)})(u||={});let d;(function(e){e.req=new n(`likec4/layout-view`)})(d||={});let f;(function(e){e.req=new n(`likec4/validate-layout`)})(f||={});let p;(function(e){e.req=new r(`likec4/reload-projects`)})(p||={});let m;(function(e){e.req=new r(`likec4/fetch-projects`)})(m||={});let h;(function(e){e.req=new n(`likec4/register-project`)})(h||={});let g;(function(e){e.req=new n(`likec4/build`)})(g||={});let _;(function(e){e.req=new n(`likec4/locate`)})(_||={});let v;(function(e){e.req=new n(`likec4/change-view`)})(v||={});let y;(function(e){e.req=new r(`likec4/metrics`)})(y||={});let b;(function(e){e.req=new n(`likec4/document-tags`)})(b||={});let x;(function(e){e.req=new r(`likec4/fetch-projects-overview`)})(x||={});export{g as BuildDocuments,v as ChangeView,i as DidChangeModelNotification,a as DidChangeProjectsNotification,o as DidChangeSnapshotNotification,s as DidRequestOpenViewNotification,c as FetchComputedModel,u as FetchLayoutedModel,m as FetchProjects,x as FetchProjectsOverview,y as FetchTelemetryMetrics,l as FetchViewsFromAllProjects,b as GetDocumentTags,d as LayoutView,_ as Locate,h as RegisterProject,p as ReloadProjects,f as ValidateLayout};
@@ -0,0 +1,4 @@
1
+ {
2
+ "types": "../dist/filesystem/index.d.mts",
3
+ "module": "../dist/filesystem/index.mjs"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "types": "../dist/mcp/index.d.mts",
3
+ "module": "../dist/mcp/index.mjs"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "types": "../dist/module.d.mts",
3
+ "module": "../dist/module.mjs"
4
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likec4/language-server",
3
3
  "description": "LikeC4 Language Server",
4
- "version": "1.48.0",
4
+ "version": "1.50.0",
5
5
  "license": "MIT",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
@@ -21,9 +21,8 @@
21
21
  "directory": "packages/language-server"
22
22
  },
23
23
  "engines": {
24
- "node": ">=22.21.1"
24
+ "node": ">=22.22.0"
25
25
  },
26
- "engineStrict": true,
27
26
  "type": "module",
28
27
  "sideEffects": false,
29
28
  "bin": {
@@ -33,11 +32,11 @@
33
32
  ".": {
34
33
  "sources": "./src/index.ts",
35
34
  "browser": {
36
- "sources": "./src/browser.ts",
35
+ "sources": "./src/browser/index.ts",
37
36
  "default": {
38
- "types": "./dist/browser.d.mts",
39
- "import": "./dist/browser.mjs",
40
- "default": "./dist/browser.mjs"
37
+ "types": "./dist/browser/index.d.mts",
38
+ "import": "./dist/browser/index.mjs",
39
+ "default": "./dist/browser/index.mjs"
41
40
  }
42
41
  },
43
42
  "node": {
@@ -71,19 +70,19 @@
71
70
  }
72
71
  },
73
72
  "./browser-worker": {
74
- "sources": "./src/browser-worker.ts",
73
+ "sources": "./src/browser/worker.ts",
75
74
  "default": {
76
- "types": "./dist/browser-worker.d.mts",
77
- "import": "./dist/browser-worker.mjs",
78
- "default": "./dist/browser-worker.mjs"
75
+ "types": "./dist/browser/worker.d.mts",
76
+ "import": "./dist/browser/worker.mjs",
77
+ "default": "./dist/browser/worker.mjs"
79
78
  }
80
79
  },
81
80
  "./browser": {
82
- "sources": "./src/browser.ts",
81
+ "sources": "./src/browser/index.ts",
83
82
  "default": {
84
- "types": "./dist/browser.d.mts",
85
- "import": "./dist/browser.mjs",
86
- "default": "./dist/browser.mjs"
83
+ "types": "./dist/browser/index.d.mts",
84
+ "import": "./dist/browser/index.mjs",
85
+ "default": "./dist/browser/index.mjs"
87
86
  }
88
87
  },
89
88
  "./protocol": {
@@ -94,6 +93,30 @@
94
93
  "default": "./dist/protocol.mjs"
95
94
  }
96
95
  },
96
+ "./mcp": {
97
+ "sources": "./src/mcp/index.ts",
98
+ "default": {
99
+ "types": "./dist/mcp/index.d.mts",
100
+ "import": "./dist/mcp/index.mjs",
101
+ "default": "./dist/mcp/index.mjs"
102
+ }
103
+ },
104
+ "./module": {
105
+ "sources": "./src/module.ts",
106
+ "default": {
107
+ "types": "./dist/module.d.mts",
108
+ "import": "./dist/module.mjs",
109
+ "default": "./dist/module.mjs"
110
+ }
111
+ },
112
+ "./filesystem": {
113
+ "sources": "./src/filesystem/index.ts",
114
+ "default": {
115
+ "types": "./dist/filesystem/index.d.mts",
116
+ "import": "./dist/filesystem/index.mjs",
117
+ "default": "./dist/filesystem/index.mjs"
118
+ }
119
+ },
97
120
  "./package.json": "./package.json"
98
121
  },
99
122
  "publishConfig": {
@@ -101,35 +124,37 @@
101
124
  "access": "public"
102
125
  },
103
126
  "dependencies": {
104
- "@hpcc-js/wasm-graphviz": "1.17.0",
127
+ "@hono/mcp": "^0.2.3",
128
+ "@hono/node-server": "^1.19.9",
129
+ "hono": "^4.11.10",
130
+ "@hpcc-js/wasm-graphviz": "1.21.0",
105
131
  "@smithy/util-base64": "^4.3.0",
106
- "fdir": "6.4.0",
107
- "which": "^5.0.0",
108
- "type-fest": "^4.41.0",
109
132
  "chokidar": "^5.0.0",
110
- "nano-spawn": "^2.0.0",
111
- "nanoid": "5.1.6",
112
- "zod": "^3.25.76",
113
133
  "defu": "^6.1.4",
114
- "std-env": "^3.10.0",
115
- "langium": "3.5.0",
116
- "immer": "^11.1.3",
134
+ "fdir": "6.4.0",
135
+ "immer": "^11.1.4",
117
136
  "json5": "^2.2.3",
137
+ "langium": "3.5.0",
138
+ "nano-spawn": "^2.0.0",
139
+ "std-env": "^3.10.0",
140
+ "type-fest": "^4.41.0",
118
141
  "vscode-jsonrpc": "8.2.1",
119
- "vscode-uri": "3.1.0",
120
- "vscode-languageserver-textdocument": "1.0.11",
142
+ "vscode-languageserver": "9.0.1",
121
143
  "vscode-languageserver-protocol": "3.17.5",
144
+ "vscode-languageserver-textdocument": "1.0.11",
122
145
  "vscode-languageserver-types": "3.17.5",
123
- "vscode-languageserver": "9.0.1",
124
- "@likec4/config": "1.48.0",
125
- "@likec4/log": "1.48.0",
126
- "@likec4/layouts": "1.48.0",
127
- "@likec4/core": "1.48.0"
146
+ "vscode-uri": "3.1.0",
147
+ "which": "^5.0.0",
148
+ "zod": "^3.25.76",
149
+ "@likec4/config": "1.50.0",
150
+ "@likec4/log": "1.50.0",
151
+ "@likec4/layouts": "1.50.0",
152
+ "@likec4/core": "1.50.0"
128
153
  },
129
154
  "peerDependencies": {
130
- "esbuild": "0.27.2",
155
+ "@modelcontextprotocol/sdk": "^1.27.0",
131
156
  "bundle-require": "^5.1.0",
132
- "@modelcontextprotocol/sdk": "^1.25.3"
157
+ "esbuild": "0.27.3"
133
158
  },
134
159
  "peerDependenciesMeta": {
135
160
  "esbuild": {
@@ -143,43 +168,41 @@
143
168
  }
144
169
  },
145
170
  "devDependencies": {
146
- "remeda": "^2.32.0",
147
- "p-queue": "8.1.1",
148
- "p-debounce": "5.1.0",
149
- "p-timeout": "6.1.4",
171
+ "@modelcontextprotocol/sdk": "^1.27.0",
150
172
  "@msgpack/msgpack": "^3.1.2",
151
- "ufo": "1.6.3",
152
- "pretty-ms": "^9.3.0",
153
- "hono": "^4.11.6",
154
- "@hono/node-server": "^1.19.9",
155
- "fast-equals": "^6.0.0",
156
- "strip-indent": "^4.1.1",
157
- "indent-string": "^5.0.0",
158
- "bundle-require": "^5.1.0",
159
- "esbuild": "0.27.2",
160
173
  "@types/natural-compare-lite": "^1.4.2",
161
- "@modelcontextprotocol/sdk": "^1.25.3",
162
- "@types/node": "~22.19.7",
174
+ "@types/node": "~22.19.11",
163
175
  "@types/picomatch": "^4.0.2",
164
- "picomatch": "^4.0.3",
165
176
  "@types/vscode": "^1.106.1",
166
177
  "@types/which": "^3.0.4",
178
+ "bundle-require": "^5.1.0",
179
+ "esbuild": "0.27.3",
180
+ "fast-equals": "^6.0.0",
181
+ "indent-string": "^5.0.0",
167
182
  "langium-cli": "3.5.2",
168
- "oxlint": "1.35.0",
183
+ "obuild": "^0.4.31",
184
+ "oxlint": "1.43.0",
185
+ "p-debounce": "5.1.0",
186
+ "p-queue": "8.1.1",
187
+ "p-timeout": "7.0.1",
188
+ "picomatch": "^4.0.3",
189
+ "pretty-ms": "^9.3.0",
190
+ "remeda": "^2.33.5",
191
+ "strip-indent": "^4.1.1",
169
192
  "tsx": "4.21.0",
170
- "turbo": "2.7.6",
193
+ "turbo": "2.8.10",
171
194
  "typescript": "5.9.3",
172
- "obuild": "^0.4.20",
195
+ "ufo": "1.6.3",
173
196
  "vitest": "4.0.18",
174
197
  "@likec4/devops": "1.42.0",
175
198
  "@likec4/icons": "1.46.4",
176
- "@likec4/tsconfig": "1.48.0"
199
+ "@likec4/tsconfig": "1.50.0"
177
200
  },
178
201
  "scripts": {
179
202
  "typecheck": "tsc -b --verbose",
180
203
  "build": "obuild",
181
204
  "pack": "pnpm pack",
182
- "pregenerate": "rm -f src/generated/* || true",
205
+ "pregenerate": "node -e \"const fs=require('fs');const p=require('path');const d='src/generated';if(fs.existsSync(d)){fs.readdirSync(d).forEach(f=>{try{fs.unlinkSync(p.join(d,f))}catch(e){}})}\"",
183
206
  "watch:langium": "langium generate --watch",
184
207
  "watch:ts": "tsc --watch",
185
208
  "generate": "langium generate && tsx scripts/generate-icons.ts",
@@ -196,6 +219,6 @@
196
219
  "types": "dist/index.d.mts",
197
220
  "module": "dist/index.mjs",
198
221
  "browser": {
199
- "dist/index.mjs": "dist/browser.mjs"
222
+ "dist/index.mjs": "dist/browser/index.mjs"
200
223
  }
201
224
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2023-2026 Denis Davydkov
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,4 +0,0 @@
1
- import "./_chunks/ast.mjs";
2
- import { n as LikeC4LanguageServices, t as DefaultLikeC4LanguageServices } from "./_chunks/LikeC4LanguageServices.mjs";
3
- import "./_chunks/protocol.mjs";
4
- export { DefaultLikeC4LanguageServices, LikeC4LanguageServices };
@@ -1,3 +0,0 @@
1
- import { t as DefaultLikeC4LanguageServices } from "./_chunks/LikeC4LanguageServices.mjs";
2
-
3
- export { DefaultLikeC4LanguageServices };