@mudah-cli/mudah 0.8.0 → 0.9.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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/autocomplete.d.ts +8 -0
  4. package/dist/autocomplete.js +38 -0
  5. package/dist/autocomplete.js.map +1 -0
  6. package/dist/built-ins.d.ts +9 -0
  7. package/dist/built-ins.js +144 -0
  8. package/dist/built-ins.js.map +1 -0
  9. package/dist/commands/autocomplete.command.d.ts +11 -0
  10. package/dist/commands/autocomplete.command.js +16 -0
  11. package/dist/commands/autocomplete.command.js.map +1 -0
  12. package/dist/commands/build.command.d.ts +1 -0
  13. package/dist/commands/build.command.js +2 -1
  14. package/dist/commands/build.command.js.map +1 -1
  15. package/dist/commands/cache.command.d.ts +11 -0
  16. package/dist/commands/cache.command.js +47 -0
  17. package/dist/commands/cache.command.js.map +1 -0
  18. package/dist/commands/complete.command.d.ts +13 -0
  19. package/dist/commands/complete.command.js +23 -0
  20. package/dist/commands/complete.command.js.map +1 -0
  21. package/dist/commands/config.diff.command.d.ts +8 -0
  22. package/dist/commands/config.diff.command.js +96 -0
  23. package/dist/commands/config.diff.command.js.map +1 -0
  24. package/dist/commands/config.set.command.d.ts +8 -0
  25. package/dist/commands/config.set.command.js +66 -0
  26. package/dist/commands/config.set.command.js.map +1 -0
  27. package/dist/commands/config.show.command.d.ts +8 -0
  28. package/dist/commands/config.show.command.js +38 -0
  29. package/dist/commands/config.show.command.js.map +1 -0
  30. package/dist/commands/config.source.command.d.ts +8 -0
  31. package/dist/commands/config.source.command.js +42 -0
  32. package/dist/commands/config.source.command.js.map +1 -0
  33. package/dist/commands/config.validate.command.d.ts +14 -0
  34. package/dist/commands/config.validate.command.js +63 -0
  35. package/dist/commands/config.validate.command.js.map +1 -0
  36. package/dist/commands/dev.command.d.ts +1 -0
  37. package/dist/commands/dev.command.js +1 -0
  38. package/dist/commands/dev.command.js.map +1 -1
  39. package/dist/commands/docs.widgets.command.d.ts +11 -0
  40. package/dist/commands/docs.widgets.command.js +17 -0
  41. package/dist/commands/docs.widgets.command.js.map +1 -0
  42. package/dist/commands/doctor.command.d.ts +1 -0
  43. package/dist/commands/doctor.command.js +36 -6
  44. package/dist/commands/doctor.command.js.map +1 -1
  45. package/dist/commands/graph.command.d.ts +10 -0
  46. package/dist/commands/graph.command.js +21 -0
  47. package/dist/commands/graph.command.js.map +1 -0
  48. package/dist/commands/help.command.d.ts +1 -0
  49. package/dist/commands/help.command.js +2 -2
  50. package/dist/commands/help.command.js.map +1 -1
  51. package/dist/commands/info.command.d.ts +8 -0
  52. package/dist/commands/info.command.js +61 -0
  53. package/dist/commands/info.command.js.map +1 -0
  54. package/dist/commands/lsp.command.d.ts +12 -0
  55. package/dist/commands/lsp.command.js +57 -0
  56. package/dist/commands/lsp.command.js.map +1 -0
  57. package/dist/commands/make.command.d.ts +2 -0
  58. package/dist/commands/make.command.js +75 -4
  59. package/dist/commands/make.command.js.map +1 -1
  60. package/dist/commands/plugins.list.command.d.ts +12 -0
  61. package/dist/commands/plugins.list.command.js +29 -0
  62. package/dist/commands/plugins.list.command.js.map +1 -0
  63. package/dist/commands/plugins.update.command.d.ts +29 -0
  64. package/dist/commands/plugins.update.command.js +78 -0
  65. package/dist/commands/plugins.update.command.js.map +1 -0
  66. package/dist/commands/plugins.watch.command.d.ts +10 -0
  67. package/dist/commands/plugins.watch.command.js +37 -0
  68. package/dist/commands/plugins.watch.command.js.map +1 -0
  69. package/dist/commands/replay.command.d.ts +10 -0
  70. package/dist/commands/replay.command.js +50 -0
  71. package/dist/commands/replay.command.js.map +1 -0
  72. package/dist/commands/storybook.command.d.ts +11 -0
  73. package/dist/commands/storybook.command.js +84 -0
  74. package/dist/commands/storybook.command.js.map +1 -0
  75. package/dist/commands/telemetry.command.d.ts +12 -0
  76. package/dist/commands/telemetry.command.js +55 -0
  77. package/dist/commands/telemetry.command.js.map +1 -0
  78. package/dist/commands/test.command.d.ts +13 -0
  79. package/dist/commands/test.command.js +83 -0
  80. package/dist/commands/test.command.js.map +1 -0
  81. package/dist/commands/tutorial.command.d.ts +12 -0
  82. package/dist/commands/tutorial.command.js +57 -0
  83. package/dist/commands/tutorial.command.js.map +1 -0
  84. package/dist/commands/version.command.d.ts +1 -0
  85. package/dist/commands/version.command.js +1 -0
  86. package/dist/commands/version.command.js.map +1 -1
  87. package/dist/commands/watch.command.d.ts +13 -0
  88. package/dist/commands/watch.command.js +62 -0
  89. package/dist/commands/watch.command.js.map +1 -0
  90. package/dist/index.d.ts +8 -5
  91. package/dist/index.js +8 -5
  92. package/dist/index.js.map +1 -1
  93. package/dist/lsp.d.ts +147 -0
  94. package/dist/lsp.js +497 -0
  95. package/dist/lsp.js.map +1 -0
  96. package/dist/run.d.ts +4 -2
  97. package/dist/run.js +372 -37
  98. package/dist/run.js.map +1 -1
  99. package/dist/watcher.d.ts +20 -1
  100. package/dist/watcher.js +41 -4
  101. package/dist/watcher.js.map +1 -1
  102. package/package.json +27 -10
package/dist/lsp.js ADDED
@@ -0,0 +1,497 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join, relative, resolve, sep } from 'node:path';
3
+ import { parseSignature } from '@mudah-cli/console';
4
+ export const MANIFEST_KEYS = [
5
+ { label: 'name', detail: 'Application name' },
6
+ { label: 'version', detail: 'Semver version' },
7
+ { label: 'bin', detail: 'Binary name' },
8
+ { label: 'description', detail: 'One-line description' },
9
+ { label: 'ui', detail: 'Theme / motion / color' },
10
+ { label: 'updates', detail: 'Update nudge (default true)' },
11
+ { label: 'commands', detail: 'Extra command module paths' },
12
+ { label: 'providers', detail: 'Extra provider module paths' },
13
+ { label: 'telemetry', detail: 'Opt-in boot/perf telemetry' },
14
+ { label: 'watch', detail: 'Declarative file watcher' },
15
+ ];
16
+ export const SIGNATURE_SNIPPETS = [
17
+ { label: '{name}', kind: 15, detail: 'required argument' },
18
+ { label: '{name?}', kind: 15, detail: 'optional argument' },
19
+ { label: '{name=default}', kind: 15, detail: 'argument with default' },
20
+ { label: '{paths...}', kind: 15, detail: 'variadic argument' },
21
+ { label: '[--flag]', kind: 15, detail: 'boolean option' },
22
+ { label: '[--opt=]', kind: 15, detail: 'value option' },
23
+ ];
24
+ const documents = new Map();
25
+ let workspaceCommands = [];
26
+ /** Directories never worth scanning for command modules. */
27
+ const SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage', '.git', '.mudah', '.cache']);
28
+ /** Max directories visited, so a huge tree cannot stall initialization. */
29
+ const MAX_DIRS = 2000;
30
+ /** Convert a `file://` URI to a filesystem path (best effort). */
31
+ export function fileUriToPath(uri) {
32
+ if (!uri.startsWith('file://'))
33
+ return uri;
34
+ try {
35
+ return decodeURIComponent(new URL(uri).pathname);
36
+ }
37
+ catch {
38
+ return uri.replace(/^file:\/\//, '');
39
+ }
40
+ }
41
+ /** Convert an absolute path to a `file://` URI. */
42
+ export function filePathToUri(path) {
43
+ const normalized = path.split(sep).join('/');
44
+ // An absolute POSIX path becomes `file:///home/...` (the third slash is the
45
+ // path itself); a relative path gets one prepended so the URI stays valid.
46
+ if (normalized.startsWith('/'))
47
+ return `file://${normalized}`;
48
+ return `file:///${normalized}`;
49
+ }
50
+ function walkCommandFiles(dir, out, state) {
51
+ if (state.visited > MAX_DIRS)
52
+ return;
53
+ state.visited += 1;
54
+ let entries;
55
+ try {
56
+ entries = readdirSync(dir, { withFileTypes: true });
57
+ }
58
+ catch {
59
+ return;
60
+ }
61
+ for (const entry of entries) {
62
+ if (state.visited > MAX_DIRS)
63
+ return;
64
+ const full = join(dir, entry.name);
65
+ if (entry.isDirectory()) {
66
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.'))
67
+ continue;
68
+ walkCommandFiles(full, out, state);
69
+ continue;
70
+ }
71
+ if (entry.isFile() && entry.name.endsWith('.command.ts'))
72
+ out.push(full);
73
+ }
74
+ }
75
+ /** 1-based line number of an offset within `text`. */
76
+ function lineAt(text, index) {
77
+ let line = 1;
78
+ for (let i = 0; i < index && i < text.length; i++) {
79
+ if (text[i] === '\n')
80
+ line += 1;
81
+ }
82
+ return line;
83
+ }
84
+ /** Every `signature = '...'` assignment in a command source file. */
85
+ export function extractSignatures(text) {
86
+ const out = [];
87
+ const re = /signature\s*=\s*(['"`])([^'"`]+)\1/g;
88
+ let match;
89
+ while ((match = re.exec(text)) !== null) {
90
+ out.push({ signature: match[2], index: match.index });
91
+ }
92
+ return out;
93
+ }
94
+ /** First `description = '...'` value in a command source file. */
95
+ function extractDescription(text) {
96
+ const match = /description\s*=\s*(['"`])([^'"`]*)\1/.exec(text);
97
+ return match?.[2] ?? '';
98
+ }
99
+ /**
100
+ * Scan a directory tree for `*.command.ts` files and index their signatures.
101
+ * Replaces any previous index. Returns the indexed commands sorted by name.
102
+ */
103
+ export function indexWorkspaceCommands(rootDir) {
104
+ if (!existsSync(rootDir)) {
105
+ workspaceCommands = [];
106
+ return workspaceCommands;
107
+ }
108
+ const files = [];
109
+ walkCommandFiles(resolve(rootDir), files, { visited: 0 });
110
+ const found = [];
111
+ for (const file of files) {
112
+ let text;
113
+ try {
114
+ text = readFileSync(file, 'utf8');
115
+ }
116
+ catch {
117
+ continue;
118
+ }
119
+ const description = extractDescription(text);
120
+ for (const raw of extractSignatures(text)) {
121
+ found.push({
122
+ name: raw.signature.trim().split(/\s/)[0] ?? raw.signature,
123
+ signature: raw.signature,
124
+ description,
125
+ file,
126
+ line: lineAt(text, raw.index),
127
+ });
128
+ }
129
+ }
130
+ found.sort((a, b) => a.name.localeCompare(b.name) || a.file.localeCompare(b.file));
131
+ workspaceCommands = found;
132
+ return found;
133
+ }
134
+ /** The current workspace command index. */
135
+ export function workspaceCommandsIndex() {
136
+ return workspaceCommands;
137
+ }
138
+ /** Drop the workspace index (tests, or when the root changes). */
139
+ export function clearWorkspaceIndex() {
140
+ workspaceCommands = [];
141
+ }
142
+ /**
143
+ * Completion items for workspace commands, annotated with the file they came
144
+ * from so the editor can show a useful detail line.
145
+ */
146
+ export function workspaceCommandItems(root) {
147
+ const items = [];
148
+ const seen = new Set();
149
+ for (const command of workspaceCommands) {
150
+ if (seen.has(command.name))
151
+ continue;
152
+ seen.add(command.name);
153
+ const location = root === undefined ? command.file : relative(root, command.file);
154
+ items.push({
155
+ label: command.name,
156
+ kind: 3,
157
+ detail: command.description === '' ? command.signature : command.description,
158
+ documentation: `Declared in ${location}:${command.line}`,
159
+ });
160
+ }
161
+ return items;
162
+ }
163
+ export function initializeResult() {
164
+ return {
165
+ capabilities: {
166
+ textDocumentSync: 1,
167
+ completionProvider: { triggerCharacters: ['"', "'", '`', '{', '[', '-', '.', ':'] },
168
+ hoverProvider: true,
169
+ diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false },
170
+ },
171
+ serverInfo: { name: 'mudah-lsp', version: '0.9.0' },
172
+ };
173
+ }
174
+ export function uriOf(params) {
175
+ if (typeof params !== 'object' || params === null)
176
+ return '';
177
+ const doc = params.textDocument;
178
+ return doc?.uri ?? '';
179
+ }
180
+ function textOf(params) {
181
+ if (typeof params !== 'object' || params === null)
182
+ return undefined;
183
+ const rec = params;
184
+ return rec.textDocument?.text ?? rec.contentChanges?.[0]?.text;
185
+ }
186
+ /** Workspace root from `initialize` params (`rootUri` or legacy `rootPath`). */
187
+ function rootOf(params) {
188
+ if (typeof params !== 'object' || params === null)
189
+ return undefined;
190
+ const rec = params;
191
+ if (typeof rec.rootUri === 'string' && rec.rootUri.length > 0)
192
+ return fileUriToPath(rec.rootUri);
193
+ if (typeof rec.rootPath === 'string' && rec.rootPath.length > 0)
194
+ return rec.rootPath;
195
+ return undefined;
196
+ }
197
+ function isManifest(uri) {
198
+ return uri.endsWith('mudah.json') || uri.includes('mudah.json');
199
+ }
200
+ function isCommandFile(uri) {
201
+ return uri.endsWith('.command.ts') || uri.includes('.command.ts');
202
+ }
203
+ export function completionItems(params) {
204
+ const uri = uriOf(params);
205
+ if (isManifest(uri)) {
206
+ return MANIFEST_KEYS.map((entry) => ({
207
+ label: entry.label,
208
+ kind: 14,
209
+ detail: entry.detail,
210
+ documentation: `mudah.json field: ${entry.detail}`,
211
+ }));
212
+ }
213
+ const text = documents.get(uri) ?? '';
214
+ const fromFile = commandSignatureItems(text);
215
+ const signatureItems = fromFile.length > 0 ? [...fromFile, ...SIGNATURE_SNIPPETS] : [...SIGNATURE_SNIPPETS];
216
+ // Command files also see every other command in the workspace.
217
+ if (isCommandFile(uri) || uri === '') {
218
+ return [...signatureItems, ...workspaceCommandItems()];
219
+ }
220
+ return signatureItems;
221
+ }
222
+ /** Pull `signature = '...'` strings from an open `*.command.ts` buffer. */
223
+ export function commandSignatureItems(text) {
224
+ const out = [];
225
+ const seen = new Set();
226
+ for (const raw of extractSignatures(text)) {
227
+ if (seen.has(raw.signature))
228
+ continue;
229
+ seen.add(raw.signature);
230
+ out.push({
231
+ label: raw.signature,
232
+ kind: 15,
233
+ detail: 'command signature',
234
+ documentation: 'Signature declared in this command file.',
235
+ });
236
+ }
237
+ return out;
238
+ }
239
+ const KNOWN_MANIFEST = new Set(MANIFEST_KEYS.map((entry) => entry.label));
240
+ function lineRange(line, character, length) {
241
+ return {
242
+ start: { line, character },
243
+ end: { line, character: character + Math.max(1, length) },
244
+ };
245
+ }
246
+ /** `[console] ` prefix stripped from signature-validation messages. */
247
+ function cleanMessage(error) {
248
+ const message = error instanceof Error ? error.message : String(error);
249
+ return message.replace(/^\[console\]\s*/, '');
250
+ }
251
+ /**
252
+ * Signature diagnostics for an open `*.command.ts` buffer: each declared
253
+ * signature is validated with the real parser, and duplicate command names
254
+ * across the workspace are flagged.
255
+ */
256
+ export function commandFileDiagnostics(uri, text) {
257
+ if (!isCommandFile(uri))
258
+ return [];
259
+ const out = [];
260
+ const signatures = extractSignatures(text);
261
+ for (const raw of signatures) {
262
+ const line = lineAt(text, raw.index) - 1;
263
+ const character = raw.index - (text.lastIndexOf('\n', raw.index) + 1);
264
+ try {
265
+ parseSignature(raw.signature);
266
+ }
267
+ catch (error) {
268
+ out.push({
269
+ range: lineRange(line, character, raw.signature.length),
270
+ severity: 1,
271
+ source: 'mudah',
272
+ message: cleanMessage(error),
273
+ });
274
+ }
275
+ }
276
+ for (const raw of signatures) {
277
+ const name = raw.signature.trim().split(/\s/)[0];
278
+ if (name === undefined || name === '')
279
+ continue;
280
+ const duplicates = workspaceCommands.filter((command) => command.name === name && command.file !== fileUriToPath(uri));
281
+ if (duplicates.length === 0)
282
+ continue;
283
+ const line = lineAt(text, raw.index) - 1;
284
+ out.push({
285
+ range: lineRange(line, 0, name.length),
286
+ severity: 2,
287
+ source: 'mudah',
288
+ message: `Command "${name}" is also declared in ${duplicates[0].file}. First registration wins.`,
289
+ });
290
+ }
291
+ return out;
292
+ }
293
+ /** Schema diagnostics for an open `mudah.json` buffer. */
294
+ export function mudahJsonDiagnostics(uri, text) {
295
+ if (!isManifest(uri))
296
+ return [];
297
+ const out = [];
298
+ let parsed;
299
+ try {
300
+ parsed = JSON.parse(text);
301
+ }
302
+ catch (error) {
303
+ const message = error instanceof Error ? error.message : String(error);
304
+ out.push({
305
+ range: lineRange(0, 0, 1),
306
+ severity: 1,
307
+ source: 'mudah',
308
+ message: `mudah.json is not valid JSON (${message}).`,
309
+ });
310
+ return out;
311
+ }
312
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
313
+ out.push({
314
+ range: lineRange(0, 0, 1),
315
+ severity: 1,
316
+ source: 'mudah',
317
+ message: 'mudah.json must contain a JSON object.',
318
+ });
319
+ return out;
320
+ }
321
+ const rec = parsed;
322
+ for (const key of ['name', 'version', 'bin']) {
323
+ if (typeof rec[key] !== 'string' || rec[key].length === 0) {
324
+ out.push({
325
+ range: lineRange(0, 0, 1),
326
+ severity: 1,
327
+ source: 'mudah',
328
+ message: `mudah.json field "${key}" must be a non-empty string.`,
329
+ });
330
+ }
331
+ }
332
+ const lines = text.split('\n');
333
+ for (const key of Object.keys(rec)) {
334
+ if (KNOWN_MANIFEST.has(key))
335
+ continue;
336
+ let line = 0;
337
+ let character = 0;
338
+ for (let i = 0; i < lines.length; i++) {
339
+ const at = (lines[i] ?? '').indexOf(`"${key}"`);
340
+ if (at >= 0) {
341
+ line = i;
342
+ character = at;
343
+ break;
344
+ }
345
+ }
346
+ out.push({
347
+ range: lineRange(line, character, key.length + 2),
348
+ severity: 2,
349
+ source: 'mudah',
350
+ message: `Unknown mudah.json key "${key}".`,
351
+ });
352
+ }
353
+ return out;
354
+ }
355
+ /** Diagnostics for whichever document type this URI is, if any. */
356
+ export function diagnosticsFor(uri, text) {
357
+ if (isManifest(uri))
358
+ return mudahJsonDiagnostics(uri, text);
359
+ if (isCommandFile(uri))
360
+ return commandFileDiagnostics(uri, text);
361
+ return [];
362
+ }
363
+ /** LSP notification for the current buffer, if it is a manifest or command file. */
364
+ export function publishDiagnostics(uri) {
365
+ const text = documents.get(uri);
366
+ if (text === undefined)
367
+ return undefined;
368
+ if (!isManifest(uri) && !isCommandFile(uri))
369
+ return undefined;
370
+ return {
371
+ jsonrpc: '2.0',
372
+ method: 'textDocument/publishDiagnostics',
373
+ params: { uri, diagnostics: diagnosticsFor(uri, text) },
374
+ };
375
+ }
376
+ export function hoverContents(params) {
377
+ const uri = uriOf(params);
378
+ const pos = params.position;
379
+ const text = documents.get(uri) ?? '';
380
+ const line = text.split('\n')[pos?.line ?? 0] ?? '';
381
+ if (isCommandFile(uri)) {
382
+ const onLine = line.match(/signature\s*=\s*(['"`])([^'"`]+)\1/);
383
+ const signature = onLine?.[2] ?? extractSignatures(text).find((raw) => text.includes(raw.signature))?.signature;
384
+ if (signature !== undefined) {
385
+ try {
386
+ parseSignature(signature);
387
+ return { kind: 'markdown', value: `Command signature \`${signature}\`.` };
388
+ }
389
+ catch (error) {
390
+ return { kind: 'markdown', value: `Invalid signature: ${cleanMessage(error)}` };
391
+ }
392
+ }
393
+ return { kind: 'markdown', value: 'Mudah command module. Set `signature` and `handle()`.' };
394
+ }
395
+ if (!isManifest(uri))
396
+ return null;
397
+ for (const entry of MANIFEST_KEYS) {
398
+ if (line.includes(`"${entry.label}"`) || line.includes(`'${entry.label}'`)) {
399
+ return { kind: 'markdown', value: `**${entry.label}** — ${entry.detail}` };
400
+ }
401
+ }
402
+ return { kind: 'markdown', value: 'Mudah application manifest (`mudah.json`).' };
403
+ }
404
+ /** Handle one JSON-RPC request. Notifications (no id) may return undefined. */
405
+ export function handleLspMessage(msg) {
406
+ if (msg.method === 'initialize') {
407
+ const root = rootOf(msg.params);
408
+ if (root !== undefined)
409
+ indexWorkspaceCommands(root);
410
+ return { jsonrpc: '2.0', id: msg.id, result: initializeResult() };
411
+ }
412
+ if (msg.method === 'textDocument/didOpen' || msg.method === 'textDocument/didChange') {
413
+ const uri = uriOf(msg.params);
414
+ const text = textOf(msg.params);
415
+ if (uri && text !== undefined)
416
+ documents.set(uri, text);
417
+ return undefined;
418
+ }
419
+ if (msg.method === 'textDocument/diagnostic') {
420
+ const uri = uriOf(msg.params);
421
+ const text = documents.get(uri) ?? '';
422
+ return {
423
+ jsonrpc: '2.0',
424
+ id: msg.id,
425
+ result: { kind: 'full', items: diagnosticsFor(uri, text) },
426
+ };
427
+ }
428
+ if (msg.method === 'textDocument/completion') {
429
+ return { jsonrpc: '2.0', id: msg.id, result: completionItems(msg.params) };
430
+ }
431
+ if (msg.method === 'textDocument/hover') {
432
+ return { jsonrpc: '2.0', id: msg.id, result: { contents: hoverContents(msg.params) } };
433
+ }
434
+ if (msg.method === 'shutdown') {
435
+ return { jsonrpc: '2.0', id: msg.id, result: null };
436
+ }
437
+ if (msg.method === 'initialized' || msg.method === 'exit')
438
+ return undefined;
439
+ if (msg.id !== undefined) {
440
+ return {
441
+ jsonrpc: '2.0',
442
+ id: msg.id,
443
+ error: { code: -32601, message: `Method not found: ${msg.method ?? ''}` },
444
+ };
445
+ }
446
+ return undefined;
447
+ }
448
+ /** LSP Content-Length framing. */
449
+ export function encodeLspFrame(message) {
450
+ const body = JSON.stringify(message);
451
+ return `Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n${body}`;
452
+ }
453
+ export function decodeLspFrames(buffer) {
454
+ const messages = [];
455
+ let rest = buffer;
456
+ while (true) {
457
+ const crlf = rest.indexOf('\r\n\r\n');
458
+ const lf = rest.indexOf('\n\n');
459
+ let headerEnd = -1;
460
+ let sepLen = 4;
461
+ if (crlf !== -1 && (lf === -1 || crlf <= lf)) {
462
+ headerEnd = crlf;
463
+ sepLen = 4;
464
+ }
465
+ else if (lf !== -1) {
466
+ headerEnd = lf;
467
+ sepLen = 2;
468
+ }
469
+ if (headerEnd === -1) {
470
+ const line = rest.trim();
471
+ if (line.startsWith('{')) {
472
+ try {
473
+ messages.push(JSON.parse(line));
474
+ return { messages, rest: '' };
475
+ }
476
+ catch {
477
+ return { messages, rest };
478
+ }
479
+ }
480
+ return { messages, rest };
481
+ }
482
+ const header = rest.slice(0, headerEnd);
483
+ const match = /Content-Length:\s*(\d+)/i.exec(header);
484
+ if (!match) {
485
+ rest = rest.slice(headerEnd + sepLen);
486
+ continue;
487
+ }
488
+ const length = Number(match[1]);
489
+ const bodyStart = headerEnd + sepLen;
490
+ if (rest.length < bodyStart + length)
491
+ return { messages, rest };
492
+ const body = rest.slice(bodyStart, bodyStart + length);
493
+ rest = rest.slice(bodyStart + length);
494
+ messages.push(JSON.parse(body));
495
+ }
496
+ }
497
+ //# sourceMappingURL=lsp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.js","sourceRoot":"","sources":["../src/lsp.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { type Application as App, type MudahManifest } from '@mudah-cli/core';
2
- import { type ThemeQueryInput } from '@mudah-cli/terminal';
3
1
  import { type CommandModule } from '@mudah-cli/console';
2
+ import { type Application as App, type MudahManifest, type TelemetrySink } from '@mudah-cli/core';
3
+ import { type ThemeQueryInput } from '@mudah-cli/terminal';
4
4
  export interface RunOptions {
5
5
  /** Raw arguments (default: `process.argv.slice(2)`). */
6
6
  argv?: string[];
@@ -51,6 +51,8 @@ export interface RunOptions {
51
51
  * are skipped with a warning.
52
52
  */
53
53
  commands?: CommandModule[];
54
+ /** Collect boot/perf events when the app opts into telemetry. */
55
+ telemetrySink?: TelemetrySink;
54
56
  }
55
57
  /**
56
58
  * The Mudah entry point. An app's `bin/<name>` stub is: